2026/2/15 7:12:30
网站建设
项目流程
地产网站设计,政务公开网站开发,做网站业务的怎么寻找客户,域名网站备案查询FSMN-VAD输出JSON格式#xff1f;结果结构化导出教程
1. 引言#xff1a;从表格到JSON#xff0c;让语音检测结果更易集成
你有没有遇到过这样的情况#xff1a;用FSMN-VAD做语音端点检测时#xff0c;结果只能看到漂亮的Markdown表格#xff0c;但想把数据拿去后续处理…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: ... # 可选关联文本 } ]注意时间单位是毫秒msvalue是语音片段列表每个元素是[start_ms, end_ms]外层是一个长度为1的列表所以我们通常取result[0][value]掌握了这个结构我们就可以把它转换成标准JSON了。3. 改造Web服务支持JSON结果导出接下来我们要对原来的web_app.py做升级新增两个核心功能将检测结果转为字典结构便于序列化添加“下载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| {i1} | {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_asciiFalse, indent2) # 写入临时JSON文件供下载 json_path vad_result.json with open(json_path, w, encodingutf-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(titleFSMN-VAD 语音检测) as demo: gr.Markdown(# FSMN-VAD 离线语音端点检测) with gr.Row(): with gr.Column(): audio_input gr.Audio(label上传音频或录音, typefilepath, sources[upload, microphone]) run_btn gr.Button(开始端点检测, variantprimary, elem_classesorange-button) with gr.Column(): output_text gr.Markdown(label检测结果) json_output gr.File(label 下载JSON结果, visibleTrue) # 新增文件输出 # 绑定事件点击按钮后同时更新表格和文件 run_btn.click( fnprocess_vad, inputsaudio_input, outputs[output_text, json_output] ) demo.css .orange-button { background-color: #ff6600 !important; color: white !important; } if __name__ __main__: demo.launch(server_name127.0.0.1, server_port6006)这样用户点击“开始端点检测”后不仅能看见表格还能直接下载结构化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 fvad_{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星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。