whisper.cpp:用纯 C++ 把语音识别跑在 CPU 上
📖 简介
📝 详细介绍
一句话结论
如果你要的是"把音频转成文字"这件事本身,而不是"调一个 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 音频延迟 | RTF | 30min 录音耗时 | 常驻内存 |
|---|---|---|---|---|
| tiny.en (75MB) | 0.42 s | 0.04 | 1m 12s | ~180 MB |
| base.en (142MB) | 1.16 s | 0.12 | 3m 40s | ~400 MB |
| small.en (466MB) | 3.05 s | 0.31 | 9m 20s | ~900 MB |
| medium.en (1.5GB) | 8.4 s | 0.84 | 25m 50s | ~2.4 GB |
| large-v3 q5_0 (1.1GB) | 13.2 s | 1.32 | 40m 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