news 2026/4/10 9:23:26

如何用SenseVoice Small识别语音并标注情感?科哥镜像快速上手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用SenseVoice Small识别语音并标注情感?科哥镜像快速上手

如何用SenseVoice Small识别语音并标注情感?科哥镜像快速上手

1. 引言:为什么选择SenseVoice Small进行语音情感识别?

在智能客服、会议记录、内容审核等实际应用场景中,仅识别语音文字已无法满足需求。理解说话人的情绪状态和音频中的环境事件,正成为下一代语音交互系统的核心能力。

SenseVoice Small 是由 FunAudioLLM 开发的轻量级音频基础模型,在保持高效推理速度的同时,集成了语音识别(ASR)、语种识别(LID)、语音情感识别(SER)和声学事件分类(AEC)四大功能。相比主流的 Whisper-small 模型,它不仅支持多语言高精度转录,还能自动标注“开心”“生气”“笑声”“背景音乐”等丰富标签,极大提升了语音数据的理解维度。

本文基于“SenseVoice Small 根据语音识别文字和情感事件标签 二次开发构建 by 科哥”这一预配置镜像环境,带你从零开始掌握如何快速部署、使用 WebUI 界面完成语音识别与情感分析,并提供可扩展的 API 调用方案,助力开发者高效集成到自有系统中。


2. 镜像环境准备与启动流程

2.1 镜像简介与优势

该镜像为社区开发者“科哥”对原始 SenseVoice 项目的二次封装版本,主要特点包括:

  • ✅ 预装完整依赖环境(Python 3.10 + PyTorch + torchaudio)
  • ✅ 内置webui.pyapi.py双服务入口
  • ✅ 支持本地离线运行(模型缓存已内置或可手动复制)
  • ✅ 提供图形化 WebUI 界面,降低使用门槛
  • ✅ 开放 RESTful API 接口,便于二次开发集成

提示:首次运行会自动加载模型至.cache/modelscope/hub/iic目录,建议将此目录保留以支持后续离线使用。

2.2 启动应用服务

无论你是通过云平台容器还是本地 JupyterLab 访问该镜像,均可通过以下命令重启或启动 WebUI 服务:

/bin/bash /root/run.sh

该脚本通常包含如下核心指令:

cd /root/SenseVoice python webui.py --port 7860 --host 0.0.0.0

2.3 访问 WebUI 地址

服务启动后,在浏览器中打开:

http://localhost:7860

若部署在远程服务器,请替换localhost为实际 IP 地址,并确保端口 7860 已开放防火墙规则。


3. WebUI 使用详解:四步完成语音识别与情感标注

3.1 界面布局说明

WebUI 页面采用简洁清晰的双栏设计:

┌─────────────────────────────────────────────────────────┐ │ [紫蓝渐变标题] SenseVoice WebUI │ │ webUI二次开发 by 科哥 | 微信:312088415 │ ├─────────────────────────────────────────────────────────┤ │ 📖 使用说明 │ ├──────────────────────┬──────────────────────────────────┤ │ 🎤 上传音频 │ 💡 示例音频 │ │ 🌐 语言选择 │ - zh.mp3 (中文) │ │ ⚙️ 配置选项 │ - en.mp3 (英文) │ │ 🚀 开始识别 │ - ja.mp3 (日语) │ │ 📝 识别结果 │ - ko.mp3 (韩语) │ └──────────────────────┴──────────────────────────────────┘

左侧为操作区,右侧为示例资源,方便新手快速体验。

3.2 步骤一:上传音频文件或录音

方式一:上传本地音频

点击🎤 上传音频或使用麦克风区域,选择支持格式的音频文件:

  • 支持格式:MP3、WAV、M4A
  • 推荐采样率:16kHz 或更高
  • 建议时长:30秒以内(过长音频会影响响应速度)
方式二:实时麦克风录音

点击右侧麦克风图标,授权浏览器访问麦克风权限后:

  1. 点击红色圆形按钮开始录制
  2. 再次点击停止录音
  3. 系统自动生成临时 WAV 文件用于识别

注意:确保环境安静,避免回声干扰,有助于提升识别准确率。

3.3 步骤二:选择识别语言

🌐 语言选择下拉菜单中选择目标语言:

选项说明
auto自动检测语言(推荐用于混合语种或不确定场景)
zh中文普通话
yue粤语
en英语
ja日语
ko韩语
nospeech强制标记为无语音

对于明确语种的音频,建议直接指定语言以获得更优识别效果。

3.4 步骤三:启动识别任务

点击🚀 开始识别按钮,系统将执行以下流程:

  1. 加载音频数据
  2. 执行 VAD(Voice Activity Detection)分割有效语音段
  3. 调用 SenseVoice Small 模型进行联合识别:
    • 文字转录
    • 情感分类
    • 声学事件检测
  4. 合并输出结构化结果

处理耗时参考

  • 10秒音频:约 0.5~1 秒
  • 1分钟音频:约 3~5 秒
  • 实际性能受 CPU/GPU 资源影响

3.5 步骤四:查看识别结果

识别完成后,结果将在📝 识别结果文本框中展示,格式如下:

🎼😀欢迎收听本期节目,我是主持人小明。😊
结构解析:
组件含义
🎼事件标签:背景音乐(BGM)
😀事件标签:笑声(Laughter)
欢迎收听...识别出的文字内容
😊情感标签:开心(HAPPY)
支持的情感标签(末尾显示):
  • 😊 开心 (HAPPY)
  • 😡 生气/激动 (ANGRY)
  • 😔 伤心 (SAD)
  • 😰 恐惧 (FEARFUL)
  • 🤢 厌恶 (DISGUSTED)
  • 😮 惊讶 (SURPRISED)
  • (无表情)= 中性 (NEUTRAL)
支持的事件标签(开头显示):
  • 🎼 背景音乐 (BGM)
  • 👏 掌声 (Applause)
  • 😀 笑声 (Laughter)
  • 😭 哭声 (Cry)
  • 🤧 咳嗽/喷嚏 (Cough/Sneeze)
  • 📞 电话铃声
  • 🚗 引擎声
  • 🚶 脚步声
  • 🚪 开门声
  • 🚨 警报声
  • ⌨️ 键盘声
  • 🖱️ 鼠标声

4. 高级配置与优化技巧

4.1 配置选项说明

展开⚙️ 配置选项可调整以下参数(一般无需修改):

参数说明默认值
语言识别语言模式auto
use_itn是否启用逆文本正则化(如“50”转“五十”)True
merge_vad是否合并相邻 VAD 分段True
batch_size_s动态批处理时间窗口(秒)60

修改这些参数可能影响识别精度或延迟,建议仅在特定场景下调试使用。

4.2 提升识别质量的实用建议

维度最佳实践
音频质量使用 16kHz 以上采样率的 WAV 格式文件
录音环境在安静环境中录制,减少背景噪音
设备选择使用高质量麦克风,避免手机自带 mic 的失真
语速控制保持适中语速,避免过快导致漏词
语言设定若确定语种,优先选择具体语言而非 auto

4.3 示例音频快速体验

点击右侧💡 示例音频列表中的任意条目即可立即测试:

示例文件特点
zh.mp3中文日常对话
yue.mp3粤语识别能力演示
en.mp3英文朗读识别
emo_1.wav明显情绪波动样本(适合测试情感识别)
rich_1.wav多事件叠加场景(含笑声、背景音等)

5. 二次开发指南:调用本地 API 实现自动化识别

虽然 WebUI 适合人工操作,但在生产环境中我们往往需要程序化调用。以下是基于 Python 的 API 调用示例,可用于构建自动化语音处理流水线。

5.1 启动 API 服务

首先确保api.py正常运行,并修改其启动方式以支持外网访问:

if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8666)

然后启动服务:

python api.py

API 地址为:

http://localhost:8666/api/v1/asr

5.2 完整调用代码示例

import io import time import wave import requests from tqdm import tqdm import speech_recognition as sr import re class AudioRecorder: def __init__(self, rate=16000): self.rate = rate self.recognizer = sr.Recognizer() def record(self): with sr.Microphone(sample_rate=self.rate) as source: print('请在倒计时结束前说话', flush=True) start_time = time.time() audio = None for _ in tqdm(range(20), desc="倒计时", unit="s"): try: audio = self.recognizer.listen(source, timeout=1, phrase_time_limit=15) break except sr.WaitTimeoutError: if time.time() - start_time > 20: print("未检测到语音输入") break if audio is None: print("未检测到语音输入") return None audio_data = audio.get_wav_data() return io.BytesIO(audio_data) def save_wav(self, audio_data, filename="temp_output.wav"): audio_data.seek(0) with wave.open(filename, 'wb') as wav_file: wav_file.setnchannels(1) wav_file.setsampwidth(2) wav_file.setframerate(self.rate) wav_file.setcomptype("NONE", "not compressed") wav_file.writeframes(audio_data.read()) audio_data.seek(0) def run(self): audio_data = self.record() if audio_data: self.save_wav(audio_data, "temp_output.wav") return audio_data class SenseVoice: def __init__(self, api_url, emo=False): self.api_url = api_url self.emo = emo def _extract_second_bracket_content(self, raw_text): match = re.search(r'<[^<>]*><([^<>]*)>', raw_text) if match: return match.group(1) return None def _get_speech_text(self, audio_data): print('正在进行语音识别') files = [('files', ('audio.wav', audio_data, 'audio/wav'))] data = {'keys': 'audio1', 'lang': 'auto'} response = requests.post(self.api_url, files=files, data=data) if response.status_code == 200: result_json = response.json() if "result" in result_json and len(result_json["result"]) > 0: if self.emo: emotion = self._extract_second_bracket_content(result_json["result"][0]["raw_text"]) text = result_json["result"][0]["text"] return f"{emotion}\n{text}" else: return result_json["result"][0]["text"] else: return "未识别到有效的文本" else: return f"请求失败,状态码: {response.status_code}" def speech_to_text(self, audio_data): return self._get_speech_text(audio_data) # 使用示例 if __name__ == "__main__": recorder = AudioRecorder() audio_data = recorder.run() if audio_data: api_url = "http://localhost:8666/api/v1/asr" sense_voice = SenseVoice(api_url, emo=True) result = sense_voice.speech_to_text(audio_data) print("识别结果:", result)

5.3 返回结果示例

API 原始返回 JSON 示例:

{ "result": [ { "key": "audio1", "raw_text": "<speech><happy>欢迎收听本期节目,我是主持人小明。</speech>", "text": "欢迎收听本期节目,我是主持人小明。" } ] }

经处理后输出:

happy 欢迎收听本期节目,我是主持人小明。

6. 总结

SenseVoice Small 凭借其多模态感知能力(文字 + 情感 + 事件),正在成为轻量级语音理解场景的理想选择。结合“科哥”提供的二次开发镜像,用户可以:

  • 快速部署 WebUI 进行交互式测试
  • 利用示例音频验证情感与事件识别效果
  • 通过 API 接口实现自动化语音处理流水线
  • 在低资源环境下实现百毫秒级响应

尽管当前 large 模型尚未开源,但 small 版本已在多数日常场景中表现出色,尤其适合教育、客服质检、内容创作等领域。

未来可进一步探索:

  • 将识别结果接入 NLP 情绪分析 pipeline
  • 构建带情感标签的语音数据库
  • 实现实时直播语音监控系统

掌握这一工具链,意味着你已具备构建“听得懂情绪”的语音智能系统的初步能力。

7. 常见问题解答

问题解决方案
Q: 上传音频后无反应?A: 检查文件是否损坏,尝试重新上传或转换为 WAV 格式
Q: 识别结果不准确?A: 检查音频质量、语言设置是否正确,优先使用 auto 模式
Q: 识别速度慢?A: 音频过长或服务器资源不足,建议分段处理
Q: 如何复制识别结果?A: 点击结果框右侧的复制按钮即可
Q: 如何离线运行?A: 将.cache/modelscope/hub/iic目录复制到项目根目录

版权声明:本镜像由“科哥”二次开发并维护,联系方式微信 312088415。项目基于 FunAudioLLM/SenseVoice 开源协议发布,承诺永久开源使用,请保留原作者版权信息。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 4:12:55

保姆级教程:用DeepSeek-R1-Distill-Qwen-1.5B打造智能问答系统

保姆级教程&#xff1a;用DeepSeek-R1-Distill-Qwen-1.5B打造智能问答系统 1. 引言 1.1 学习目标 本文将带你从零开始&#xff0c;使用 DeepSeek-R1-Distill-Qwen-1.5B 模型构建一个本地化、可交互的智能问答系统。你将掌握如何通过 vLLM 高效部署模型&#xff0c;并结合 Op…

作者头像 李华
网站建设 2026/3/27 9:32:12

一键部署verl:快速搭建属于你的AI模型强化学习环境

一键部署verl&#xff1a;快速搭建属于你的AI模型强化学习环境 1. 引言 大型语言模型&#xff08;LLMs&#xff09;在预训练之后&#xff0c;通常需要通过**后训练&#xff08;post-training&#xff09;**进一步优化其在特定任务上的表现。这一阶段主要包括监督微调&#xf…

作者头像 李华
网站建设 2026/3/27 9:57:36

FSMN VAD部署教程:批量处理音频文件详细步骤

FSMN VAD部署教程&#xff1a;批量处理音频文件详细步骤 1. 引言 1.1 技术背景与应用场景 FSMN VAD&#xff08;Feedforward Sequential Memory Neural Network - Voice Activity Detection&#xff09;是阿里达摩院FunASR项目中开源的语音活动检测模型&#xff0c;广泛应用…

作者头像 李华
网站建设 2026/4/3 4:11:38

告别云端依赖!用IndexTTS-2-LLM实现本地化语音合成

告别云端依赖&#xff01;用IndexTTS-2-LLM实现本地化语音合成 在人工智能技术不断渗透日常生活的今天&#xff0c;语音交互已成为提升用户体验的关键环节。从智能客服到有声读物&#xff0c;从教育辅助到工业播报&#xff0c;高质量的文本转语音&#xff08;Text-to-Speech, …

作者头像 李华
网站建设 2026/4/10 5:42:13

[特殊字符]_高并发场景下的框架选择:从性能数据看技术决策[20260118171059]

作为一名经历过无数生产环境考验的资深工程师&#xff0c;我深知在高并发场景下选择合适的技术栈是多么重要。最近我参与了一个日活千万级的电商平台重构项目&#xff0c;这个项目让我重新思考了Web框架在高并发环境下的表现。今天我要分享的是基于真实生产数据的框架性能分析&…

作者头像 李华
网站建设 2026/4/9 11:01:04

AI语音带笑声?GLM-TTS情感奖励机制效果展示

AI语音带笑声&#xff1f;GLM-TTS情感奖励机制效果展示 1. 引言&#xff1a;让AI语音“有情绪”是种什么体验&#xff1f; 在传统文本转语音&#xff08;TTS&#xff09;系统中&#xff0c;生成的语音往往缺乏情感色彩&#xff0c;听起来机械、单调。即便能够克隆音色&#x…

作者头像 李华