PaiFlow 之前的 TTS 能力,主要是围绕讯飞的超拟人语音合成来做的。效果没毛病,链路也跑得通,讯飞也给新人提供了免费的额度,但无奈我购买的额度用完了,再购买好贵,于是就又被迫接入了阿里的千问 TTS。😄
接下来,我会通过 qwen-tts 的接入全过程,带大家搞清楚在 PaiFlow 现有的架构上,如何集成一个新的 TTS 服务(大家可以尝试接入其他厂商的 TTS,比如说智谱)。
1.千问TTS内置插件的整体设计
回到上一篇插件节点执行器。PluginNodeExecutor 只做插件节点的执行,具体怎么调工具完全由 PluginServiceClient 接管。
在 PluginServiceClient 中,我们注入了 List
TtsIntegration 接口定义的比较简单,source 方法返回插件的标识符,call 方法规定了所有 TTS 实现都必须接收 NodeState 和 inputs 作为参数,并返回一个包含结果的 Map。确保无论底层调用哪个厂商的服务,对于上层调用者 PluginServiceClient 来说,调用方式都是一致的。
public interface TtsIntegration {
// 返回插件标识符(如"spark"、"qwen")
String source();
// 执行TTS合成
Map call(NodeState nodeState, Map inputs) throws Exception;
}
source 的配置在 application.yml 文件中,可选项目前有 spark 和 qwen,通过这个配置就能切换到 SmartTTSIntegration 或者 QwenTTSIntegration 来完成超拟人音频内置插件的执行。
接下来,我们在 toolCall 方法执行的过程中调用 getTtsIntegration 方法判断 ttsSource 的值,如果是 qwen 就会执行 QwenTTSIntegratoin 的 call 方法。
通过流程图来表示就是下图这样。
[MISSING IMAGE: , ] 不同厂商需要不同的配置参数,千问的 tts 需要配置 apiKey、model、url 等参数。
其值我们放在 application.yml 文件中。

真诚点赞 诚不我欺
回复