从0开始学语音AI:用SenseVoiceSmall做带情绪标签的转录
你有没有遇到过这样的问题:一段录音里,说话人明明语气激动,但转写出来的文字却平平无奇?或者视频会议记录里,大家鼓掌、笑出声的瞬间,在文本中完全“消失”了?
传统的语音识别(ASR)只能把声音变成文字,而现在的AI已经能听懂“语气”和“环境”了。今天我们要一起上手的,就是阿里开源的SenseVoiceSmall模型——它不仅能精准识别中文、英文、日语、韩语、粤语,还能告诉你这段话是“开心地说”还是“愤怒地吼”,甚至标注出背景里的掌声、笑声、音乐。
更棒的是,我们不需要一行行敲代码,就能通过一个可视化界面玩转这个强大的模型。这篇文章会带你从零开始,一步步部署、运行,并真正理解它输出的每一条“带情绪的转录”。
1. 为什么你需要“带情绪”的语音识别?
传统ASR vs 富文本转录
我们先来对比一下:
传统语音识别(ASR)
输入:一段音频
输出:纯文字
示例:“我觉得这个方案不行。”
看不出说话人是冷静分析,还是在发火。
富文本转录(Rich Transcription)
输入:同一段音频
输出:带情感和事件标签的文字
示例:<|ANGRY|>我觉得这个方案不行<|APPLAUSE|>
这下清楚多了:说话人生气了,而且后面还有人鼓掌。
这种能力在很多场景下非常关键:
- 客服质检:自动识别客户是否不满,提升服务质量。
- 视频字幕生成:让字幕更有表现力,比如标注“(笑声)”。
- 会议纪要:标记谁在什么时候表达了情绪,便于复盘。
- 内容创作:为播客、短视频自动生成带氛围描述的脚本。
而 SenseVoiceSmall 正是目前少数能同时支持多语言 + 情感识别 + 声音事件检测的开源模型之一。
2. 镜像环境快速部署
2.1 一键启动 WebUI
你拿到的镜像是一个已经配置好所有依赖的完整环境,包括:
- Python 3.11
- PyTorch 2.5
- FunASR 和 ModelScope 核心库
- Gradio 可视化界面
- FFmpeg 音频处理工具
这意味着你几乎不需要手动安装任何东西。
如果镜像没有自动运行服务,只需在终端执行以下命令即可启动 Web 界面:
python app_sensevoice.py这条命令会启动一个基于 Gradio 的网页应用,默认监听6006端口。
2.2 如何访问本地 Web 界面?
由于大多数云平台出于安全考虑不直接开放端口,我们需要通过 SSH 隧道将远程服务映射到本地。
在你的本地电脑终端运行:
ssh -L 6006:127.0.0.1:6006 -p [实际端口号] root@[服务器IP]连接成功后,打开浏览器访问:
👉 http://127.0.0.1:6006
你会看到一个简洁的语音识别控制台,支持上传音频或直接录音,选择语言,点击按钮就能获得结果。
小贴士:为什么用 Gradio?
Gradio 是一个极简的 Python 库,几行代码就能把机器学习模型变成可交互的网页。对于非前端开发者来说,它是快速验证模型效果的最佳工具。
3. 模型核心功能详解
3.1 多语言识别:不再局限于中文
SenseVoiceSmall 支持五种主要语言:
| 语言 | 代码 |
|---|---|
| 自动识别 | auto |
| 中文 | zh |
| 英文 | en |
| 粤语 | yue |
| 日语 | ja |
| 韩语 | ko |
你在使用时可以通过下拉菜单指定语言,也可以设为auto让模型自动判断。
这对于跨国会议、双语访谈等场景特别有用。
3.2 情感识别:听出“语气”
模型可以识别多种情感状态,常见的有:
<|HAPPY|>:开心、兴奋<|SAD|>:低落、悲伤<|ANGRY|>:愤怒、不满<|NEUTRAL|>:中性、平静
这些标签会被插入到对应语句前后,形成“富文本”输出。
举个例子:
原始音频内容:
“哇!这真是太棒了!!”
模型输出可能为:<|HAPPY|>哇!这真是太棒了!!
这比单纯的文字多了太多信息量。
3.3 声音事件检测:听见“背景音”
除了人声,模型还能识别环境中的特定声音事件:
<|BGM|>:背景音乐<|APPLAUSE|>:掌声<|LAUGHTER|>:笑声<|CRY|>:哭声
想象一下,一段脱口秀视频中,观众突然爆笑,传统 ASR 只会沉默,而 SenseVoice 会标注:
<|LAUGHTER|>(此时全场大笑)
这对后期剪辑、内容摘要都非常有价值。
4. 实际操作演示
4.1 准备一段测试音频
你可以找一段包含以下元素的音频来测试:
- 不同情绪的说话(如高兴、生气)
- 背景音乐
- 掌声或笑声
如果没有现成素材,也可以自己录制一段简单的测试语音,比如:
“大家好,今天我们来聊聊 AI。(笑声)我觉得这项技术真的太神奇了!(掌声)”
4.2 上传并识别
- 打开 http://127.0.0.1:6006
- 点击“上传音频”按钮,选择你的文件
- 在“语言选择”中选
zh或auto - 点击“开始 AI 识别”
等待几秒钟,结果就会出现在右侧文本框中。
4.3 查看带标签的输出
假设你上传了一段带有笑声和掌声的演讲录音,输出可能是这样的:
<|HAPPY|>大家好,今天我们来聊聊 AI<|LAUGHTER|>我觉得这项技术真的太神奇了!<|APPLAUSE|>是不是一下子生动起来了?
4.4 后处理:让标签更友好
默认输出中的<|HAPPY|>这类标签虽然清晰,但在某些场景下可能不够自然。我们可以用rich_transcription_postprocess函数将其转换为更易读的形式。
例如:
from funasr.utils.postprocess_utils import rich_transcription_postprocess raw_text = "<|HAPPY|>大家好<|APPLAUSE|>" clean_text = rich_transcription_postprocess(raw_text) print(clean_text) # 输出:[开心]大家好[掌声]这样更适合展示给普通用户。
5. 代码解析:看看背后发生了什么
虽然我们用了 Gradio 界面,但了解背后的逻辑对后续定制非常重要。
以下是app_sensevoice.py的关键部分拆解:
5.1 初始化模型
model_id = "iic/SenseVoiceSmall" model = AutoModel( model=model_id, trust_remote_code=True, vad_model="fsmn-vad", vad_kwargs={"max_single_segment_time": 30000}, device="cuda:0", # 使用 GPU 加速 )这里做了几件事:
- 加载预训练模型
- 启用 VAD(语音活动检测),自动切分静音段
- 指定使用 GPU 提升推理速度
5.2 调用识别接口
res = model.generate( input=audio_path, cache={}, language=language, use_itn=True, # 数字转文字(如 100 → 一百) batch_size_s=60, # 批处理长度,影响速度 merge_vad=True, # 合并短片段 merge_length_s=15, # 最大合并时长 )参数说明:
use_itn=True:开启“逆文本归一化”,把数字、日期等转成口语表达。batch_size_s=60:以60秒为单位进行批处理,适合长音频。merge_vad=True:避免一句话被切成太碎的片段。
5.3 结果清洗
raw_text = res[0]["text"] clean_text = rich_transcription_postprocess(raw_text)这一步会把原始标签美化成[开心]、[掌声]这样的格式,更适合展示。
6. 使用技巧与常见问题
6.1 音频格式建议
- 采样率:推荐 16kHz,模型会自动重采样,但原始为16k效果最佳。
- 格式:WAV、MP3、FLAC 均可,避免使用高压缩率的 AMR 或 OPUS。
- 声道:单声道优先,立体声也能处理,但可能影响定位精度。
6.2 如何提升识别准确率?
- 明确语言设置:如果知道是中文,就不要用
auto,直接选zh。 - 避免背景噪音过大:虽然模型有一定抗噪能力,但清晰录音效果更好。
- 控制语速:过快或含糊不清会影响断句和情感判断。
6.3 常见问题排查
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 无法启动服务 | 端口被占用 | 更换server_port为其他值,如6007 |
| 识别失败 | 音频损坏或路径错误 | 检查上传文件是否正常 |
| 情感标签缺失 | 语气太平淡 | 尝试更明显的情绪表达 |
| GPU 报错 | 显存不足 | 改用 CPU 推理(device="cpu") |
经验分享:什么时候用 GPU?
如果你只是偶尔处理几段短音频,CPU 完全够用。但如果你要批量处理上百条录音,强烈建议使用 GPU(如 4090D),推理速度可达秒级,效率提升显著。
7. 进阶玩法:不只是转录
7.1 批量处理音频文件
你可以写个脚本,遍历整个文件夹,自动处理所有音频:
import os audio_dir = "./audios/" for filename in os.listdir(audio_dir): if filename.endswith((".wav", ".mp3")): audio_path = os.path.join(audio_dir, filename) result = model.generate(input=audio_path, language="auto") text = result[0]["text"] clean_text = rich_transcription_postprocess(text) with open(f"transcripts/{filename}.txt", "w") as f: f.write(clean_text)7.2 构建私有语音分析平台
结合数据库和前端框架(如 Vue),你可以搭建一个企业级语音分析系统:
- 上传会议录音 → 自动生成带情绪标记的纪要
- 统计客户投诉录音中“愤怒”出现频率
- 分析培训课程中讲师情绪变化趋势
7.3 与其他工具集成
- 接入微信机器人:用户发送语音,自动回复转录结果。
- 连接 Notion API:将会议记录直接写入知识库。
- 配合 TTS 模型:实现“有感情”的语音合成闭环。
8. 总结
8.1 你学会了什么?
在这篇文章中,我们完成了以下目标:
- 了解了什么是“富文本转录”,以及它相比传统 ASR 的优势。
- 成功部署并运行了 SenseVoiceSmall 的 WebUI 服务,无需复杂配置。
- 实践了如何上传音频、选择语言、获取带情感和事件标签的识别结果。
- 理解了模型的核心能力:多语言识别、情感检测、声音事件标注。
- 掌握了关键代码逻辑,为后续定制开发打下基础。
- 学会了一些实用技巧,如后处理、批量处理、性能优化。
8.2 下一步你可以做什么?
- 尝试更多真实场景:用朋友聊天录音、公开演讲视频做测试。
- 优化输出格式:把结果导出为 SRT 字幕、Markdown 笔记等。
- 加入标点修复:虽然 SenseVoice 自带一定标点能力,但仍可进一步优化。
- 探索微调可能:如果有特定领域数据(如医疗、法律),可以尝试微调模型。
语音 AI 正在从“听清”走向“听懂”。SenseVoiceSmall 让我们第一次如此轻松地触达这一能力。现在,轮到你去创造属于自己的智能语音应用了。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。