超越转写:用 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

SenseVoice 是通义实验室开源的多功能语音理解模型,中文场景又快又准。

在 GitHub 上 Star SenseVoice ★

相关文章