粤语语音识别:SenseVoice 原生输出地道粤语口语(Whisper 会转成普通话)
全球约有 8500 万粤语使用者,但开源语音识别对粤语的支持一直很弱。Whisper 名义上有粤语,实际上它把粤语当成中文(zh)处理、转写成普通话书面语——唔 变 不、嘅 变 的、呢 变 這,地道的粤语口语就这么没了。
SenseVoice(FunAudioLLM 团队开源的多语种语音理解模型)原生支持粤语(yue):自动识别语种、保留真正的粤语口语用字,一次非自回归前向就给出结果。下面是同一段粤语音频的真实对比。
真实对比:同一段粤语音频
用 SenseVoice 自带的粤语示例 yue.mp3 实测,两个模型的真实输出:
| 模型 | 识别语种 | 输出 |
|---|---|---|
| SenseVoice | yue(粤语) | 呢几个字都表达唔到,我想讲嘅意思。 |
| Whisper-small | zh(中文) | 這幾個字都表達不到我想講的意思 |
差别一目了然:SenseVoice 保留了粤语标志性的 呢 / 唔 / 嘅;Whisper 没有独立的粤语,把它识别成中文并转成了普通话书面语(呢→這、唔→不、嘅→的)——意思大致对,但已经不是粤语了。
3 行代码跑通粤语识别
pip install funasr
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(model="iic/SenseVoiceSmall", disable_update=True)
res = model.generate(input="cantonese.wav", cache={}, language="yue", use_itn=True)
print(rich_transcription_postprocess(res[0]["text"]))
# 呢几个字都表达唔到,我想讲嘅意思。
language 可以直接写 "yue",也可以写 "auto" 让模型自动判语种——实测这段音频在 auto 下同样被正确判为 yue 并给出一致结果。
原始输出里还带了什么
SenseVoice 的原始输出每段开头有一串标签:
<|yue|><|NEUTRAL|><|Speech|><|withitn|>呢几个字都表达唔到,我想讲嘅意思。
含义:<|yue|> = 语种是粤语;<|NEUTRAL|> = 情感;<|Speech|> = 音频事件(纯人声);<|withitn|> = 已做逆文本归一化。也就是说,识别粤语的同时,语种 / 情感 / 音频事件全都免费拿到了。用 rich_transcription_postprocess() 一行就能清洗成纯文本。
为什么粤语识别选 SenseVoice
| SenseVoice | Whisper | |
|---|---|---|
| 粤语口语用字(呢/唔/嘅) | ✅ 原生保留 | ❌ 转成普通话 |
| 自动语种识别 | ✅ 直接判出 yue | 归为 zh |
| 情感 / 音频事件 | ✅ 一次出 | ❌ |
| 逆文本归一化(ITN) | ✅ 内置 | 部分 |
| 速度 | 非自回归,比 Whisper-Large 约快 15× | 自回归基准 |
| 许可证 | 开源,可商用 | 开源 |
如果你的场景是普通话 + 粤语混合(港澳、客服、媒体字幕),SenseVoice 一个模型就能两种都覆盖;要更高精度的离线转写,可以看同属 FunASR 家族的 Fun-ASR-Nano。更完整的中文准确率对比见 FunASR vs Whisper benchmark。
FunASR 全家桶都是开源的——工业级 ASR / VAD / 标点 / 说话人 / 情感事件 / LLM-ASR,粤语开箱即用。觉得有用就点个 Star 支持一下 👇