SenseVoiceSmall情感标签解析:HAPPY/ANGRY识别后处理代码实例
1. 引言:让语音“有情绪”的AI识别
你有没有遇到过这种情况:一段录音里,说话人明显带着笑意,但转写出来的文字却冷冰冰的?或者视频中突然响起掌声,文字记录却毫无反应?
现在,这些问题有了新解法。今天我们要聊的是阿里达摩院开源的SenseVoiceSmall模型——它不只是把声音变成文字,还能听出“语气”、感知“情绪”,甚至捕捉背景里的笑声和音乐。
这个模型最特别的地方在于,它输出的不是干巴巴的文字,而是带有情感标签的富文本。比如一句话后面跟着<|HAPPY|>,说明这人是笑着说的;如果出现<|ANGRY|>,那语气可就不善了。更厉害的是,它还能标记<|LAUGHTER|>、<|APPLAUSE|>这类声音事件。
但问题来了:这些标签虽然信息丰富,可直接展示给用户会显得很“技术味”。我们能不能把这些原始标签转化成更自然、易读的内容?答案是肯定的。本文就带你一步步实现情感标签的智能解析与美化输出,并提供完整可运行的代码示例。
无论你是想做智能客服的情绪分析、视频内容自动打标,还是语音日记的情感记录,这篇都能给你实用参考。
2. 核心能力解析:不止是语音转写
2.1 多语言支持,覆盖主流语种
SenseVoiceSmall 支持多种语言混合识别,包括:
- 中文普通话(zh)
- 英语(en)
- 粤语(yue)
- 日语(ja)
- 韩语(ko)
而且支持“自动识别语言”模式(language="auto"),非常适合多语种混杂的场景,比如跨国会议、双语播客等。
2.2 富文本输出:情感 + 事件双重感知
传统ASR只输出文字,而 SenseVoice 的输出是这样的:
你好啊<|HAPPY|>,今天天气真不错<|LAUGHTER|>,对吧?其中:
<|HAPPY|>表示前一句带有开心情绪<|LAUGHTER|>表示紧接着有笑声
这种结构化的标注方式,极大提升了语音内容的信息密度。你可以基于这些标签做进一步处理,比如:
- 统计整段对话的情绪分布
- 自动为视频添加字幕特效(开心时字体变暖色)
- 检测客户投诉中的愤怒语句
2.3 极速推理,适合生产环境
得益于非自回归架构,SenseVoiceSmall 在 NVIDIA 4090D 上可以做到秒级转写,延迟极低。配合 Gradio WebUI,普通用户也能轻松上手,无需编写代码即可上传音频查看结果。
3. 环境搭建与依赖说明
3.1 基础环境要求
| 组件 | 版本 |
|---|---|
| Python | 3.11 |
| PyTorch | 2.5 |
| GPU | 推荐 NVIDIA 显卡(CUDA 支持) |
3.2 必要依赖库
pip install funasr modelscope gradio avfunasr:阿里官方语音识别工具包modelscope:模型下载与管理gradio:构建可视化界面av:高效音频解码(比 librosa 快得多)
3.3 系统工具
确保系统已安装ffmpeg,用于音频格式转换和重采样:
# Ubuntu/Debian sudo apt-get install ffmpeg # macOS brew install ffmpeg模型会自动将非16k音频重采样为16kHz,这是其推荐输入格式。
4. 完整代码实现:从识别到标签美化
4.1 初始化模型
首先加载 SenseVoiceSmall 模型,并启用 VAD(语音活动检测)来提升长音频处理效果:
from funasr import AutoModel from funasr.utils.postprocess_utils import rich_transcription_postprocess # 加载模型 model = AutoModel( model="iic/SenseVoiceSmall", trust_remote_code=True, vad_model="fsmn-vad", vad_kwargs={"max_single_segment_time": 30000}, device="cuda:0", # 使用GPU加速 )注意:trust_remote_code=True是必须的,因为模型包含自定义逻辑。
4.2 原始识别与后处理对比
我们来测试一段带情绪的音频:
# 假设 audio_path 是你的音频文件路径 res = model.generate( input=audio_path, language="auto", use_itn=True, # 数字转文字(如 "123" → "一百二十三") batch_size_s=60, merge_vad=True, merge_length_s=15, ) raw_text = res[0]["text"] print("原始输出:", raw_text) # 示例输出:今天开会迟到<|ANGRY|>,真是气死我了<|SAD|>接下来使用内置的后处理函数进行清洗:
clean_text = rich_transcription_postprocess(raw_text) print("美化后:", clean_text) # 输出:今天开会迟到(生气),真是气死我了(悲伤)可以看到,<|ANGRY|>被替换成了中文“(生气)”,更加友好。
4.3 自定义标签映射:按需调整风格
如果你希望输出更生动,比如把“生气”改成“怒气冲冲”,可以把默认的映射表改掉。
查看源码可知,rich_transcription_postprocess使用了一个固定的标签映射字典。我们可以自己实现一个增强版:
def custom_postprocess(text): # 自定义标签映射 tag_map = { "<|HAPPY|>": "😄", "<|SAD|>": "😢", "<|ANGRY|>": "💢", "<|LAUGHTER|>": "😂", "<|APPLAUSE|>": "", "<|BGM|>": "[背景音乐]", "<|CRY|>": "😭" } for tag, emoji in tag_map.items(): text = text.replace(tag, emoji) return text # 使用自定义后处理 enhanced_text = custom_postprocess(raw_text) print("增强版:", enhanced_text) # 输出:今天开会迟到💢,真是气死我了😢这样处理后的文本更适合社交平台、弹幕系统或年轻化产品界面。
4.4 批量处理多个音频文件
如果你想批量处理一批音频,可以这样写:
import os audio_dir = "./audios/" results = [] for filename in os.listdir(audio_dir): if filename.endswith((".wav", ".mp3")): filepath = os.path.join(audio_dir, filename) res = model.generate(input=filepath, language="auto") if res and len(res) > 0: raw = res[0]["text"] clean = rich_transcription_postprocess(raw) results.append({ "file": filename, "raw": raw, "clean": clean }) # 保存为JSON或CSV import json with open("transcription_results.json", "w", encoding="utf-8") as f: json.dump(results, f, ensure_ascii=False, indent=2)5. Web交互界面:零代码体验情感识别
为了让非技术人员也能用上这个功能,我们封装一个 Gradio 界面。
5.1 完整 Web 应用脚本
# app_sensevoice.py import gradio as gr from funasr import AutoModel from funasr.utils.postprocess_utils import rich_transcription_postprocess import os # 初始化模型 model = AutoModel( model="iic/SenseVoiceSmall", trust_remote_code=True, vad_model="fsmn-vad", device="cuda:0", ) def sensevoice_process(audio_path, language): if audio_path is None: return "请先上传音频文件" res = model.generate( input=audio_path, language=language, use_itn=True, batch_size_s=60, merge_vad=True, ) if len(res) > 0: raw_text = res[0]["text"] clean_text = rich_transcription_postprocess(raw_text) return clean_text else: return "识别失败" with gr.Blocks(title="SenseVoice 情感语音识别") as demo: gr.Markdown("# 🎙 SenseVoice 智能语音识别控制台") gr.Markdown(""" **功能特色:** - **多语言支持**:中、英、日、韩、粤语自动识别。 - 🎭 **情感识别**:自动检测音频中的开心、愤怒、悲伤等情绪。 - 🎸 **声音事件**:自动标注 BGM、掌声、笑声、哭声等。 """) with gr.Row(): with gr.Column(): audio_input = gr.Audio(type="filepath", label="上传音频或直接录音") lang_dropdown = gr.Dropdown( choices=["auto", "zh", "en", "yue", "ja", "ko"], value="auto", label="语言选择" ) submit_btn = gr.Button("开始 AI 识别", variant="primary") with gr.Column(): text_output = gr.Textbox(label="识别结果", lines=15) submit_btn.click( fn=sensevoice_process, inputs=[audio_input, lang_dropdown], outputs=text_output ) demo.launch(server_name="0.0.0.0", server_port=6006)5.2 启动服务
python app_sensevoice.py然后通过 SSH 隧道访问:
ssh -L 6006:127.0.0.1:6006 -p [端口] root@[IP地址]浏览器打开:http://127.0.0.1:6006
你就能看到一个简洁的网页界面,上传音频即可看到带情感标签的识别结果。
6. 实际应用建议与优化技巧
6.1 如何提升情感识别准确率?
- 避免远场录音:距离麦克风太远的声音容易失真,影响情绪判断
- 减少背景噪音:嘈杂环境中模型可能误判笑声为掌声
- 使用高质量音频:尽量用16k、单声道WAV格式
6.2 后续处理方向
拿到带标签的文本后,你可以做很多事:
| 应用场景 | 处理方式 |
|---|---|
| 客服质检 | 提取所有 `< |
| 视频字幕 | 将 `< |
| 心理咨询 | 统计一周录音中“开心” vs “悲伤”的比例变化 |
| 内容审核 | 检测是否含有持续愤怒语句,触发预警 |
6.3 性能优化小贴士
- 开启
batch_size_s=60可提升吞吐量 - 使用
merge_vad=True减少碎片化短句 - 对于超长音频(>1小时),建议分段处理
7. 总结:让语音理解更有温度
SenseVoiceSmall 不只是一个语音识别模型,它让机器真正开始“听懂”人类的情绪。
通过本文的代码实践,你应该已经掌握了:
- 如何部署并调用 SenseVoiceSmall 模型
- 如何解析
<|HAPPY|>、<|ANGRY|>等情感标签 - 如何使用
rich_transcription_postprocess进行文本美化 - 如何构建 Web 界面供他人使用
更重要的是,你学会了如何把冷冰冰的技术输出,转化为温暖、可读性强的人性化内容。
无论是做产品集成、科研实验,还是个人项目探索,这套方案都能帮你快速落地语音情感分析能力。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。