本文介绍如何通过WebSocket协议,使用CosyVoice大模型进行语音合成。当您不希望引入百炼SDK,或者当目前提供的SDK无法满足您的要求时,您可以参照本文档,自行开发代码访问百炼语音服务。
WebSocket是一种在单个TCP连接上进行全双工通信的协议。它让客户端和服务端之间的数据交换变得更加简单,客户端和服务端只需通过一次握手就可建立永久性连接,并进行双向数据传输。
通过WebSocket协议使用CosyVoice大模型进行语音合成有以下几个简要步骤:
拿到WebSocket服务URL地址
鉴权并建立连接
进行数据交互
断开连接
本文将对上述步骤中涉及到的一些概念(WebSocket交互流程、指令、事件)和信息(WebSocketURL、鉴权细节)等分别进行详细的介绍。
前提条件
已开通服务并获得api-key:获取API Key
WebSocket交互流程
客户端和服务端的交互流程,按照时间顺序可分为三个阶段,关于指令(例如:【run-task】)和事件(例如:【task-started】)的详细介绍,请分别参见客户端指令和服务端事件:
建立连接阶段(一次握手):客户端与服务端建立连接。客户端发送【run-task】指令,服务端返回响应事件【task-started】以确认建立连接成功,正式开启TTS语音合成服务。
循环调用阶段:客户端循环发送【continue-task】指令,向服务端发送待合成的文本流;同时,服务端返回合成好的音频数据。
断开连接阶段:文本发送完毕后,客户端发送【finish-task】指令,服务端待所有合成好的音频数据发送完毕后返回响应事件【task-finished】,然后客户端断开连接。
WebSocket服务URL
wss://dashscope.aliyuncs.com/api-ws/v1/inference
鉴权
只支持在建立连接阶段,通过Headers中携带API Key进行鉴权。配置好鉴权信息后您可以确认下是否能和WebSocket服务建立连接。
{
"Authorization": "bearer <your-dashscope-api-key>", // 将<your-dashscope-api-key>替换成您自己的API-KEY
"user-agent": "your-platform-info", //可选
"X-DashScope-WorkSpace": workspace, // 可选
"X-DashScope-DataInspection":"enable"
}
客户端指令
指令用于控制语音合成任务的起止,标识任务边界。客户端以JSON格式的Text Frame方式向服务端发送请求。
指令由header
和payload
两部分组成:
payload:包含基础信息外的其他信息如模型名、发音人等。不同指令的payload格式各不相同。
各指令如下:
run-task指令:开启语音合成任务
continue-task指令:发送待合成文本
finish-task指令:结束语音合成任务
服务端事件
事件指的是服务端返回给客户端的处理进度事件,代表不同的处理阶段,客户端可获取不同处理阶段的事件实现不同的业务逻辑。以JSON格式返回。
事件由header
和payload
两部分组成:
payload:包含基础信息外的其他信息。不同事件的payload格式可能不同。
各事件如下:
task-started事件:语音合成任务已开启
result-generated事件(现阶段忽略)
task-finished事件:语音合成任务已结束
task-failed事件:任务失败
下发音频流
CosyVoice语音合成中,音频会通过binary通道按照数据流的方式分帧下发。下发的所有音频为一个完整的音频文件,可以通过支持流式播放的播放器实时播放。
支持流式播放的播放器:ffmpeg、pyaudio (Python)、AudioFormat (Java)、MediaSource (Javascript)等。
客户端从第一次通过continue-task指令发送文本开始,到收到task-finished事件之间会收到音频流。
在流式语音合成中,是将一个完整的音频文件分多次返回。在播放流式音频时,需要使用支持流式播放的音频播放器,而不是将每一帧当作一个独立的音频播放,这样无法成功解码。
在保存音频时,请使用追加模式写入同一个文件。
在使用wav/mp3格式合成音频时,由于文件按照流式合成,因此只在第一帧中包含当前任务的文件头信息。