dify工作流串联:文本生成后自动转为语音播报
📌 背景与场景需求
在智能客服、有声阅读、AI助手等应用场景中,“文本生成 + 语音播报”是一个高频且关键的链路。传统的流程往往需要人工介入或多个系统间手动传递数据,效率低、体验差。
而Dify作为一款强大的低代码 AI 应用开发平台,支持通过可视化工作流(Workflow)将多个模型和服务串联起来。本文将详细介绍如何利用 Dify 的工作流能力,实现:
大模型生成中文文本 → 自动调用 Sambert-Hifigan 多情感语音合成服务 → 输出可播放的语音文件
整个流程无需编写复杂代码,即可构建出具备“思考+表达”能力的智能语音播报系统。
🎙️ 核心技术选型:Sambert-Hifigan 中文多情感语音合成
为什么选择 Sambert-Hifigan?
在众多 TTS(Text-to-Speech)方案中,ModelScope 提供的 Sambert-Hifigan 模型因其高质量、自然度高、支持多情感语调等特点脱颖而出,特别适合中文场景下的语音输出任务。
该模型由两部分组成: -Sambert:负责将文本转换为梅尔频谱图(Mel-spectrogram),支持丰富的韵律建模 -Hifigan:将频谱图还原为高质量音频波形,音质接近真人发音
✅ 支持多种情感(如开心、悲伤、愤怒、平静等)
✅ 端到端训练,语音连贯性好
✅ 对中文拼音和声调建模精准
我们在此基础上封装了Flask WebUI + RESTful API 接口,并修复了datasets、numpy、scipy等常见依赖冲突问题,确保服务开箱即用、稳定运行。
🧩 工作流设计思路
要实现“文本生成 → 语音播报”的自动化流程,我们需要打通两个核心环节:
| 步骤 | 功能模块 | 技术实现 | |------|--------|---------| | 1 | 文本生成 | 使用 Dify 内置 LLM(如 Qwen、ChatGLM)生成回复内容 | | 2 | 语音合成 | 调用本地部署的 Sambert-Hifigan Flask API | | 3 | 结果返回 | 返回语音文件 URL 或 base64 编码音频 |
最终目标是:用户输入问题 → AI 自动生成回答 → 系统自动朗读回答内容。
🔧 实践步骤详解
第一步:部署 Sambert-Hifigan 语音合成服务
1. 获取镜像并启动服务
docker run -p 5000:5000 your-sambert-hifigan-image服务启动后访问http://<your-host>:5000即可看到 WebUI 界面:
2. 查看 API 接口文档
POST 请求地址:http://<your-host>:5000/tts
请求体示例(JSON):
{ "text": "今天天气真不错,适合出去散步。", "emotion": "happy", "speed": 1.0 }响应结果为.wav文件的下载链接或 base64 编码音频流。
💡 注意:请确保你的 Dify 工作流服务器可以网络访问该接口(建议内网部署或配置反向代理)
第二步:在 Dify 中创建工作流
登录 Dify 控制台,进入“工作流”(Workflow)模块,新建一个名为TextToSpeech_Broadcast的工作流。
节点 1:LLM 文本生成节点
- 类型:Large Language Model
- 模型选择:Qwen-Max / ChatGLM3-Turbo(根据实际可用资源)
- 输入变量:
user_input(用户提问) - 提示词模板:
你是一个贴心的生活助手,请用自然、口语化的方式回答以下问题,控制在100字以内: {{user_input}}- 输出变量:
generated_text
节点 2:HTTP 请求调用语音合成 API
- 类型:HTTP Request
- 方法:POST
- URL:
http://<your-tts-server>:5000/tts - Headers:
{ "Content-Type": "application/json" }- Body(JSON):
{ "text": "{{generated_text}}", "emotion": "neutral", "speed": 1.0 }- 响应解析方式:JSON Path
- 提取字段:
$.audio_url或$.audio_base64(根据后端返回结构调整)
⚠️ 若返回的是 base64 音频,需在后续节点进行解码处理;若为 URL,则可直接返回前端播放
节点 3:结果聚合与输出
- 类型:Data Formatter
- 将生成的文本和语音链接组合成统一响应格式:
{ "text": "{{generated_text}}", "audio_url": "{{http_response.audio_url}}" }这样前端就可以同时展示文字和提供语音播放按钮。
第三步:测试完整链路
在 Dify 的调试面板中输入:
“明天会下雨吗?”
触发工作流执行:
- LLM 生成:“明天部分地区有阵雨,出门记得带伞哦。”
- 自动发送至 TTS 接口
返回语音文件 URL:
http://<tts-server>/output/20250405.wav前端接收 JSON 响应,并自动播放语音。
✅ 实现了从“思考”到“发声”的全流程自动化!
🛠️ 关键问题与优化建议
❌ 常见问题 1:跨域无法调用 API
如果你的 Sambert-Hifigan 服务未开启 CORS,Flask 后端需添加:
from flask_cors import CORS app = Flask(__name__) CORS(app) # 允许所有域名访问或者使用 Nginx 反向代理统一域名前缀。
❌ 常见问题 2:长文本合成失败
Sambert 对输入长度有限制(通常 ≤ 200 字)。解决方案:
- 在工作流中加入文本截断节点,限制
generated_text长度 - 或启用分段合成机制,拼接多个音频片段
# 示例:分段逻辑(Python 片段,可用于自定义插件) def split_text(text, max_len=100): sentences = text.split('。') chunks = [] current = "" for s in sentences: if len(current) + len(s) < max_len: current += s + "。" else: if current: chunks.append(current) current = s + "。" if current: chunks.append(current) return chunks✅ 性能优化建议
| 优化方向 | 具体措施 | |--------|----------| |降低延迟| 使用 Redis 缓存已合成过的文本-音频对,避免重复请求 | |提升并发| 部署多个 TTS 实例 + 负载均衡(Nginx 或 Kubernetes) | |节省带宽| 返回 MP3 格式而非 WAV(可通过 ffmpeg 转码) | |增强体验| 添加语音预览控件,支持调节语速、情感 |
🔄 扩展应用:打造多模态 AI 播报机器人
基于此架构,你可以进一步扩展功能:
场景 1:智能广播系统
- 输入:每日新闻摘要(来自爬虫或 RSS)
- 输出:定时语音播报,用于办公室/校园广播
场景 2:无障碍阅读助手
- 用户上传文章 → 自动生成语音版 → 支持盲人听读
场景 3:儿童故事机
- LLM 生成童话故事 → 选择“活泼”情感 → 输出童声朗读版本
只需更换提示词模板和情感参数,即可适配不同角色声音风格。
📊 方案对比分析:三种 TTS 集成方式优劣
| 方案 | 优点 | 缺点 | 适用场景 | |------|------|------|-----------| |云服务 API(阿里云/百度TTS)| 开通即用,稳定性高 | 成本高、依赖外网、无情感定制 | 快速原型验证 | |开源模型自建(Sambert-Hifigan)| 可私有化部署、支持多情感、成本低 | 需维护服务、初始配置复杂 | 企业级产品集成 | |边缘设备推理(如树莓派+ONNX)| 低延迟、离线可用 | 算力受限、音质略低 | IoT 设备、嵌入式场景 |
🔍推荐选择:对于追求性价比和可控性的项目,Sambert-Hifigan 自建服务 + Dify 工作流是最优解。
🧪 完整 API 测试代码(Python)
import requests import json url = "http://localhost:5000/tts" headers = {"Content-Type": "application/json"} data = { "text": "欢迎使用智能语音播报系统,这里是多情感合成演示。", "emotion": "happy", "speed": 1.1 } response = requests.post(url, headers=headers, data=json.dumps(data)) if response.status_code == 200: result = response.json() audio_url = result.get("audio_url") print(f"✅ 音频已生成:{audio_url}") # 可自动下载或嵌入网页播放器 else: print(f"❌ 请求失败:{response.text}")🏁 总结与最佳实践
✅ 核心价值总结
通过Dify 工作流 + Sambert-Hifigan 多情感 TTS的组合,我们实现了: -全自动文本生成与语音播报-高度可定制的情感表达-稳定可靠的本地化部署-低成本、易维护的技术栈
这不仅提升了用户体验,也为构建下一代多模态 AI 应用提供了坚实基础。
🛠 最佳实践建议
- 统一服务入口:为 TTS 服务增加 JWT 认证,防止未授权调用
- 异步处理长任务:对于长文本合成,采用 Celery + Redis 异步队列机制
- 日志监控:记录每次 TTS 请求的文本、耗时、状态,便于排查问题
- 动态情感匹配:根据 LLM 输出的情绪倾向(如积极/消极),自动设置
emotion参数 - 前端集成建议:使用
<audio>标签 + JavaScript 控制播放,支持暂停、重播等功能
💡 一句话收尾:
当 AI 不仅能“写”,还能“说”,才是真正意义上的智能交互。
用 Dify 连接思想与声音,让机器拥有温度。