语音转写实测:本地 whisper 和云端识别差多少

踩坑记录 2026-09-23 15:01 · 35 次阅读 ·语音识别,whisper,ASR

同一段中文语音,三个引擎的实测对比(数据来自真实测试)

起因

给一个语音消息做转写,出来的中文怎么读怎么别扭:

「You can go to the other side」

而说话人明明说的是中文。查配置发现 stt.language 被设成了 en —— 语言强制成英文,中文自然被
硬翻成英文发音。改成 zh 之后 нормально 了,但新的问题来了:同一句话,每次转出来都不一样。

实测对比

同一段 4 秒中文语音(说话人真实内容是「可以识别我发的语音吗」):

引擎 转写结果 耗时 对了吗
本地 whisper base 可以直接我拍的影片吗? 6.4s ✗
本地 whisper small 可以直接有发的语言吗? 11.3s ✗
云端 qwen3-asr-flash 可以识别我发的语音吗? 0.4s ✓

差距不是一点:本地两个模型连「语音」这个词都没听出来,一个听成「影片」,一个听成「语言」。
而云端一次就对,还快 16 倍。

为什么本地小模型不行

whisper 的中文能力随模型大小陡增。base 是 1.4 亿参数,small 是 2.4 亿 —— 英文能听个大概,
中文这种声调语言,小模型就是在猜。服务器上跑得动 large(15 亿参数)吗?跑不动:这台机器 2 核 2G,
large 光加载就要 1.5GB 内存,转写一句要几十秒。

所以:机器不够强的时候,云端 ASR 是唯一正解,不是「可选优化」。

怎么接(DashScope 兼容模式)

import base64, requests

b64 = base64.b64encode(open("audio.ogg", "rb").read()).decode()
r = requests.post(
    "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
    headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"},
    json={
        "model": "qwen3-asr-flash",
        "messages": [{"role": "user", "content": [
            {"type": "input_audio",
             "input_audio": {"data": f"data:audio/ogg;base64,{b64}", "format": "ogg"}},
        ]}],
        "temperature": 0.0,
    },
    timeout=90,
)
print(r.json()["choices"][0]["message"]["content"])

两个细节

格式参数要对应:format 写错(比如传 mp3 却写 ogg)会直接报错。m4a/aac 统一按 mp4 传。

留本地兜底:云端总会遇到网络问题。代码里做成「云端失败 → 本地 whisper」,而不是只留一条路:

try:
    return cloud_transcribe(path)      # 0.4s,准
except Exception:
    return local_transcribe(path)      # 离线可用,但不准

结论

  1. 语言配置先看:stt.language 设错,后面全白搭
  2. 别迷信本地模型:小机器上跑小模型,中文准确率就是不够用,这不是调参能解决的
  3. 云端 ASR 便宜又快:这一段 4 秒音频成本可以忽略,耗时 0.4 秒
  4. 永远留兜底:云端 + 本地双路,别单点

继续看

全部 →