news 2026/2/15 13:37:39

FSMN-VAD输出JSON格式?结果结构化导出教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FSMN-VAD输出JSON格式?结果结构化导出教程

FSMN-VAD输出JSON格式?结果结构化导出教程

1. 引言:从表格到JSON,让语音检测结果更易集成

你有没有遇到过这样的情况:用FSMN-VAD做语音端点检测时,结果只能看到漂亮的Markdown表格,但想把数据拿去后续处理却无从下手?比如要接入ASR自动识别流程、做语音片段切分,或者存入数据库分析——这时候你就需要结构化的JSON输出,而不是仅供查看的文本表格。

本文将带你一步步改造默认的FSMN-VAD控制台应用,不仅保留原有的可视化功能,还增加JSON格式的结果导出能力。无论你是想自动化处理长音频,还是开发语音预处理流水线,这篇教程都能让你轻松拿到可编程使用的检测结果。

你能学到什么

  • 如何获取FSMN-VAD模型原始输出并解析为结构化数据
  • 在Gradio界面中同时支持表格展示 + JSON下载
  • 实现一键生成.json文件供下游系统使用
  • 完整代码示例,直接复制即可运行

不需要深度学习背景,只要你会写基础Python脚本,就能搞定!


2. 理解FSMN-VAD的原始输出结构

在动手改造之前,先搞清楚模型返回的数据到底长什么样。这是实现结构化导出的关键一步。

当你调用vad_pipeline(audio_file)后,返回的是一个嵌套列表结构:

[ { 'value': [ [1000, 3520], # 第一段语音:起始毫秒,结束毫秒 [4800, 9600], # 第二段 [11000, 15200] # 第三段 ], 'text': '...' # (可选)关联文本 } ]

注意:

  • 时间单位是毫秒(ms)
  • value是语音片段列表,每个元素是[start_ms, end_ms]
  • 外层是一个长度为1的列表,所以我们通常取result[0]['value']

掌握了这个结构,我们就可以把它转换成标准JSON了。


3. 改造Web服务:支持JSON结果导出

接下来我们要对原来的web_app.py做升级,新增两个核心功能:

  1. 将检测结果转为字典结构,便于序列化
  2. 添加“下载JSON”按钮,用户可保存结构化数据

3.1 新增JSON格式化函数

我们在原代码基础上添加一个新函数,专门负责生成结构化数据:

import json from datetime import datetime def generate_vad_json(segments): """ 将语音片段列表转换为结构化JSON字典 """ result_data = { "generated_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "total_segments": len(segments), "segments": [] } for i, seg in enumerate(segments): start_ms, end_ms = seg start_sec = round(start_ms / 1000.0, 3) end_sec = round(end_ms / 1000.0, 3) duration_sec = round(end_sec - start_sec, 3) result_data["segments"].append({ "index": i + 1, "start_time_s": start_sec, "end_time_s": end_sec, "duration_s": duration_sec }) return result_data

这个函数返回的是标准Python字典,可以直接用json.dumps()转成字符串。


3.2 修改主处理函数,支持双输出

现在我们让process_vad函数不仅能输出表格,还能返回JSON数据和文件路径:

import os def process_vad(audio_file): if audio_file is None: return "请先上传音频或录音", None try: result = vad_pipeline(audio_file) if isinstance(result, list) and len(result) > 0: segments = result[0].get('value', []) else: return "模型返回格式异常", None if not segments: return "未检测到有效语音段。", None # 生成Markdown表格(保持原有功能) formatted_res = "### 🎤 检测到以下语音片段 (单位: 秒):\n\n" formatted_res += "| 片段序号 | 开始时间 | 结束时间 | 时长 |\n| :--- | :--- | :--- | :--- |\n" for i, seg in enumerate(segments): start, end = seg[0] / 1000.0, seg[1] / 1000.0 formatted_res += f"| {i+1} | {start:.3f}s | {end:.3f}s | {end-start:.3f}s |\n" # 生成JSON结构 json_data = generate_vad_json(segments) json_str = json.dumps(json_data, ensure_ascii=False, indent=2) # 写入临时JSON文件供下载 json_path = "vad_result.json" with open(json_path, "w", encoding="utf-8") as f: f.write(json_str) return formatted_res, json_path except Exception as e: error_msg = f"检测失败: {str(e)}" return error_msg, None

关键变化:

  • 返回值变成元组(markdown_table, json_file_path)
  • 自动生成vad_result.json文件

3.3 更新Gradio界面,增加JSON下载组件

最后更新UI部分,加入文件输出框和下载按钮:

with gr.Blocks(title="FSMN-VAD 语音检测") as demo: gr.Markdown("# 🎙 FSMN-VAD 离线语音端点检测") with gr.Row(): with gr.Column(): audio_input = gr.Audio(label="上传音频或录音", type="filepath", sources=["upload", "microphone"]) run_btn = gr.Button("开始端点检测", variant="primary", elem_classes="orange-button") with gr.Column(): output_text = gr.Markdown(label="检测结果") json_output = gr.File(label=" 下载JSON结果", visible=True) # 新增文件输出 # 绑定事件:点击按钮后同时更新表格和文件 run_btn.click( fn=process_vad, inputs=audio_input, outputs=[output_text, json_output] ) demo.css = ".orange-button { background-color: #ff6600 !important; color: white !important; }" if __name__ == "__main__": demo.launch(server_name="127.0.0.1", server_port=6006)

这样用户点击“开始端点检测”后,不仅能看见表格,还能直接下载结构化JSON文件。


4. 使用示例:一次检测,双重输出

假设你上传了一段包含三句话的录音,中间有停顿。检测完成后你会看到:

4.1 Markdown表格输出(前端展示)

### 🎤 检测到以下语音片段 (单位: 秒): | 片段序号 | 开始时间 | 结束时间 | 时长 | | :--- | :--- | :--- | :--- | | 1 | 1.020s | 3.520s | 2.500s | | 2 | 4.800s | 9.600s | 4.800s | | 3 | 11.000s | 15.200s | 4.200s |

4.2 生成的JSON文件内容

{ "generated_at": "2025-04-05 14:30:22", "total_segments": 3, "segments": [ { "index": 1, "start_time_s": 1.02, "end_time_s": 3.52, "duration_s": 2.5 }, { "index": 2, "start_time_s": 4.8, "end_time_s": 9.6, "duration_s": 4.8 }, { "index": 3, "start_time_s": 11.0, "end_time_s": 15.2, "duration_s": 4.2 } ] }

这个JSON可以直接被其他程序读取,例如用于:

  • 自动切分音频文件
  • 驱动ASR批量识别
  • 分析说话人活跃时长
  • 构建语音标注系统

5. 进阶技巧:自定义输出字段与命名规则

如果你希望每次生成的JSON文件名包含时间戳或音频名称,可以进一步优化文件保存逻辑:

def get_json_filename(audio_path): if audio_path: name = os.path.splitext(os.path.basename(audio_path))[0] return f"{name}_vad.json" return f"vad_{int(datetime.now().timestamp())}.json" # 在 process_vad 中替换 json_path 的生成方式: json_path = get_json_filename(audio_file)

还可以扩展JSON内容,加入音频信息:

import soundfile as sf def get_audio_info(path): info = {} try: data, sr = sf.read(path) info['sample_rate'] = sr info['duration_s'] = round(len(data) / sr, 3) info['channels'] = len(data.shape) if len(data.shape) == 1 else data.shape[1] except: pass return info # 然后在 generate_vad_json 中加入: "audio_info": get_audio_info(audio_file)

这样你的JSON就变成了完整的语音分析报告。


6. 总结:让VAD结果真正“可用”

通过本文的改造,我们实现了:

  • 保留原有Markdown表格的直观展示
  • 新增JSON结构化输出,便于程序解析
  • 支持一键下载.json文件
  • 输出格式清晰、字段语义明确
  • 可无缝集成到自动化流程中

这不仅仅是“换个格式”,而是把FSMN-VAD从一个演示工具升级为真正的生产级预处理模块

无论是做语音识别前的切片,还是分析会议录音中的发言分布,你现在都可以轻松拿到结构化的时间戳数据,再也不用手动抄录表格了。


获取更多AI镜像

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

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

Gradio界面太友好了!拖拽音频就能看情感分析结果

Gradio界面太友好了!拖拽音频就能看情感分析结果 1. 为什么说这个语音模型不一样? 你有没有遇到过这种情况:一段录音,光听文字转写总觉得少了点什么?语气是激动还是低落,背景有没有笑声或掌声&#xff0c…

作者头像 李华
网站建设 2026/2/7 2:09:21

中文指令合成标杆|Voice Sculptor镜像的18种场景实战

中文指令合成标杆|Voice Sculptor镜像的18种场景实战 通过自然语言精准“捏”出理想音色,让语音合成从机械朗读迈向情感表达 1. 实战背景与核心价值 在AI语音技术快速演进的今天,传统TTS(文本转语音)系统正面临表达…

作者头像 李华
网站建设 2026/2/7 7:48:43

终极游戏存档编辑工具:轻松定制你的专属游戏体验

终极游戏存档编辑工具:轻松定制你的专属游戏体验 【免费下载链接】ER-Save-Editor Elden Ring Save Editor. Compatible with PC and Playstation saves. 项目地址: https://gitcode.com/GitHub_Trending/er/ER-Save-Editor 还在为游戏难度而苦恼&#xff1f…

作者头像 李华
网站建设 2026/2/10 4:24:47

告别高配需求!Qwen3-VL-8B在24G显卡上的完整部署指南

告别高配需求!Qwen3-VL-8B在24G显卡上的完整部署指南 你是否也曾被“70B大模型才能做好多模态任务”的说法劝退?高昂的显存门槛、复杂的环境配置、漫长的推理延迟,让很多开发者望而却步。但现在,这一切正在改变。 阿里通义推出的…

作者头像 李华
网站建设 2026/2/8 17:10:58

3大实战场景解析DolphinScheduler:从零构建企业级分布式调度平台

3大实战场景解析DolphinScheduler:从零构建企业级分布式调度平台 【免费下载链接】dolphinscheduler Dolphinscheduler是一个分布式调度系统,主要用于任务调度和流程编排。它的特点是易用性高、可扩展性强、性能稳定等。适用于任务调度和流程自动化场景。…

作者头像 李华