news 2026/5/1 13:44:18

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 1:00:15

SAM 3摄影应用:人像分割技术教程

SAM 3摄影应用:人像分割技术教程 1. 引言 随着人工智能在图像理解领域的持续突破,可提示分割(Promptable Segmentation)技术正成为计算机视觉中的一项核心能力。特别是在摄影、视频编辑和内容创作领域,精准地识别并分…

作者头像 李华
网站建设 2026/5/1 10:23:32

实测Qwen All-in-One:CPU环境下的全能AI服务体验

实测Qwen All-in-One:CPU环境下的全能AI服务体验 1. 项目背景与核心价值 在边缘计算和资源受限的场景中,如何高效部署人工智能服务一直是一个关键挑战。传统的解决方案往往依赖多个专用模型协同工作,例如使用 BERT 进行情感分析、LLM 负责对…

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

WAV格式为何推荐?Seaco Paraformer支持音频类型全面解析

WAV格式为何推荐?Seaco Paraformer支持音频类型全面解析 1. 引言:音频格式选择的重要性 在语音识别系统中,输入音频的质量和格式直接影响识别的准确率与处理效率。Seaco Paraformer作为阿里基于FunASR开发的高性能中文语音识别模型&#xf…

作者头像 李华
网站建设 2026/5/1 10:43:49

cv_unet_image-matting图像抠图实战教程:一键部署WebUI,GPU加速3秒出图

cv_unet_image-matting图像抠图实战教程:一键部署WebUI,GPU加速3秒出图 1. 教程简介与学习目标 本教程将带你完整掌握 cv_unet_image-matting 图像抠图工具的本地化部署与高效使用。该工具基于 U-Net 架构实现高精度人像分割,结合 WebUI 界…

作者头像 李华
网站建设 2026/4/27 1:59:38

DeepSeek-R1-Distill-Qwen-1.5B自动化部署:CI/CD集成最佳实践

DeepSeek-R1-Distill-Qwen-1.5B自动化部署:CI/CD集成最佳实践 1. 引言:轻量级大模型的本地化落地挑战 随着大语言模型在推理能力上的持续突破,如何将高性能模型高效部署到资源受限的边缘设备或本地开发环境中,成为工程落地的关键…

作者头像 李华
网站建设 2026/5/1 3:01:13

人脸细节重建有多强?GPEN镜像效果震撼

人脸细节重建有多强?GPEN镜像效果震撼 你是否曾面对一张模糊、低清甚至严重退化的老照片,感叹时间的无情?如今,AI 正在改变这一现实。通过深度学习驱动的人脸细节重建技术,我们不仅能“修复”图像,更能“还…

作者头像 李华