ComfyUI与TTS联动设想:Sambert-Hifigan提供语音输出节点支持
🎯 引言:让AI工作流“开口说话”——ComfyUI的语音合成新可能
在当前AIGC(人工智能生成内容)生态中,ComfyUI作为基于节点式操作的稳定扩散(Stable Diffusion)图形化界面工具,凭借其高度模块化、可复用性强和流程可视化的优势,已成为高级用户和开发者构建复杂AI工作流的首选平台。然而,目前ComfyUI的功能主要集中于图像生成与处理,缺乏对多模态输出(如语音)的原生支持。
与此同时,语音合成技术正快速演进,尤其是以ModelScope 的 Sambert-Hifigan 模型为代表的端到端中文多情感TTS(Text-to-Speech)系统,已经能够实现接近真人发音的情感化语音输出。若能将此类高质量TTS能力集成进ComfyUI的工作流中,便有望实现“文→图→音”一体化的内容生成闭环——例如,在生成一幅情绪鲜明的艺术画作后,自动为其配上一段富有情感色彩的旁白解说。
本文提出一种创新性设想:通过Flask API封装Sambert-Hifigan模型服务,并在ComfyUI中开发自定义节点调用该接口,从而实现语音输出功能的无缝接入。我们将从技术原理、服务部署、API设计到节点集成路径进行全面解析,探索这一跨模态联动的技术可行性与工程实践方案。
🔍 核心技术背景:Sambert-Hifigan为何适合ComfyUI集成?
什么是Sambert-Hifigan?
Sambert-Hifigan 是由 ModelScope(魔搭)平台推出的端到端中文多情感语音合成模型,其架构由两个核心组件构成:
- SAMBERT(Semantic-Aware Mel-spectrogram Predicting Transformer)
- 负责将输入文本转换为语义感知的梅尔频谱图(Mel-spectrogram)
- 支持多种情感标签(如开心、悲伤、愤怒、平静等),可通过参数控制输出语音的情绪风格
基于Transformer结构,具备强大的上下文建模能力
HiFi-GAN(High-Fidelity Generative Adversarial Network)
- 作为声码器(Vocoder),将梅尔频谱图还原为高保真波形音频
- 推理速度快,尤其适合CPU环境下的轻量级部署
✅优势总结: - 高质量自然语音输出,MOS(Mean Opinion Score)评分达4.3以上 - 支持中文长文本合成,断句合理 - 多种预设情感模式,满足多样化表达需求 - 开源免费,模型权重可在ModelScope官网直接下载
已验证的服务化封装:Flask WebUI + RESTful API
根据已有项目实践,Sambert-Hifigan已成功封装为一个稳定运行的Flask应用,具备以下关键特性:
| 特性 | 说明 | |------|------| |Web交互界面| 提供简洁美观的HTML前端,支持文本输入、语音播放与.wav文件下载 | |RESTful API接口| 开放/tts端点,支持POST请求进行语音合成 | |依赖冲突修复| 已解决datasets==2.13.0、numpy==1.23.5与scipy<1.13的版本兼容问题 | |CPU优化推理| 不依赖GPU,适用于低资源服务器或本地部署 | |响应延迟| 平均每百字合成时间约3~5秒(Intel i7 CPU环境下) |
📦 典型API调用示例
POST /tts HTTP/1.1 Content-Type: application/json Host: localhost:5000 { "text": "欢迎使用Sambert-Hifigan中文语音合成服务", "emotion": "happy", "speed": 1.0 }返回结果为JSON格式,包含音频Base64编码或临时文件URL:
{ "status": "success", "audio_url": "/static/audio/output_20250405.wav", "duration": 2.8 }这为后续与ComfyUI的集成提供了坚实基础——我们不再需要重新训练模型,只需将其作为远程微服务调用即可。
🧩 架构设计:如何在ComfyUI中实现TTS语音输出节点?
整体系统架构图
+------------------+ +---------------------+ | | | | | ComfyUI Node | <-> | Flask TTS Service | | (Custom TTS Out) | | (Sambert-Hifigan) | | | | | +------------------+ +---------------------+ ↑ ↓ +------------------+ | 用户操作流程 | | 1. 输入文本 | | 2. 选择情感模式 | | 3. 触发合成 | | 4. 播放/保存音频 | +------------------+整个联动系统分为三层:
前端层(ComfyUI UI)
用户在ComfyUI画布上添加“TTS Output”节点,配置文本来源(可连接前序节点输出)、情感类型、语速等参数。通信层(HTTP Client)
自定义节点内部使用requests库向本地或远程的 Flask TTS 服务发起 POST 请求。服务层(Flask + Sambert-Hifigan)
接收请求,执行语音合成,返回音频资源链接或Base64数据。
💻 实践路径:手把手构建ComfyUI语音输出节点
步骤一:准备Flask TTS服务环境
确保Sambert-Hifigan服务已在本地或内网服务器启动:
git clone https://github.com/modelscope/Sambert-Hifigan.git cd Sambert-Hifigan # 创建隔离环境并安装已验证的依赖 conda create -n tts python=3.8 conda activate tts pip install flask numpy==1.23.5 scipy==1.12.0 torch==1.13.1 datasets==2.13.0 # 启动服务 python app.py --host 0.0.0.0 --port 5000✅ 访问
http://localhost:5000可打开WebUI界面,确认服务正常运行。
步骤二:编写ComfyUI自定义节点代码
在ComfyUI的custom_nodes/目录下创建新插件文件夹,如comfyui-tts-output/,并新增__init__.py和tts_node.py。
📄tts_node.py核心实现
# comfyui-tts-output/tts_node.py import requests import json import uuid import os from pathlib import Path class TTSSpeechOutput: def __init__(self): self.tts_api_url = "http://localhost:5000/tts" self.output_dir = Path("./output/tts") self.output_dir.mkdir(parents=True, exist_ok=True) @classmethod def INPUT_TYPES(cls): return { "required": { "text": ("STRING", { "multiline": True, "default": "这是一个语音合成测试" }), "emotion": (["neutral", "happy", "sad", "angry", "surprised"], { "default": "neutral" }), "speed": ("FLOAT", { "default": 1.0, "min": 0.5, "max": 2.0, "step": 0.1 }) } } RETURN_TYPES = () FUNCTION = "generate_speech" CATEGORY = "audio" def generate_speech(self, text, emotion, speed): try: # 调用Flask TTS服务 response = requests.post(self.tts_api_url, json={ "text": text.strip(), "emotion": emotion, "speed": speed }, timeout=30) if response.status_code == 200: data = response.json() if data["status"] == "success": audio_url = data["audio_url"] full_url = f"http://localhost:5000{audio_url}" if audio_url.startswith("/static") else audio_url # 下载音频到本地输出目录 audio_resp = requests.get(full_url) filename = f"tts_{uuid.uuid4().hex[:8]}.wav" file_path = self.output_dir / filename with open(file_path, "wb") as f: f.write(audio_resp.content) print(f"[TTS Node] 语音已生成: {file_path}") print(f"🔊 播放地址: {full_url}") # ComfyUI暂不支持音频预览,但可记录日志 return {} else: raise Exception(f"TTS服务错误: {data.get('message', 'unknown')}") else: raise Exception(f"HTTP {response.status_code}: {response.text}") except Exception as e: print(f"[TTS Node] 合成失败: {str(e)}") return {} # 注册节点 NODE_CLASS_MAPPINGS = { "TTSSpeechOutput": TTSSpeechOutput } NODE_DISPLAY_NAME_MAPPINGS = { "TTSSpeechOutput": "🗣️ TTS 语音输出 (Sambert-Hifigan)" }步骤三:注册插件并重启ComfyUI
在__init__.py中简单导入:
# comfyui-tts-output/__init__.py from .tts_node import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS __all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']将插件目录放入ComfyUI/custom_nodes/,重启主程序后,在节点菜单中即可找到“🗣️ TTS 语音输出 (Sambert-Hifigan)”节点。
步骤四:使用流程演示
- 在ComfyUI画布中拖入新节点
- 输入任意中文文本(也可从前序节点如LLM输出连接)
- 选择情感模式(如“happy”)
- 点击“Queue Prompt”执行
- 查看控制台日志,确认音频已保存至
./output/tts/目录 - 手动播放
.wav文件验证效果
⚠️ 当前限制:ComfyUI原生不支持音频预览控件,未来可通过扩展Web前端实现浏览器内播放。
🛠️ 关键挑战与优化建议
❗ 1. 网络延迟与超时控制
由于语音合成涉及深度学习模型推理,响应时间较长(通常3~10秒)。需设置合理的HTTP超时机制,避免阻塞主线程。
✅解决方案: - 使用异步请求(aiohttp)提升并发性能 - 增加重试机制与进度提示 - 在前端显示“正在合成…”状态指示器
❗ 2. 音频资源管理
频繁合成会产生大量临时音频文件,需定期清理以防磁盘溢出。
✅优化建议: - 添加自动清理策略(如保留最近10个文件) - 支持用户指定输出路径 - 提供“清空缓存”按钮
❗ 3. 情感标签映射一致性
Sambert-Hifigan支持的情感种类可能随版本变化,需保证节点选项与后端一致。
✅改进方向: - 动态获取/emo_list接口返回可用情感列表 - 实现配置热更新机制
🔄 扩展设想:构建完整的“图文声”多模态生成流水线
一旦TTS节点落地,便可进一步拓展应用场景:
场景1:AI绘本自动生成
[故事文本] ↓ (LLM生成情节) ↓ [分镜描述] → [Stable Diffusion] → [图像] ↓ ↓ ↓ [旁白提取] → [TTS Node] → [语音]一键生成带配音的儿童绘本视频。
场景2:无障碍内容转换
将视觉艺术作品转化为语音导览,服务于视障人群。
场景3:虚拟主播内容生产
结合数字人驱动技术,实现“文案→图像背景→语音播报”的全自动化短视频生成。
✅ 总结:打通AI创作的最后一公里声音通道
本文提出并详细论证了将Sambert-Hifigan中文多情感TTS服务集成至ComfyUI的完整技术路径,涵盖:
- 技术选型依据:为何Sambert-Hifigan是理想选择
- 服务封装现状:Flask API稳定性与易用性已验证
- 节点开发实践:从零实现可运行的自定义TTS输出节点
- 工程挑战应对:网络、资源、兼容性三大难题的解决方案
- 应用前景展望:迈向真正的多模态AI内容生成
📌 核心结论: 通过“外部微服务 + 内部节点调用”的松耦合架构,我们无需修改ComfyUI核心代码,即可安全、高效地扩展其功能边界。Sambert-Hifigan作为高质量中文TTS的代表,完全具备成为ComfyUI标准音频输出模块的技术条件。
下一步建议社区开发者共同推进该项目开源化,打造统一的ComfyUI-Audio-Extension插件包,支持更多语音模型与音频处理功能,真正实现“所见即所听”的AI创作体验。