13 分钟音频 59 秒转完:faster-whisper 语音转文字从安装到调参实践指南
【免费下载链接】faster-whisperFaster Whisper transcription with CTranslate2项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper
如果你需要把会议录音、讲座或播客转成文字,这篇文章适合你。faster-whisper 是基于 CTranslate2 推理引擎的 Whisper 语音转文字实现,官方基准中同精度下速度可达原版的最高 4 倍,且占用更少内存。读完你能完成四件事:在本地跑通第一段转录、给视频产出逐词时间戳、批量处理整个音频文件夹,并按排错手册解决安装与性能问题。文中所有性能数据均来自仓库 README 的基准测试(测试口径见下文)。
五分钟快速上手:安装 faster-whisper 并跑通第一段转录
目标:5 分钟内从空环境拿到第一条带时间戳的转录结果。
环境要求:Python 3.9 及以上。音频解码由依赖包 PyAV 完成,无需在系统里另装 FFmpeg。
pip install faster-whisper然后运行最小示例(audio.mp3换成你的音频路径即可):
from faster_whisper import WhisperModel model = WhisperModel("tiny", device="cpu", compute_type="int8") segments, info = model.transcribe("audio.mp3") print(f"语言: {info.language}(概率 {info.language_probability:.2f})") for segment in segments: print(f"[{segment.start:.2f}s -> {segment.end:.2f}s] {segment.text}")这段代码做了什么:WhisperModel按模型名自动下载并加载 CTranslate2 权重,transcribe返回音频信息和分段结果;tiny是最小档位,用于先验证流程,后续可换成更大模型。注意segments是生成器,真正开始转录是在你遍历它的 for 循环(或执行list(segments))那一刻。
示意输出(实际内容取决于你的音频):
语言: en(概率 0.99) [0.00s -> 5.49s] And so my fellow Americans...转录会议录音:用 VAD 过滤静音片段
场景:一小时会议里夹杂大量停顿,先去掉无声部分再解码,省时并减少乱码。
segments, _ = model.transcribe( "meeting.m4a", vad_filter=True, vad_parameters=dict(min_silence_duration_ms=500), )这段代码做了什么:vad_filter=True启用内置的 Silero VAD 检测器。它的默认行为偏保守,只过滤超过 2 秒的静音;如果你把min_silence_duration_ms调小,短停顿也会被切掉。各参数的完整含义见 faster_whisper/vad.py。
给视频做逐词字幕:word_timestamps 用法
场景:做字幕或时间轴对齐,需要每个词自己的起止时间。
segments, _ = model.transcribe("lecture.mp3", word_timestamps=True) for segment in segments: for word in segment.words: print(f"[{word.start:.2f}s -> {word.end:.2f}s] {word.word}")这段代码做了什么:开启逐词时间戳后,每个 segment 额外携带words列表,输出即为 (start, end, word) 三元组,可直接映射为 SRT 等字幕格式。如果只需要上一节那种段落级时间戳,不要开这个参数,速度更快。
批量处理一个音频文件夹
场景:目录里有一批录音,要一次性出文稿。模型加载是固定开销,正确做法是只加载一次,在循环里只调用transcribe:
import os from faster_whisper import WhisperModel model = WhisperModel("small", device="cpu", compute_type="int8") for name in sorted(os.listdir("recordings")): if name.endswith((".mp3", ".m4a", ".wav")): segments, _ = model.transcribe(os.path.join("recordings", name)) print("==", name) for segment in segments: print(f"{segment.start:.2f}\t{segment.text}")把recordings换成你的目录即可;有 GPU 时把device/compute_type换回cuda/float16。
长音频加速:批量推理 pipeline
场景:单条长音频在 GPU 上仍嫌慢。仓库提供了BatchedInferencePipeline作为transcribe的替代入口,README 基准中 13 分钟音频在 int8、batch_size=8下约 16 秒完成(NVIDIA RTX 3070 Ti 8GB,CUDA 12.4)。
from faster_whisper import WhisperModel, BatchedInferencePipeline model = WhisperModel("turbo", device="cuda", compute_type="float16") batched = BatchedInferencePipeline(model) segments, info = batched.transcribe("audio.mp3", batch_size=16)批量推理路径默认已开启 VAD 过滤,长音频可少写一个参数。
⚙️ GPU / CPU 模型大小与计算类型怎么选
本节给出选型逻辑和参数背后的原因,所有数据来自 README 基准(GPU:RTX 3070 Ti 8GB、CUDA 12.4;CPU:Intel Core i7-12700K、8 线程)。
| 硬件 | 推荐配置 | 依据 |
|---|---|---|
| NVIDIA GPU,显存充裕 | large-v3 / turbo + float16 | 13 分钟音频 1m03s,显存 4525MB(large-v2,beam_size=5) |
| NVIDIA GPU,显存紧张 | int8_float16 | 同基准下 59s,显存降到 2926MB |
| 无 GPU | small + int8(实时场景用 tiny) | small 模型 13 分钟音频:fp32 需 2m37s,int8 为 1m42s |
选型原则:先按硬件定compute_type,再按内存余量定模型档位;int8 量化在 CPU 和 GPU 上都能进一步压缩占用(README 结论)。
beam_size 为什么默认是 5
transcribe的beam_size默认值为 5。README 专门提醒:与其他 Whisper 实现横向对比时必须固定该参数(openai/whisper 的默认是 1)。调大更稳但更慢,追求速度可降到 1。
其他值得动的参数
initial_prompt:提供领域上下文文本,用于压低专有名词的误识别率。hotwords:faster_whisper/transcribe.py 中TranscriptionOptions定义的热词字段,处理特定领域术语时可关注。condition_on_previous_text:是否让当前片段参考上文解码,distil 系列官方示例中显式关闭了它,长文本场景注意这个开关。
🔍 排错手册
按安装、性能、精度三组排查,每条按"现象—可能原因—解决办法"给出。
安装类
- 现象:初始化 GPU 报 CUDA 相关错误。可能原因:最新版 ctranslate2 只支持 CUDA 12 + cuDNN 9。解决:安装 CUDA 12 的 cuBLAS 与 cuDNN 9;CUDA 11 环境执行
pip install --force-reinstall ctranslate2==3.24.0,CUDA 12 + cuDNN 8 环境执行pip install --force-reinstall ctranslate2==4.4.0。 - 现象:import 报 Python 版本错误。可能原因:版本低于 3.9。解决:升级到 Python 3.9 及以上。
性能类
- 现象:CPU 转录很慢。可能原因:使用 fp32 或线程数未受控。解决:
compute_type换 int8;运行时用环境变量控制线程,如OMP_NUM_THREADS=4 python3 my_script.py。 - 现象:GPU 显存不足。可能原因:float16 下大模型偏大。解决:换 int8_float16,或改用更小模型。
精度类
- 现象:专有名词、领域术语识别错。解决:用
initial_prompt提供上下文,或关注TranscriptionOptions的hotwords字段。 - 现象:出现重复文本或幻觉。解决:调整
condition_on_previous_text与temperatures重试策略,完整选项集见 faster_whisper/transcribe.py。
进阶入口
- 转换自训或第三方模型:先
pip install "transformers[torch]>=4.23",再用ct2-transformers-converter转换,完整命令与--copy_files、--quantization参数说明见 README.md 的 "Model conversion" 一节;转换出的本地目录可直接传给WhisperModel加载。 - 批量推理与 distil-large-v3 的用法细节,同样见 README.md 对应小节。
- 想复现本文引用的基准数据,可运行仓库自带的 benchmark/speed_benchmark.py。
- 需要观察解码细节时,用
logging.getLogger("faster_whisper").setLevel(logging.DEBUG)打开调试日志。
faster-whisper 覆盖的是离线批量转录这条主线;实时与多说话人需求,README 的 "Community integrations" 一节列出了基于它的成熟方案。三个后续方向供参考:
- 说话人分离:WhisperX、whisper-diarize 等项目在 faster-whisper 之上补了 diarization 能力。
- 近似实时转写:Whisper-Streaming、WhisperLive 以 faster-whisper 为后端的流式方案。
- 自训模型接入:把微调权重转成 CTranslate2 格式后按上文加载,即可复用整套流水线。
【免费下载链接】faster-whisperFaster Whisper transcription with CTranslate2项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考