實時工作流支持您按照我們提供的標準協議來接入文本轉語音(TTS)模型。
自研TTS標準接口
您需要實現一個公網可訪問的HTTP流式數據傳輸服務,按照我們定義的輸入輸出規范,封裝好您的文本轉語音模型,即可將您的自研TTS添加到工作流中。
首先您需要在編排管理控制臺中的TTS 文字轉語音節點中,配置以下參數:
名稱 | 類型 | 必填 | 描述 | 示例值 |
請求服務地址 | String | 是 | 自研模型HTTPS接口地址 | https://www.abc.com |
Token | String | 否 | 服務校驗令牌 | AUJH-pfnTNMPBm6iWXcJAcWsrscb5KYaLitQhHBLKrI |
碼率 | Integer | 是 | 僅支持48000 | 48000 |
在實時工作流運行期間,我們會按照以下格式,組裝表單數據,通過Post請求來訪問您配置的自研文本轉語音模型HTTPS地址,輸入參數如下:
名稱 | 類型 | 必填 | 描述 | 示例值 |
Text | String | 是 | 語音文本 | 你好 |
SampleRate | Integer | 是 | 碼率 | 48000 |
Token | String | 否 | 服務校驗令牌 | AUJH-pfnTNMPBm6iWXcJAcWsrscb5KYaLitQhHBLKrI |
ExtendData | String | 是 | 提交自定義TTS拓展信息字段,會包含實例Id,以及啟動實例時您傳入的UserData業務字段數據。 | {'InstanceId':'68e00b6640e*****3e943332fee7','ChannelId':'123','SentenceId':'3',UserData':'{"aaaa":"bbbb"}'} |
| String | 是 | 實例ID信息 | 68e00b6640e*****3e943332fee7 |
| String | 是 | 房間ID信息 | 123 |
| Int | 是 | 問答ID信息 說明 對于用戶的同一次提問,智能體回答會使用相同的ID信息。 | 3 |
| String | 否 | 啟動實例時您傳入的UserData業務字段數據 | {"aaaa":"bbbb"} |
您需要將生成的對應音色以及采樣率的音頻源流PCM通過HTTP流式響應,分段發送給我們的服務,我們將實時地推送到后續節點當中。
自定義TTS Server
Python
自定義TTS Server代碼示例如下:
from aiohttp import web
async def stream_audio(request):
data = await request.json()
text = data.get('Text', "")
token = data.get('Token', None)
sample_rate = data.get('SampleRate', 48000)
extend_data = data.get('ExtendData', "")
print(f"text:{text}, token:{token}, sample_rate:{sample_rate}, extend_data:{extend_data}")
# TODO:校驗Token是否合法
response = web.StreamResponse(
status=200,
reason='OK',
headers={'Content-Type': 'audio/mpeg'}
)
# 開始響應
await response.prepare(request)
# generate_tts_data 是一個協程,用于生成音頻數據
async for chunk in generate_tts_data(text, sample_rate):
await response.write(chunk)
# 完成響應
await response.write_eof()
return response
async def generate_tts_data(text: str, sample_rate: int):
# TODO: 調用TTS服務,生成對應音頻對應采樣率的音頻數據
# 示例:從文件讀取音頻數據
file_path = '/your_dir/sample.pcm'
with open(file_path, 'rb') as f:
while True:
chunk = f.read(4096) # 每次讀取4KB的數據
if not chunk:
break
yield chunk
app = web.Application()
app.add_routes([web.post('/stream-audio', stream_audio)])
if __name__ == '__main__':
web.run_app(app)