跳到主要内容

语音识别 ASR

Faster-Whisper 私有化部署:4,525MB 显存就能跑满 large-v3

SYSTRAN 用 CTranslate2 把 OpenAI Whisper 重写了一遍,同样的精度快到四倍、显存还更省。这页把 faster-whisper 1.2.1 真正要吃多少显存、该配哪张卡、以及自建时一定会踩的那几个坑,一次说清楚。

faster-whisper 不是又一个 Whisper 套壳。它是 SYSTRAN 基于 CTranslate2 推理引擎对 OpenAI Whisper 的完整重实现,官方给出的定位是「在同等精度下比 openai/whisper 快最多四倍,同时占用更少内存」。仓库地址是 github.com/SYSTRAN/faster-whisper,MIT 协议,PyPI 上最新的稳定版本是 1.2.1。装它甚至不需要系统里有 FFmpeg——音频解码走 PyAV,FFmpeg 的动态库已经打包在 wheel 里了。

真正让它在 2025 年之后重新变成默认选择的,是 1.1.0 引入的 BatchedInferencePipeline:一行代码换成批量管线,官方 benchmark 里 13 分钟音频的转写时间从 1 分 03 秒掉到 17 秒。之后 1.1.1 修掉了 VAD 吃爆内存导致的 OOM,1.2.0 加上了 distil-large-v3.5 支持和批量转写里的静音剔除,1.2.1 把 Silero-VAD 升到了 V6 并修掉了批量管线里冒出 <|nocaptions|> token 的老毛病。搜「faster-whisper 本地部署」的人多半是被 openai-whisper 的速度劝退过来的,这条路径是对的。

显存这件事上,faster-whisper 的门槛低到有点反直觉。1550M 参数的 large-v3 权重文件只有 3.09GB,官方在一块 RTX 3070 Ti 8GB 上实测 fp16 顺序解码峰值 4,525MB、int8 峰值 2,926MB。换句话说,一张 24GB 的消费级卡不是「勉强够跑」,而是「够跑三四路并发还剩空间」。真正卡住自建的从来不是显存,是 CUDA 12 + cuDNN 9 那套依赖,和 VAD 参数没调好导致的漏句与重复。这两件事下面都讲。

01 —

能跑哪些模型,各要多少显存

faster-whisper 直接加载 CTranslate2 格式权重;下面的权重体积是 Hugging Face 上 model.bin 的实际字节数,峰值显存是官方 benchmark 的实测值

版本参数量显存上下文说明
large-v3(Systran/faster-whisper-large-v3)1550Mfp16 权重 3.09GB/实测峰值 4,525MB;int8 峰值 2,926MB;batch_size=8 时 fp16 6,090MB、int8 4,500MB30 秒窗口 · 448 token · 100 语种多语种精度上限,也是中文长音频转写的默认选择。HF 上月下载量 118 万次,生态里几乎所有下游项目都默认拉它。
large-v3-turbo(deepdml/faster-whisper-large-v3-turbo-ct2)809Mfp16 权重 1.62GB,显著低于 large-v3 的 3.09GB30 秒窗口 · 448 token · 99 语种解码层从 32 层剪到 4 层,编码器不动。OpenAI 自己的说法是「快很多,代价是轻微的质量下降」。要低延迟又不想丢多语种能力,选它。faster-whisper 从 1.1.0 起原生支持。
distil-large-v3.5(distil-whisper/distil-large-v3.5-ct2)756Mfp16 权重 1.51GB30 秒窗口 · 仅英文faster-whisper 1.2.0 新增支持。相对实时率约为 large-v3-turbo 的 1.46 倍,短音频域外 WER 7.08%、长音频 11.39%。纯英文场景的性价比之王,也可以当 large-v3 投机解码的草稿模型用。中文用不了。
large-v2(Systran/faster-whisper-large-v2)1550M与 large-v3 同规模:fp16 峰值 4,525MB、int8 峰值 2,926MB(官方 benchmark 即以此模型测得)30 秒窗口 · 99 语种别急着跳过。仓库里「Whisper-v3 worse than v2」的 issue 攒了二十多条讨论,部分语种和口音上 v2 反而更稳。上生产前拿自己的音频对比一轮,成本只有几分钟卡时。
medium / small / base / tiny769M / 244M / 74M / 39Mfp16 权重 1.53GB / 0.48GB / 约 0.15GB / 约 0.08GB30 秒窗口 · 99 语种medium 在很多中文场景下已经够用且快得多;small 及以下适合做关键词唤醒、语种识别预筛或超大规模粗筛,再把可疑片段丢给 large-v3 复核。

02 —

该租哪张卡

按 CTranslate2 的 compute_type 支持情况和实测显存峰值来挑,不多给也不少给

  • large-v3 fp16 批量转写长音频,成本优先

    RTX 3090 24GB$0.193/卡·时

    batch_size=8 的 fp16 峰值是 6,090MB,24GB 塞得下三到四个 worker 同时跑;Ampere 计算能力 8.6,fp16、bf16、int8 全支持,不会触发 CTranslate2 的类型回退。

  • 实时字幕 / 会议转写,延迟优先,跑 large-v3-turbo 或 distil-large-v3.5

    RTX 4090 24GB$0.540/卡·时

    turbo 权重只有 1.62GB,瓶颈完全在时钟和显存带宽而不是容量,4090 把单请求首字延迟压得最低。

  • int8 量化稳定跑批,把单位音频成本压到最低

    Tesla T4 16GB$0.298/卡·时

    int8 峰值 2,926MB,16GB 绰绰有余;Turing 计算能力 7.5 带原生 INT8 张量核,正好吃满 CTranslate2 的 int8_float16 路径。

  • 转写 + 强制对齐 + 说话人分离一条流水线(WhisperX / whisper-diarization)

    RTX A6000 48GB$0.817/卡·时

    48GB 能让 large-v3、wav2vec2 对齐模型和 pyannote 分离模型常驻同一张卡,省掉反复加载卸载,并发路数还能再翻一倍。

03 —

四步跑起来

在 NexGPU 上从开机到对外提供 OpenAI 兼容接口,实际耗时不到十分钟

  1. 01

    开一台带 CUDA 12 的实例,装 faster-whisper

    控制台里挑 PyTorch 或 Ubuntu CLI 预置镜像(2,000+ 个镜像里也有现成的 Whisper ASR 镜像),SSH 进去直接 pip。Python 3.9 以上即可,不需要另外装 FFmpeg——PyAV 已经把 FFmpeg 的库带进来了。

    pip install faster-whisper==1.2.1
  2. 02

    补齐 cuBLAS 与 cuDNN 9

    这一步是自建 faster-whisper 唯一真正会翻车的地方。CTranslate2 的新版本只认 CUDA 12 + cuDNN 9。如果你的环境是 CUDA 12 + cuDNN 8,把 ctranslate2 降到 4.4.0;如果是 CUDA 11 + cuDNN 8,降到 3.24.0。走 Docker 的话直接用 nvidia/cuda:12.3.2-cudnn9-runtime-ubuntu22.04 做基础镜像,省事。注意 LD_LIBRARY_PATH 必须在启动 Python 之前设好。

    pip install nvidia-cublas-cu12 nvidia-cudnn-cu12==9.*
    export LD_LIBRARY_PATH=`python3 -c 'import os; import nvidia.cublas.lib; import nvidia.cudnn.lib; print(os.path.dirname(nvidia.cublas.lib.__file__) + ":" + os.path.dirname(nvidia.cudnn.lib.__file__))'`
  3. 03

    用批量管线跑第一段音频

    别用最朴素的 model.transcribe 就下结论。BatchedInferencePipeline 是 1.1.0 引入的直接替换品,官方口径快四倍。还有一点必须记住:segments 是生成器,你不去迭代它,转写根本不会开始——很多人第一次跑觉得「瞬间返回、什么也没发生」就是栽在这。

    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, vad_filter=True, language="zh")
    for s in segments:
        print("[%.2fs -> %.2fs] %s" % (s.start, s.end, s.text))
  4. 04

    对外暴露 OpenAI 兼容的转写接口

    官方社区集成里的 speaches(MIT 协议)用 faster-whisper 做后端,提供与 OpenAI 完全兼容的接口,还支持 SSE 流式返回边转边推。业务侧原来调 OpenAI 的 SDK 一行不用改,把 base_url 指到你这台实例就行。要做实时流式则换 WhisperLive 或 Whisper-Streaming,要说话人分离就上 WhisperX。

    git clone https://github.com/speaches-ai/speaches && cd speaches
    docker compose --file compose.cuda.yaml up --detach

算一笔真账:1,000 小时音频要花多少

官方 benchmark 的口径很实在:13 分钟音频、large-v2、beam_size=5、batch_size=8、fp16,在一块 RTX 3070 Ti 8GB 上 17 秒跑完,也就是约 45.9 倍实时(780 ÷ 17 ≈ 45.9)。NexGPU 的 RTX 3090 24GB 是同代规格更高的 GA102,把 45.9 倍当保守下限并不过分。按 $0.193/卡·时 算:一个卡时约等于 45.9 小时音频,转写 1,000 小时音频 ≈ 1000 ÷ 45.9 ≈ 21.8 卡时,21.8 × $0.193 ≈ $4.21,折合每小时音频 0.42 美分。同一批活换到 RTX 4090 24GB($0.540/卡·时),即便还按 45.9 倍这个偏低的系数算也只要 21.8 × $0.540 ≈ $11.77,而 4090 实际只会更快,所以这是上限不是下限。模型缓存要不要留在持久盘?large-v3 的 model.bin 是 3.09GB,按 $0.414/GB·月 的中位价算约 $1.28/月;不留的话每次开机重新从 Hugging Face 拉一遍,也就几分钟的事。计费按秒走、按小时报价,17 秒的活就收 17 秒的钱,没有起步价、没有开通费、不用申请配额;实例一停算力就停止计费,只有存储会一直计到你销毁它为止。

04 —

常见问题

faster-whisper 跑 large-v3 到底需要多大显存?8GB 够不够?

够,而且官方 benchmark 本身就是在一块 RTX 3070 Ti 8GB 上做的:fp16 顺序解码峰值 4,525MB,int8 峰值 2,926MB。只有开 batch_size=8 时 fp16 会顶到 6,090MB,8GB 就有点紧。但显存不是你该省的地方——8GB 卡跑起来慢,而 NexGPU 的 RTX 3090 24GB 只要 $0.193/卡·时,多出来的 16GB 让你能同时开三四路并发,单位音频成本反而更低。

large-v3、large-v3-turbo、distil-large-v3.5 中文场景该选哪个?

中文只在 large-v3 和 large-v3-turbo 之间选,distil-large-v3.5 是纯英文模型,别浪费时间。追求精度上限用 large-v3(1550M,100 语种);追求延迟用 turbo(809M,解码层 32 剪到 4)。另外认真建议拿 large-v2 一起对比一轮,仓库里关于 v3 在部分语种上不如 v2 的讨论一直没停。在 NexGPU 上开一台 RTX 4090,三个模型跑同一批音频对比完,花掉的钱大概是一杯咖啡的零头。

报错 Could not locate cudnn_ops64_9.dll / libcudnn_ops.so.9 怎么办?

这是 faster-whisper issue 区排名最靠前的一类问题,根因就一个:CTranslate2 4.5.0 及以后只支持 cuDNN 9(需要 CUDA 12.3 以上)。对照关系是——PyTorch cu121 配 ctranslate2 ≤ 4.4.0,PyTorch cu124 或 2.4.0 以上配 ctranslate2 ≥ 4.5.0。Linux 上 pip 装完 nvidia-cudnn-cu12 后一定要在启动 Python 前 export LD_LIBRARY_PATH;Windows 可以用 Purfview 的 whisper-standalone-win 打包好的库。在 NexGPU 上直接选 CUDA 12 的预置镜像,这一整段问题从一开始就不存在。

转写结果出现重复循环、幻听、或者整段被漏掉,怎么修?

先开 vad_filter=True,Silero-VAD 在 1.2.1 里已升到 V6,默认会剔掉超过 2 秒的静音——大部分「对着空白音频编内容」都是这么来的。重复循环则调 condition_on_previous_text=False。如果你用的是 BatchedInferencePipeline 又遇到中途切语种、整段丢失,社区里确实有未关闭的质量退化 issue,先固定 language 参数别让它自动检测,必要时退回顺序解码做对照。这类调参本来就要跑几十遍,NexGPU 按秒计费,跑坏了停掉就不再计算力费用。

一张卡能跑几路并发?要不要上多卡?

先把单卡吃满再说多卡。int8 + batch_size=8 峰值 4,500MB,24GB 卡理论上能开五路,留点余量按三到四路规划最稳。CTranslate2 本身还有 num_workers 参数做卡内并行。真需要横向扩的时候,NexGPU 单节点最多 14 张 GPU、节点最大显存 2,152GB,全网 2,498 张卡分布在 51 个国家和地区的 1,175 个可租节点上,扩到多少路都不用排队申请配额。

我能不能就拿 CPU 跑,反正 faster-whisper 也支持 int8 CPU?

小模型短音频可以。但官方 CPU benchmark 里 small 模型 int8 + batch_size=8 转 13 分钟音频要 51 秒,而同样 13 分钟音频在 GPU 上跑 large-v2 只要 17 秒——模型大了七倍、速度还快三倍。真正的分水岭是量:一天几十条录音,CPU 无所谓;一天几百上千小时,CPU 方案的电费和等待时间都比租卡贵。NexGPU 的 Tesla V100 32GB 只要 $0.188/卡·时,比大多数人自己那台机器的折旧还便宜,SSH、Jupyter、Web 终端、REST API 和 CLI 都开着,Telegram 上有中英双语支持,不用排工单。

开始使用 NexGPU

无论你是企业研发团队还是独立开发者,都可以在几分钟内跑起第一个任务。

注册即可浏览全网实时价格,无需绑定支付方式。