news 2026/4/20 22:55:01

Paraformer-large+Gradio二次开发:增加导出TXT/PDF功能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Paraformer-large+Gradio二次开发:增加导出TXT/PDF功能

Paraformer-large+Gradio二次开发:增加导出TXT/PDF功能

1. 背景与需求分析

随着语音识别技术在会议记录、教学转写、媒体内容处理等场景的广泛应用,用户对识别结果的后续使用提出了更高要求。原始的 Paraformer-large + Gradio 实现虽然提供了高效的离线语音转文字能力,但缺乏将识别结果持久化保存的功能。

在实际应用中,用户不仅希望看到识别文本,更需要将其导出为通用格式(如 TXT 或 PDF)以便归档、分享或进一步编辑。因此,本文基于已有的Paraformer-large 离线长音频识别系统,进行功能扩展,重点实现:

  • 一键导出识别结果为.txt文本文件
  • 支持生成带格式排版的.pdf文件
  • 在 Gradio 界面中集成下载按钮,提升交互体验

该改造无需修改核心 ASR 模型逻辑,属于典型的前端功能增强型二次开发,适合希望快速提升工具实用性的开发者参考。

2. 功能设计与技术选型

2.1 核心功能模块划分

为实现导出功能,需在原有系统基础上新增以下三个模块:

模块职责
结果缓存模块临时存储每次识别的文本结果,供导出调用
文件生成模块将文本转换为指定格式(TXT/PDF)并保存到服务器临时目录
下载接口模块提供给 Gradio 的可点击下载组件,触发文件传输

2.2 技术方案选择

TXT 导出

直接使用 Python 内置open()函数写入.txt文件,轻量高效。

PDF 导出

对比多种方案后选择fpdf2库,原因如下:

  • 安装简单:pip install fpdf2
  • 无外部依赖,兼容性强
  • 支持中文 UTF-8 编码(通过set_font('helvetica')自动处理)
  • 体积小,适合嵌入现有服务

为什么不选 reportlab?虽然 reportlab 更强大,但配置复杂且对中文支持不友好;而weasyprint需要额外安装 CSS 引擎,增加了部署负担。

3. 代码实现详解

3.1 安装依赖库

确保环境中已安装fpdf2

pip install fpdf2

若使用镜像环境,请将其加入启动脚本或 Dockerfile 中。

3.2 修改主程序 app.py

以下是完整更新后的app.py代码,在原功能基础上增加了导出逻辑:

import gradio as gr from funasr import AutoModel from fpdf import FPDF import os import time # 加载模型 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" ) # 全局变量:缓存最新识别结果 latest_text = "" def asr_process(audio_path): global latest_text if audio_path is None: result = "请先上传音频文件" else: res = model.generate(input=audio_path, batch_size_s=300) if len(res) > 0: result = res[0]['text'] else: result = "识别失败,请检查音频格式" # 更新全局缓存 latest_text = result return result def export_to_txt(): if not latest_text: return None # 生成唯一文件名 filename = f"transcript_{int(time.time())}.txt" filepath = os.path.join("/root/workspace/output", filename) # 创建输出目录 os.makedirs(os.path.dirname(filepath), exist_ok=True) with open(filepath, "w", encoding="utf-8") as f: f.write(latest_text) return filepath def export_to_pdf(): if not latest_text: return None filename = f"transcript_{int(time.time())}.pdf" filepath = os.path.join("/root/workspace/output", filename) os.makedirs(os.path.dirname(filepath), exist_ok=True) pdf = FPDF() pdf.add_page() pdf.set_auto_page_break(auto=True, margin=15) pdf.set_font("helvetica", size=12) # 分行写入避免超长文本截断 for line in latest_text.split('\n'): pdf.multi_cell(0, 10, txt=line) pdf.output(filepath) return filepath with gr.Blocks(title="Paraformer 语音转文字控制台") as demo: gr.Markdown("# 🎤 Paraformer 离线语音识别转写") gr.Markdown("支持长音频上传,自动添加标点符号和端点检测。") 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=15) with gr.Row(): with gr.Column(): txt_btn = gr.Button("导出为 TXT") txt_download = gr.File(label="下载 TXT 文件") with gr.Column(): pdf_btn = gr.Button("导出为 PDF") pdf_download = gr.File(label="下载 PDF 文件") # 事件绑定 submit_btn.click(fn=asr_process, inputs=audio_input, outputs=text_output) txt_btn.click(fn=export_to_txt, inputs=None, outputs=txt_download) pdf_btn.click(fn=export_to_pdf, inputs=None, outputs=pdf_download) demo.launch(server_name="0.0.0.0", server_port=6006)

3.3 关键代码解析

全局状态管理
latest_text = ""

使用全局变量缓存最近一次识别结果。注意:此方式适用于单用户本地服务;多用户场景建议改用会话机制(gr.State)或 Redis 缓存。

文件路径安全处理
os.makedirs(os.path.dirname(filepath), exist_ok=True)

确保输出目录存在,避免因路径不存在导致写入失败。

PDF 中文支持
pdf.set_font("helvetica", size=12)

fpdf2默认字体支持 UTF-8,无需额外加载中文字体即可正常显示中文。

多行文本渲染
pdf.multi_cell(0, 10, txt=line)

使用multi_cell替代cell,防止长段落溢出页面边界。

4. 使用说明与优化建议

4.1 启动服务

将上述app.py保存至/root/workspace/app.py,执行:

source /opt/miniconda3/bin/activate torch25 && cd /root/workspace && python app.py

4.2 访问 Web 界面

通过 SSH 隧道映射端口后,在本地浏览器访问:

👉http://127.0.0.1:6006

操作流程:

  1. 上传音频文件或录音
  2. 点击“开始转写”
  3. 查看识别结果
  4. 点击“导出为 TXT”或“导出为 PDF”
  5. 点击生成的链接下载文件

4.3 性能与稳定性优化建议

问题建议解决方案
多用户并发时结果混淆使用gr.State()替代全局变量
输出文件堆积添加定时清理脚本(如 cron 删除 24 小时前文件)
PDF 排版单一支持自定义模板(标题、作者、时间戳)
不支持命名下载返回带有语义名称的文件(如基于音频文件名生成)

示例:改进文件命名逻辑

base_name = os.path.splitext(os.path.basename(audio_path))[0] if audio_path else "unknown" filename = f"{base_name}_transcript.pdf"

5. 总结

本文完成了对 Paraformer-large + Gradio 语音识别系统的实用化升级,成功实现了TXT 和 PDF 文件导出功能。整个过程无需改动底层模型,仅通过扩展 Gradio UI 组件和引入轻量级 PDF 生成库fpdf2即可完成。

主要成果包括:

  1. ✅ 实现了识别结果的持久化导出
  2. ✅ 提供了简洁直观的下载交互界面
  3. ✅ 保证了系统的低依赖性和高可移植性

该方案特别适用于教育、会议、访谈等需要长期保存转录内容的场景。未来可进一步拓展为支持 Word、SRT 字幕等更多格式,打造一体化语音处理工作台。


获取更多AI镜像

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

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

哔哩下载姬完全攻略:从入门到精通的无水印视频下载指南

哔哩下载姬完全攻略:从入门到精通的无水印视频下载指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&…

作者头像 李华
网站建设 2026/4/17 14:27:19

开年的AI狂欢,是利好还是隐忧?

2026开局,关于AI的段子又多了一个。据说,AI成了金融人的斩杀线:今年如果不推AI产品,没让客户赚到钱,那今年就是金融人的斩杀线。如果今年推出的AI产品套住了客户,那明年就是金融人的斩杀线。AI能在金融界得…

作者头像 李华
网站建设 2026/4/20 22:54:16

Vetur与Vue2项目整合搭建实战:完整示例演示

让 Vue2 开发像呼吸一样自然:Vetur 实战配置全解析 你有没有过这样的经历?在维护一个老项目时,敲下 import UserCard from /components/user/UserCard ,结果 VS Code 红线警告“找不到模块”。点进去看路径明明没错&#xff0c…

作者头像 李华
网站建设 2026/4/17 16:04:18

Llama3-8B部署成本:RTX3060显卡性价比分析

Llama3-8B部署成本:RTX3060显卡性价比分析 1. 背景与选型动机 随着大语言模型的快速发展,本地化部署高性能开源模型已成为开发者和中小团队的重要选择。在众多8B级别模型中,Meta-Llama-3-8B-Instruct 凭借其强大的指令遵循能力、较长的上下…

作者头像 李华
网站建设 2026/4/17 16:28:59

5分钟部署AI写作大师Qwen3-4B,零基础打造专业级内容创作

5分钟部署AI写作大师Qwen3-4B,零基础打造专业级内容创作 1. 引言:为什么你需要一个高智商AI写作助手? 在内容爆炸的时代,高质量文本的生产效率直接决定个人与团队的竞争力。无论是撰写技术文档、创作小说剧本,还是生…

作者头像 李华
网站建设 2026/4/17 20:24:22

智谱新开源模型体验:GLM-4.6V-Flash-WEB上手分享

智谱新开源模型体验:GLM-4.6V-Flash-WEB上手分享 在当前多模态AI快速发展的背景下,开发者对高效、易用且可本地部署的视觉语言模型需求日益增长。传统多模态系统往往依赖高算力GPU集群和复杂的工程配置,限制了中小团队或个人开发者的实践门槛…

作者头像 李华