跳到主要内容

语音识别模型

Vosk 本地部署:从 41.9MB 小模型到 CUDA 批量解码的完整私有化方案

Vosk 是 Alpha Cephei 基于 Kaldi 做的离线流式语音识别引擎,Apache 2.0,20 多种语言,模型下载下来就能跑,不联网、不上传、不按分钟计费。它跟 Transformer 系的 ASR 完全是两套逻辑——先看清楚这一点,再决定你到底要不要一张卡。

先说最容易被搜索结果误导的一件事:Vosk 本身不需要 GPU。官方模型页写得很直白,小模型(比如中文的 vosk-model-small-cn-0.22,41.9MB)运行时大约只占 300MB 内存,树莓派和手机上都在跑;大模型(vosk-model-cn-0.22,1.3GB;英文 vosk-model-en-us-0.22,1.8GB)因为要做 CARPA 重打分,官方建议按最多 16GB 内存准备——注意是内存不是显存。所以「Vosk 需要多大显存」这个问题的诚实答案是:默认路线一张显卡都不需要,解码全在 CPU 上。

那什么时候真的要卡?三种情况。第一,你有几千小时的存量音频要转写,这时候走 vosk-api 的 CUDA 批量解码——BatchModel / BatchRecognizer / GpuInit 这一套包的是 Kaldi 的 cudafeat + cudadecoder,源码里默认 max_batch_size=32、num_channels=600、use_gpu_feature_extraction=true,一张卡同时喂几十路音频,吞吐跟 CPU 逐路解码完全不是一个量级。第二,Vosk 的原始输出没有标点也没有大小写,要接 recasepunc 做恢复,而 recasepunc 的英文模型 1.6GB、是个 BERT,放 GPU 上才顺。第三,你要在同一台机器上把 Vosk 和 faster-whisper 摆在一起做 A/B——这是绝大多数团队真正该花的那笔钱。

还有几个自建时一定会撞上的坑,提前说清楚:官方至今没有发布带 GPU 的 pip 包(vosk-api 仓库里 #1287「Package vosk with GPU support」还开着),CUDA 路线必须自己按 Dockerfile.kaldi-vosk-server-gpu 从源码编译;PyPI 上的 vosk 停在 0.3.45(2022-12),而 GitHub 的 tag 已经到 v0.3.50,主干提交一路更新到 2026 年 8 月,端点检测、ITN、Golang GPU Batch API 这些新东西 pip 装不到;官方 GPU 镜像只有英文的 alphacep/kaldi-en-gpu,中文要照着 Dockerfile 换 MODEL_VERSION 自己 build;GPU 服务默认 VOSK_SAMPLE_RATE=8000,你拿 16kHz 的模型直接连上去,出来的就是一堆乱码。这些都不是玄学,是可以在 NexGPU 上租一小时把它们逐个跑通的事。

01 —

Vosk 官方模型:现役版本与真实资源占用

官方模型列表里共 131 个条目,其中大部分已标记 obsolete;下面只列还在维护的那几个,WER/CER 数字全部取自 alphacephei.com 官方表格。

版本参数量显存上下文说明
vosk-model-small-cn-0.22小模型 / Kaldi nnet3 chain无需显存;运行时约 300MB 内存16kHz 单声道流式,词表可运行时替换中文端侧首选,41.9MB。CER 23.54(SpeechIO-02)、38.29(SpeechIO-06)、17.15(THCHS)。支持 SetGrammar 动态词表,适合命令词、数字串、固定话术场景。
vosk-model-cn-0.22大模型 / 带 CARPA 重打分CPU 路线按 16GB 内存准备;GPU 批量解码走 16GB 级显卡16kHz 单声道流式,词表静态不可改1.3GB,目前唯一在维护的中文服务端大模型。CER 13.98(SpeechIO-02)、27.30(SpeechIO-06)、7.43(THCHS)。朗读体和干净录音很稳,远场、口音重的会场音频会明显掉。
vosk-model-small-en-us-0.15小模型 / Kaldi nnet3 chain无需显存;运行时约 300MB 内存16kHz 单声道流式,支持动态词表39.3MB,Android 与树莓派上的标配。WER 9.85(librispeech test-clean)、10.38(tedlium)。做唤醒后指令识别、IVR 按键替代基本够用。
vosk-model-en-us-0.22 / -lgraph大模型 1.8GB / 动态图版 124.5MB大模型按 16GB 内存准备;lgraph 版几百 MB 即可16kHz 单声道流式英文通用主力。0.22 的 WER 5.69(librispeech test-clean)、6.05(tedlium)、29.78(callcenter);lgraph 版 WER 7.82,牺牲一点精度换来运行时改词表的能力,热词需求强就选它。
vosk-model-en-us-0.42-gigaspeech最大的官方英文包,2.3GB内存按 16GB 准备,磁盘预留 5GB 解压空间16kHz 单声道流式Kaldi 在 Gigaspeech 上训的,WER 5.64(librispeech test-clean)、6.24(tedlium)。官方明说「适合播客,不适合电话音频」——callcenter 上 30.17,比 0.22 还差一点,别拿它做客服质检。
vosk-model-spk-0.4 + vosk-recasepunc-en-0.22说话人向量 13MB / 标点恢复 1.6GBspk 可忽略;recasepunc 是 BERT,建议放 GPUspk 全语种通用;recasepunc 官方只有 en / ru / deVosk 主模型不输出标点和大小写,要靠 recasepunc 补。中文没有官方 recasepunc,得自己训或者接别的标点模型——这是中文自建方案里最常被漏掉的一段。

02 —

配什么卡:按你真正要做的事选,不按参数表选

Vosk 是 CPU 优先的引擎,租卡的价值在批量吞吐、标点恢复和横向对比。我们不建议为了跑 Vosk 去开 H100。

  • 小模型流式服务、并发压测(解码基本落在 CPU)

    Tesla V100 32GB$0.188/卡·时

    全站最低的整机时价,vosk-model-small-cn-0.22 运行时只吃约 300MB 内存,卡先空着;等你切到 GPU 批量解码,32GB 显存正好接得住 HCLG 图。

  • CUDA 批量解码存量音频(BatchModel 默认 batch 32 / 600 通道)

    Tesla T4 16GB$0.298/卡·时

    Kaldi 的 cudadecoder 当年就是照着 T4 这类推理卡调的,16GB 放得下解码图和 32 路批状态,单位音频时长的成本最低。

  • Vosk + recasepunc 标点恢复,或与 faster-whisper 同机 A/B

    RTX 4090 24GB$0.540/卡·时

    1.6GB 的 recasepunc 和 Whisper large-v3 可以同时常驻 24GB,一次租用就把「Vosk 到底够不够用」这件事测出结论。

  • 自己编译 HAVE_CUDA=1 的 vosk(官方没有 GPU 包)

    RTX 3090 24GB$0.193/卡·时

    编 Kaldi 的 cudafeat / cudadecoder 需要真卡在场做验证,3090 是 24GB 档里最便宜的一张,镜像 build 完推走就停机,不留成本。

03 —

四步把 Vosk 跑起来

从裸机到能对外提供流式识别的 WebSocket 服务,第一次做大概一个小时,按秒计费算下来不到一杯咖啡。

  1. 01

    开实例,把模型拉下来

    在 console.nexgpu.net 选一个 Ubuntu 或 PyTorch 镜像开机,SSH 进去直接下模型。所有官方模型都在 alphacephei.com/vosk/models/ 下,文件名即 URL。中文换成 vosk-model-cn-0.22,先试水就用 41.9MB 的 small 版。模型解压后是一个目录,里面 am/、graph/、ivector/、rescore/ 几个子目录缺一不可,别只拷 final.mdl。

    wget https://alphacephei.com/vosk/models/vosk-model-cn-0.22.zip && unzip vosk-model-cn-0.22.zip
  2. 02

    先用 vosk-transcriber 把一批文件跑通

    pip 装完自带命令行工具,内部调 ffmpeg 解码,mp4/mp3/m4a 都能直接喂,-t 支持 txt 和 srt,--tasks 控制并行路数(默认 10)。如果你走 Python API 而不是 CLI,音频必须是单声道 16bit PCM 的 WAV,采样率跟模型对齐——喂 44.1kHz 立体声不会报错,只会安静地把识别率打到地板上,这是新手第一大坑。

    pip install vosk && vosk-transcriber -m vosk-model-cn-0.22 -i meeting.mp4 -t srt -o meeting.srt --tasks 16
  3. 03

    起流式 WebSocket 服务

    vosk-server 提供 WebSocket、gRPC、MQTT、WebRTC 四种协议,官方镜像默认监听 2700 端口。中文用 alphacep/kaldi-cn,英文用 alphacep/kaldi-en,想换成自己微调过的模型就把目录挂进 /opt/vosk-model-cn/model。仓库里的 test.py 直接连上去就能验证;接 Asterisk、FreeSWITCH 这类话务系统时记得用 8kHz 对应的配置。

    docker run -d -p 2700:2700 -v /opt/model:/opt/vosk-model-cn/model alphacep/kaldi-cn:latest
  4. 04

    上 CUDA 批量解码

    GPU 路线用 alphacep/kaldi-en-gpu,基础镜像是 nvidia/cuda:12.1.0-devel-ubuntu22.04,Kaldi 编了 cudafeat 和 cudadecoder,vosk-api 用 HAVE_CUDA=1 构建。官方只发了英文镜像,中文照着 docker/Dockerfile.kaldi-en-gpu 把 MODEL_VERSION 换掉自己 build 即可。两个必看细节:GPU 服务默认 VOSK_SAMPLE_RATE=8000,配 16kHz 模型必须改;仓库自带的 python/example/test_gpu_batch.py 跑完会直接打印 xRT 倍速,别信任何人给你的吞吐数字,用它在你自己租的卡上压一遍。

    docker run --gpus all -d -p 2700:2700 alphacep/kaldi-en-gpu:latest

一笔算得清的账

场景一,1,000 小时中文客服录音批量转写:租 Tesla T4 16GB($0.298/卡·时),先跑官方 test_gpu_batch.py 拿到你这批音频的真实 xRT。假设实测 60 倍实时,1,000 ÷ 60 ≈ 16.7 机时,16.7 × $0.298 ≈ $4.98 转写完事。模型本体 1.3GB 常驻,1.3 × $0.414 ≈ $0.54/月;转写结果按 200MB 回传,0.2 × $0.0081 ≈ $0.002,忽略不计。换 RTX 4090 24GB($0.540/卡·时)通常快一截但单价也高一截,总价接近,选哪张取决于你要多快拿到结果。场景二,常驻流式识别服务:Tesla V100 32GB $0.188 × 24 × 30 = $135.36/月,一台带卡的常驻机器,小模型只占 300MB 内存,剩下的算力留给你的业务进程。场景三,只想验证一下值不值得自建:按秒计费意味着一次 40 分钟的压测就是 $0.188 × 0.67 ≈ $0.13,没有起租时长,没有配额申请,实例一停计算就不计费,只有存储会继续算到你销毁它为止。

04 —

常见问题

Vosk 本地部署到底需要多大显存?必须有 GPU 吗?

默认路线不需要显卡。小模型运行时约 300MB 内存,大模型官方建议按最多 16GB 内存准备——是内存不是显存,解码全在 CPU。只有走 CUDA 批量解码、跑 recasepunc 标点恢复,或者要和 Whisper 同机对比时才需要卡,Tesla T4 16GB($0.298/卡·时)这一档就够,NexGPU 上按秒计费,用一小时就是一小时的钱。

Vosk 和 Whisper / faster-whisper 该选哪个?

取舍很清楚:Vosk 是真流式,边说边出 partial 结果,延迟接近零,CPU 就能跑,还能运行时改词表;Whisper 系精度更高、鲁棒性更好,但本质是分块离线解码,做实时要额外工程。中文上 vosk-model-cn-0.22 的 CER 是 13.98(SpeechIO-02),朗读体场景够用,嘈杂远场会吃亏。别听结论,在 NexGPU 开一台 RTX 4090 24GB($0.540/卡·时)把两条链路装在同一台机器上,用你自己的音频跑一遍就知道了。

pip install vosk 装到的是最新版吗?

不是。PyPI 上的 vosk 停在 0.3.45,发布于 2022 年 12 月;GitHub 的 tag 已经是 v0.3.50,主干提交一直更新到 2026 年 8 月,端点检测配置、ITN、Golang GPU Batch API 这些都在 pip 版本之外。要用新特性只能从源码构建,官方也一直没有发带 GPU 的 wheel(仓库 issue #1287 至今开着)。编译这活儿在一台 RTX 3090 24GB($0.193/卡·时)上做一次、把镜像推到你自己的仓库,是最省事的办法。

Vosk 识别结果没有标点和大小写怎么办?

这是设计如此,Kaldi 输出的就是纯词序列。官方推荐配 recasepunc 模型做恢复,但只提供了英文(1.6GB)、俄文(1.6GB)、德文(1.1GB)三个,中文没有官方版本,得自己训或接第三方标点模型。recasepunc 是 BERT 结构,跟 Vosk 主解码放在同一张卡上跑最省事——RTX 4090 24GB 装得下它加一个对照用的 Whisper。

怎么给 Vosk 加专有名词和热词?

看你用哪类模型。小模型和 lgraph 模型支持动态词表,构造识别器时直接传 JSON 数组,比如 KaldiRecognizer(model, 16000, '["一 二 三 四", "[unk]"]'),运行中还能用 SetGrammar 换掉。大模型是静态图,改不了,只能用 Kaldi 的 OpenFST/OpenGRM 重编 Gr.fst 调整词的概率,而且官方明确说这样加不了新词——真要加新词得重建词典和整张解码图,编译过程吃 CPU 和内存,正适合按小时租一台大内存节点做完就走。

GPU 批量解码到底能跑多快?

别信任何写死的倍率,音频时长分布、采样率、模型大小都会改变结果。仓库自带的 python/example/test_gpu_batch.py 跑完直接打印 xRT,用你自己的音频、在你自己要买的那张卡上测一次,比任何 benchmark 都可信。NexGPU 有 2,498 张卡、75 种型号,T4、V100、4090、A6000 都能开,按秒计费,测完停机就停止计算扣费——先测再定型号,这本来就该是标准动作。

开始使用 NexGPU

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

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