本教程系统讲解自动语音识别(ASR)技术,详细介绍 OpenAI 开源的 Whisper large-v3 模型及其高速推理方案 faster-whisper(CTranslate2 量化运行时)。通过完整示例项目 voice2text,你将学会在本地部署 Whisper large-v3 模型,用 FastAPI 构建语音识别后端服务,实现"用户上传音频或用麦克风录音,输出识别文字",并对外暴露 OpenAI 兼容的语音识别接口;同时支持把识别结果转换为带时间轴的字幕,一键下载 SRT / VTT 字幕文件。教程内容覆盖 ASR 技术概览、Whisper large-v3 模型详解、环境准备与综合示例的完整链路,适合希望在本地搭建语音识别与字幕生成服务的开发者。
前置教程
如想快速开始学习本教程,你可能需要先完成以下前置教程:
- Python+FastAPI在Windows环境下创建一个基础后端服务教程,本教程使用 FastAPI 构建语音识别后端服务,需要你掌握基础后端服务写法。
- OpenAI兼容API的概念与用法详解,本教程的示例服务对外暴露 OpenAI 兼容的语音识别接口,需要你了解其请求格式与设计规范。
资源下载
1. ASR 技术概览
1.1 什么是 ASR
ASR(Automatic Speech Recognition,自动语音识别) 是指将人类的语音音频自动转换为对应文字文本的技术,是人工智能语音领域的核心基础能力之一,与 TTS(文本转语音)恰好互为反向任务。
ASR 的应用场景非常广泛:
- 语音输入:手机输入法、语音笔记、会议纪要的自动转写
- 智能交互:语音助手、智能音箱、客服系统的语音理解前端
- 字幕生成:视频、直播、网课的自动字幕
- 语音翻译:先识别再翻译,构成语音翻译链路
- 无障碍服务:为听障人群提供实时字幕
现代 ASR 系统的核心处理流程如下:
采样率统一、降噪] 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 秒窗口的对数梅尔频谱编码为特征向量,解码器以自回归方式逐个输出文字词元,因此天然具备语言模型的上下文纠错能力。
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):
- 通过夸克网盘将压缩包下载到本地并解压
- 将解压出的文件放入
C:\models\faster-whisper-large-v3目录,最终目录中应包含model.bin、config.json、tokenizer.json、vocabulary.json与preprocessor_config.json(各文件作用见第 2.4 节)
如需自定义路径,同步修改 config.py 中的 ASR_MODEL_DIR 即可。
4. 综合示例:voice2text 语音识别服务
4.1 项目目标与架构
示例项目 voice2text 将 Whisper large-v3 封装为一个完整的语音识别服务,实现以下目标:
- 用户上传一段音频,或用麦克风录音,服务识别并输出文字
- 对外暴露 OpenAI 兼容的
POST /v1/audio/transcriptions接口 - 识别结果可转换为带时间轴的字幕,一键下载 SRT / VTT 字幕文件
- 构建前端页面,支持文件上传与浏览器内麦克风录音
整体架构如下:
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() 二次细分:切分时把连续英文字母与数字(如 8000、HTTP、docs)视为不可拆分的整体,切口只落在单元边界,时间按字符占比分配。
除分段外还有两个关键参数:vad_filter=True 会先用静音检测裁掉无语音区段,既加快推理速度,也抑制 Whisper 在纯静音处的"幻觉"输出;condition_on_previous_text=False 关闭跨片段的上下文传递,避免偶发的错误文本被反复复制到后续片段。
字幕文本与正文聚合识别还有一个明显区分:字幕默认不显示句读标点。标点在二次细分阶段仍承担"找切口"的作用,因此去标点放在 split_segments() 之后执行,由 strip_punctuation() 统一去除句号、逗号等句读符号;是否开启由 config.py 的 SUBTITLE_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 查看完整的示例代码。页面主要功能:
- 上传音频:选择本地音频文件(wav/mp3/m4a/flac 等)作为识别输入
- 麦克风录音:调用浏览器麦克风录音,通过 Web Audio API 实时采集并编码为 16kHz WAV
- 语言选择:提供自动检测与中英粤日韩手动指定,口播内容语种单一时建议手动指定以避免误判
- 音频预览:识别前可播放已选音频或录音
- 识别展示:点击"开始识别",通过
fetch以 multipart 表单上传音频,展示返回的文字 - 字幕下载:识别完成后出现"下载 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.py 的 ASR_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 调大换取更优搜索结果。
举手提问