汕尾市网站建设_网站建设公司_GitHub_seo优化
2026/1/22 5:56:39 网站建设 项目流程

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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询