Paraformer-large邮件通知功能:完成转写后自动发送报告
1. 实现目标:让语音转写更智能、更省心
你有没有遇到过这种情况:上传了一个长达两小时的会议录音,点击“开始转写”后就去忙别的事了,结果等了半天也不知道识别完成了没有?来回刷新页面太麻烦,一直挂着又浪费时间。
今天我们要解决的就是这个问题——给 Paraformer-large 语音识别系统加上“邮件通知”功能。当音频转写完成后,系统会自动把识别结果通过邮件发送到你的邮箱,真正做到“提交即忘”,大幅提升使用体验。
这个功能特别适合以下场景:
- 长时间批量处理录音文件
- 远程服务器上运行任务无法实时查看
- 团队协作中需要及时同步转录内容
接下来,我会手把手教你如何在原有 Gradio 界面基础上,轻松集成自动发邮件功能。
2. 功能扩展思路与技术选型
2.1 整体流程设计
我们希望实现这样一个闭环流程:
用户上传音频 → 后台开始转写 → 转写完成 → 自动生成文本报告 → 自动发送邮件 → 返回提示信息关键点在于:不能阻塞主界面响应,否则用户就得一直等着邮件发完才能操作下一步。所以我们采用同步逻辑中的简单延时处理方式(对于轻量级应用足够实用)。
2.2 邮件发送方案选择
Python 中常用的邮件库是smtplib+email组合,无需额外依赖,稳定性高,适合嵌入现有项目。
支持主流邮箱服务(QQ、163、Gmail、Outlook等),只需要开启 SMTP 功能并获取授权码即可。
为什么不选第三方服务?
像 SendGrid、阿里云邮件推送虽然更专业,但需要注册账号、配置密钥、可能涉及费用。而我们只是想做个简单的结果通知,本地 SMTP 完全够用,部署也快。
3. 修改 app.py:添加邮件发送功能
我们现在要修改原来的app.py文件,在识别完成后加入邮件发送逻辑。
3.1 新增邮件配置参数
首先,在代码顶部附近添加你的邮箱配置信息(请替换成自己的):
# === 邮件通知配置 === SMTP_SERVER = "smtp.qq.com" # QQ邮箱SMTP服务器 SMTP_PORT = 587 # TLS端口 SENDER_EMAIL = "your_email@qq.com" # 发件人邮箱 SENDER_PASSWORD = "your_auth_code" # 授权码(非登录密码!) RECEIVER_EMAIL = "your_email@qq.com" # 收件人邮箱(可设为不同地址)📌注意:QQ邮箱需手动开启“POP3/SMTP服务”,并在设置中获取“授权码”。不要使用登录密码!
3.2 编写 send_email 函数
在asr_process函数之前定义一个通用的邮件发送函数:
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from datetime import datetime def send_email(transcribed_text, audio_filename="unknown"): """发送转写结果邮件""" try: # 创建带主题和发件人信息的邮件对象 msg = MIMEMultipart() msg['From'] = SENDER_EMAIL msg['To'] = RECEIVER_EMAIL msg['Subject'] = f"【Paraformer转写完成】 - {audio_filename} | {datetime.now().strftime('%H:%M')}" # 构建邮件正文 body = f""" <h3>🎤 语音转写已完成</h3> <p><strong>音频文件:</strong>{audio_filename}</p> <p><strong>转写时间:</strong>{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</p> <hr> <h4>📝 识别结果:</h4> <pre style="font-family: Arial, sans-serif; font-size: 14px; background-color: #f5f5f5; padding: 10px; border-radius: 5px;"> {transcribed_text} </pre> <hr> <small style="color: #888;">本邮件由 Paraformer-large 离线语音识别系统自动发出。</small> """ msg.attach(MIMEText(body, 'html', 'utf-8')) # 连接SMTP服务器并发送 server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) server.starttls() # 启用TLS加密 server.login(SENDER_EMAIL, SENDER_PASSWORD) server.send_message(msg) server.quit() print("✅ 邮件发送成功!") return True except Exception as e: print(f"❌ 邮件发送失败: {str(e)}") return False3.3 更新 asr_process 函数以触发邮件
现在我们将原来的asr_process函数升级一下,让它在识别完成后尝试发送邮件:
import os import gradio as gr from funasr import AutoModel # 加载模型 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" ) def asr_process(audio_path): if audio_path is None: return "请先上传音频文件" # 获取文件名用于邮件标题 filename = os.path.basename(audio_path) if audio_path else "unknown_audio" # 开始识别 res = model.generate( input=audio_path, batch_size_s=300, ) # 提取结果 if len(res) > 0: text_result = res[0]['text'] else: return "识别失败,请检查音频格式" # 尝试发送邮件 success = send_email(text_result, filename) # 返回结果 + 邮件状态提示 status_msg = "📧 邮件已发送至您的邮箱" if success else "⚠️ 转写完成,但邮件发送失败" return f"{text_result}\n\n---\n{status_msg}"3.4 完整更新后的 app.py 结构概览
你现在完整的app.py应该包含以下几个部分:
- 导包(gradio, funasr, smtplib, email 相关)
- 模型加载
- 邮件配置常量
send_email()函数- 增强版
asr_process()函数 - Gradio 界面构建与启动
确保所有缩进正确,保存后重启服务即可生效。
4. 测试与验证步骤
4.1 第一步:检查依赖是否齐全
大多数情况下,Python 内置了smtplib和email模块,无需安装。但如果你遇到导入错误,可以运行:
pip install smtplib email不过通常不需要。
4.2 第二步:测试邮件功能独立运行
你可以先写一个测试脚本验证邮件能否正常发出:
# test_email.py from send_email import send_email # 假设你把函数单独提取出来了 if __name__ == "__main__": sample_text = "这是一条来自 Paraformer 的测试转录内容。\n时间:" + str(datetime.now()) send_email(sample_text, "test_audio.wav")运行它看是否能收到邮件。
4.3 第三步:完整流程测试
- 启动服务:
python app.py - 打开本地映射地址:http://127.0.0.1:6006
- 上传一段短音频(建议1分钟以内)
- 点击“开始转写”
- 观察终端输出是否有 ✅ 邮件发送成功
- 查看邮箱是否收到带格式的结果邮件
如果一切顺利,你会看到类似这样的效果:
📧 主题:【Paraformer转写完成】 - meeting_01.mp3 | 14:23
正文包含时间戳、原始音频名、识别文字和样式化排版
5. 使用技巧与常见问题解决
5.1 如何提升邮件送达率?
- 使用企业邮箱或 Gmail 更稳定
- QQ邮箱建议使用
.com后缀而非.cn - 不要频繁发送,避免被判定为垃圾邮件
- 可将发件人添加到收件箱联系人列表
5.2 如何自定义收件人?
目前是固定收件人,如果你想让用户输入邮箱,可以在界面上加一个输入框:
with gr.Row(): audio_input = gr.Audio(type="filepath", label="上传音频") email_input = gr.Textbox(label="接收邮箱", value="your_email@qq.com") submit_btn = gr.Button("开始转写") # 修改 click 绑定时传入 email_input submit_btn.click( fn=lambda audio, email: asr_process_with_custom_email(audio, email), inputs=[audio_input, email_input], outputs=text_output )然后修改函数接收email参数并动态赋值RECEIVER_EMAIL
5.3 长音频处理期间界面卡住怎么办?
Gradio 默认是同步执行的,所以长音频会导致界面“假死”。解决方案有两个:
方案一:前端提示优化
在按钮点击后立即显示“正在转写,请耐心等待……”提示,减少焦虑感。
方案二:异步处理(进阶)
使用queue()开启异步模式:
demo.queue().launch(server_name="0.0.0.0", server_port=6006)并配合gr.Progress()显示进度条(FunASR 目前不直接支持回调,需自行封装)。
6. 总结:打造真正可用的自动化语音处理系统
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。