Python 语音情感识别:一个模型同时输出语种、情感与音频事件(SenseVoice)
大多数语音识别(ASR)模型只给你文字。但真实场景里,你往往还想知道:说话人是什么情绪?这段是哪种语言?背景是纯人声还是带音乐?用 Whisper 你得叠一堆东西——语种检测 + 单独的情感模型 + 音频事件分类器,既慢又难维护。
SenseVoice 是 FunAudioLLM 团队开源的多语种语音理解模型。它在一次非自回归前向里就同时返回:转写文本、语种识别、情感识别、音频事件检测,外加逆文本归一化(ITN)。架构非自回归,比 Whisper-Large 快约 15 倍,适合实时也适合大批量。
一次推理能拿到什么
| 能力 | 说明 |
|---|---|
| 语音识别(ASR) | 50+ 语种,中文准确率领先 |
| 语种识别(LID) | 自动判别 zh / en / ja / ko / yue … |
| 情感识别 | HAPPY 😊 / SAD 😔 / ANGRY 😡 / NEUTRAL / FEARFUL / DISGUSTED / SURPRISED |
| 音频事件 | Speech / BGM 🎵 / Applause 👏 / Laughter / Cry |
| 逆文本归一化(ITN) | “九点”→“9点”、“fifty”→“50” |
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="audio.wav", cache={}, language="auto", use_itn=True)
print(res[0]["text"]) # 原始带标签输出
print(rich_transcription_postprocess(res[0]["text"])) # 清洗后的纯文本
真实输出:5 种语言自动识别
用 SenseVoice 自带的多语种示例音频实测(zh/en/ja/ko/yue),原始输出每段开头都带标签:
<|zh|><|NEUTRAL|><|Speech|><|withitn|>开放时间早上9点至下午5点。 <|en|><|NEUTRAL|><|Speech|><|withitn|>The tribal chieftain called for the boy and presented him with 50 pieces of gold. <|ja|><|NEUTRAL|><|Speech|><|withitn|>うちの中学は弁当制で持っていけない場合は、50 円の学校販売のパンを買う。 <|ko|><|NEUTRAL|><|Speech|><|withitn|>조금만 생각을 하면서 살면 훨씬 편할 거야. <|yue|><|NEUTRAL|><|Speech|><|withitn|>呢几个字都表达唔到,我想讲嘅意思。
注意每段开头的标签:<|zh|> 语种(连粤语 yue 都能分出来)、<|NEUTRAL|> 情感、<|Speech|> 音频事件、<|withitn|> 表示已做 ITN(“9点至下午5点”“50 pieces”)。
情感与音频事件:真实音频实测
把 SenseVoice 跑在 60 段真实网络音频上:其中 56 段被正确标为 BGM(带背景音乐)——这正是 Whisper 会硬转写、容易幻觉的场景;同时检测出 HAPPY / ANGRY / NEUTRAL 等情感。例如一段被标为 ANGRY 的语音:
<|zh|><|ANGRY|><|Speech|><|withitn|>哎,不要看不起那些理想主义者,你脚下的每一步都是他们走出来的。
完整标签集——情感:HAPPY / SAD / ANGRY / NEUTRAL / FEARFUL / DISGUSTED / SURPRISED;事件:Speech / BGM / Applause / Laughter / Cry。
如何解析这些标签
import re
raw = res[0]["text"]
tags = re.findall(r"<\|([^|]+)\|>", raw)
language = tags[0] if tags else None # 'zh'
emotion = next((t for t in tags if t in
{"HAPPY","SAD","ANGRY","NEUTRAL","FEARFUL","DISGUSTED","SURPRISED"}), None)
event = next((t for t in tags if t in
{"Speech","BGM","Applause","Laughter","Cry"}), None)
text = re.sub(r"<\|[^|]+\|>", "", raw) # 纯文本
print(language, emotion, event, text)
对比 Whisper
| SenseVoice | Whisper | |
|---|---|---|
| 转写 + 语种 | ✅ 一次搞定 | ✅ |
| 情感识别 | ✅ 内置 | ❌ 需另接模型 |
| 音频事件(BGM/掌声/笑声) | ✅ 内置 | ❌ |
| 逆文本归一化 | ✅ 内置 | 部分 |
| 速度 | 非自回归,约快 15× | 自回归基准 |
要的不只是文字,而是对音频的理解时,SenseVoice 一个模型就够了——无需再拼语种检测 + 情感模型 + 事件分类器。
FunASR 全家桶都是开源的——工业级 ASR / VAD / 标点 / 说话人 / 情感事件 / LLM-ASR。觉得有用就点个 Star 支持一下 👇
也欢迎 Star:SenseVoice · Fun-ASR · FunClip
相关文章
- FunASR vs Whisper 实测对比
- SenseVoice 部署指南
- Fun-ASR-Nano 使用指南
- 说话人分离:谁在何时说话
- 实时流式语音识别
- 转写超长音频(1小时一次搞定)
- 命令行转写(文本/JSON/SRT)
- 自托管 OpenAI Whisper API 替代
- 自动生成字幕(SRT / VTT)
- Python 语音转文字教程
- FunASR 跑进 llama.cpp(whisper.cpp 替代)
- FunASR vs faster-whisper(中文/粤语)
- 轻量语音识别(CPU 250MB)
- 自托管替代 Deepgram/AssemblyAI
- 选哪个 FunASR 模型
- 粤语语音识别(SenseVoice 原生粤语)
- 日语语音识别(SenseVoice 转写+标点+情感)
- Python 语音活动检测(VAD)
- 自托管替代 Google/AWS/Azure 云语音 API
- 中文语音识别(普通话)实战
- 标点恢复 Python 实战
- 语音识别带时间戳(字级)