dify工作流串联:文本生成后自动转为语音播报
通过Dify 工作流 + Sambert-Hifigan 多情感 TTS的组合,我们实现了:全自动文本生成与语音播报高度可定制的情感表达稳定可靠的本地化部署低成本、易维护的技术栈这不仅提升了用户体验,也为构建下一代多模态 AI 应用提供了坚实基础。
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 连接思想与声音,让机器拥有温度。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)