语音识别结果导出:SenseVoiceSmall JSON格式生成实战
1. 引言:为什么需要结构化语音识别输出?
你有没有遇到过这种情况:用语音识别工具转写了一段会议录音,结果只得到一长串文字,根本分不清谁在什么时候说了什么,更别说判断说话人的情绪或背景里的掌声、笑声了?传统ASR(自动语音识别)只能解决“说了什么”,但真实场景中我们更关心“怎么说得”、“当时什么氛围”。
今天要讲的SenseVoiceSmall,正是为了解决这个问题而生。它不只是把声音变文字,还能告诉你这段话是开心地说的,还是愤怒地反驳,背景里有没有音乐或掌声——这些信息,对内容分析、客服质检、视频剪辑都至关重要。
本文将带你从零开始,部署 SenseVoiceSmall 模型,并重点实现一个关键功能:将识别结果以结构化的 JSON 格式导出,方便后续程序处理、存储或集成到其他系统中。
2. 模型简介:SenseVoiceSmall 能做什么?
SenseVoiceSmall 是阿里巴巴达摩院开源的一款多语言语音理解模型,属于 FunASR 项目的一部分。相比传统语音识别模型,它的核心优势在于支持“富文本转录”(Rich Transcription),即在转写文字的同时,标注出情感和声音事件。
2.1 多语言高精度识别
支持以下语种:
- 中文(zh)
- 英文(en)
- 粤语(yue)
- 日语(ja)
- 韩语(ko)
无需切换模型,一句话里夹杂多种语言也能准确识别。
2.2 情感与声音事件识别
这是 SenseVoice 的杀手级功能:
| 类型 | 支持标签 |
|---|---|
| 情感 | `< |
| 声音事件 | `< |
这些标签会直接嵌入到识别结果中,比如:
<|HAPPY|>今天天气真好啊!<|LAUGHTER|><|BGM|>这意味着你不仅能知道“说了什么”,还能感知“说话时的情绪”和“环境音变化”。
2.3 极致推理速度
采用非自回归架构,在 NVIDIA 4090D 上可实现秒级转写,适合实时或批量处理长音频。
3. 环境准备与快速部署
3.1 基础依赖
确保你的环境满足以下条件:
# Python 版本 python --version # 推荐 3.11 # 安装核心库 pip install torch==2.5.0 funasr modelscope gradio av -U其中:
funasr:阿里开源的语音识别工具包av:用于高效音频解码(比 librosa 快得多)gradio:构建 Web 可视化界面ffmpeg:系统级音频处理工具(需提前安装)
提示:如果你使用的是预置镜像,通常这些依赖已安装完毕。
3.2 下载并运行 WebUI 脚本
创建文件app_sensevoice.py,内容如下:
import gradio as gr from funasr import AutoModel from funasr.utils.postprocess_utils import rich_transcription_postprocess import json import os # 初始化模型 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 加速 )这个脚本初始化了 SenseVoiceSmall 模型,并启用了 VAD(语音活动检测),能自动切分静音段,提升长音频处理效率。
4. 实现 JSON 结果导出功能
默认的rich_transcription_postprocess函数只会返回清洗后的纯文本。但我们希望保留原始结构信息,便于后续分析。因此,我们需要绕过后处理函数,直接解析原始输出,并构造成标准 JSON 格式。
4.1 修改识别函数,返回结构化数据
替换原来的sensevoice_process函数:
def sensevoice_to_json(audio_path, language): if audio_path is None: return {"error": "请上传音频文件"} # 调用模型 res = model.generate( input=audio_path, cache={}, language=language, use_itn=True, batch_size_s=60, merge_vad=True, merge_length_s=15, ) if len(res) == 0: return {"error": "识别失败"} raw_text = res[0]["text"] # 手动解析带标签的文本,生成结构化 JSON segments = parse_rich_text(raw_text) return { "success": True, "total_segments": len(segments), "transcription": segments } def parse_rich_text(text): """ 将 <|TAG|> 形式的富文本解析成结构化列表 """ segments = [] current_segment = {"text": "", "emotion": None, "event": None} i = 0 while i < len(text): if text[i] == '<' and i + 3 < len(text) and text[i:i+2] == '<|': # 找到标签结束 end = text.find('|>', i) if end == -1: break tag = text[i+2:end] i = end + 2 # 分类标签 if tag in ["HAPPY", "ANGRY", "SAD", "NEUTRAL"]: current_segment["emotion"] = tag.lower() elif tag in ["BGM", "APPLAUSE", "LAUGHTER", "CRY"]: current_segment["event"] = tag.lower() else: # 遇到新标签前先保存当前段落 if current_segment["text"].strip(): segments.append(current_segment) current_segment = {"text": "", "emotion": None, "event": None} else: current_segment["text"] += text[i] i += 1 # 添加最后一段 if current_segment["text"].strip(): segments.append(current_segment) return segments4.2 更新 Gradio 界面,支持 JSON 输出
修改 WebUI,增加一个“导出 JSON”按钮:
with gr.Blocks(title="SenseVoice 智能语音识别") as demo: gr.Markdown("# 🎙️ SenseVoice 富文本语音识别与导出") with gr.Row(): with gr.Column(scale=2): 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("开始识别", variant="primary") with gr.Column(scale=3): result_text = gr.Textbox(label="纯文本结果", lines=8) json_output = gr.JSON(label="结构化 JSON 输出", collapsible=True) submit_btn.click( fn=sensevoice_to_json, inputs=[audio_input, lang_dropdown], outputs=[result_text, json_output] )这样,用户点击识别后,不仅能看见清洗后的文字,还能看到完整的 JSON 数据结构。
5. JSON 输出示例与应用场景
5.1 实际输出样例
假设输入一段包含情绪和背景音的中文语音,JSON 输出可能如下:
{ "success": true, "total_segments": 3, "transcription": [ { "text": "今天项目终于上线了,", "emotion": "happy", "event": null }, { "text": "大家辛苦了!", "emotion": "happy", "event": "applause" }, { "text": "接下来我们继续加油。", "emotion": "neutral", "event": null } ] }5.2 这个 JSON 能用来做什么?
- 客服质检系统:自动标记客户是否愤怒,辅助判定投诉等级。
- 视频字幕生成:根据情感调整字幕颜色(如愤怒用红色),增强表现力。
- 会议纪要分析:统计发言情绪分布,识别关键讨论节点(如掌声处可能是决策点)。
- AI 视频剪辑:自动剪辑“笑声密集”片段用于短视频推广。
- 教育评估:分析教师授课情绪变化,优化教学方式。
6. 本地访问与调试技巧
6.1 启动服务
python app_sensevoice.py如果一切正常,你会看到类似输出:
Running on local URL: http://0.0.0.0:60066.2 外部访问配置
由于云服务器通常不开放公网端口,需通过 SSH 隧道转发:
ssh -L 6006:127.0.0.1:6006 -p [SSH_PORT] root@[SERVER_IP]连接成功后,在本地浏览器打开: 👉 http://127.0.0.1:6006
即可访问 Web 界面。
6.3 调试建议
- 音频格式问题:优先使用
.wav或.mp3,采样率 16kHz 最佳。 - GPU 内存不足:可尝试降低
batch_size_s参数(如设为 30)。 - 识别不准:检查是否开启了
use_itn=True(数字规范化),避免“138”读成“一百三十八”。
7. 总结:让语音识别真正“懂”人类表达
SenseVoiceSmall 不只是一个语音转文字工具,它是通往“理解声音背后含义”的桥梁。通过本文的实践,你已经掌握了如何:
- 部署支持多语言、情感识别的先进语音模型;
- 解析富文本标签,构建结构化 JSON 输出;
- 将识别结果集成到实际业务系统中,发挥更大价值。
未来你可以进一步扩展功能:
- 添加时间戳,实现逐句对齐;
- 支持批量音频导入,一键生成多个 JSON 文件;
- 将结果存入数据库,构建语音分析平台。
技术的价值不在于炫技,而在于解决问题。当你能从一段录音中提取出情绪波动、掌声节奏、背景音乐的变化时,你就不再只是“听到了声音”,而是真正“读懂了现场”。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。