faster-whisper:4 倍速的语音转写与识别
2026/9/5 16:49:54 网站建设 项目流程

faster-whisper:4 倍速的语音转写与识别

【免费下载链接】faster-whisperFaster Whisper transcription with CTranslate2项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper

一条 13 分钟的音频,用官方 Whisper 在 CPU 上要跑 6 分 58 秒,换成 faster-whisper(基于 CTranslate2 引擎的语音转写重实现)开 int8 量化只要 1 分 42 秒,内存占用还从 2.3GB 降到 1.5GB。这篇文章在 Linux + NVIDIA GPU 的机器上实测它,从 CUDA 12 依赖安装、批量转写部署到量化调优,全部给你可复现的命令和参数,读完能独立跑起生产级的转写服务。

快速上手:5 步跑通第一条转写结果

赶时间的话照这 5 步敲,先别管为什么快。

第 1 步,装依赖。一条命令搞定,它会把 ctranslate2(4.x)、av(PyAV)、onnxruntime 一起拉进来:

pip install faster-whisper

注意,Python 版本要求 3.9 及以上(仓库 setup.py 里写死了python_requires=">=3.9"),3.8 的环境会直接报错。

第 2 步,装 GPU 依赖(纯 CPU 可跳过)。最新 ctranslate2 只认 CUDA 12 + cuDNN 9:

pip install nvidia-cublas-cu12 "nvidia-cudnn-cu12==9.*"

第 3 步,准备一段音频。mp3、m4a、wav、flac 都行——它不需要你系统里装 FFmpeg,音频解码由 PyAV 内置的 FFmpeg 库完成。仓库测试目录里就有现成的 tests/data/jfk.flac 可以拿来试。

第 4 步,跑最小脚本:

from faster_whisper import WhisperModel # device 可以是 "cuda" / "cpu" / "auto" model = WhisperModel("base", device="cuda", compute_type="float16") segments, info = model.transcribe("audio.mp3", beam_size=5) print("语言: %s (%.2f)" % (info.language, info.language_probability)) for seg in segments: # 注意:迭代到这里才开始真正转写 print("[%.2fs -> %.2fs] %s" % (seg.start, seg.end, seg.text))

第 5 步,验证。终端先打印语言: en (0.99)之类的检测行,然后逐段输出带时间戳的文字。模型(默认 base)会在首次运行时自动从 Hugging Face Hub 下载,之后走缓存。

看到逐段时间戳刷出来,说明链路通了。跑通之后你多半会想知道:它凭什么比原版快这么多?

原理拆解:快的钱花在哪了

加速链路:CTranslate2 接住了 Whisper 的解码器

Whisper 是一个 encoder-decoder Transformer,原版实现用 PyTorch 跑 decoder,每一步自回归生成都走一遍完整前向,CPU 上特别亏。faster-whisper 的 转写主逻辑 把整个模型转成 CTranslate2 的私有格式后,推理全部交给 CTranslate2 的 C++ 引擎:KV 缓存、算子融合、batched 解码都在这层完成,Python 侧只负责切音频、喂 mel 特征、处理时间戳 token。

再往上叠两把刀:

第一把是量化compute_type="int8"把权重量化到 8 位,实测 same-precision 下推理时间几乎不变但内存减半(large-v2 显存从 4.5GB 降到 2.9GB)。第二把是批处理解码:把多个 30 秒片段塞进同一个 batch 让 GPU 一次算完,13 分钟音频从 63 秒压到 17 秒,代价是显存涨到 6GB。

两条容易忽略的依赖链

音频侧看 audio.py:PyAV 打开容器 → 解码 audio stream → 重采样成 16kHz 单声道 s16 → 转 float32 交给 feature_extractor.py 用纯 numpy 算 80 维 log-Mel(30 秒一块,pad 到 3000 帧)。整条链路没有任何系统级 FFmpeg 调用,这就是"免 FFmpeg"的来源,也意味着你机器上有没有 ffmpeg 完全不影响运行

静音侧看 vad.py:内置 Silero VAD 的 ONNX 模型(assets 目录 里那个 onnx 文件),按 512 样本一窗扫全音频,把超过 2 秒的静音段整块剔除再送进模型——长音频里大量 BGM、留白全被跳过,既省时又减少模型对着静音"硬编"出幻觉文本的概率。

原理清楚了,下面把它当成服务部署起来。跑部署流程之前,每一步做完你都应该能对着验证命令自检。

深度实操:配置 → 部署 → 调优

配置:让 ctranslate2 找到 cuBLAS 和 cuDNN

这一步做完,你应该看到python -c "import ctranslate2; print(ctranslate2.get_cuda_device_count())"输出设备数(比如1)而不是抛错。

三种装法按省事程度排:

Linux + pip(最省事):上一条装完库之后,还差一步让动态库可被找到——LD_LIBRARY_PATH必须在启动 Python 之前设好,这步别跳:

export LD_LIBRARY_PATH=$(python3 -c \ 'import os,nvidia.cublas.lib,nvidia.cudnn.lib; \ print(os.path.dirname(nvidia.cublas.lib.__file__) + ":" + \ os.path.dirname(nvidia.cudnn.lib.__file__))')

写进~/.bashrc就不用每次手动导了。

Docker(最干净):nvidia/cuda:12.3.2-cudnn9-runtime-ubuntu22.04镜像,cuBLAS/cuDNN 9 已经在里面,直接pip install faster-whisper开跑。仓库自带的 docker/ 目录(Dockerfile + infer.py)就是这个用法的最小示例,加载 tiny 模型转一条 flac,可以直接拿来当冒烟测试。

Windows 手动拷库:从 NVIDIA 官网下 cuBLAS 和 cuDNN 9 for CUDA 12 的运行时包,把cublas64_*.dllcudnn64_*.dll拷进任意PATH目录。装完验证命令同 Linux。

部署:从单条转写切到批量管道

这一步做完,你应该看到同一个 13 分钟文件从单线程的 63 秒级压到 17 秒级,且多个文件能并行处理。

单条转写用WhisperModel.transcribe就够,但服务化场景上BatchedInferencePipeline——它是 drop-in 替换,接口一致,默认就开着 VAD 过滤:

from faster_whisper import WhisperModel, BatchedInferencePipeline model = WhisperModel("large-v3", device="cuda", compute_type="float16") batched = BatchedInferencePipeline(model=model) segments, info = batched.transcribe("audio.mp3", batch_size=16) for seg in segments: print("[%.2fs -> %.2fs] %s" % (seg.start, seg.end, seg.text))

两个部署细节:

  • 模型落本地。生产环境别指望首次调用去下载几 GB 的权重。先用download_model("large-v3", output_dir="/opt/models")预热,或直接把路径传进去:WhisperModel("/opt/models/large-v3-ct2", local_files_only=True)local_files_only=True保证内网机器不会偷偷连外网。
  • 微调过的模型转格式。自训的 Transformers 权重可以用ct2-transformers-converter转成 CTranslate2 格式(--quantization float16顺手量化),转完直接当本地目录加载,精度和原模型一致。

调优:三个参数决定 80% 的性能

这一步做完,你应该能在"速度 / 显存 / 精度"之间按自己机器的余量显式取舍,而不是吃默认值。

compute_type 怎么选:Turing 架构起(RTX 20 系以上)用int8_float16,量化速度收益最大;显存宽裕想保精度就用float16;Pascal 老卡(GTX 10 系)没有 Tensor Core,float16 反而更慢,直接用int8;纯 CPU 就是int8default(fp32)。

batch_size 是显存换速度的旋钮:large-v2 fp16 下,batch 8 让 13 分钟音频从 63 秒到 17 秒,显存 4.5GB → 6.1GB。8GB 卡建议 8~16,4GB 卡保持单条或压到 4。

VAD 参数按音频类型调:默认只删 2 秒以上静音(min_silence_duration_ms=2000),短停顿密集的对话可以收紧:

segments, _ = batched.transcribe( "meeting.mp3", vad_parameters=dict(min_silence_duration_ms=500, speech_pad_ms=200), )

CPU 部署记得设线程数:WhisperModel("small", device="cpu", cpu_threads=8),或者跑脚本前export OMP_NUM_THREADS=8,不设的话框架自己猜的线程数经常不优。想要逐词时间戳加word_timestamps=True,代价是每段多一次对齐计算。

调优完跑在别的机器上,就会撞上下面这批高频报错。

踩坑实录:这 5 个报错按三段式修

ImportError: libcudnn.so.9 / cuDNN not found

  • 根因:ctranslate2 4.x 只捆绑 CUDA 12 运行时,cuDNN 9 必须你自己提供,没装或LD_LIBRARY_PATH没导。
  • 修复
pip install nvidia-cublas-cu12 "nvidia-cudnn-cu12==9.*" export LD_LIBRARY_PATH=$(python3 -c \ 'import os,nvidia.cublas.lib,nvidia.cudnn.lib; \ print(os.path.dirname(nvidia.cublas.lib.__file__) + ":" + \ os.path.dirname(nvidia.cudnn.lib.__file__))')

Failed to load ctranslate2 / CUDA 版本不匹配

  • 根因:你的环境还是 CUDA 11 或 cuDNN 8,而ctranslate2>=4.0不再兼容(requirements.txt 锁的是ctranslate2>=4.0,<5)。
  • 修复:驱动暂时升不了就降库版本,官方给的对应关系是——CUDA 11 + cuDNN 8 降ctranslate2==3.24.0;CUDA 12 + cuDNN 8 降ctranslate2==4.4.0
pip install --force-reinstall ctranslate2==3.24.0

脚本"跑完"了但没有任何输出、没有进度条

  • 根因transcribe()返回的segments是生成器,不迭代就一行不会算,看起来像卡死或静默失败。
  • 修复:把结果物化,转写才会真正执行:
segments, _ = model.transcribe("audio.mp3") segments = list(segments) # 转写实际发生在这里

CUDA out of memory

  • 根因:batch 内片段数 × 模型大小超过了显存,和 batch_size、compute_type 两个变量直接相关。
  • 修复:按顺序试——先降batch_size(16 → 8 → 4),再切量化:
model = WhisperModel("large-v3", device="cuda", compute_type="int8_float16")

实测 large-v2 int8 比 fp16 省 1.6GB 显存,精度损失在可感知范围内基本无感。

长音频结尾反复输出同一句话

  • 根因:静音段里模型"幻觉",condition_on_previous_text=True(默认)又把错误文本喂回下一段 prompt,错误被放大。
  • 修复:开 VAD 过滤静音,并给幻觉检测设阈值:
segments, _ = model.transcribe( "long_audio.mp4", vad_filter=True, # 单条转写默认是关的,必须显式开 hallucination_silence_threshold=3.0, # 连续3秒无语音即判为幻觉 )

用 distil-large-v3 蒸馏模型时,官方建议直接condition_on_previous_text=False,连这个坑一起避开。

报错处理完,最后拿硬数据对比一下它和其他实现,好决定你机器上该开哪档。

横向对比:同一条 13 分钟音频,各家实测

GPU 组(large-v2,RTX 3070 Ti 8GB,CUDA 12.4,beam=5):

实现精度耗时显存
openai/whisperfp162m23s4708MB
transformers (SDPA)fp161m52s4960MB
faster-whisperfp161m03s4525MB
faster-whisper(batch_size=8)fp1617s6090MB
faster-whisperint859s2926MB
faster-whisper(batch_size=8)int816s4500MB

CPU 组(small 模型,i7-12700K 8 线程,beam=5):

实现精度耗时内存
openai/whisperfp326m58s2335MB
whisper.cppfp322m05s1049MB
faster-whisperfp322m37s2257MB
faster-whisperint81m42s1477MB
faster-whisper(batch_size=8)int851s3608MB

两个选机结论:纯 CPU 且内存紧张,int8 是比 fp32 更快的选择(1m42s vs 2m37s,内存还少 780MB);有 8GB 显存的 GPU,int8_float16+ batch 8 是性价比顶点——16 秒转完 13 分钟音频,显存 4.5GB,还有富余。想再压时间,看 distil-large-v3:同 batch 16 下比 transformers 快 8 分钟(25m50s vs 46m12s),WER 还低 1.3 个点。

行动清单

  • pip install faster-whisper装好,python -c "from faster_whisper import WhisperModel"无报错
  • GPU 环境:cuBLAS/cuDNN 9 就位,ctranslate2.get_cuda_device_count()返回正确设备数
  • 用 tests/data/ 里的样本音频跑通一条 fp16 转写,核对时间戳合理
  • compute_type="int8_float16"复跑,对比耗时与显存,记下你机器的最优档
  • BatchedInferencePipeline+batch_size=8~16,验证长音频提速幅度
  • vad_filter=True处理一段带长静音的会议录音,确认没有幻觉重复

下一步建议:把模型预热到download_root固定目录并加local_files_only=True做内网部署;有自训权重就用转换器转成 CTranslate2 格式再上线;需要说话人分离的场景,在转写结果上叠 WhisperX 这类对齐工具,别自己造轮子。

【免费下载链接】faster-whisperFaster Whisper transcription with CTranslate2项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询