SenseVoice Small保姆级教程:语音识别模型训练

1. 引言

1.1 学习目标

本文旨在为开发者和研究人员提供一份完整的 SenseVoice Small 模型训练与二次开发指南。通过本教程,您将掌握:

  • 如何部署并运行基于 SenseVoice Small 的 WebUI 界面
  • 如何使用其进行高精度语音转文字及情感/事件标签识别
  • 如何基于现有模型结构进行定制化训练与微调
  • 实际项目中的优化技巧与常见问题解决方案

适合具备基础 Python 和深度学习知识的用户阅读。

1.2 前置知识

在开始前,请确保您已了解以下内容:

  • Linux 基本命令操作
  • Python 编程基础
  • PyTorch 框架基本用法
  • Hugging Face Transformers 使用经验(加分项)
  • 音频处理基础知识(如采样率、声道、格式等)

1.3 教程价值

本教程不仅涵盖 SenseVoice Small 的使用方法,还深入讲解其背后的技术逻辑与可扩展性设计,帮助您从“会用”进阶到“能改”,真正实现本地化、私有化、定制化的语音识别系统构建。


2. 环境准备与部署

2.1 系统要求

组件 推荐配置
CPU Intel i5 或以上,4核+
内存 16GB RAM 起
GPU NVIDIA GTX 1660 / RTX 3060 及以上(支持 CUDA)
存储 50GB 可用空间(含模型缓存)
操作系统 Ubuntu 20.04 / 22.04 LTS 或 WSL2

注意:若无 GPU,也可在 CPU 上运行,但推理速度较慢。

2.2 安装依赖环境

# 创建虚拟环境
python -m venv sensevoice-env
source sensevoice-env/bin/activate

# 升级 pip
pip install --upgrade pip

# 安装 PyTorch(根据您的 CUDA 版本选择)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# 克隆官方仓库
git clone https://github.com/FunAudioLLM/SenseVoice.git
cd SenseVoice

# 安装项目依赖
pip install -r requirements.txt

2.3 启动 WebUI 服务

执行启动脚本以加载模型并开启 WebUI 服务:

/bin/bash /root/run.sh

服务默认监听端口 7860,可通过浏览器访问:

http://localhost:7860

若远程访问,请配置防火墙或使用 SSH 隧道:

ssh -L 7860:localhost:7860 user@server_ip

3. WebUI 功能详解

3.1 页面布局说明

界面采用简洁双栏式设计,左侧为功能区,右侧为示例音频列表:

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

3.2 核心功能模块

3.2.1 音频上传方式

支持两种输入方式:

  • 文件上传:点击区域选择 .mp3, .wav, .m4a 等常见格式
  • 麦克风录音:实时录制并自动上传,适用于快速测试

支持最大文件大小未限制,但建议控制在 5 分钟以内以保证响应效率。

3.2.2 多语言识别选项
语言代码 说明
auto 自动检测(推荐新手使用)
zh 普通话
yue 粤语
en 英语
ja 日语
ko 韩语
nospeech 强制跳过语音检测

实测表明,“auto”模式对中英混合语句识别准确率高于手动指定。

3.2.3 高级配置参数
参数名 作用 默认值
use_itn 是否启用逆文本正则化(数字转汉字) True
merge_vad 是否合并 VAD 分段结果 True
batch_size_s 动态批处理时间窗口(秒) 60

修改这些参数会影响识别粒度和性能表现,一般情况下无需调整。


4. 情感与事件标签识别机制解析

4.1 技术背景

SenseVoice Small 不仅是一个 ASR(自动语音识别)模型,更集成了 多任务学习架构,同时输出:

  • 文本序列(ASR)
  • 情感分类标签(Emotion Tagging)
  • 环境事件检测(Sound Event Detection)

这使其特别适用于客服质检、情绪分析、智能会议记录等场景。

4.2 情感标签体系

模型内置七类情感分类,输出时以表情符号标注于句尾:

表情 标签英文 含义
😊 HAPPY 开心、积极
😡 ANGRY 生气、激动
😔 SAD 伤心、低落
😰 FEARFUL 恐惧、紧张
🤢 DISGUSTED 厌恶、反感
😮 SURPRISED 惊讶
(无) NEUTRAL 中性

输出示例:
今天天气真好!😊
这个价格太离谱了!😡

4.3 事件标签体系

在句子开头添加环境音提示,用于还原真实对话上下文:

符号 事件类型 触发条件
🎼 BGM(背景音乐) 检测到持续背景旋律
👏 Applause 突发高频掌声
😀 Laughter 尖锐笑声频段
😭 Cry 婴儿哭声或抽泣
🤧 Cough/Sneeze 短促爆破音
📞 Ringtone 固定频率铃声
🚗 Engine 低频持续噪音
🚶 Footsteps 规律节奏脚步声
🚪 Door open/close 突发声强变化
🚨 Alarm 高频周期性警报
⌨️ Keyboard 快速敲击声
🖱️ Mouse click 单次短促点击

输出示例:
🎼😀欢迎收听本期节目,我是主持人小明。😊


5. 训练自定义模型(Fine-tuning)

5.1 数据准备

要对 SenseVoice Small 进行微调,需准备如下数据格式:

目录结构
dataset/
├── train.jsonl
├── dev.jsonl
└── audio/
    ├── clip_001.wav
    ├── clip_002.wav
    └── ...
JSONL 格式样本

每行为一个 JSON 对象:

{
  "utt_id": "clip_001",
  "audio_path": "audio/clip_001.wav",
  "text": "你好,欢迎来到我们的直播间。",
  "emotion": "HAPPY",
  "event": ["Laughter", "BGM"]
}

注意:emotion 和 event 字段可选,若不参与训练可省略。

5.2 预处理脚本

编写音频预处理脚本 preprocess.py

import json
from pathlib import Path
import soundfile as sf

def check_audio(file_path):
    try:
        data, sr = sf.read(file_path)
        duration = len(data) / sr
        return duration, sr
    except Exception as e:
        print(f"Error reading {file_path}: {e}")
        return None, None

# 扫描数据集
data_dir = Path("dataset")
with open("train_processed.jsonl", "w") as f:
    for line in open(data_dir / "train.jsonl"):
        item = json.loads(line.strip())
        audio_path = data_dir / item["audio_path"]
        duration, sr = check_audio(audio_path)
        
        if duration and 1 <= duration <= 30:  # 过滤过短或过长
            item["duration"] = duration
            item["sample_rate"] = sr
            f.write(json.dumps(item, ensure_ascii=False) + "\n")

5.3 微调命令

使用 HuggingFace Trainer 进行轻量级微调:

python run_speech_recognition_seq2seq.py \
    --model_name_or_path "FunAudioLLM/SenseVoiceSmall" \
    --train_file train_processed.jsonl \
    --validation_file dev.jsonl \
    --text_column text \
    --audio_column audio_path \
    --output_dir ./sensevoice-finetuned \
    --num_train_epochs 3 \
    --per_device_train_batch_size 8 \
    --gradient_accumulation_steps 2 \
    --learning_rate 1e-4 \
    --warmup_steps 500 \
    --logging_steps 100 \
    --save_steps 1000 \
    --evaluation_strategy steps \
    --eval_steps 1000 \
    --load_best_model_at_end \
    --use_auth_token True \
    --fp16 \
    --push_to_hub False

提示:首次运行会自动下载预训练权重(约 1.8GB),请保持网络畅通。


6. 性能优化与实践建议

6.1 提高识别准确率的方法

方法 描述
使用高质量音频 推荐 16kHz 以上采样率,WAV 格式最佳
控制背景噪声 在安静环境下录音,避免回声干扰
合理分段 单段音频建议不超过 30 秒,利于 VAD 切分
启用 ITN 数字转写更符合中文表达习惯(如“50”→“五十”)

6.2 GPU 加速设置

编辑 run.sh 文件,强制使用 GPU:

export CUDA_VISIBLE_DEVICES=0
python app.py \
    --device cuda \
    --model_path models/sensevoice-small \
    --port 7860

若有多卡,可设为 CUDA_VISIBLE_DEVICES=0,1 并启用 DataParallel。

6.3 批量处理脚本示例

对于大量音频文件,可编写批量识别脚本:

import os
import requests

API_URL = "http://localhost:7860/transcribe"

audio_dir = "./test_audios/"
results = []

for fname in os.listdir(audio_dir):
    if fname.endswith((".mp3", ".wav", ".m4a")):
        with open(os.path.join(audio_dir, fname), "rb") as f:
            files = {"audio": f}
            response = requests.post(API_URL, files=files, data={"lang": "auto"})
            result = response.json()
            results.append({"file": fname, "text": result["text"]})

# 保存结果
import json
with open("batch_results.json", "w", encoding="utf-8") as f:
    json.dump(results, f, ensure_ascii=False, indent=2)

7. 常见问题与解决方案

7.1 上传无反应

可能原因

  • 文件损坏或编码异常
  • 浏览器兼容性问题(建议使用 Chrome/Firefox)
  • 后端服务未完全启动

解决方法

  • 重新导出音频为标准 WAV 格式
  • 查看终端日志是否有错误堆栈
  • 重启服务:pkill python && /bin/bash /root/run.sh

7.2 识别结果不准

排查方向

  • 检查是否选择了正确的语言
  • 确认音频清晰度(可用 Audacity 查看波形)
  • 尝试关闭 merge_vad 查看分段效果

进阶方案

  • 对特定领域术语添加词典(如有专有名词)
  • 使用微调方式注入领域知识

7.3 GPU 显存不足

症状:出现 CUDA out of memory 错误

应对策略

  • 减小 batch_size_s 至 30 或更低
  • 使用 CPU 推理(修改 device 参数)
  • 升级显卡或使用云服务(如阿里云 A10 实例)

8. 总结

8.1 核心收获回顾

本文系统介绍了 SenseVoice Small 的完整使用流程与二次开发路径,包括:

  • WebUI 的部署与交互操作
  • 多模态输出(文本 + 情感 + 事件)的工作机制
  • 自定义数据集构建与模型微调方法
  • 实际应用中的性能优化技巧

该模型凭借其小巧体积(Small 版本约 1.8GB)、高识别精度和丰富的语义标签能力,非常适合嵌入式、边缘计算和私有化部署场景。

8.2 下一步学习建议

  • 深入研究 FunASR 框架源码,理解底层 VAD 与 CTC 模块
  • 尝试接入实时流式识别(WebSocket)
  • 结合 Whisper.cpp 实现纯 CPU 本地化部署
  • 构建自动化流水线:录音 → 识别 → 分析 → 存储

获取更多AI镜像

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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐