Dify工作流如何接入语音?通过Flask API调用TTS镜像实现自动化
📌 背景与需求:让AI工作流“开口说话”
在构建智能对话系统、虚拟助手或自动化客服流程时,文本到语音(Text-to-Speech, TTS)是提升用户体验的关键一环。Dify作为一款强大的低代码AI应用开发平台,擅长处理自然语言理解与生成任务,但其原生能力并未直接支持语音输出。
然而,在实际项目中,我们常常需要将Dify生成的回复“读出来”——比如用于语音播报、有声内容生成、教育机器人等场景。这就引出了一个核心问题:
如何为Dify工作流接入高质量的中文语音合成功能?
本文将介绍一种工程化落地方案:利用已封装好的Sambert-HifiGan 中文多情感TTS镜像服务,通过其内置的 Flask API 接口,实现与 Dify 工作流的无缝集成,完成从“文字生成”到“语音播放”的全链路自动化。
🎙️ Sambert-HifiGan 中文多情感语音合成服务(WebUI + API)
📖 项目简介
本镜像基于 ModelScope 开源的Sambert-HifiGan(中文多情感)模型构建,具备高保真、自然流畅的中文语音合成能力。该模型采用两阶段架构: -SAmBERT:负责文本编码与梅尔频谱预测,支持多种情感风格(如开心、悲伤、愤怒、平静等) -HiFi-GAN:作为声码器,将频谱图高效还原为高质量音频波形
在此基础上,我们封装了完整的运行环境,并集成了Flask WebUI 和 RESTful API,用户既可通过浏览器交互使用,也可通过HTTP请求进行程序化调用。
💡 核心亮点
- 多情感表达:支持情绪控制参数,可生成富有表现力的语音
- 开箱即用:已解决
datasets(2.13.0)、numpy(1.23.5)与scipy(<1.13)的版本冲突,避免常见依赖报错- 双模式访问:提供可视化界面和标准API接口,适配调试与生产环境
- CPU友好优化:无需GPU即可稳定运行,适合边缘部署和轻量级服务器
🔧 实现路径:从Dify到TTS服务的自动化调用
要实现Dify工作流输出语音,关键在于打通两个系统之间的通信桥梁。整体架构如下:
[Dify Agent] ↓ (HTTP POST: 生成文本) [Flask TTS API] → [Sambert-HifiGan 模型推理] ↓ (返回 .wav 音频文件URL) [前端/客户端播放语音]具体步骤包括: 1. Dify完成文本生成 2. 将结果通过 HTTP 请求发送至 TTS 镜像的 Flask API 3. API 返回合成后的.wav文件下载链接 4. 客户端获取音频并自动播放
下面我们重点讲解Flask API 的调用方式以及如何在Dify中配置外部工具调用逻辑。
🚀 使用说明:启动服务与基础操作
启动TTS镜像服务
假设你已获得该Docker镜像(例如名为tts-sambert-hifigan:latest),执行以下命令启动容器:
docker run -p 5000:5000 tts-sambert-hifigan:latest服务启动后,默认监听http://localhost:5000。
访问WebUI界面
- 打开浏览器,访问
http://<你的IP>:5000 - 在文本框中输入中文内容(支持长文本)
- 点击“开始合成语音”
- 系统自动生成
.wav文件,支持在线试听和下载
⚠️ 注意:若在云平台运行,请确保安全组开放5000端口,并使用平台提供的“http按钮”跳转访问。
🔄 API接口详解:实现程序化调用
为了让Dify或其他系统自动化调用此服务,我们需要了解其提供的RESTful API。
✅ 接口地址与方法
- URL:
http://<host>:5000/tts - Method:
POST - Content-Type:
application/json
✅ 请求体格式(JSON)
{ "text": "今天天气真好,适合出去散步。", "emotion": "happy", // 可选:happy, sad, angry, neutral 等 "speed": 1.0 // 可选:语速调节(0.8~1.2) }✅ 响应格式
成功时返回 JSON 结构:
{ "status": "success", "audio_url": "/static/audio/output_20250405_120000.wav", "download_url": "http://<host>:5000/static/audio/output_20250405_120000.wav" }失败时返回:
{ "status": "error", "message": "Text is required." }💡 示例代码:Python调用TTS API
以下是一个通用的 Python 函数,用于向该 Flask 服务发起语音合成请求:
import requests import json import os def text_to_speech(text, emotion="neutral", speed=1.0, tts_api_url="http://localhost:5000/tts"): """ 调用Sambert-HifiGan TTS服务生成语音 :param text: 输入中文文本 :param emotion: 情感类型(happy/sad/angry/neutral) :param speed: 语速(建议0.8~1.2) :param tts_api_url: TTS服务API地址 :return: 下载链接 或 None(失败) """ payload = { "text": text, "emotion": emotion, "speed": speed } try: response = requests.post( tts_api_url, data=json.dumps(payload), headers={"Content-Type": "application/json"}, timeout=60 # 合成可能耗时较长 ) if response.status_code == 200: result = response.json() if result["status"] == "success": print("✅ 语音合成成功!") print(f"🎧 播放地址: {result['download_url']}") return result["download_url"] else: print(f"❌ 合成失败: {result['message']}") return None else: print(f"❌ HTTP错误: {response.status_code}") return None except Exception as e: print(f"⚠️ 请求异常: {str(e)}") return None # === 使用示例 === if __name__ == "__main__": text = "欢迎使用Dify智能语音系统,现在为您播报最新消息。" url = text_to_speech(text, emotion="happy", speed=1.1) if url: print(f"🔊 请访问以下链接下载音频:\n{url}")✅ 提示:你可以将此函数封装为独立模块,供Dify插件或后端服务调用。
🔗 如何在Dify中接入该TTS服务?
Dify 支持通过自定义工具(Custom Tools)调用外部API。以下是配置流程:
步骤1:在Dify中创建新工具
进入 Dify → Developer → Tools → Create Tool
填写基本信息: - Name:Text to Speech- Provider:Custom Tool- Description:Convert generated text into spoken Chinese audio using Sambert-HifiGan model
步骤2:定义输入参数
设置 JSON Schema,允许传入文本和情感选项:
{ "type": "object", "properties": { "text": { "type": "string", "description": "要合成的中文文本" }, "emotion": { "type": "string", "enum": ["happy", "sad", "angry", "neutral"], "description": "语音情感风格", "default": "neutral" }, "speed": { "type": "number", "minimum": 0.8, "maximum": 1.2, "description": "语速", "default": 1.0 } }, "required": ["text"] }步骤3:配置API调用逻辑
选择 “HTTP Request” 类型,填写:
- Method:
POST - URL:
http://<your-tts-host>:5000/tts - Headers:
json { "Content-Type": "application/json" } - Body:
json { "text": "{{text}}", "emotion": "{{emotion}}", "speed": {{speed}} }
步骤4:定义返回值解析
告诉Dify如何提取结果中的音频链接:
{ "audio_url": "{{$.download_url}}" }保存后,该工具即可在工作流中被调用。
🧩 实际应用场景示例
场景1:智能客服语音播报
当Dify根据用户问题生成回答后,自动调用TTS工具,将答案转为语音并通过IVR系统播放。
Workflow: - 用户提问 → Dify生成回复 - 回复文本 → 调用 TTS 工具 - 获取 audio_url → 推送至电话系统播放场景2:儿童故事生成器
Dify根据关键词生成童话故事,再逐段调用TTS,生成带情感色彩的有声读物。
示例提示词: “写一个关于小熊找蜂蜜的温馨故事,适合3岁儿童。”
合成时设置emotion=happy,speed=0.9,营造亲切缓慢的讲述节奏。
⚙️ 性能优化与工程建议
虽然该TTS镜像已在CPU上做了优化,但在高并发或实时性要求高的场景下,仍需注意以下几点:
| 优化方向 | 建议措施 | |--------|---------| |缓存机制| 对常见语句(如“您好,请问有什么可以帮助您?”)做音频预生成+MD5缓存,减少重复推理 | |异步处理| 使用 Celery 或 Redis Queue 异步执行TTS任务,避免阻塞主流程 | |资源隔离| 将TTS服务部署在独立容器中,防止与Dify主服务争抢内存 | |CDN加速| 若音频需公网分发,可将/static/audio目录挂载至对象存储并启用CDN | |日志监控| 记录每次请求的文本、耗时、状态,便于排查问题 |
❓ 常见问题与解决方案(FAQ)
Q1:为什么合成时出现
ModuleNotFoundError: No module 'scipy'?
A:这是由于 scipy 版本不兼容导致。本镜像已锁定scipy<1.13并修复所有依赖,请勿自行升级。Q2:能否支持英文或中英混合?
A:Sambert-HifiGan 主要针对中文训练,对英文支持较弱。建议纯中文场景使用;如有混合需求,可考虑替换为 CosyVoice 或 VITS 多语言模型。Q3:如何修改默认语音音色?
A:当前镜像固定使用女性音色。如需更换音色,需重新训练或加载不同预训练权重,进阶用户可参考 ModelScope 官方文档进行微调。Q4:能否部署在树莓派等ARM设备?
A:可以!只要系统支持 Python 3.8+ 和 PyTorch CPU 版本,即可运行。建议使用 Debian 系统并预先安装 libopenblas-dev 等底层库。
✅ 总结:打造会“说话”的AI工作流
通过本文介绍的方法,我们可以轻松实现:
- ✅ 利用ModelScope Sambert-HifiGan 模型提供高质量中文语音合成
- ✅ 借助Flask API 接口实现程序化调用
- ✅ 在Dify 工作流中集成TTS工具,完成从“思考”到“表达”的闭环
- ✅ 支持多情感、可调节语速的自然语音输出
这套方案不仅适用于Dify,也可扩展至任何需要语音输出的AI系统,如LangChain代理、AutoGPT、Rasa机器人等。
🎯 最佳实践建议: 1. 在开发阶段优先使用WebUI快速验证效果 2. 上线前务必测试API稳定性与超时处理 3. 对敏感文本增加内容过滤层,防止不当语音生成
未来,随着语音合成技术向更小体积、更低延迟、更高表现力发展,这类“AI发声”能力将成为智能系统的标配功能。而现在,正是将其落地的最佳时机。