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

SenseVoiceWhisper
转写 + 语种✅ 一次搞定
情感识别✅ 内置❌ 需另接模型
音频事件(BGM/掌声/笑声)✅ 内置
逆文本归一化✅ 内置部分
速度非自回归,约快 15×自回归基准

要的不只是文字,而是对音频的理解时,SenseVoice 一个模型就够了——无需再拼语种检测 + 情感模型 + 事件分类器。

FunASR 全家桶都是开源的——工业级 ASR / VAD / 标点 / 说话人 / 情感事件 / LLM-ASR。觉得有用就点个 Star 支持一下 👇

⭐ Star FunASR

也欢迎 Star:SenseVoice · Fun-ASR · FunClip

相关文章