2026/5/18 21:53:11
网站建设
项目流程
门户网站系统开发,网页设计素材,企业电子商务网站建设的必要性,钟点工Paraformer-large如何导出结果#xff1f;TXT/SRT格式生成实战教程
1. 教程目标与适用人群
你是否已经用上了Paraformer-large这个强大的离线语音识别工具#xff0c;却还在为“识别完只能看不能存”而烦恼#xff1f; 你是不是也希望把识别结果自动保存成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_okTrue)这样所有生成的文件都会集中放在./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, encodingutf-8) as f: f.write(text) return txt_path调用时只需传入识别结果和原音频文件名即可。3.3 实现SRT字幕文件生成SRT是视频字幕的标准格式包含序号、时间戳和文本三部分。我们需要从模型返回的结果中提取时间信息。注意Paraformer-large-vad-punc模型在启用batch_size_s参数时默认不会返回详细时间戳。要获取时间信息必须开启output_timestampTrue。修改推理参数如下res model.generate( inputaudio_path, batch_size_s300, output_timestampTrue # 关键开启时间戳输出 )然后解析时间戳并生成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{i1}) 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, encodingutf-8) as f: f.write(srt_content) return srt_path4. 改造Gradio界面支持文件下载现在我们将原来的单输出框升级为多组件输出包括文本显示区TXT文件下载按钮SRT文件下载按钮更新后的asr_process函数如下def asr_process(audio_path): if audio_path is None: return 请先上传音频文件, None, None # 推理识别含时间戳 res model.generate( inputaudio_path, batch_size_s300, output_timestampTrue ) 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, encodingutf-8) as f: f.write(字幕生成失败未检测到时间戳信息。\n请确认模型支持并正确配置 output_timestampTrue。) return full_text, txt_path, srt_path接着在Gradio界面上添加两个可下载的文件组件with gr.Blocks(titleParaformer 语音转文字控制台) as demo: gr.Markdown(# Paraformer 离线语音识别转写) gr.Markdown(支持长音频上传自动添加标点符号和端点检测并导出TXT/SRT文件。) with gr.Row(): with gr.Column(): audio_input gr.Audio(typefilepath, label上传音频或直接录音) submit_btn gr.Button(开始转写, variantprimary) with gr.Column(): text_output gr.Textbox(label识别结果, lines10) gr.Markdown(### 下载结果) txt_output gr.File(labelTXT文本下载) srt_output gr.File(labelSRT字幕下载) submit_btn.click( fnasr_process, inputsaudio_input, outputs[text_output, txt_output, srt_output] ) demo.launch(server_name0.0.0.0, server_port6006)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( modelmodel_id, model_revisionv2.0.4, devicecuda:0 ) # 结果输出目录 OUTPUT_DIR ./asr_results os.makedirs(OUTPUT_DIR, exist_okTrue) 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{i1}) 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, encodingutf-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, encodingutf-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( inputaudio_path, batch_size_s300, output_timestampTrue ) 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, encodingutf-8) as f: f.write(警告未获取到时间戳信息无法生成准确字幕。\n建议检查模型配置是否启用 output_timestampTrue。) return full_text, txt_path, srt_path # 构建界面 with gr.Blocks(titleParaformer 语音转文字控制台) as demo: gr.Markdown(# Paraformer 离线语音识别转写) gr.Markdown(支持长音频上传自动添加标点符号和端点检测并导出TXT/SRT文件。) with gr.Row(): with gr.Column(): audio_input gr.Audio(typefilepath, label上传音频或直接录音) submit_btn gr.Button(开始转写, variantprimary) with gr.Column(): text_output gr.Textbox(label识别结果, lines10) gr.Markdown(### 下载结果) txt_output gr.File(labelTXT文本下载) srt_output gr.File(labelSRT字幕下载) submit_btn.click( fnasr_process, inputsaudio_input, outputs[text_output, txt_output, srt_output] ) # 启动服务 demo.launch(server_name0.0.0.0, server_port6006)6. 使用说明与常见问题6.1 如何部署运行将上述完整脚本保存为/root/workspace/app.py确保环境已激活source /opt/miniconda3/bin/activate torch25安装依赖如未预装pip install funasr gradio启动服务cd /root/workspace python app.py6.2 如何访问Web界面使用SSH隧道映射端口ssh -L 6006:127.0.0.1:6006 -p [你的端口号] root[你的实例IP]本地浏览器打开http://127.0.0.1:60066.3 常见问题解答问题可能原因解决方法SRT字幕时间错乱模型未返回时间戳确认output_timestampTrue已设置文件无法下载路径权限问题检查asr_results目录是否存在且可写中文乱码编码未设为UTF-8所有文件保存时指定encodingutf-8长音频卡顿显存不足降低batch_size_s如改为1507. 总结让语音识别真正落地可用通过本次实战改造我们成功将一个“只能看”的语音识别Demo升级为一个“能存能用”的实用工具。你现在可以一键上传音频自动获得带标点的文本下载.txt用于文档归档下载.srt用于视频剪辑如Premiere、剪映等这不仅提升了工作效率也让Paraformer-large真正具备了生产级应用价值。无论是整理讲座录音、制作课程字幕还是处理访谈内容这套方案都能帮你节省大量手动输入的时间。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。