尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

faster-whisper:4 倍速的语音转写与识别 faster-whisper4 倍速的语音转写与识别【免费下载链接】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 步装依赖。一条命令搞定它会把 ctranslate24.x、avPyAV、onnxruntime 一起拉进来pip install faster-whisper注意Python 版本要求 3.9 及以上仓库 setup.py 里写死了python_requires3.93.8 的环境会直接报错。第 2 步装 GPU 依赖纯 CPU 可跳过。最新 ctranslate2 只认 CUDA 12 cuDNN 9pip install nvidia-cublas-cu12 nvidia-cudnn-cu129.*第 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, devicecuda, compute_typefloat16) segments, info model.transcribe(audio.mp3, beam_size5) 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_typeint8把权重量化到 8 位实测 same-precision 下推理时间几乎不变但内存减半large-v2 显存从 4.5GB 降到 2.9GB。第二把是批处理解码把多个 30 秒片段塞进同一个 batch 让 GPU 一次算完13 分钟音频从 63 秒压到 17 秒代价是显存涨到 6GB。两条容易忽略的依赖链音频侧看 audio.pyPyAV 打开容器 → 解码 audio stream → 重采样成 16kHz 单声道 s16 → 转 float32 交给 feature_extractor.py 用纯 numpy 算 80 维 log-Mel30 秒一块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_*.dll、cudnn64_*.dll拷进任意PATH目录。装完验证命令同 Linux。部署从单条转写切到批量管道这一步做完你应该看到同一个 13 分钟文件从单线程的 63 秒级压到 17 秒级且多个文件能并行处理。单条转写用WhisperModel.transcribe就够但服务化场景上BatchedInferencePipeline——它是 drop-in 替换接口一致默认就开着 VAD 过滤from faster_whisper import WhisperModel, BatchedInferencePipeline model WhisperModel(large-v3, devicecuda, compute_typefloat16) batched BatchedInferencePipeline(modelmodel) segments, info batched.transcribe(audio.mp3, batch_size16) 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_onlyTrue)。local_files_onlyTrue保证内网机器不会偷偷连外网。微调过的模型转格式。自训的 Transformers 权重可以用ct2-transformers-converter转成 CTranslate2 格式--quantization float16顺手量化转完直接当本地目录加载精度和原模型一致。调优三个参数决定 80% 的性能这一步做完你应该能在速度 / 显存 / 精度之间按自己机器的余量显式取舍而不是吃默认值。compute_type 怎么选Turing 架构起RTX 20 系以上用int8_float16量化速度收益最大显存宽裕想保精度就用float16Pascal 老卡GTX 10 系没有 Tensor Corefloat16 反而更慢直接用int8纯 CPU 就是int8或defaultfp32。batch_size 是显存换速度的旋钮large-v2 fp16 下batch 8 让 13 分钟音频从 63 秒到 17 秒显存 4.5GB → 6.1GB。8GB 卡建议 8164GB 卡保持单条或压到 4。VAD 参数按音频类型调默认只删 2 秒以上静音min_silence_duration_ms2000短停顿密集的对话可以收紧segments, _ batched.transcribe( meeting.mp3, vad_parametersdict(min_silence_duration_ms500, speech_pad_ms200), )CPU 部署记得设线程数WhisperModel(small, devicecpu, cpu_threads8)或者跑脚本前export OMP_NUM_THREADS8不设的话框架自己猜的线程数经常不优。想要逐词时间戳加word_timestampsTrue代价是每段多一次对齐计算。调优完跑在别的机器上就会撞上下面这批高频报错。踩坑实录这 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-cu129.* 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而ctranslate24.0不再兼容requirements.txt 锁的是ctranslate24.0,5。修复驱动暂时升不了就降库版本官方给的对应关系是——CUDA 11 cuDNN 8 降ctranslate23.24.0CUDA 12 cuDNN 8 降ctranslate24.4.0pip install --force-reinstall ctranslate23.24.0脚本跑完了但没有任何输出、没有进度条根因transcribe()返回的segments是生成器不迭代就一行不会算看起来像卡死或静默失败。修复把结果物化转写才会真正执行segments, _ model.transcribe(audio.mp3) segments list(segments) # 转写实际发生在这里CUDA out of memory根因batch 内片段数 × 模型大小超过了显存和 batch_size、compute_type 两个变量直接相关。修复按顺序试——先降batch_size16 → 8 → 4再切量化model WhisperModel(large-v3, devicecuda, compute_typeint8_float16)实测 large-v2 int8 比 fp16 省 1.6GB 显存精度损失在可感知范围内基本无感。长音频结尾反复输出同一句话根因静音段里模型幻觉condition_on_previous_textTrue默认又把错误文本喂回下一段 prompt错误被放大。修复开 VAD 过滤静音并给幻觉检测设阈值segments, _ model.transcribe( long_audio.mp4, vad_filterTrue, # 单条转写默认是关的必须显式开 hallucination_silence_threshold3.0, # 连续3秒无语音即判为幻觉 )用 distil-large-v3 蒸馏模型时官方建议直接condition_on_previous_textFalse连这个坑一起避开。报错处理完最后拿硬数据对比一下它和其他实现好决定你机器上该开哪档。横向对比同一条 13 分钟音频各家实测GPU 组large-v2RTX 3070 Ti 8GBCUDA 12.4beam5实现精度耗时显存openai/whisperfp162m23s4708MBtransformers (SDPA)fp161m52s4960MBfaster-whisperfp161m03s4525MBfaster-whisperbatch_size8fp1617s6090MBfaster-whisperint859s2926MBfaster-whisperbatch_size8int816s4500MBCPU 组small 模型i7-12700K 8 线程beam5实现精度耗时内存openai/whisperfp326m58s2335MBwhisper.cppfp322m05s1049MBfaster-whisperfp322m37s2257MBfaster-whisperint81m42s1477MBfaster-whisperbatch_size8int851s3608MB两个选机结论纯 CPU 且内存紧张int8 是比 fp32 更快的选择1m42s vs 2m37s内存还少 780MB有 8GB 显存的 GPUint8_float16 batch 8 是性价比顶点——16 秒转完 13 分钟音频显存 4.5GB还有富余。想再压时间看 distil-large-v3同 batch 16 下比 transformers 快 8 分钟25m50s vs 46m12sWER 还低 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_typeint8_float16复跑对比耗时与显存记下你机器的最优档换BatchedInferencePipelinebatch_size8~16验证长音频提速幅度开vad_filterTrue处理一段带长静音的会议录音确认没有幻觉重复下一步建议把模型预热到download_root固定目录并加local_files_onlyTrue做内网部署有自训权重就用转换器转成 CTranslate2 格式再上线需要说话人分离的场景在转写结果上叠 WhisperX 这类对齐工具别自己造轮子。【免费下载链接】faster-whisperFaster Whisper transcription with CTranslate2项目地址: https://gitcode.com/GitHub_Trending/fa/faster-whisper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表