faster-whisper 实战:3 步把 Whisper 语音转写提速 4 倍
【免费下载链接】faster-whisperFaster Whisper transcription with CTranslate2项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper
晚上 6 点,你手里有一段 40 分钟会议录音,想在晚饭前拿到带时间戳的语音转写稿。faster-whisper 是 OpenAI Whisper 的 CTranslate2 重写版,CTranslate2 相当于给模型换了台更省油的推理引擎,同等精度下最高 4 倍速,还更省内存。
🎯 动手前,先把这 3 件事定下来
- 先看硬件档位:有 N 卡就选
device="cuda"+compute_type="float16",没卡就device="cpu"+compute_type="int8"。新版 ctranslate2 只支持 CUDA 12 + cuDNN 9,如果老环境跑不了,就升级,或把 ctranslate2 锁到 3.24.0(CUDA 11)/ 4.4.0(CUDA 12 + cuDNN 8)。显存紧张时还能用compute_type="int8_float16"再压一档。 - 按延迟预算选模型:
tiny/base最快,medium均衡,large-v3/turbo精度最高。如果音频短、要求快,就往小模型靠;如果是正式交付,就上大模型。 - 环境只要 Python 3.9+:解码音频靠 PyAV,它把 FFmpeg 的库打进了自己的 wheel 里,系统不用另装 FFmpeg。如果
import faster_whisper直接报缺av,说明 PyAV 没装好,先回上一节补装。
📦 安装与首次启动
有 N 卡先装 GPU 运行库。CTranslate2 推理时要调 cuBLAS 和 cuDNN,缺了它们模型根本起不来:
pip install nvidia-cublas-cu12 nvidia-cudnn-cu12==9.*Linux 装完要把库目录加进LD_LIBRARY_PATH,README 的 GPU 小节有现成命令。如果加载时报cuDNN not found或 CUDA 版本错 → 库没进环境变量,或版本对不上 CUDA 12 → 回上一步核对路径,或者直接换内置 cuDNN 9 的 Docker 镜像。
再装 PyAV,它是唯一的音频解码入口,走官方预编译 wheel 就免编译:
pip install av如果它触发本地编译失败 → pip 拉到了源码包而不是 wheel → 换官方预编译包,别在 Windows 上硬编译。
最后装本体,一行把 ctranslate2、tokenizers、onnxruntime 全部带齐:
pip install faster-whisper如果import faster_whisper报 ctranslate2 版本冲突 → 机器上已有旧版 → 用pip install --force-reinstall ctranslate2==4.4.0锁版本。
装完先验证一下。仓库自带一条小样本tests/data/jfk.flac,转它一遍,链路就算通了:
from faster_whisper import WhisperModel model = WhisperModel("tiny", device="cpu", compute_type="int8") segments, info = model.transcribe("tests/data/jfk.flac") print(next(iter(segments)).text, info.language)🚀 核心用法:从单条到批量
三种模式都在同一个transcribe接口上,参数是同一套。
单条转写,最小可跑。vad_filter=True会先用内置 Silero VAD 剪掉长静音再送进模型,VAD ≈ 先把没声音的段落剪掉,模型就不用白算;beam_size控制解码精度,默认就是 5:
model = WhisperModel("large-v3", device="cuda", compute_type="float16") segments, info = model.transcribe("meeting.mp3", beam_size=5, vad_filter=True) print(f"语言: {info.language},置信度 {info.language_probability:.2f}") for seg in segments: print(f"[{seg.start:.2f}s -> {seg.end:.2f}s] {seg.text}")注意segments是生成器,真正跑转写发生在你遍历它的那一刻;想立刻跑完,先segments = list(segments)。
收紧 VAD,省算力。音频很长、说话占比低时,可以收紧静音切分:
segments, _ = model.transcribe( "meeting.mp3", vad_filter=True, vad_parameters=dict(min_silence_duration_ms=500), )默认只移除超过 2 秒的静音;speech_pad_ms默认 400,在语音块两侧留余量。各参数含义在 vad.py。
批量转写,生产可用。BatchedInferencePipeline是WhisperModel.transcribe的平替,把片段攒成批一次喂给模型,比逐句解码快一个量级:
from faster_whisper import BatchedInferencePipeline model = WhisperModel("turbo", device="cuda", compute_type="float16") pipeline = BatchedInferencePipeline(model=model) segments, _ = pipeline.transcribe("meeting.mp3", batch_size=16)批量管线默认就开着 VAD;仓库基准里,13 分钟音频用large-v2+batch_size=8,fp16 的 1 分 03 秒被压到 17 秒。
📋 快速对照表
RTX 3070 Ti 上的实测数据(13 分钟音频、large-v2,来自 README 的 Benchmark 节):
| 转写方式 | 耗时 | 显存 |
|---|---|---|
| fp16,beam_size=5 | 1 分 03 秒 | 4525 MB |
| fp16,batch_size=8 | 17 秒 | 6090 MB |
| int8,beam_size=5 | 59 秒 | 2926 MB |
| int8,batch_size=8 | 16 秒 | 4500 MB |
结论就一句:批量化是提速大头,int8 是省显存大头,两者可以叠加。
🧭 接下来往哪走
- 做词级时间戳:加
word_timestamps=True,每个seg.words里都有起止时刻,完整解码参数看 transcribe.py。 - 调 VAD 省算力:用
vad_parameters=dict(min_silence_duration_ms=500)收紧静音切分,默认值与含义在 vad.py。 - 转换或加载自有权重:README 的 Model conversion 一节讲了怎么把微调模型转成 CTranslate2 格式,见 README.md,更多跑分参考 benchmark/。
【免费下载链接】faster-whisperFaster Whisper transcription with CTranslate2项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考