SenseVoice Small详细指南:语音情感分析API开发
1. 引言
1.1 技术背景与应用场景
随着人机交互技术的不断演进,传统的语音识别已无法满足智能客服、心理评估、车载系统等场景对用户情绪理解的需求。在此背景下,多模态语音理解技术应运而生——不仅识别语音内容,还能解析说话人的情感状态和环境事件。
SenseVoice Small 正是这一趋势下的代表性轻量化模型。它基于 FunAudioLLM 团队开源的 SenseVoice 模型进行裁剪与优化,在保持高精度的同时显著降低资源消耗,适用于边缘设备部署和快速原型开发。
本文将围绕“由科哥二次开发构建的 SenseVoice Small”版本展开,详细介绍其 WebUI 使用方式、核心功能机制以及如何基于该系统进行 API 接口封装与集成,帮助开发者高效实现语音情感分析能力的工程化落地。
1.2 核心价值与创新点
相比原始版本,本项目具备以下关键优势:
- 本地化一键部署:通过
run.sh脚本自动拉起服务,无需复杂配置 - 直观可视化界面:提供图形化操作入口,支持上传、录音、示例试听
- 细粒度标签输出:同时返回文本、情感标签(7类)和事件标签(11类)
- 跨语言识别支持:涵盖中、英、日、韩、粤语等多种语言
- 可扩展性强:前端基于 Gradio 构建,易于改造为 RESTful API 服务
2. 系统架构与运行环境
2.1 整体架构概览
+------------------+ +---------------------+ | 用户端浏览器 | <-> | Gradio WebUI | +------------------+ +----------+----------+ | +--------v---------+ | SenseVoice Model | | (Small, ONNX/Torch)| +--------+----------+ | +--------v---------+ | 后端推理引擎 | | (Python + Torch) | +------------------+整个系统采用典型的前后端分离结构:
- 前端层:Gradio 提供的 WebUI 界面,负责音频输入、参数设置与结果展示
- 逻辑层:Python 编写的处理脚本,调用模型并解析输出
- 模型层:SenseVoice Small 模型文件(通常为
.onnx或 PyTorch 格式),执行 ASR + Emotion + Event 多任务联合推理
2.2 运行环境准备
硬件要求
| 配置项 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 4核 | 8核以上 |
| 内存 | 8GB | 16GB |
| GPU | 无 | NVIDIA T4 / RTX3060及以上(加速推理) |
软件依赖
# Python 3.9+ pip install torch torchaudio gradio soundfile numpy onnxruntime-gpu注意:若使用 GPU 加速,请确保安装对应版本的
onnxruntime-gpu或启用 PyTorch 的 CUDA 支持。
3. WebUI 功能详解与使用流程
3.1 启动服务
在 JupyterLab 或终端中执行启动命令:
/bin/bash /root/run.sh该脚本会自动完成以下动作:
- 激活虚拟环境(如存在)
- 启动 Gradio 应用
- 监听
localhost:7860
访问地址:
http://localhost:78603.2 页面布局说明
界面分为左右两大区域:
| 左侧功能区 | 右侧示例区 |
|---|---|
| - 上传音频/麦克风录音 - 语言选择 - 高级配置 - 开始识别按钮 | - 预置测试音频列表 - 支持一键加载播放 |
顶部显示标题信息:“SenseVoice WebUI” + “webUI二次开发 by 科哥”
3.3 完整使用流程
步骤 1:上传或录制音频
支持两种方式获取音频数据:
- 文件上传:点击区域选择本地
.mp3,.wav,.m4a文件 - 实时录音:点击麦克风图标 → 允许权限 → 录制 → 停止
建议录音时长控制在 30 秒以内以获得更快响应。
步骤 2:选择识别语言
下拉菜单包含:
auto(推荐):自动检测语言zh:普通话yue:粤语en:英语ja:日语ko:韩语nospeech:仅检测非语音事件
步骤 3:开始识别
点击🚀 开始识别按钮后,系统将执行以下流程:
- 音频预处理(重采样至 16kHz)
- VAD(语音活动检测)分段
- 模型推理(ASR + Emotion + Event)
- ITN(逆文本正则化)后处理
- 结果拼接与格式化输出
步骤 4:查看识别结果
输出格式如下:
[事件标签][文本内容] [情感标签]例如:
🎼😀欢迎收听本期节目,我是主持人小明。😊解析为:
- 事件:背景音乐 + 笑声
- 文本:欢迎收听本期节目,我是主持人小明。
- 情感:开心
4. 情感与事件标签体系解析
4.1 情感分类模型设计
SenseVoice Small 内置一个轻量级情感分类头,共支持7 类情感标签:
| 表情符号 | 标签英文名 | 中文含义 | 典型声学特征 |
|---|---|---|---|
| 😊 | HAPPY | 开心 | 高音调、快节奏、元音延长 |
| 😡 | ANGRY | 生气/激动 | 强重音、高频能量集中 |
| 😔 | SAD | 伤心 | 低音调、语速慢、停顿多 |
| 😰 | FEARFUL | 恐惧 | 颤抖声、呼吸急促 |
| 🤢 | DISGUSTED | 厌恶 | 鼻音重、语气冷淡 |
| 😮 | SURPRISED | 惊讶 | 突然升高音调 |
| —— | NEUTRAL | 中性 | 平稳语调、无明显波动 |
模型采用多标签分类策略,允许同一片段出现多个情感倾向(但最终只保留置信度最高的一项)。
4.2 环境事件检测能力
除了情感,系统还集成了声音事件检测(SED)模块,可识别 11 种常见环境音:
| 图标 | 事件类型 | 应用场景举例 |
|---|---|---|
| 🎼 | BGM(背景音乐) | 判断是否处于媒体播放环境 |
| 👏 | Applause(掌声) | 演讲效果评估 |
| 😀 | Laughter(笑声) | 用户满意度监测 |
| 😭 | Cry(哭声) | 婴儿监护、心理咨询 |
| 🤧 | Cough/Sneeze(咳嗽/喷嚏) | 健康状态预警 |
| 📞 | Ringtone(电话铃声) | 通话中断判断 |
| 🚗 | Engine(引擎声) | 车载语音降噪 |
| 🚶 | Footsteps(脚步声) | 居家安全监控 |
| 🚪 | Door open/close(开门声) | 智能家居联动 |
| 🚨 | Alarm(警报声) | 紧急事件响应 |
| ⌨️ | Keyboard typing | 办公环境噪音过滤 |
这些事件标签有助于构建更完整的“上下文感知”语音交互系统。
5. API 接口封装实践
虽然 WebUI 提供了便捷的操作界面,但在生产环境中我们往往需要将其封装为标准 API 服务。以下是基于 Flask 的 RESTful 接口实现方案。
5.1 抽取核心推理函数
首先从原项目中提取出模型调用逻辑:
# inference.py import torch from funasr import AutoModel model = AutoModel( model="sensevoice-small", device="cuda" if torch.cuda.is_available() else "cpu" ) def recognize_speech(audio_path: str, language: str = "auto"): res = model.generate( input=audio_path, language=language, use_itn=True, merge_vad=True ) return res[0]["text"] # 返回带标签的完整字符串5.2 构建 Flask API 服务
# app.py from flask import Flask, request, jsonify from werkzeug.utils import secure_filename import os from inference import recognize_speech app = Flask(__name__) UPLOAD_FOLDER = '/tmp/audio' os.makedirs(UPLOAD_FOLDER, exist_ok=True) @app.route('/api/transcribe', methods=['POST']) def transcribe(): if 'file' not in request.files: return jsonify({"error": "No file uploaded"}), 400 file = request.files['file'] lang = request.form.get('lang', 'auto') filename = secure_filename(file.filename) filepath = os.path.join(UPLOAD_FOLDER, filename) file.save(filepath) try: result = recognize_speech(filepath, language=lang) # 解析结果中的情感与事件标签 response = parse_result(result) return jsonify(response) except Exception as e: return jsonify({"error": str(e)}), 500 finally: os.remove(filepath) # 清理临时文件 def parse_result(text_with_tags: str): import re events = re.findall(r'[🎼👏😀😭🤧📞🚗🚶🚪🚨⌨️🖱️]+', text_with_tags) emotions = re.findall(r'[😊😡😔😰🤢😮]', text_with_tags) # 去除标签得到纯文本 clean_text = re.sub(r'[🎼👏😀😭🤧📞🚗🚶🚪🚨⌨️🖱️😊😡😔😰🤢😮]+', '', text_with_tags).strip() return { "text": clean_text, "events": list(set(events)), "emotion": emotions[-1] if emotions else "NEUTRAL", "raw_output": text_with_tags } if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)5.3 API 使用示例
curl -X POST http://localhost:5000/api/transcribe \ -F "file=@test.mp3" \ -F "lang=zh" | python -m json.tool返回示例:
{ "text": "今天天气真好", "events": ["😀"], "emotion": "😊", "raw_output": "😀今天天气真好。😊" }6. 性能优化与最佳实践
6.1 提升识别准确率
| 维度 | 优化建议 |
|---|---|
| 音频质量 | 使用 16kHz 采样率、单声道 WAV 格式 |
| 噪声抑制 | 前置添加 RNNoise 或 WebRTC NS 模块 |
| 语言设定 | 明确语种时避免使用 auto,减少误判 |
| 语速控制 | 保持自然语速,避免过快或断续 |
6.2 推理加速技巧
- 启用批处理:设置
batch_size_s=60实现动态批处理 - GPU 推理:使用 ONNX Runtime-GPU 版本提升吞吐
- 模型量化:将 FP32 模型转为 INT8 减少内存占用
- 缓存机制:对重复音频哈希去重,避免重复计算
6.3 错误处理与健壮性增强
try: result = model.generate(input=audio_data) except RuntimeError as e: if "out of memory" in str(e): return {"error": "GPU memory insufficient, try shorter audio"} else: return {"error": "Inference failed: " + str(e)}7. 总结
7.1 技术价值总结
SenseVoice Small 在保持较小模型体积的前提下,实现了语音识别、情感分析与事件检测的三合一能力,特别适合嵌入式设备、本地化部署和低延迟场景的应用需求。经过科哥的二次开发,其 WebUI 界面极大降低了使用门槛,使得非技术人员也能快速上手体验高级语音分析功能。
7.2 实践建议
- 优先使用 auto 语言模式:在多语种混合或口音复杂场景下表现更鲁棒
- 结合业务逻辑解析标签:将 😊、👏 等标签转化为 NPS 分数或用户满意度指标
- 定期更新模型版本:关注 FunAudioLLM/SenseVoice 官方仓库,获取性能改进
7.3 发展展望
未来可进一步拓展方向包括:
- 将情感强度数值化(如 HAPPY: 0.8)
- 支持长时间音频流式识别
- 添加自定义关键词唤醒功能
- 与 RAG 系统结合实现情绪感知对话机器人
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。