本教程系统讲解自动语音识别(ASR)技术,详细介绍 OpenAI 开源的 Whisper large-v3 模型及其高速推理方案 faster-whisper(CTranslate2 量化运行时)。通过完整示例项目 voice2text,你将学会在本地部署 Whisper large-v3 模型,用 FastAPI 构建语音识别后端服务,实现"用户上传音频或用麦克风录音,输出识别文字",并对外暴露 OpenAI 兼容的语音识别接口;同时支持把识别结果转换为带时间轴的字幕,一键下载 SRT / VTT 字幕文件。教程内容覆盖 ASR 技术概览、Whisper large-v3 模型详解、环境准备与综合示例的完整链路,适合希望在本地搭建语音识别与字幕生成服务的开发者。

前置教程

如想快速开始学习本教程,你可能需要先完成以下前置教程:

资源下载

1. ASR 技术概览

1.1 什么是 ASR

ASR(Automatic Speech Recognition,自动语音识别) 是指将人类的语音音频自动转换为对应文字文本的技术,是人工智能语音领域的核心基础能力之一,与 TTS(文本转语音)恰好互为反向任务。

ASR 的应用场景非常广泛:

  • 语音输入:手机输入法、语音笔记、会议纪要的自动转写
  • 智能交互:语音助手、智能音箱、客服系统的语音理解前端
  • 字幕生成:视频、直播、网课的自动字幕
  • 语音翻译:先识别再翻译,构成语音翻译链路
  • 无障碍服务:为听障人群提供实时字幕

现代 ASR 系统的核心处理流程如下:

graph LR A[语音音频] --> B[音频预处理
采样率统一、降噪] B --> C[声学特征提取
如梅尔频谱] C --> D[声学模型与解码
音频映射为文字] D --> E[输出文本] classDef input fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px classDef process fill:#d5f5e3,stroke:#1e8449,stroke-width:2px classDef model fill:#ffecd6,stroke:#ca6f1e,stroke-width:2px classDef output fill:#ebdef0,stroke:#6c3483,stroke-width:2px class A input class B process class C,D model class E output
阶段 作用 说明
音频预处理 统一采样率、静音切除 保证输入质量一致
声学特征提取 将音频波形转为特征向量 常用梅尔频谱、特征滤波器组
声学模型与解码 将声学特征映射为文字序列 决定识别准确率与语种支持

ASR 的本质是"音频到文字"的映射,工程上的重点是选择合适的识别模型,并把它封装成易于调用的服务。

1.2 在线 ASR 与本地部署 ASR 的对比

调用 ASR 有两种主流方式:调用在线 ASR 服务本地部署 ASR 模型。两者的对比如下:

对比项 在线 ASR 服务 本地部署 ASR(Whisper large-v3)
联网要求 需要联网调用云端服务 无需联网,完全离线可用
调用成本 按量计费或订阅 模型开源免费,需自备硬件
数据隐私 音频上传至云端 数据不出本地,隐私可控
部署门槛 低,注册即可调用 较高,需要配置深度学习环境
语种支持 视服务商而定 支持 99 种语言
识别速度 受网络影响 GPU 加速后可达实时的数倍

1.3 本教程的选型

  • Whisper large-v3:OpenAI 开源的语音识别模型,基于编码器-解码器 Transformer 架构,使用约 68 万小时弱监督音频训练,支持 99 种语言,自带标点与词级时间戳,对专有名词、数字与中英混说内容的上下文纠错能力强。
  • faster-whisper:基于 CTranslate2 的 Whisper 高速推理实现,通过权重量化与计算图优化,在精度几乎无损的前提下将推理速度提升 4 倍以上、显存占用大幅降低。

选择建议:需要离线、隐私可控、高质量中文识别的场景选择本地部署 Whisper large-v3;快速原型或语音量小的场景可选用在线服务。本教程的示例项目将本地模型封装为 OpenAI 兼容接口,便于与既有系统集成。

2. Whisper large-v3 模型详解

2.1 模型简介

Whisper 是 OpenAI 开源的通用语音识别模型,large-v3 是该系列参数量最大的版本(约 15 亿参数)。模型在约 68 万小时多语言音频上训练,采用编码器-解码器 Transformer 结构:编码器把 30 秒窗口的对数梅尔频谱编码为特征向量,解码器以自回归方式逐个输出文字词元,因此天然具备语言模型的上下文纠错能力。

graph LR A[语音音频] --> B[对数梅尔频谱
30 秒窗口] B --> C[Transformer 编码器] C --> D[Transformer 解码器
自回归输出] D --> E[带标点与时间戳的文本] classDef input fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px classDef model fill:#ffecd6,stroke:#ca6f1e,stroke-width:2px classDef output fill:#ebdef0,stroke:#6c3483,stroke-width:2px class A input class B,C,D model class E output

2.2 核心能力

  • 多语言识别:支持 99 种语言的语音识别与翻译,中文效果位居开源模型第一梯队
  • 自带标点:解码时直接输出带标点的文本,无需外挂标点模型
  • 词级时间戳:可输出每个词的精确起止时间,是自动字幕的关键能力
  • 上下文纠错:自回归解码具备语言模型能力,对专有名词、数字、中英混说内容的容错性强
  • 抗噪鲁棒:训练数据覆盖大量真实场景音频,对口音与背景噪声不敏感

2.3 CTranslate2 与 faster-whisper

Whisper 原版基于 PyTorch,推理速度与显存占用对个人设备并不友好。faster-whisper 使用 CTranslate2 运行时重新实现了 Whisper 的推理流程:

对比项 原版 Whisper(PyTorch) faster-whisper(CTranslate2)
推理速度 基准 快约 4 倍以上
显存占用 较高 量化后显著降低
精度损失 几乎无损(float16 / int8 量化)
依赖体积 需完整 PyTorch 无需 PyTorch,依赖轻量

本教程示例项目使用 float16 量化在 GPU 上推理;无 GPU 时回退 CPU 的 int8 量化模式,同样可运行。

2.4 本地模型目录

faster-whisper 使用 CTranslate2 格式的模型权重。本教程假设模型已放置在 C:\models\faster-whisper-large-v3,目录中应包含以下文件:

文件 作用
model.bin 模型权重文件(约 3 GB)
config.json 模型结构配置
tokenizer.json 分词器配置
vocabulary.json 文本词表
preprocessor_config.json 音频预处理(梅尔频谱)参数

2.5 使用 faster-whisper 调用

faster-whisper 的调用接口非常简洁,核心代码如下:

from faster_whisper import WhisperModel

# 加载本地模型(GPU 使用 float16,CPU 使用 int8)
model = WhisperModel(
    "C:/models/faster-whisper-large-v3",
    device="cuda",          # 无 GPU 时改为 "cpu"
    compute_type="float16",
)

segments, info = model.transcribe(
    "audio.mp3",            # 任意格式音频
    language="zh",          # 语种代码,传 None 表示自动检测
    beam_size=5,            # 束搜索宽度
    vad_filter=True,        # 过滤静音段,抑制幻觉
)

for seg in segments:
    print(f"[{seg.start:.1f} -> {seg.end:.1f}] {seg.text}")

transcribe() 返回的是片段生成器,遍历时才真正执行推理;每个片段自带秒级的起止时间。把 word_timestamps 设为 True 后,时间戳还能细化到每个词。

3. 环境准备

3.1 创建环境

ASR 使用独立的 conda 环境 voice2text,依赖统一使用 uv 安装:

# 创建并激活 conda 环境
conda create -n voice2text python=3.10 -y
conda activate voice2text

# 安装 lzma 运行库(conda 的 Python 可能缺少 _lzma 模块,避免后续报错)
conda install -c conda-forge liblzma -y

# 安装 uv(Python 包管理工具)
pip install uv

3.2 安装依赖

faster-whisper 不依赖 PyTorch,安装非常轻量:

cd voice2text

# 安装服务依赖(含 faster-whisper、fastapi、uvicorn 等)
uv pip install -r requirements.txt --index-url https://pypi.tuna.tsinghua.edu.cn/simple

# GPU 推理可选:安装 CUDA 运行库(cuBLAS 与 cuDNN,CPU 推理可跳过)
uv pip install nvidia-cublas-cu12 nvidia-cudnn-cu12 --index-url https://pypi.tuna.tsinghua.edu.cn/simple

提示:不安装 CUDA 运行库时,服务会自动回退 CPU 的 int8 量化推理,可用但速度较慢。示例代码已自动把 pip 安装的 CUDA 库目录加入进程搜索路径,无需手动配置环境变量。mp3/m4a 等格式由 faster-whisper 内置的 PyAV(FFmpeg)解码,无需单独安装 ffmpeg。

3.3 下载模型权重

faster-whisper 需要 CTranslate2 格式的模型权重,从本教程资源下载区块的网盘地址直接下载模型压缩包 faster-whisper-large-v3.zip(约 3 GB):

  1. 通过夸克网盘将压缩包下载到本地并解压
  2. 将解压出的文件放入 C:\models\faster-whisper-large-v3 目录,最终目录中应包含 model.binconfig.jsontokenizer.jsonvocabulary.jsonpreprocessor_config.json(各文件作用见第 2.4 节)

如需自定义路径,同步修改 config.py 中的 ASR_MODEL_DIR 即可。

4. 综合示例:voice2text 语音识别服务

4.1 项目目标与架构

示例项目 voice2text 将 Whisper large-v3 封装为一个完整的语音识别服务,实现以下目标:

  • 用户上传一段音频,或用麦克风录音,服务识别并输出文字
  • 对外暴露 OpenAI 兼容的 POST /v1/audio/transcriptions 接口
  • 识别结果可转换为带时间轴的字幕,一键下载 SRT / VTT 字幕文件
  • 构建前端页面,支持文件上传与浏览器内麦克风录音

整体架构如下:

graph LR U[前端页面
static/index.html] -->|上传音频 / 录音 WAV| A[FastAPI 后端
main.py] A --> S[asr_service.py
faster-whisper 封装与时间戳识别] A --> P[subtitle.py
SRT / VTT 格式化] S --> M[Whisper large-v3 模型
C:/models/faster-whisper-large-v3] S -->|识别文字| U P -->|字幕文件下载| U classDef frontend fill:#d6eaf8,stroke:#1a6b8a,stroke-width:2px classDef backend fill:#d5f5e3,stroke:#1e8449,stroke-width:2px classDef engine fill:#ebdef0,stroke:#6c3483,stroke-width:2px classDef model fill:#ffecd6,stroke:#ca6f1e,stroke-width:2px class U frontend class A,P backend class S engine class M model

4.2 项目结构

voice2text/
├── config.py                  # 服务配置(端口、模型路径、设备、字幕分段时长)
├── main.py                    # FastAPI 后端,识别与字幕接口
├── asr_service.py             # ASR 识别服务(faster-whisper 封装)
├── subtitle.py                # 字幕格式化(SRT / VTT 生成)
├── requirements.txt           # 依赖管理
├── static/
│   └── index.html             # 前端页面(上传 + 录音 + 字幕下载)
└── README.md                  # 项目说明

4.3 配置文件 config.py

所有配置统一在 config.py 中修改,包括监听端口、模型路径、推理设备、识别语言等:

# config.py(核心片段,完整代码请查看 voice2text/config.py)
PORT = 8000

# faster-whisper 模型目录(需包含 model.bin、tokenizer.json 等文件)
ASR_MODEL_DIR = "C:/models/faster-whisper-large-v3"

# 推理设备:cuda / cpu(cuda 初始化失败会自动回退 cpu)
ASR_DEVICE = "cuda"

# 识别语言:auto(自动检测)/ zh / en / yue / ja / ko 等
ASR_LANGUAGE = "zh"

# 字幕单条最大时长(秒),值越小每条字幕越短、时间轴越细
SUBTITLE_MAX_LENGTH_S = 5

# 字幕是否去除句读标点(句号、逗号等),仅影响字幕下载,正文聚合识别不受影响
SUBTITLE_STRIP_PUNCTUATION = True

4.4 ASR 识别服务

asr_service.py 封装了 faster-whisper 的调用逻辑。考虑到模型加载耗时,采用懒加载方式在首次请求时才加载模型;同时推理过程非线程安全,使用全局锁串行化识别请求;GPU 初始化失败时自动回退 CPU:

# asr_service.py(核心片段,完整代码请查看 voice2text/asr_service.py)
def _get_model():
    """懒加载 faster-whisper 模型(首次调用时加载),GPU 失败自动回退 CPU"""
    global _model
    if _model is None:
        from faster_whisper import WhisperModel

        _add_nvidia_dll_dirs()               # 引入 pip 安装的 CUDA 运行库
        if ASR_DEVICE.startswith("cuda"):
            try:
                _model = WhisperModel(ASR_MODEL_DIR, device="cuda", compute_type="float16")
            except Exception as e:
                logger.warning("CUDA 初始化失败,回退 CPU:%s", e)
                _model = WhisperModel(ASR_MODEL_DIR, device="cpu", compute_type="int8")
        else:
            _model = WhisperModel(ASR_MODEL_DIR, device="cpu", compute_type="int8")
    return _model


def transcribe(audio_path, language=None):
    """将音频文件识别为整段文字"""
    items = _transcribe(audio_path, language, with_words=False)
    return "".join(item["text"] for item in items)


def transcribe_segments(audio_path, language=None):
    """将音频识别为带时间戳的字幕分段列表"""
    items = _transcribe(audio_path, language, with_words=True)
    segments = [{
        "start": int(item["start"] * 1000),  # 起始毫秒
        "end": int(item["end"] * 1000),      # 结束毫秒
        "text": item["text"],
    } for item in items]
    # 超过字幕时长上限的段落二次细分,切口不落入英文数字单元内部
    segments = split_segments(segments, SUBTITLE_MAX_LENGTH_S * 1000)
    # 字幕场景默认去除句读标点,与正文聚合识别结果区分
    if SUBTITLE_STRIP_PUNCTUATION:
        segments = strip_punctuation(segments)
    return segments


def _transcribe(audio_path, language, with_words):
    """执行一次转写,返回 [{"start": 秒, "end": 秒, "text": 文本}]"""
    model = _get_model()
    lang = language or ASR_LANGUAGE

    segments_iter, _info = model.transcribe(
        audio_path,
        language=None if lang in ("auto", "") else lang,
        beam_size=5,
        vad_filter=True,                    # 过滤静音段,抑制幻觉
        condition_on_previous_text=False,   # 降低长音频的重复幻觉风险
        word_timestamps=with_words,         # 字幕场景使用词级时间戳收紧边界
    )
    items = []
    with _recog_lock:                       # 生成器遍历时才真正推理,需持有全局锁
        for seg in segments_iter:
            text = seg.text.strip()
            if text:
                items.append({"start": seg.start, "end": seg.end, "text": text})
    return items

字幕分段的关键有两点。其一,Whisper 解码时天然输出带标点的句子级片段,开启 word_timestamps=True 后每个片段的起止时间会精确到最后一个词,时间轴质量远高于纯静音切分,因此字幕分段直接以这些片段为骨架。其二,连续语流中的单个片段仍可能超过 SUBTITLE_MAX_LENGTH_S 秒上限,超出部分交给 subtitle.split_segments() 二次细分:切分时把连续英文字母与数字(如 8000HTTPdocs)视为不可拆分的整体,切口只落在单元边界,时间按字符占比分配。

除分段外还有两个关键参数:vad_filter=True 会先用静音检测裁掉无语音区段,既加快推理速度,也抑制 Whisper 在纯静音处的"幻觉"输出;condition_on_previous_text=False 关闭跨片段的上下文传递,避免偶发的错误文本被反复复制到后续片段。

字幕文本与正文聚合识别还有一个明显区分:字幕默认不显示句读标点。标点在二次细分阶段仍承担"找切口"的作用,因此去标点放在 split_segments() 之后执行,由 strip_punctuation() 统一去除句号、逗号等句读符号;是否开启由 config.pySUBTITLE_STRIP_PUNCTUATION 控制(默认开启)。正文接口 /api/transcribe 返回的整段文字不受影响,仍保留完整标点。

4.5 后端接口

main.py 是服务的核心入口,提供三个业务接口:自定义的 /api/transcribe、OpenAI 兼容的 /v1/audio/transcriptions,以及生成字幕文件的 /api/subtitle

# main.py(核心片段,完整代码请查看 voice2text/main.py)
@app.post("/api/transcribe")
async def transcribe(
    file: UploadFile = File(...),
    language: str = Form("auto"),
):
    """自定义识别接口:上传音频文件,返回识别文字"""
    audio_path = _save_audio(file)               # 保存为临时文件
    try:
        text = asr_service.transcribe(audio_path, language=language or None)
    finally:
        os.unlink(audio_path)                    # 识别后清理临时文件
    return {"text": text}

@app.post("/v1/audio/transcriptions")
async def transcriptions(
    file: UploadFile = File(...),
    model: str = Form("whisper-large-v3"),
    language: str = Form("auto"),
):
    """OpenAI 兼容的语音识别接口"""
    audio_path = _save_audio(file)
    try:
        text = asr_service.transcribe(audio_path, language=language or None)
    finally:
        os.unlink(audio_path)
    return {"text": text}                        # OpenAI 兼容返回格式

@app.post("/api/subtitle")
async def generate_subtitle(
    file: UploadFile = File(...),
    language: str = Form("auto"),
    fmt: str = Form("srt"),                      # srt / vtt
):
    """字幕识别接口:返回可下载的字幕文件"""
    audio_path = _save_audio(file)
    try:
        segments = asr_service.transcribe_segments(
            audio_path, language=language or None
        )
    finally:
        os.unlink(audio_path)
    content = subtitle.to_vtt(segments) if fmt == "vtt" else subtitle.to_srt(segments)
    return Response(
        content=content,
        media_type="text/vtt; charset=utf-8" if fmt == "vtt"
                   else "application/x-subrip; charset=utf-8",
        headers={"Content-Disposition": f"attachment; filename*=UTF-8''{quote(filename)}"},
    )

代码要点说明:

功能模块 实现方式 说明
音频接收 UploadFile(multipart) 前端通过表单上传音频文件
临时文件 tempfile.NamedTemporaryFile 识别结束后清理,不落盘
自定义接口 POST /api/transcribe 前端使用的简单接口
兼容接口 POST /v1/audio/transcriptions 与 OpenAI 规范一致,返回 {"text": ...}
字幕接口 POST /api/subtitle 返回 SRT / VTT 文本流,Content-Disposition 标记为附件下载

4.6 前端页面

前端为单页 HTML 应用,位于 static/index.html。你可以前往 voice2text/static/index.html 查看完整的示例代码。页面主要功能:

  1. 上传音频:选择本地音频文件(wav/mp3/m4a/flac 等)作为识别输入
  2. 麦克风录音:调用浏览器麦克风录音,通过 Web Audio API 实时采集并编码为 16kHz WAV
  3. 语言选择:提供自动检测与中英粤日韩手动指定,口播内容语种单一时建议手动指定以避免误判
  4. 音频预览:识别前可播放已选音频或录音
  5. 识别展示:点击"开始识别",通过 fetch 以 multipart 表单上传音频,展示返回的文字
  6. 字幕下载:识别完成后出现"下载 SRT 字幕"与"下载 VTT 字幕"按钮,点击后请求 /api/subtitle 并将返回的字幕文件保存到本地

麦克风录音采用 Web Audio API 采集原始 PCM 并编码为 WAV,不依赖 WebM/Opus,因此无需 ffmpeg 即可在服务端解码。

4.7 字幕生成与下载

字幕的本质是"带时间轴的纯文本":每条字幕由起始时间、结束时间与文本三部分组成。示例项目新增的 subtitle.py 承担三件事:先用 split_segments() 把超过时长上限的分段按标点二次切分,再用 strip_punctuation() 去除句读标点(受 SUBTITLE_STRIP_PUNCTUATION 控制),最后把时间戳分段格式化为标准字幕文件:

# subtitle.py(核心片段,完整代码请查看 voice2text/subtitle.py)
def _format_timestamp(ms, decimal_sep):
    """毫秒转 HH:MM:SS,mmm(SRT 用逗号)或 HH:MM:SS.mmm(VTT 用点)"""
    hours, rem = divmod(max(0, int(ms)), 3600_000)
    minutes, rem = divmod(rem, 60_000)
    seconds, millis = divmod(rem, 1000)
    return f"{hours:02d}:{minutes:02d}:{seconds:02d}{decimal_sep}{millis:03d}"

def to_srt(segments):
    """生成 SRT 格式字幕内容"""
    cues = []
    for i, seg in enumerate(segments, start=1):
        start = _format_timestamp(seg["start"], ",")
        end = _format_timestamp(seg["end"], ",")
        cues.append(f"{i}\n{start} --> {end}\n{seg['text']}")
    return "\n\n".join(cues) + "\n"

SRT 与 VTT 是两种最常用的字幕格式,主流播放器与视频平台均支持:

对比项 SRT VTT
全称 SubRip Text WebVTT(Web Video Text Tracks)
时间戳秒的分隔符 英文逗号 , 英文句点 .
文件头 必须以 WEBVTT 开头
典型用途 本地播放器、剪映、抖音等 网页 <video> 标签、HTML5 播放器

生成的字幕文件内容形如下方所示,可直接导入播放器或剪辑软件:

1
00:00:00,420 --> 00:00:05,600
开放时间早上9点至下午5点

2
00:00:06,100 --> 00:00:11,300
自动字幕生成可以大幅提升视频制作效率

也可以不经过前端页面,直接用 curl 下载字幕文件:

# fmt 可选 srt / vtt,-o 指定保存路径
curl.exe -X POST http://localhost:8000/api/subtitle -F "file=@C:/path/to/audio.mp3" -F "fmt=srt" -o audio.srt

4.8 运行与测试

第一步:创建环境并安装依赖

若已按第 3 章完成环境准备(voice2text 环境已创建),直接激活即可;否则先按第 3 章创建环境并安装依赖。

conda activate voice2text
cd voice2text

# 安装服务依赖(若第 3 章已安装可跳过)
uv pip install -r requirements.txt --index-url https://pypi.tuna.tsinghua.edu.cn/simple

第二步:确认模型位置

确保模型位于 C:\models\faster-whisper-large-v3(第 3.3 节),如需自定义路径,修改 config.py 中的 ASR_MODEL_DIR

第三步:启动服务

python main.py

启动后访问 http://localhost:8000,即可看到语音识别界面。

第四步:验证功能

  • 在页面中上传一段音频或点击录音,点击"开始识别",确认能正确输出文字
  • 识别完成后点击"下载 SRT 字幕",用记事本打开下载的 .srt 文件,确认包含时间轴与文本
  • 也可使用 curl 直接验证接口:
curl.exe -X POST http://localhost:8000/api/transcribe -F "file=@C:/path/to/audio.wav"

# 验证字幕接口
curl.exe -X POST http://localhost:8000/api/subtitle -F "file=@C:/path/to/audio.mp3" -F "fmt=srt" -o audio.srt

验证字幕接口示意图

4.9 使用 OpenAI SDK 验证接口兼容性

由于服务暴露了 OpenAI 兼容接口,可以直接使用 openai 官方 Python SDK 调用:

# 使用 openai SDK 调用本地 voice2text 服务
from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8000/v1",  # 本地服务地址
    api_key="not-needed",                 # 本地服务不校验 Key
)

with open("audio.wav", "rb") as f:
    result = client.audio.transcriptions.create(
        model="whisper-large-v3",
        file=f,
        language="zh",
    )
print(result.text)

5. 总结

5.1 核心内容回顾

  • ASR 技术:语音转文字,核心流程为音频预处理、声学特征提取、声学模型与解码
  • Whisper large-v3:OpenAI 开源的多语言识别模型,自带标点与词级时间戳,上下文纠错能力强
  • faster-whisper 推理:CTranslate2 量化运行时,transcribe() 一次调用即可拿到片段与时间戳,GPU 失败自动回退 CPU
  • 服务封装:FastAPI 实现 /api/transcribe 与 OpenAI 兼容的 /v1/audio/transcriptions 接口
  • 字幕生成word_timestamps=True 获取词级时间戳,超长段二次细分后格式化为 SRT / VTT 字幕文件供用户下载
  • 前端应用:支持上传音频与麦克风录音,录音通过 Web Audio 编码为 WAV

5.2 常见问题与解答

问:首次识别为什么要等二十多秒?

答:示例项目采用懒加载设计,模型在第一次识别请求时才载入显存(large-v3 约需 3 GB),之后常驻内存,后续识别都是秒级响应。

问:麦克风录音后识别为空或失败?

答:确认浏览器允许麦克风权限;录音时长过短可能识别为空,建议录制 1 秒以上。也可改用上传音频方式测试。

问:无 GPU 如何运行?

答:将 config.pyASR_DEVICE 改为 "cpu",服务会以 int8 量化模式推理。CPU 模式可用但速度较慢,长音频建议耐心等待或换用 GPU。

问:上传 mp3/m4a 无法识别?

答:faster-whisper 内置的 PyAV(FFmpeg)已支持常见音频格式。若仍失败,可先转码为 wav 再上传。

问:识别结果完全为空?

答:vad_filter=True 会把整段音频都判定为静音并过滤掉,通常源于录音音量过低。可尝试提高录音音量,或检查麦克风权限与输入设备选择。

问:字幕开头偶尔冒出其他语种的文字?

答:这是 language=auto 自动检测在短音频片段上的误判。如果口播内容语种单一,建议在前端语言选择器中手动指定语种,或在 config.py 中把 ASR_LANGUAGE 改为对应语言代码。

问:专有名词(产品名、术语、网址)总是识别错怎么办?

答:本教程的 Whisper large-v3 已是开源模型中上下文纠错能力的第一梯队。若个别词仍出错,可在 main.py 调用 transcribe() 时传入 initial_prompt 提示词(如"以下内容涉及 FastAPI 与 localhost 等技术术语")引导解码,或将 beam_size 调大换取更优搜索结果。