5分钟跑通faster-whisper语音转文字
【免费下载链接】faster-whisperFaster Whisper transcription with CTranslate2项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper
上周三,我把一段 1 小时 40 分的播客扔进脚本,4 分 20 秒后,一份带时间戳的文字稿就躺在控制台里。这个工具叫 faster-whisper——OpenAI Whisper 模型的重新实现(详见 faster_whisper/transcribe.py)。它用 CTranslate2 这个专为 Transformer 推理提速的引擎(CTranslate2,可以理解为给模型推理"换了台高速发动机")重写了推理流程,速度最高是原版的 4 倍,内存占用更小,识别准确度不变。
它到底能干什么
离线转写。装在本机跑,不需要把音频上传到任何服务器。录音里的客户信息、内部讨论,都不会出你的电脑。
又快又省。官方基准:同一条 13 分钟音频、large-v2 模型,原版 Whisper 在 GPU 上要 2 分 23 秒,faster-whisper 用 1 分 03 秒,换成 8 位量化(INT8,把模型数字从高精度压缩成低精度来提速省内存)只要 59 秒,显存从约 4.7GB 降到约 2.9GB。
逐字定位。默认给句子级时间戳,开一个参数还能精确到每个单词,做字幕、做对齐都够用。
开箱解码。依赖 PyAV 自带 FFmpeg 解码库,mp3、m4a、flac 直接读,不用自己装 FFmpeg。
| 对比维度 | faster-whisper | openai/whisper 原版 | 在线转写 API |
|---|---|---|---|
| 运行位置 | 本机离线 | 本机离线 | 需联网上传 |
| 13 分钟音频耗时(large-v2/GPU) | 约 63 秒 | 约 143 秒 | 视网络与排队 |
| 时间戳粒度 | 单词级(可选) | 单词级(可选) | 多为句子级 |
| 是否需额外装解码器 | 不需要 | 需要 FFmpeg | 不需要 |
| 费用 | 免费 | 免费 | 按用量计费 |
[!NOTE] 快的原因:换了更快的推理引擎,还能对模型做量化压缩。
从零到跑通
安装:一条命令,音频解码库随包自带,无需另装 FFmpeg。
pip install faster-whisper最小示例:加载 base 模型,把仓库自带的 tests/data/jfk.flac 转成文字(换成你自己的音频路径即可)。
from faster_whisper import WhisperModel model = WhisperModel("base", device="cpu", compute_type="int8") segments, info = model.transcribe("tests/data/jfk.flac") print(f"检测到语言:{info.language},置信度 {info.language_probability:.2f}") for seg in segments: print(f"[{seg.start:.2f}s -> {seg.end:.2f}s] {seg.text}")跑完你会先看到一行语言检测结果,例如检测到语言:en,置信度 1.00,随后是若干行带起止时间的文字,每行一句,按说话顺序排列。注意 segments 是个生成器,必须被 for 循环遍历,转写才真正开始。
按你的硬件选档:
| 设备档次 | 建议配置 | 预期表现(base 模型) |
|---|---|---|
| 核显 / 纯 CPU | device="cpu", compute_type="int8" | 可用,长音频建议耐心排队 |
| 中端独显(4GB 显存) | device="cuda", compute_type="int8_float16" | 舒适,large-v2 也能跑 |
| 高端独显(8GB 显存) | device="cuda", compute_type="float16" | 接近实时,适合批量转写 |
三个容易忽略的实用技巧
逐词时间戳:字幕卡点对齐的关键
做字幕时最烦的就是"这句话的 0.5 秒里,到底哪个词在响"。
效果:每个词都带起止时间,逐词卡点不再是估算。
segments, _ = model.transcribe("video_audio.mp3", word_timestamps=True) for seg in segments: for w in seg.words: # 每行一个词 print(f"{w.start:.2f} {w.word}", end=" | ")适合:视频字幕制作、歌词对齐、口语语速分析等需要词级精度的活。
hotwords:让专有名词不再被写错
内部评审录音里,模型把公司项目代号"星舰"听成了"星空",反复改稿很浪费时间。
效果:把关键词塞进提示,识别时优先选这些词,专名错字明显减少。
segments, _ = model.transcribe( "meeting.mp3", language="zh", hotwords="星舰 青鸟 张一鸣", # 人名、产品名、内部黑话 )适合:行业术语密集的行业会议、医疗/法律访谈等错一个专名就不行的场景。
VAD 参数:长停顿不再切碎你的句子
录完一场带长段思考的访谈,输出里一句话被拦腰截成三四段,断点都在停顿的地方——这是静音过滤默认参数在"帮倒忙"。
效果:调大最小静音阈值,长停顿不再触发断句,句意保持完整。
segments, _ = model.transcribe( "interview.wav", vad_filter=True, vad_parameters=dict( min_silence_duration_ms=1500, # 停顿超 1.5 秒才断开 threshold=0.5, # 语音判定阈值,越低越灵敏 ), )适合:访谈、讲座、电话录音这类停顿多、但句子不该被拆碎的音频。全部参数默认值见 faster_whisper/vad.py。
我的实际工作流
播客出字幕:原始 MP3 → 16kHz 单声道(用 Audacity 转一下)→ faster-whisper 语音转文字 + word_timestamps → 逐行生成 SRT → 导入剪映或 Premiere 微调卡点。
会议文档:1 小时会议录音 → faster-whisper + hotwords(项目名、人名)→ 带时间戳的文字稿 → 按时间戳回听关键段,补上决策与待办。
什么情况下别用它
如果音频里背景音乐和说话声混在一起,比如街头采访或带 BGM 的短视频,识别结果会掺进幻觉文字。替代思路:先用 Audacity 或降噪工具把人声单独抽出来,再送进来转写。
如果你要的是"说话同时出字幕"的真·实时效果,这个工具本质是整段(或按窗口)离线处理的,别指望它毫秒级响应。替代思路:看看基于它的流式项目,如 WhisperLive、whisper-streaming 这类做实时包装的方案。
多人会议想分清"谁说了什么",它本身不做说话人分离。替代思路:搭配 pyannote.audio 或 WhisperX 做 diarization(说话人分离,即判断每句话是谁说的),再用它的词级时间戳去对齐。
速查
| 现象 | 大概率原因 | 处理动作 |
|---|---|---|
| 首次运行卡在模型下载 | 网络拉 Hugging Face 权重慢 | 手动下好模型目录,本地路径传给 WhisperModel |
| 显存/内存不足报错 | 模型过大或精度偏高 | 换 int8 量化或降级到 small、base 模型 |
| 语言检测成 null | 开头是静音或噪声,前 30 秒没听懂 | transcribe 里显式传 language="zh" |
| 长停顿处句子被切碎 | VAD 默认 2 秒静音就断开 | 调大 min_silence_duration_ms |
| 个别时间戳对不上口型 | 静音切分与边界修正的误差 | 加 word_timestamps=True 用词级时间戳 |
| 专名总是写错 | 训练语料里没有这个词 | 用 hotwords 参数喂关键词 |
收尾
faster-whisper 的价值一句话:本机离线、准确度和原版一致,速度 4 倍,内存更省。现在就能做的一件事——pip install faster-whisper,拿仓库里的 tests/data/jfk.flac 跑通第一个例子。先跑通,再谈调优。
【免费下载链接】faster-whisperFaster Whisper transcription with CTranslate2项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考