Skip to main content

纯接口 · 多引擎适配

多个功能条目共用同一个 openSocketID,但每个条目的参数结构不同。适合多后端场景——不同引擎需要的参数不一样,拆成独立条目比堆在一个条目里更清晰。

真实节点MultiTTS


模式

调用方 ──▶ [TTS=SysTTS&text=你好&rate=3&volume=0.7&voice_index=0] ──▶ MultiTTS
调用方 ──▶ [TTS=EdgeTTS&text=你好&rate=+0%25&voice=zh-CN-XiaoxiaoNeural] ──▶ MultiTTS
调用方 ──▶ [TTS=GPT_SoVITS&ip=127.0.0.1&port=9880&text=你好&text_lang=zh&ref_audio_path=...] ──▶ MultiTTS

三个功能条目 SysTTSEdgeTTSGPT_SoVITS 共用 openSocketID: "0x00000011",靠 static 参数 TTS 区分引擎。


清单

plugin_manifest.json

{
"app_id": "0x00000022",
"plugin_name": "MultiTTS",
"author": "HXH",
"version": "v1.0.0",
"description": "多引擎 TTS 语音合成客户端",
"download_url": "https://github.com/hxh230802/MultiTTS_Client/releases/latest",
"auto_start": "false",
"exe_path": "MultiTTS_Client.exe"
}

FuncList.json — 三个条目,同一个 socketID,各自定义参数和选项:

"openSocket": {
"SysTTS": {
"appID": "0x00000022",
"openSocketID": "0x00000011",
"description": "调用系统 TTS",
"args": {
"TTS": { "type": "static", "value": "SysTTS" },
"text": { "type": "input", "defaultVal": "测试语音内容" },
"rate": { "type": "input", "defaultVal": "3" },
"volume": { "type": "input", "defaultVal": "0.7" },
"voice_index": {
"type": "optional",
"options": [["中英", "0"], ["英", "1"]]
}
}
},
"EdgeTTS": {
"appID": "0x00000022",
"openSocketID": "0x00000011",
"description": "调用 Edge TTS",
"args": {
"TTS": { "type": "static", "value": "EdgeTTS" },
"text": { "type": "input", "defaultVal": "测试语音内容" },
"rate": { "type": "input", "defaultVal": "+0%" },
"volume": { "type": "input", "defaultVal": "+0%" },
"voice": { "type": "input", "defaultVal": "zh-CN-XiaoxiaoNeural" }
}
},
"GPT_SoVITS": {
"appID": "0x00000022",
"openSocketID": "0x00000011",
"description": "调用 GPT-SoVITS",
"args": {
"TTS": { "type": "static", "value": "GPT_SoVITS" },
"ip": { "type": "input", "defaultVal": "127.0.0.1" },
"port": { "type": "input", "defaultVal": "9880" },
"text": { "type": "input", "defaultVal": "测试语音文本" },
"text_lang": {
"type": "optional", "options": [["中文", "zh"], ["英文", "en"]]
},
"ref_audio_path": { "type": "input" },
"prompt_lang": {
"type": "optional", "options": [["中文", "zh"], ["英文", "en"]]
},
"prompt_text": { "type": "input", "defaultVal": "测试参考音频文本" }
}
}
}

通信代码

from knotlink import OpenSocketResponser, KLKVMap

APPID = "0x00000022"
SOCKET_ID = "0x00000011"

responser = OpenSocketResponser(APPID, SOCKET_ID)


def handle_request(data: str) -> str:
req = KLKVMap()
req.deserialize(data)
engine = req.get("TTS", "")

if engine == "SysTTS":
return speak_system(req.get("text"), req.get("rate"), req.get("volume"))

if engine == "EdgeTTS":
return speak_edge(req.get("text"), req.get("voice"), req.get("rate"))

if engine == "GPT_SoVITS":
return speak_sovits(req.get("text"), req.get("ip"), req.get("port"))

return "status=error;message=未知引擎"


responser.set_RecvFunc(handle_request)
input("按回车退出。\n")

关键点

  • 一个 socketID,多个功能条目 — 每个条目通过 static 参数标明身份
  • static 参数 — 调用方在 API 测试页看到灰显的固定值,不可修改,保证参数不会传错
  • 不同引擎不同参数 — 系统 TTS 有速度和音量,Edge 有讲述人,GPT-SoVITS 有 IP 和端口。参数跟着引擎走,而不是硬塞进一个通用结构