faster-whisper 实战教程:13分钟音频语音转写提速4倍,从环境到批处理的完整路径
faster-whisper 实战教程:13分钟音频语音转写提速4倍,从环境到批处理的完整路径
faster-whisper 是基于 CTranslate2 推理引擎重新实现的 Whisper 语音转写工具,解决音频转写慢、占内存高的问题,适合需要在普通硬件上批量处理录音的开发者。下面按实际任务的推进顺序讲:装好环境、跑出第一条带时间戳的转写、调出可用的结果,再处理大批量音频,并给出让结果可验证的调试方法。
准备语音转写环境:Python 3.9 与 GPU 库检查
CPU 环境安装
依赖只有 Python 3.9 及以上。与 openai-whisper 不同,这套实现不需要系统安装 FFmpeg——音频解码由打包了 FFmpeg 库的 PyAV 完成:
pip install faster-whisper
GPU 环境额外检查
GPU 运行需要 NVIDIA 的 cuBLAS 和 cuDNN 9(均对应 CUDA 12)。注意当前 ctranslate2 只支持 CUDA 12 + cuDNN 9;如果你停留在 CUDA 11/cuDNN 8,需把 ctranslate2 降到 3.24.0,CUDA 12 配 cuDNN 8 则降到 4.4.0。Linux 上可以用 pip 装 nvidia-cublas-cu12 和 nvidia-cudnn-cu12==9.*,并在启动 Python 前设置 LD_LIBRARY_PATH;也可以用官方 NVIDIA CUDA 12 Docker 镜像,仓库里就附带了一份示例:docker/Dockerfile 和 docker/infer.py。
跑通第一条转写结果:加载模型与输出时间戳分段
选一个模型大小
按模型名加载时,会从 Hugging Face Hub 自动下载对应的 CTranslate2 模型。faster_whisper/utils.py 中的映射表定义了全部可选尺寸:
| 模型名 | 说明 |
|---|---|
tiny / tiny.en | 最快,精度最低 |
base / base.en | 日常任务起点,.en 版本仅英语 |
small / small.en | 速度质量平衡点,多语言 |
medium / medium.en | 精度更高 |
large-v3(large) | 精度最高 |
distil-large-v3、turbo | 蒸馏模型,推理更快,适合英文为主的场景 |
核心入口在 faster_whisper/transcribe.py 的 WhisperModel 类,完整转写流程只有下面几行:
from faster_whisper import WhisperModel
model = WhisperModel("base", device="cpu", compute_type="int8")
segments, info = model.transcribe("audio.mp3")
print(f"检测到语言: {info.language} (置信度 {info.language_probability:.2f})")
for segment in segments: # segments 是生成器,转写从这里才开始
print(f"[{segment.start:.2f}s -> {segment.end:.2f}s] {segment.text}")
两个容易踩的点:
segments是生成器,不迭代就不会真正转写;需要整包结果时先list(segments)。device支持"cpu"、"cuda"、"auto";compute_type控制精度,"int8"内存占用最低,"float16"是 GPU 上的常用选择。
调出可用结果:词级时间戳、静音过滤与语言检测
词级时间戳
转写时传 word_timestamps=True,每个 segment 会多出 words 字段,逐项给出 start、end、word 和 probability。做字幕对齐、热词统计时直接遍历即可,不需要额外对齐模型。
VAD 静音过滤
长录音里大量静音会被白白转写一遍。vad_filter=True 会先用内置的 Silero VAD 模型(faster_whisper/vad.py)裁掉无人声区间。默认行为偏保守,只删超过 2 秒的静音;想更激进,通过 vad_parameters 传参,例如 dict(min_silence_duration_ms=500)。批量管线里 VAD 默认就是开启的。
语言检测与指定语言
不传 language 时,模型用音频前 30 秒做自动检测,结果和置信度都在 info 里。语种确定后(比如客服录音固定中文),显式传 language="zh" 能省掉检测成本并减少误判。多语言模型覆盖 99 种语言,具体代码以 supported_languages 属性返回的列表为准。
批量处理大量音频:BatchedInferencePipeline 与 int8 量化
单条音频逐段转写时,GPU 常常喂不饱。仓库提供了 BatchedInferencePipeline,它是 WhisperModel.transcribe 的替换件,支持多路请求并行解码:
from faster_whisper import WhisperModel, BatchedInferencePipeline
model = WhisperModel("large-v3", device="cuda", compute_type="float16")
pipeline = BatchedInferencePipeline(model=model)
segments, info = pipeline.transcribe("audio.mp3", batch_size=16)
README 中的基准数据(13 分钟音频,RTX 3070 Ti,large-v2)可以直观感受量级:
| 配置 | 耗时 | 显存 |
|---|---|---|
| openai/whisper(fp16) | 2m23s | 4708MB |
| faster-whisper(fp16) | 1m03s | 4525MB |
| faster-whisper(int8) | 59s | 2926MB |
| faster-whisper(int8,batch_size=8) | 16s | 4500MB |
CPU 侧(i7-12700K,small 模型):openai/whisper 需 6m58s,faster-whisper int8 为 1m42s、int8 加 batch 8 为 51s——这就是 README 所说"最高提速 4 倍"的出处。int8 量化在 CPU 和 GPU 上都有效,是内存紧张时第一优先项。
验证转写质量与性能:调试手段与公平对比
让对比数据可比
如果你要自己验证性能数字,先确认设置一致(README 专门提醒了这一点):
- beam size:faster-whisper 默认
beam_size=5,而 openai/whisper 默认是 1,不统一就不可比; - CPU 线程:统一
OMP_NUM_THREADS环境变量再跑; - 词错误率(WER):转写速度与文本长度强相关,对比前先确认两边 WER 接近。
调试与查看内部过程
把日志级别调到 DEBUG(logger 名为 faster_whisper)可以看到分块与解码细节。质量验证方面,benchmark/ 目录提供了完整的脚本集:speed_benchmark.py 测速度、memory_benchmark.py 测内存、wer_benchmark.py 结合 evaluate_yt_commons.py 在 YouTube Commons 语料上算 WER,拿来跑自己的音频即可。
另外两个进阶能力值得列入下一步:
- 蒸馏模型:
distil-large-v3原生适配 faster-whisper 的转写算法,英文场景比 large-v3 快得多(同 GPU 下 25m50s 对 46m12s,WER 还略低); - 模型转换:用
ct2-transformers-converter可以把 OpenAI 原版或自训练的 Whisper 权重转成 CTranslate2 格式,本地目录或 Hub 模型 ID 直接传给WhisperModel加载。
想继续深入参数含义,直接读 faster_whisper/transcribe.py 里 TranscriptionOptions 的字段注释,每个解码参数(condition_on_previous_text、hallucination_silence_threshold 等)都有说明;音频解码与特征提取分别见 faster_whisper/audio.py 和 faster_whisper/feature_extractor.py。
更多推荐
所有评论(0)