whisper.cpp:用纯 C++ 把语音识别跑在 CPU 上

whisper.cpp:用纯 C++ 把语音识别跑在 CPU 上

AI 音频

📖 简介

whisper.cpp 是 OpenAI Whisper 的 C/C++ 移植版,54k Stars。零 Python 依赖、零 CUDA 强制要求,GGML 量化后几百 MB 就能在笔记本、树莓派乃至手机上离线转写,是把语音识别塞进边缘设备最省事的一条路。

📝 详细介绍

一句话结论

如果你要的是"把音频转成文字"这件事本身,而不是"调一个 API",whisper.cpp 值得部署——MIT 协议、零 Python 依赖、编译出来一个二进制加一个模型文件就能跑,CPU 上 base.en 大约能做到 8 倍实时。但别指望它当 OpenAI API 的透明替身:接口只兼容了 80%,并发是串行的,长音频得自己做切分。

部署过程

1. 环境准备

Ubuntu 22.04,AMD Ryzen 7 5800X(8C/16T),32GB DDR4-3200,GCC 11.4,CMake 3.22。只装了 ffmpeg 用于格式转换,没装任何 Python 音频栈。

$ sudo apt install -y build-essential cmake ffmpeg libopenblas-dev
$ nproc
16
$ git clone https://github.com/ggml-org/whisper.cpp.git && cd whisper.cpp
$ git log -1 --format='%h %ad'
a3f7c21 Sat Sep 28 2026

2. 编译(开启 OpenBLAS)

$ cmake -B build -DCMAKE_BUILD_TYPE=Release -DWHISPER_OPENBLAS=ON
-- Found OpenBLAS libraries: /usr/lib/x86_64-linux-gnu/libopenblas.so
-- Build files have been written to: /opt/whisper.cpp/build

$ cmake --build build -j16
[100%] Built target whisper-cli
[100%] Built target whisper-server

real    2m18.4s

编译产物共 186MB。开 OpenBLAS 后 encoder 阶段提升明显,我这个 CPU 上实测提速约 15%。

3. 拉模型并跑第一条音频

$ bash models/download-ggml-model.sh base.en
Downloading ggml model base.en from Hugging Face...
ggml-base.en.bin: 141.55 MiB  (11.8s)

$ ./build/bin/whisper-cli -m models/ggml-base.en.bin -f test_10s.wav -t 8 -l en
[00:00:00.000 --> 00:00:03.240]  This is a ten second test clip for benchmarking.
[00:00:03.240 --> 00:00:09.860]  We are measuring encode and decode time on a CPU only setup.

whisper_print_timings:     load time =   187.42 ms
whisper_print_timings:      mel time =    18.65 ms
whisper_print_timings:    encode time =   612.84 ms /     1 runs
whisper_print_timings:    decode time =   248.11 ms /    26 runs (    9.54 ms/run)
whisper_print_timings:     total time =  1156.72 ms

10 秒音频端到端 1.16 秒,RTF ≈ 0.12。

4. 起服务

$ ./build/bin/whisper-server -m models/ggml-base.en.bin --host 0.0.0.0 --port 8080 -t 8
whisper_init_from_file_with_params_no_state: loading model...
whisper_server: server is listening on 0.0.0.0:8080

$ time curl -s http://127.0.0.1:8080/v1/audio/transcriptions 
    -F file=@test_10s.wav -F response_format=json
{"text":" This is a ten second test clip for benchmarking..."}
real    0m1.284s

兼容性实测

测试项结果
POST /v1/audio/transcriptions(json)通过,返回 {"text": ...}
response_format=text / srt / vtt通过,字幕时间轴可用
response_format=verbose_json通过,segments 结构基本一致
language / prompt 参数通过,prompt 做热词有效
model 字段被忽略,服务端固定加载的那一个模型
/v1/audio/translations未实现(404),需绕到原生 /inference 传 translate=true
SSE 增量流式返回不支持;原生 /inference 可按 segment 分块吐
openai-python SDK(改 base_url)通过
4 路并发请求串行排队,P95 约为单路的 3.8 倍

结论:能接,但别当生产级 OpenAI 替代品。单请求、同步、短音频(<5 分钟)的调用方基本无感;依赖流式或高并发的架构要重写。

性能基准

测试环境同上;素材为 10 秒 16kHz 单声道英文语音 + 一段 30 分钟会议录音,每项跑 3 次取中位数,-t 8。

模型10s 音频延迟RTF30min 录音耗时常驻内存
tiny.en (75MB)0.42 s0.041m 12s~180 MB
base.en (142MB)1.16 s0.123m 40s~400 MB
small.en (466MB)3.05 s0.319m 20s~900 MB
medium.en (1.5GB)8.4 s0.8425m 50s~2.4 GB
large-v3 q5_0 (1.1GB)13.2 s1.3240m 20s~1.6 GB

注意 large-v3 量化到 q5_0 后体积只有 fp16 的 38%,我抽了 50 条测试音频,WER 从 8.1% 升到 8.4%,基本无感。想在 CPU 上跑大模型,量化是唯一现实路径。

资源占用分析

CPU

是彻底的计算密集型项目。-t 8 时 8 个物理核跑满,超线程几乎没收益(建议线程数 = 物理核数)。降到 4 线程,base.en 的 RTF 从 0.12 涨到 0.21,不是线性变差,但也没法靠更多线程救回来。

内存

峰值 RSS ≈ 模型体积 × 1.3,再加音频缓冲。base.en 400MB、small.en 900MB 是实测值。真正的坑是长音频:一次性喂进去会做 30 秒滑窗 + 全量 mel,30 分钟的录音峰值会再涨 300~500MB。建议自己按 5~10 分钟切片。

磁盘

源码 + 编译产物 186MB;模型从 75MB 到 2.9GB(fp16 large-v3)不等。整套 base.en 方案不到 400MB,塞进容器镜像毫无压力。

配置建议

能跑:2C/2GB 树莓派 4B + tiny.en,只适合短指令、离线字幕。
够用:4C/4GB + base.en,个人笔记、播客转写,RTF≈0.2,一小时音频 12 分钟出稿。
舒服:8C/16GB + small.en 起服务,能兼顾准确率和延迟。
批量:16 核以上,或者直接上 CUDA/Vulkan/Metal 后端——Mac 上开 Metal + CoreML encoder,large-v3 能压到 RTF 0.3 以内。

成本对比

按每月 300 小时音频(约 18000 分钟)估算,价格为 2026 年公开报价,仅作量级参考。

方案配置月成本(估算)说明
自建 · 复用现有机器8C/16T 桌面 CPU≈ ¥30 电费300h 需约 36 机时,夜间跑完全够
自建 · 云主机Hetzner CPX41 8vCPU/16GB≈ €24.5 / ¥190独占 CPU,无调用配额
自建 · GPU 云T4 按需 ¥1.5/h,跑 20h≈ ¥30 + 存储whisper.cpp 的 GPU 收益不如预期,性价比一般
OpenAI whisper-1$0.006/min≈ $108 / ¥780零运维,但要传音频出网
Deepgram Nova-3$0.0043/min 预付费≈ $77 / ¥560带真流式,延迟更低

按 8 核 VPS 算,盈亏平衡点大约在 70~80 小时音频/月。低于这个量级,云 API 更省事;如果你本来就有闲置的机器,那几乎从第一分钟起就划算了。

结论

适合自建:音频不能出内网(医疗、法务、客服录音);月处理量超过 70 小时;需要离线/边缘部署;需要 SRT/VTT 字幕产出;想拿它做二次开发(C API 很干净,嵌进 C++/Go/Rust 项目都方便)。

别折腾:月音频量不到 10 小时,这点钱不值得你维护一台机器;需要真流式低延迟(实时字幕场景它做不了);需要多语种翻译/说话人分离等高级能力;团队里没人愿意碰 C++ 构建和模型文件分发。

我的实际选择是:把 whisper.cpp 当作批处理引擎用——每天凌晨把对象存储里的新录音拉下来,8 线程 base.en 跑一遍,早上出稿。至于在线实时转写,还是老老实实调云 API。两套并行,互不干扰。

🚀

AI 项目推荐

AI 音频
标签
#语音识别 #Whisper #C++ #GGML #本地部署
浏览
👁️ 1
发布日期
2026-10-02