超越转写:用 SenseVoice 一次识别语音的语言、情感与声学事件
绝大多数语音识别模型只回答一个问题:说了什么。但很多真实业务还想知道:这是哪种语言?说话人什么情绪?这段音频里有没有笑声、掌声、背景音乐?
SenseVoice 用一次非自回归前向,就把这四件事一起做了。它在输出文本的同时,给每一段标注语种、情感和声学事件——不需要再额外跑情感模型或语种检测模型。
安装
pip install -U funasr modelscope
完整代码(可直接运行)
from funasr import AutoModel
from funasr.utils.postprocess_utils import rich_transcription_postprocess
model = AutoModel(
model="iic/SenseVoiceSmall", # or FunAudioLLM/SenseVoiceSmall + hub="hf"
vad_model="fsmn-vad",
device="cuda:0",
)
res = model.generate(
input="audio.wav",
cache={},
language="auto", # auto-detect: zh / en / yue / ja / ko ...
use_itn=True,
batch_size_s=300,
)
print(res[0]["text"]) # raw, with tags
print(rich_transcription_postprocess(res[0]["text"])) # rendered
原始输出长这样
<|zh|><|NEUTRAL|><|Speech|><|withitn|>关于春秋战国的一大区别。 <|zh|><|SAD|><|Speech|><|withitn|>在白宫出丑闻还蹦迪,嘿嘿。
每一段前面的尖括号标签就是结构化信息:
| 标签 | 含义 |
|---|---|
<|zh|> | 语种(zh 中文 / en 英文 / yue 粤语 / ja 日语 / ko 韩语 …) |
<|SAD|> | 情感:NEUTRAL / HAPPY / SAD / ANGRY / FEARFUL / DISGUSTED / SURPRISED |
<|Speech|> | 声学事件:Speech 语音 / BGM 背景音乐 / Laughter 笑声 / Applause 掌声 … |
<|withitn|> | 该段已做逆文本规整(数字、标点) |
rich_transcription_postprocess() 会把这些标签渲染成 emoji(例如 😔 表示悲伤),方便直接展示;如果你要做结构化分析,直接用正则从原始文本里解析标签即可。
解析标签做情感分析
import re
pat = re.compile(r"<\|(\w+)\|><\|(\w+)\|><\|(\w+)\|><\|withitn\|>([^<]*)")
for lang, emo, event, text in pat.findall(res[0]["text"]):
print(lang, emo, event, text.strip())
# zh NEUTRAL Speech 关于春秋战国的一大区别。
# zh SAD Speech 在白宫出丑闻还蹦迪,嘿嘿。
典型场景
- 客服 / 电话质检:在转写的同时检测客户情绪(愤怒、不满),自动标记需要复盘的通话。
- 多语种路由:先自动判定语种,再分发到对应的下游处理。
- 视频 / 播客理解:识别笑声、掌声、背景音乐等事件,做高光切片或章节划分。
- 内容审核:结合情感 + 事件,辅助识别异常音频。
为什么是 SenseVoice 而不是 Whisper
- 四合一:Whisper 只输出文本;SenseVoice 一次给出文本 + 语种 + 情感 + 事件。
- 更快:SenseVoice 是非自回归模型,实测 RTFx 远高于 Whisper(实测对比),CPU 上也能实时。
- 中文更准:中文 CER 显著低于 Whisper。
SenseVoice 是通义实验室开源的多功能语音理解模型,中文场景又快又准。
在 GitHub 上 Star SenseVoice ★