跳转至

ASR 语音识别速查(CPU 服务器部署 · 跟读评测场景)

版本基线: faster-whisper v1.2.1(CTranslate2 4.8.5)· FunASR v1.4.24(funasr-onnx v0.4.3)· sherpa-onnx v2.0.1 · Vosk v0.3.50 · WhisperX v3.8.6 · OpenAI Whisper 权重最新多语言模型仍为 large-v3 / large-v3-turbo(2024-10,2026 年无同级新模型)· Paraformer-zh / SenseVoiceSmall 仍为 FunASR 中文主力模型· whisper.cpp v1.9.5(2026-10-07,MIT)· whisper-asr-webservice v1.10.0(2026-08-09,MIT)· SenseVoice-Small(FunAudioLLM,2024-07 开源,代码 MIT / 权重 Apache-2.0,官方称 GPU 上 10 秒音频仅 70ms、FunASR 官方基准 CPU 约 17× 实时;仓库最后提交 2025-12,无 release tag)· FireRedASR(小红书 FireRedTeam,AED-L 1.1B / LLM-L 8.3B,2025-01/02,Apache-2.0;FireRedASR2 全家桶 2026-02)· Moonshine(Useful Sensors→Moonshine AI,tiny 27M / base 58M,MIT,英文为主)· NVIDIA Parakeet-TDT-0.6B v2(英文,2025-05)/ v3(25 种欧洲语言,2025-08),权重 CC-BY-4.0,NeMo 工具包(核对日期 2026-11-11,来源:GitHub Releases / PyPI / funasr.com / HF / ModelScope)

宿主机约束(必读): Windows Server,2×Xeon Gold 6138(40 核 80 线程)、256GB 内存、F 盘 895G 剩 862G。无独立 GPU,纯 CPU 推理。所有服务以 Docker 容器部署,产物只存 F:\EricLiu\ 下;模型权重统一放 F:\EricLiu\labs\models\。

业务目标: 跟读评测(TTS 朗读→用户跟读→识别打分)。打分需要词级时间戳对齐(对比朗读文本与跟读音频的逐词时间),选型时 word_timestamps / 时间戳能力是硬指标。


1. 选型对比

项目 定位 中文效果 CPU 速度(int8 量级,40 核 Xeon) 内存 许可证 推荐场景
faster-whisper Whisper 的 CTranslate2 加速重实现 好(Whisper large 系,中文准确但需外挂标点模型) small:1 分钟音频约 10–20 秒;large-v3-turbo:1 分钟音频约 60–120 秒(int8,非流式) small 约 1GB;large-v3-turbo 约 3–4GB MIT 高准确率离线转写、带词级时间戳的评测打分
FunASR (Paraformer-zh) 阿里达摩院工业级 ASR 工具包 中文最佳(Paraformer 专为中文优化,内置标点恢复 FSMN-VAD) paraformer-zh:1 分钟音频约 10–25 秒;SenseVoiceSmall 约 5–10 秒(CPU 非流式) 2–4GB(ASR+VAD+标点组合) MIT 中文场景首选:转写、打分、长音频、需要标点的直接输出
sherpa-onnx next-gen Kaldi + ONNXRuntime 推理框架 良好(Zipformer/Paraformer ONNX 版,流式非流式都有) 流式 Zipformer:单路 RTF ≈ 0.1–0.2(1 分钟音频约 6–12 秒);内存极小 <1GB Apache-2.0 流式实时识别(低延迟跟读反馈)、嵌入式/低资源
Vosk Kaldi 离线轻量 ASR 一般(中文小模型可用但准确率落后 Whisper 一档) small-cn:1 分钟音频约 20–40 秒;模型小、延迟低 300MB–1GB Apache-2.0 离线轻量、边缘设备、实时性优先准确率其次
WhisperX Whisper + wav2vec2 对齐 + 说话人分离 好(同 Whisper) 面向 GPU 设计;纯 CPU 强制对齐较重,本项目仅了解,不推荐部署 ≥5GB BSD-2-Clause GPU 服务器上的词对齐/分离,了解即可
SenseVoice-Small (FunAudioLLM) 非自回归多语种语音理解一体模型(ASR+语种识别+情感识别+音频事件检测) 优(zh/yue/en/ja/ko 五语种;中文/粤语优于 Whisper,"富文本"转写可带情感/事件标签;2024-11 起 CTC 时间戳支持) ✅✅ 极快:官方 GPU 上 10 秒音频仅 70ms、比 Whisper-Large 快 15 倍;FunASR 官方基准 CPU 约 17× 实时(1 分钟音频约 3-4 秒),比 faster-whisper small 还快一档 1-2GB(权重仓 940MB) 代码 MIT;权重 ModelScope(iic/SenseVoiceSmall)标注 Apache-2.0(HF 仓库标 FunASR 模型许可,商用前以实际下载仓库许可页为准) 中文转写/情感标注增强:FunASR 内一行切换(model="iic/SenseVoiceSmall"),与 paraformer-zh 并列的主力模型
FireRedASR (小红书 FireRedTeam) 工业级中文 ASR:AED-L 1.1B(效率)/ LLM-L 8.3B(Encoder-Adapter-LLM 精度上限),含方言与歌声识别 优秀(公开中文基准 SOTA:四集平均 CER 3.05-3.18%,AISHELL-1 最低 0.55%;后继 FireRedASR2 于 2026-02 集成 VAD/LID/标点) ❌ CPU 回避:官方推理路径按 CUDA 设计,未声明 CPU 支持;8.3B 本机不可行,1.1B AED 无官方 CPU 路径(社区有非官方 GGUF/CrispASR 路线,不入生产) 3-8GB(1.1B)/ 16GB+(8.3B,另需 Qwen2-7B) Apache-2.0(代码+权重) GPU 环境的中文精度参考线;本机仅技术观察
Moonshine (Useful Sensors→Moonshine AI) 边缘/端侧轻量 ASR(变长输入不 pad 30s、ONNX、流式变体) ❌ 英文为主:tiny 27M / base 58M 为英文模型;后出的多语种 base 版(含 Mandarin)较新、准确率不及中文专用模型 ✅✅ 极轻:tiny CPU 数十倍实时(约 37× 量级),峰值内存 <300MB;Q8 权重仅 ~33MB <500MB MIT(代码+权重) 英文低延迟语音命令/边缘设备选配;中文跟读打分场景不用
NVIDIA Parakeet / NeMo FastConformer-TDT 高吞吐 ASR(v2 英文 / v3 25 种欧洲语言,HF Open ASR 榜前列) ❌ 无中文(v3 仅覆盖欧洲语言) ⚠️ GPU 导向:官方基准全在 A100;CPU 可跑(社区 ONNX)但慢,且无中文则对本项目无意义 2-4GB 权重 CC-BY-4.0(NeMo 工具包 Apache-2.0) 回避本机(GPU 依赖 + 无中文);仅作 GPU 场景参考

选型速览(跟读评测): 服务化主链路 = faster-whisper int8(word_timestamps=True 词级时间戳,RTF 可控);中文增强 = FunASR paraformer-zh(中文最优 + 自带标点 + 字符级时间戳),双引擎并行;流式即时反馈 = sherpa-onnx 流式 Zipformer。完整首选/选配/回避判据见 §1.2。

⚠️ 速度数字为 2026-11 基于公开基准(faster-whisper README、sherpa-onnx 官方 benchmark、社区实测)在 Xeon Gold 6138 int8 下的估算量级,上线前必须用真实跟读音频实测校准(见第 6 节守则)。

1.1 整合/聚合型项目(推荐与回避)

推荐逻辑:本地首选 faster-whisper 直连(第 4 节自封装,可控 RTF 上报与词级时间戳);需要现成 HTTP 服务、不想自维护封装时用 whisper-asr-webservice(开箱即用,内部也走 faster_whisper 引擎);追求 CPU 极致性能或想脱离 Python 依赖时用 whisper.cpp(AVX-512 + Q5 量化)。FunASR 自带服务端(runtime 部署)属本文档既有范畴,不在此重复。三者均为 MIT,无许可证风险。

项目 定位 维护状态 许可证 CPU 可行性 结论:推荐用/选配/回避
whisper-asr-webservice (ahmetoner,镜像 onerahmet/openai-whisper-asr-webservice) 现成 Whisper HTTP 服务:Docker 拉起即用,Swagger UI;ASR_ENGINE 三选一(openai_whisper / faster_whisper / whisperx),词级时间戳、VAD、输出 text/JSON/VTT/SRT/TSV 维护中但节奏放缓:v1.10.0(2026-08-09)距上一版 v1.9.1 间隔约 13 个月 MIT ✅ 官方 CPU 镜像开箱即用;模型缓存挂载持久化;ASR_DEVICE=cpu 选配(推荐):需要"拿来即用"的标准 ASR HTTP 服务时直接用,省去第 4 节的自封装;生产使用 pin v1.10.0,ASR_MODEL_PATH 指向 F:\EricLiu\labs\models\ 并离线化。自封装方案(第 4 节)仍是主力:可带真实 RTF 上报(守则第 4 条)
whisper.cpp (ggml-org) Whisper 的 C/C++ + ggml 重实现,CPU 性能天花板(AVX2/AVX-512,本机 Xeon 6138 支持 AVX-512) 极活跃:v1.9.5(2026-10-07),月度级发版 MIT ✅✅ 纯 CPU 最优路径之一;内存极省(small 约 852MB,Q5 量化更小) 选配:当前 faster-whisper 已满足打分场景,whisper.cpp 作为"性能瓶颈出现时的升级路径"或无 Python 环境的嵌入式方案;自带 examples/server HTTP 服务与 whisper-cli;注意 ggml 模型格式与 faster-whisper 的 CTranslate2 权重不通用,需单独下载
FunASR 自带服务端 funasr runtime / docker 部署(funasr 官方 docs) 活跃(随 FunASR 主仓) MIT ✅ 本文档既有内容 推荐(已在册):中文主力路径,见 §2.2 与 §1.2 推荐结论;此处仅登记,不重复展开

1.2 限制与回避(选型红线)

  • WhisperX:面向 GPU 设计(wav2vec2 强制对齐 + 说话人分离),纯 CPU 上对齐阶段比识别本身还慢,回避部署,只作 GPU 环境参考。
  • faster-whisper:无原生流式 API;标点靠外挂(FunASR ct-punc);CTranslate2 权重与 whisper.cpp 的 ggml 格式不通用,两套模型要各下一份。
  • FunASR:中文最强,但生态绑定 ModelScope/PyTorch、镜像体积大;英文与多语种不如 Whisper 系稳。
  • Vosk:中文准确率落后一档,只适合低资源/边缘;不适合当打分主力。
  • whisper-asr-webservice:维护节奏放缓(v1.10.0 距上一版约 13 个月),必须 pin 版本 + 权重离线化。
  • FireRedASR(2026-11 补充核实):中文精度天花板级(Apache-2.0),但官方推理路径按 CUDA 设计、未声明 CPU 支持,8.3B 更是不可行——回避本机部署,只作 GPU 环境参考。
  • NVIDIA Parakeet/NeMo(2026-11 补充核实):GPU 依赖 + v2/v3 均无中文,本机双重回避。
  • Moonshine(2026-11 补充核实):MIT + CPU 极轻(tiny 数十倍实时),但英文为主,中文打分场景不适用;仅英文边缘场景选配。

推荐结论(跟读评测): - 首选 = faster-whisper int8 自封装(compute_type="int8" + word_timestamps=True):词级时间戳直接喂 SOE、RTF 可真实上报,是服务化基线。 - 中文增强首选 = FunASR paraformer-zh(自带标点 + 字符级时间戳),与 faster-whisper 双引擎并行;流式即时反馈 = sherpa-onnx 流式 Zipformer。 - SenseVoice-Small(2026-11 补核实后结论:进入"中文增强"推荐档,但不替换打分主链路):官方基准 CPU 约 17× 实时、比 paraformer-zh 更快,且中文/粤语准确率优于 Whisper 系,还能输出情感/事件标签;但其时间戳为 CTC 对齐粒度、成熟度不及 paraformer-zh 的字符级时间戳。跟读打分主链路仍用 paraformer-zh;SenseVoice 作为快速转写与情感标注的补充引擎(同为 FunASR AutoModel 一行切换,无额外框架成本),是否全面顶替以实测 CER + 时间戳质量为准。 - 选配 = whisper-asr-webservice v1.10.0(MIT,拿来即用的 HTTP 服务)/ whisper.cpp v1.9.5(MIT,AVX-512 极致 CPU 性能、无 Python 依赖);CPU 性能遇瓶颈或要嵌嵌入式时再切 whisper.cpp。 - 回避 = WhisperX 在纯 CPU 部署(GPU 设计,对齐阶段过重);FireRedASR / NVIDIA Parakeet(CUDA 导向,后者无中文);Moonshine 中文场景不用(英文为主)。

2. 安装

2.1 faster-whisper(pip / docker)

# pip(宿主机或容器内均可)
pip install faster-whisper==1.2.1
# 依赖 CTranslate2 4.x(CPU 路径无需 CUDA/cuDNN)

# 模型下载(首次运行自动从 HuggingFace 下载;建议显式下载到统一目录)
# Windows: set HF_HOME=F:\EricLiu\labs\models\huggingface
export HF_HOME=/f/EricLiu/labs/models/huggingface
python -c "from huggingface_hub import snapshot_download; snapshot_download('Systran/faster-whisper-small')"
python -c "from huggingface_hub import snapshot_download; snapshot_download('Systran/faster-whisper-large-v3-turbo')"

Docker 镜像(自建,官方无维护镜像,用 python:3.11-slim 基底):

FROM python:3.11-slim
RUN pip install --no-cache-dir faster-whisper==1.2.1 fastapi uvicorn python-multipart
ENV HF_HOME=/models
# docker-compose 关键段(完整版见第 4 节)
services:
  asr:
    build: .
    volumes:
      - F:\EricLiu\labs\models\huggingface:/models   # 权重只放 labs\models
    cpus: 8          # 限制核数,避免抢占其它服务
    deploy:
      resources:
        limits: { memory: 8G }

int8 量化参数(CPU 必开): WhisperModel(model_size, device="cpu", compute_type="int8", cpu_threads=8)。 可用的 compute_type:int8(推荐,速度/精度/内存最佳)、int8_float32、float32。CPU 上 int8 相比 float32 通常快 2–4 倍、内存减半以上。

2.2 FunASR(中文路径)

# 依赖 PyTorch CPU 版(省去 CUDA 包,体积小很多)
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu
pip install funasr==1.4.24

# 可选 Silero VAD(v1.4.3+)
pip install "funasr[silero]==1.4.24"

中文模型(首次自动从 ModelScope 下载,用环境变量指到统一目录):

import os
os.environ["MODELSCOPE_CACHE"] = r"F:\EricLiu\labs\models\modelscope"
from funasr import AutoModel
model = AutoModel(
    model="paraformer-zh",          # 识别;中文主力
    vad_model="fsmn-vad",           # 长音频切分
    punc_model="ct-punc",           # 标点恢复
    device="cpu",
)

离线部署:先在联网机把 paraformer-zh / fsmn-vad / ct-punc(ModelScope 仓 iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch 等)下载齐,连 MODELSCOPE_CACHE 目录一起拷进容器,之后设置 disable_update=True 并禁外网。

ONNX 轻量路径:pip install funasr_onnx==0.4.3(模型转为 ONNX,CPU 推理更快、无 torch 依赖,见 modelscope FunASR onnx 模型仓库)。

2.3 Vosk(离线轻量)

pip install vosk==0.3.50
# 中文模型手动下载(vosk-model-small-cn-0.22 约 42MB / vosk-model-cn-0.22 约 1.3GB)
# 下载解压到 F:\EricLiu\labs\models\vosk\vosk-model-small-cn-0.22
from vosk import Model, KaldiRecognizer
model = Model(r"F:\EricLiu\labs\models\vosk\vosk-model-small-cn-0.22")

2.4 sherpa-onnx(了解/流式备选)

pip install -U sherpa-onnx>=2.0.1
# 模型从 GitHub k2-fsa/sherpa-onnx Releases 或其官方模型页下载流式 zipformer 中文模型
# 解压到 F:\EricLiu\labs\models\sherpa-onnx\

3. 高频用法

3.1 faster-whisper CLI/Python

from faster_whisper import WhisperModel

model = WhisperModel(
    "small",                      # 或 large-v3-turbo;也可直接传本地路径
    device="cpu",
    compute_type="int8",          # CPU 必开 int8
    cpu_threads=8,
)

segments, info = model.transcribe(
    "read_aloud.wav",
    language="zh",
    beam_size=5,
    vad_filter=True,              # Silero VAD 过滤静音,长音频提速
    word_timestamps=True,         # ★ 词级时间戳 —— 跟读打分(SOE)必需,务必开启
)
print(info.language, info.duration)
for seg in segments:
    print(f"[{seg.start:.2f}→{seg.end:.2f}] {seg.text}")
    for w in seg.words:           # 每个词的 start/end,用于逐词对齐打分
        print(f"  {w.word} {w.start:.2f}-{w.end:.2f}")

命令行批量:

# 无官方 CLI,用 python -c 或写薄封装脚本;批量建议走第 4 节 HTTP API
python transcribe.py F:\EricLiu\asr_jobs\*.wav --model small --int8

3.2 FunASR

from funasr import AutoModel

model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad",
                  punc_model="ct-punc", device="cpu",
                  disable_update=True)
res = model.generate(input="read_aloud.wav", batch_size_s=60)
print(res[0]["text"])                          # 带标点的转写
print(res[0]["timestamp"])                     # ★ 字符级时间戳 [[ms_start, ms_end], ...]
                                               # 打分时按字→词聚合后对齐
# 流式(Paraformer 流式版,2s chunk 边收边出)
from funasr import AutoModel
stream_model = AutoModel(model="paraformer-streaming-zh", device="cpu")

★ 时间戳说明:FunASR paraformer-zh 返回的是字符级时间戳(毫秒),比 Whisper 的词级更细;faster-whisper word_timestamps=True 返回词级(中文按词切分)。两者都能支撑 SOE 时间对齐,但单位不同,打分代码要分别适配。

3.3 Vosk

import wave, json
from vosk import Model, KaldiRecognizer

model = Model(r"F:\EricLiu\labs\models\vosk\vosk-model-small-cn-0.22")
wf = wave.open("read_aloud.wav", "rb")
rec = KaldiRecognizer(model, wf.getframerate())
rec.SetWords(True)                    # 开启词级时间戳
while True:
    data = wf.readframes(4000)
    if len(data) == 0: break
    if rec.AcceptWaveform(data):
        print(json.loads(rec.Result()))
print(json.loads(rec.FinalResult()))  # result 里含 word/start/end

4. 服务化:faster-whisper + FastAPI

4.1 app.py(含 /health)

import os, tempfile, time
from fastapi import FastAPI, UploadFile, File
from faster_whisper import WhisperModel

MODEL_DIR = os.environ.get("ASR_MODEL", "/models/Systran/faster-whisper-small")
model = WhisperModel(MODEL_DIR, device="cpu", compute_type="int8", cpu_threads=int(os.environ.get("CPU_THREADS", "8")))

app = FastAPI(title="ASR Service")

@app.get("/health")
def health():
    return {"status": "ok", "model": MODEL_DIR, "compute_type": "int8"}

@app.post("/transcribe")
async def transcribe(file: UploadFile = File(...), language: str = "zh"):
    suffix = os.path.splitext(file.filename)[1] or ".wav"
    with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as tmp:
        tmp.write(await file.read())
        path = tmp.name
    try:
        t0 = time.time()
        segments, info = model.transcribe(path, language=language,
                                          vad_filter=True, word_timestamps=True)
        segs, words = [], []
        for seg in segments:
            segs.append({"start": round(seg.start, 3), "end": round(seg.end, 3), "text": seg.text})
            for w in seg.words:
                words.append({"word": w.word, "start": round(w.start, 3), "end": round(w.end, 3)})
        audio_sec = info.duration
        cost_sec = time.time() - t0
        return {"text": "".join(s["text"] for s in segs), "segments": segs, "words": words,
                "duration": round(audio_sec, 2), "cost": round(cost_sec, 2),
                "rtf": round(cost_sec / max(audio_sec, 0.01), 3)}
    finally:
        os.unlink(path)

返回里的 rtf(实时率 = 处理耗时 / 音频时长)必须真实上报,用于持续校准本文档的 CPU 速度估算。

4.2 docker-compose.yml(放 F:\EricLiu\labs\docker\asr\)

services:
  asr:
    build: .
    container_name: asr-faster-whisper
    ports: ["127.0.0.1:8101:8000"]
    environment:
      - ASR_MODEL=/models/Systran/faster-whisper-small
      - CPU_THREADS=8
      - HF_HOME=/models
      - HF_HUB_OFFLINE=1            # 权重已就位后禁外网下载,避免运行时拉模型
    volumes:
      - F:\EricLiu\labs\models\huggingface:/models
    cpus: 8
    deploy:
      resources:
        limits: { memory: 8G }
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "python", "-c", "import urllib.request as u; u.urlopen('http://127.0.0.1:8000/health')"]
      interval: 30s
      timeout: 5s
      retries: 3

4.3 流式 vs 非流式

  • 非流式(上文模板):整段音频一次识别,准确率最高,延迟 = 音频时长 × RTF。跟读评测的"读完整段再打分"走这条路。
  • 流式:音频分块送入,边收边出部分结果(sherpa-onnx / funasr 流式模型 / Vosk 逐 chunk)。延迟可到 0.5–2s,但准确率略降。用户"边读边显示文字"的即时反馈走这条路。
  • 注意:faster-whisper 本身不提供原生流式 API;流式需求交给 sherpa-onnx 或 FunASR 流式模型,或对 faster-whisper 做 VAD 分段近似(短分段循环调用)。

5. 排障

症状 原因 处置
模型下载慢/超时 HuggingFace/ModelScope 国内网络 设 HF_ENDPOINT=https://hf-mirror.com(HF 镜像);FunASR 换 ModelScope 本就国内快;终极方案:联网机下载→拷 labs\models\→容器内 HF_HUB_OFFLINE=1 / MODELSCOPE_CACHE 指过去
中文无标点/一逗到底 Whisper 系不带标点模型 用 FunASR(内置 ct-punc);或 faster-whisper 输出后接 funasr ct-punc 二次处理
长音频 OOM/极慢 一次性喂长音频、attention 内存涨 vad_filter=True + FunASR batch_size_s=60 切分;faster-whisper 分段循环;容器内存限 8G 并监控
首次请求慢 10s+ 模型加载在首个请求内 启动时预加载模型(app.py 顶层加载,如上文);compose 加 healthcheck 就绪后再放流量
时间戳对不上 未开词级时间戳 / 两引擎单位不同 faster-whisper 必须 word_timestamps=True;FunASR 用 res["timestamp"](毫秒、字符级);打分代码统一换算成毫秒
int8 精度明显下降 极少出现 换 int8_float32 或 float32,用同一批跟读音频对比字错率 CER
Windows 路径挂载失败 Docker Desktop 路径格式 compose 里用 F:\EricLiu\labs\models:/models 原生写法;bash 操作时用 /f/EricLiu/...

6. AI 操作守则

  1. 先读后写:改任何配置/代码前先读现有文件;模型权重只允许放 F:\EricLiu\labs\models\,产物只写 F:\EricLiu\ 下,禁止写到 C 盘或其它盘。
  2. 版本固定:生产 compose/pip 一律 pin 具体版本号(本文基线为 2026-11-11 核对结果),升级前先查 GitHub Releases changelog,不得盲目 pip install -U。
  3. 实测优先:文档中的 RTF/内存是估算量级。每次换模型、换量化类型,必须用 ≥5 条真实跟读音频跑分(记录 RTF、内存峰值、CER),结果回填到选型表旁。
  4. 诚实上报:服务 /health 与响应体必须携带真实 RTF/耗时,禁止编造性能数据;评测打分逻辑上线前用人工标注样本验证对齐正确性。
  5. 离线优先:容器内设 HF_HUB_OFFLINE=1/disable_update=True,禁止服务运行时在线拉模型;下载走联网机→labs\models\ 人工同步。
  6. 资源隔离:每容器限 cpus 与 memory(ASR 建议 8 核 8G 起步),多引擎并存时留足余量(宿主机 256G 内存充足,瓶颈在 CPU 核)。
  7. 破坏性操作需确认:删除模型目录、重建容器卷、清理 F 盘数据前必须向用户确认。
  8. 隐私:跟读音频含用户语音,临时文件用完即删(参考 app.py 的 finally unlink),禁止上传外部服务。