news 2026/6/10 12:15:54

Paraformer-large如何导出结果?TXT/SRT格式生成实战教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Paraformer-large如何导出结果?TXT/SRT格式生成实战教程

Paraformer-large如何导出结果?TXT/SRT格式生成实战教程

1. 教程目标与适用人群

你是否已经用上了Paraformer-large这个强大的离线语音识别工具,却还在为“识别完只能看不能存”而烦恼?
你是不是也希望把识别结果自动保存成TXT文本SRT字幕文件,方便后续编辑、归档或嵌入视频?

本教程将手把手带你改造默认的Gradio界面脚本,在原有语音转写功能基础上,增加结果导出能力,实现:

  • 自动将识别结果保存为.txt文件
  • 按时间戳生成标准.srt字幕文件(适用于视频剪辑)
  • 用户可一键下载结果文件
  • 兼容长音频切片处理机制

无需深度学习背景,只要你会复制代码、会运行Python脚本,就能搞定。适合科研、 transcription 工作者、自媒体创作者、会议记录整理者等所有需要“语音变文字”的用户。


2. 原始功能回顾:Paraformer-large + Gradio基础版

我们使用的镜像是基于阿里达摩院开源的FunASR框架,预装了paraformer-large-vad-punc模型,支持:

  • 长音频自动分段(VAD)
  • 标点恢复(Punc)
  • 中英文混合识别
  • Web可视化界面(Gradio)

默认脚本app.py提供了一个简洁的上传→识别→显示流程,但缺少文件导出功能。这正是我们要补全的关键一环。


3. 功能升级:添加TXT与SRT导出能力

我们将对原始app.py进行扩展,新增以下核心功能模块:

3.1 新增输出路径管理

首先定义一个安全的结果存储目录,并确保每次运行都能访问:

import os from datetime import datetime # 创建结果保存目录 OUTPUT_DIR = "./asr_results" os.makedirs(OUTPUT_DIR, exist_ok=True)

这样所有生成的文件都会集中放在./asr_results目录下,便于管理和清理。


3.2 实现TXT文本导出

最简单的导出方式就是把纯文本内容写入.txt文件:

def save_as_txt(text, audio_filename): # 构造输出文件名 base_name = os.path.splitext(os.path.basename(audio_filename))[0] txt_path = os.path.join(OUTPUT_DIR, f"{base_name}_result.txt") with open(txt_path, "w", encoding="utf-8") as f: f.write(text) return txt_path

调用时只需传入识别结果和原音频文件名即可。


3.3 实现SRT字幕文件生成

SRT是视频字幕的标准格式,包含序号、时间戳和文本三部分。我们需要从模型返回的结果中提取时间信息。

注意:Paraformer-large-vad-punc模型在启用batch_size_s参数时,默认不会返回详细时间戳。要获取时间信息,必须开启output_timestamp=True

修改推理参数如下:

res = model.generate( input=audio_path, batch_size_s=300, output_timestamp=True # 关键!开启时间戳输出 )

然后解析时间戳并生成SRT内容:

def generate_srt(res_list): srt_lines = [] for i, seg in enumerate(res_list): if 'start' not in seg or 'end' not in seg: continue start_time = format_timestamp_srt(seg['start']) end_time = format_timestamp_srt(seg['end']) text = seg['text'].strip() srt_lines.append(f"{i+1}") srt_lines.append(f"{start_time} --> {end_time}") srt_lines.append(f"{text}\n") return "\n".join(srt_lines) def format_timestamp_srt(seconds): """将秒数转换为SRT时间格式 HH:MM:SS,mmm""" hours = int(seconds // 3600) minutes = int((seconds % 3600) // 60) secs = seconds % 60 ms = int((secs - int(secs)) * 1000) secs = int(secs) return f"{hours:02d}:{minutes:02d}:{secs:02d},{ms:03d}"

最后保存为.srt文件:

def save_as_srt(res_list, audio_filename): srt_content = generate_srt(res_list) base_name = os.path.splitext(os.path.basename(audio_filename))[0] srt_path = os.path.join(OUTPUT_DIR, f"{base_name}_subtitles.srt") with open(srt_path, "w", encoding="utf-8") as f: f.write(srt_content) return srt_path

4. 改造Gradio界面:支持文件下载

现在我们将原来的单输出框升级为多组件输出,包括:

  • 文本显示区
  • TXT文件下载按钮
  • SRT文件下载按钮

更新后的asr_process函数如下:

def asr_process(audio_path): if audio_path is None: return "请先上传音频文件", None, None # 推理识别(含时间戳) res = model.generate( input=audio_path, batch_size_s=300, output_timestamp=True ) if len(res) == 0: text = "识别失败,请检查音频格式" return text, None, None # 提取主文本 full_text = "".join([seg['text'] for seg in res]) if isinstance(res[0], dict) else res[0]['text'] # 保存TXT txt_path = save_as_txt(full_text, audio_path) # 保存SRT(仅当有时间戳时) if 'start' in res[0]: srt_path = save_as_srt(res, audio_path) else: # 若无时间戳,则创建空占位文件 base_name = os.path.splitext(os.path.basename(audio_path))[0] srt_path = os.path.join(OUTPUT_DIR, f"{base_name}_subtitles.srt") with open(srt_path, "w", encoding="utf-8") as f: f.write("字幕生成失败:未检测到时间戳信息。\n请确认模型支持并正确配置 output_timestamp=True。") return full_text, txt_path, srt_path

接着在Gradio界面上添加两个可下载的文件组件:

with gr.Blocks(title="Paraformer 语音转文字控制台") as demo: gr.Markdown("# 🎤 Paraformer 离线语音识别转写") gr.Markdown("支持长音频上传,自动添加标点符号和端点检测,并导出TXT/SRT文件。") with gr.Row(): with gr.Column(): audio_input = gr.Audio(type="filepath", label="上传音频或直接录音") submit_btn = gr.Button("开始转写", variant="primary") with gr.Column(): text_output = gr.Textbox(label="识别结果", lines=10) gr.Markdown("### 下载结果") txt_output = gr.File(label="TXT文本下载") srt_output = gr.File(label="SRT字幕下载") submit_btn.click( fn=asr_process, inputs=audio_input, outputs=[text_output, txt_output, srt_output] ) demo.launch(server_name="0.0.0.0", server_port=6006)

5. 完整增强版 app.py 脚本

以下是整合后的完整代码,可直接替换原app.py使用:

# app.py - 增强版:支持TXT/SRT导出 import gradio as gr from funasr import AutoModel import os from datetime import datetime # 初始化模型 model_id = "iic/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch" model = AutoModel( model=model_id, model_revision="v2.0.4", device="cuda:0" ) # 结果输出目录 OUTPUT_DIR = "./asr_results" os.makedirs(OUTPUT_DIR, exist_ok=True) def format_timestamp_srt(seconds): hours = int(seconds // 3600) minutes = int((seconds % 3600) // 60) secs = seconds % 60 ms = int((secs - int(secs)) * 1000) secs = int(secs) return f"{hours:02d}:{minutes:02d}:{secs:02d},{ms:03d}" def generate_srt(res_list): srt_lines = [] for i, seg in enumerate(res_list): if 'start' not in seg or 'end' not in seg: continue start_time = format_timestamp_srt(seg['start']) end_time = format_timestamp_srt(seg['end']) text = seg['text'].strip() srt_lines.append(f"{i+1}") srt_lines.append(f"{start_time} --> {end_time}") srt_lines.append(f"{text}\n") return "\n".join(srt_lines) def save_as_txt(text, audio_filename): base_name = os.path.splitext(os.path.basename(audio_filename))[0] txt_path = os.path.join(OUTPUT_DIR, f"{base_name}_result.txt") with open(txt_path, "w", encoding="utf-8") as f: f.write(text) return txt_path def save_as_srt(res_list, audio_filename): srt_content = generate_srt(res_list) base_name = os.path.splitext(os.path.basename(audio_filename))[0] srt_path = os.path.join(OUTPUT_DIR, f"{base_name}_subtitles.srt") with open(srt_path, "w", encoding="utf-8") as f: f.write(srt_content) return srt_path def asr_process(audio_path): if audio_path is None: return "请先上传音频文件", None, None res = model.generate( input=audio_path, batch_size_s=300, output_timestamp=True ) if len(res) == 0: text = "识别失败,请检查音频格式" return text, None, None full_text = "".join([seg['text'] for seg in res]) if isinstance(res[0], dict) and 'text' in res[0] else res[0]['text'] txt_path = save_as_txt(full_text, audio_path) if isinstance(res[0], dict) and 'start' in res[0]: srt_path = save_as_srt(res, audio_path) else: base_name = os.path.splitext(os.path.basename(audio_path))[0] srt_path = os.path.join(OUTPUT_DIR, f"{base_name}_subtitles.srt") with open(srt_path, "w", encoding="utf-8") as f: f.write("警告:未获取到时间戳信息,无法生成准确字幕。\n建议检查模型配置是否启用 output_timestamp=True。") return full_text, txt_path, srt_path # 构建界面 with gr.Blocks(title="Paraformer 语音转文字控制台") as demo: gr.Markdown("# 🎤 Paraformer 离线语音识别转写") gr.Markdown("支持长音频上传,自动添加标点符号和端点检测,并导出TXT/SRT文件。") with gr.Row(): with gr.Column(): audio_input = gr.Audio(type="filepath", label="上传音频或直接录音") submit_btn = gr.Button("开始转写", variant="primary") with gr.Column(): text_output = gr.Textbox(label="识别结果", lines=10) gr.Markdown("### 下载结果") txt_output = gr.File(label="TXT文本下载") srt_output = gr.File(label="SRT字幕下载") submit_btn.click( fn=asr_process, inputs=audio_input, outputs=[text_output, txt_output, srt_output] ) # 启动服务 demo.launch(server_name="0.0.0.0", server_port=6006)

6. 使用说明与常见问题

6.1 如何部署运行?

  1. 将上述完整脚本保存为/root/workspace/app.py
  2. 确保环境已激活:
    source /opt/miniconda3/bin/activate torch25
  3. 安装依赖(如未预装):
    pip install funasr gradio
  4. 启动服务:
    cd /root/workspace && python app.py

6.2 如何访问Web界面?

使用SSH隧道映射端口:

ssh -L 6006:127.0.0.1:6006 -p [你的端口号] root@[你的实例IP]

本地浏览器打开:http://127.0.0.1:6006


6.3 常见问题解答

问题可能原因解决方法
SRT字幕时间错乱模型未返回时间戳确认output_timestamp=True已设置
文件无法下载路径权限问题检查asr_results目录是否存在且可写
中文乱码编码未设为UTF-8所有文件保存时指定encoding="utf-8"
长音频卡顿显存不足降低batch_size_s(如改为150)

7. 总结:让语音识别真正落地可用

通过本次实战改造,我们成功将一个“只能看”的语音识别Demo,升级为一个“能存能用”的实用工具。你现在可以:

一键上传音频
自动获得带标点的文本
下载.txt用于文档归档
下载.srt用于视频剪辑(如Premiere、剪映等)

这不仅提升了工作效率,也让Paraformer-large真正具备了生产级应用价值。

无论是整理讲座录音、制作课程字幕,还是处理访谈内容,这套方案都能帮你节省大量手动输入的时间。


获取更多AI镜像

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

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

Qwen-Image-2512-ComfyUI部署实战:阿里云GPU实例配置教程

Qwen-Image-2512-ComfyUI部署实战:阿里云GPU实例配置教程 镜像/应用大全,欢迎访问 1. 快速开始:三步实现Qwen-Image-2512出图 你是不是也想试试阿里最新发布的图片生成模型 Qwen-Image-2512?好消息是,现在通过 Comf…

作者头像 李华
网站建设 2026/6/10 10:42:51

5分钟上手GPEN人像修复增强镜像,一键修复老照片超简单

5分钟上手GPEN人像修复增强镜像,一键修复老照片超简单 你是否也翻过家里的老相册,看着那些泛黄、模糊甚至破损的照片,心里满是怀念却无能为力?以前想修复这些珍贵的人像照片,要么找专业修图师,费时又费钱&…

作者头像 李华
网站建设 2026/6/10 10:54:32

掌握数据可视化:从零构建智能报表的完整指南

掌握数据可视化:从零构建智能报表的完整指南 【免费下载链接】skills Public repository for Skills 项目地址: https://gitcode.com/GitHub_Trending/skills3/skills 您是否曾经面对一堆杂乱的数据无从下手?是否在为如何将复杂数据转化为清晰见解…

作者头像 李华
网站建设 2026/6/10 10:57:10

超强本地语音合成工具:ChatTTS-ui让文字转语音零门槛

超强本地语音合成工具:ChatTTS-ui让文字转语音零门槛 【免费下载链接】ChatTTS-ui 匹配ChatTTS的web界面和api接口 项目地址: https://gitcode.com/GitHub_Trending/ch/ChatTTS-ui 还在为在线语音合成服务的限制而烦恼吗?现在,一款完全…

作者头像 李华
网站建设 2026/5/30 20:40:06

思源笔记部署方案终极指南:企业级与个人使用完整对比

思源笔记部署方案终极指南:企业级与个人使用完整对比 【免费下载链接】siyuan A privacy-first, self-hosted, fully open source personal knowledge management software, written in typescript and golang. 项目地址: https://gitcode.com/GitHub_Trending/si…

作者头像 李华
网站建设 2026/6/9 20:55:46

Open-AutoGLM效率翻倍:批量任务自动执行

Open-AutoGLM效率翻倍:批量任务自动执行 1. 项目介绍 1.1 Open-AutoGLM 的定位与意义 Open-AutoGLM 是由智谱AI推出的开源手机端AI Agent框架,基于AutoGLM多模态大模型构建。它能通过视觉语言理解技术“看懂”手机屏幕内容,并结合自然语言…

作者头像 李华