本文介绍如何使用智能语音交互流式文本Websocket协议来使用语音合成。如果您不希望引入阿里云智能语音交互产品SDK,或者目前提供的SDK不能满足您的要求,可以基于本文描述自行开发代码访问阿里语音服务。
前提条件
在使用WebSocket协议对接之前,请先阅读接口说明。
指令
请求指令用于控制语音识别任务的起止,标识任务边界,以JSON格式的Text Frame方式发送服务端请求,需要在Header中设置请求的基础信息。指令由Header和Payload两部分组成,其中Header部分为统一格式,不同指令的Payload部分格式各不相同。
1. Header格式说明
Header格式如下:
参数 | 类型 | 是否必选 | 说明 |
header | 请求头 | ||
header.appkey | String | 是 | 管控台创建的项目Appkey。 |
header.message_id | String | 是 | 当次消息请求ID,随机生成32位唯一ID。 |
header.task_id | String | 是 | 整个实时语音合成的会话ID,整个请求中需要保持一致,32位唯一ID。 |
header.namespace | String | 是 | 访问的产品名称,固定为“FlowingSpeechSynthesizer”。 |
header.name | String | 是 | 指令名称,包含StartSynthesis和StopSynthesis指令。 |
2. StartSynthesis指令
参数 | 类型 | 是否必选 | 说明 |
payload.voice | String | 否 | 发音人,默认是xiaoyun。发音人,默认是xiaoyun。 |
payload.format | String | 否 | 音频编码格式,支持pcm、wav和mp3格式,默认值:pcm。音频编码格式,支持pcm、wav和mp3格式,默认值:pcm。 |
payload.sample_rate | Integer | 否 | 音频采样率,默认值:16000Hz。 |
payload.volume | Integer | 否 | 音量,取值范围:0~100。默认值:50。 |
payload.speech_rate | Integer | 否 | 语速,取值范围:-500~500,默认值:0。 [-500,0,500]对应的语速倍速区间为 [0.5,1.0,2.0]。 |
payload.pitch_rate | Integer | 否 | 语调,取值范围:-500~500,默认值:0。 |
payload.enable_subtitle | Boolean | 否 | 开启字级别时间戳。 |
payload.enable_phoneme_timestamp | Boolean | 否 | 开启音素级别时间戳。 |
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "FlowingSpeechSynthesizer",
"name": "StartSynthesis",
"appkey": "17d4c634****"
},
"payload": {
"voice": "xiaoyun",
"format": "wav",
"sample_rate": 16000,
"volume": 50,
"speech_rate": 0,
"pitch_rate": 0,
"enable_subtitle": true
}
}
3. RunSynthesis指令
参数 | 类型 | 是否必选 | 说明 |
text | String | 是 | 需要合成的文本 |
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "FlowingSpeechSynthesizer",
"name": "RunSynthesis",
"appkey": "17d4c634****"
},
"payload": {
"text": "流式输入文本"
}
}
4. StopSynthesis指令
StopSynthesis指令要求服务端停止语音合成,Payload为空。示例代码如下:
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "FlowingSpeechSynthesizer",
"name": "StopSynthesis",
"appkey": "17d4c634****"
}
}
事件
事件指的是服务端返回给客户端的处理进度事件,代表不同的处理阶段,客户端可获取不同处理阶段的事件实现不同的业务逻辑。以JSON格式返回,事件由Header和Payload两部分组成,其中Header部分为统一格式,不同事件的Payload部分格式可能不同。
1. SynthesisStarted事件
参数 | 类型 | 说明 |
session_id | String | 客户端请求时传入session_id的话则原样返回,否则由服务端自动生成32位唯一ID。 |
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "FlowingSpeechSynthesizer",
"name": "SynthesisStarted",
"status": 20000000,
"status_message": "GATEWAY|SUCCESS|Success."
},
"payload": {
"session_id": "1231231dfdf****"
}
2. SentenceBegin事件
SentenceBegin事件表示服务端检测到了一句话的开始。
参数 | 类型 | 说明 |
index | Integer | 句子编号,从1开始递增。 |
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "FlowingSpeechSynthesizer",
"name": "SentenceBegin",
"status": 20000000,
"status_message": "GATEWAY|SUCCESS|Success."
},
"payload": {
"index": 1
}
}
3. SentenceSynthesis事件
SentenceSynthesis事件表示有新的合成结果返回,包含最新的音频和时间戳,句内全量,句间增量。
参数 | 类型 | 说明 |
subtitles[] | ArrayList | 时间戳信息。 |
subtitles[0].text | String | ⽂本信息。 |
subtitles[0].sentence | String | 句子时间戳控制,True表示当前时间戳为句子。 |
subtitles[0].begin_index | Integer | 该字在整句中的开始位置,从0开始。 |
subtitles[0].end_index | Integer | 该字在整句中的结束位置,从0开始。 |
subtitles[0].begin_time | Integer | ⽂本对应TTS语⾳开始时间戳,单位ms。 |
subtitles[0].end_time | Integer | ⽂本对应TTS语⾳结束时间戳,单位ms。 |
subtitles[0].phoneme_list | ArrayList | 文本的音素时间戳信息。 |
subtitles[0].phoneme_list[0].index | Integer | 该音素的下标,从0开始。 |
subtitles[0].phoneme_list[0].beginTime | Integer | 该音素对应TTS语音开始时间戳,单位ms。 |
subtitles[0].phoneme_list[0].endTime | Integer | 该音素对应TTS语音结束时间戳,单位ms。 |
subtitles[0].phoneme_list[0].phoneme | String | 音素信息。 |
subtitles[0].phoneme_list[0].tone | String | 语气信息。 |
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "FlowingSpeechSynthesizer",
"name": "SentenceSynthesis",
"status": 20000000,
"status_message": "GATEWAY|SUCCESS|Success."
},
"payload": {
"subtitles": [
{
"text": "",
"begin_time": 0,
"end_time": 0,
"begin_index": 0,
"end_index": 1,
"sentence": true,
"phoneme_list": []
},
{
"text": "今",
"begin_time": 0,
"end_time": 175,
"begin_index": 0,
"end_index": 1,
"sentence": false,
"phoneme_list": [
{
"begin_time": 0,
"end_time": 120,
"text": "j_c",
"tone": "1"
},
{
"begin_time": 120,
"end_time": 170,
"text": "in_c",
"tone": "1"
}
]
}
]
}
}
4. SentenceEnd事件
SentenceEnd事件表示服务端检测到了一句话的结束,返回该句的全量时间戳。
参数 | 类型 | 说明 |
subtitles[] | ArrayList | 时间戳信息。 |
subtitles[0].text | String | ⽂本信息。 |
subtitles[0].sentence | String | 句子时间戳控制,True表示当前时间戳为句子。 |
subtitles[0].begin_index | Integer | 该字在整句中的开始位置,从0开始。 |
subtitles[0].end_index | Integer | 该字在整句中的结束位置,从0开始。 |
subtitles[0].begin_time | Integer | ⽂本对应TTS语⾳开始时间戳,单位ms。 |
subtitles[0].end_time | Integer | ⽂本对应TTS语⾳结束时间戳,单位ms。 |
subtitles[0].phoneme_list | ArrayList | 文本的音素时间戳信息。 |
subtitles[0].phoneme_list[0].index | Integer | 该音素的下标,从0开始。 |
subtitles[0].phoneme_list[0].beginTime | Integer | 该音素对应TTS语音开始时间戳,单位ms。 |
subtitles[0].phoneme_list[0].endTime | Integer | 该音素对应TTS语音结束时间戳,单位ms。 |
subtitles[0].phoneme_list[0].phoneme | String | 音素信息。 |
subtitles[0].phoneme_list[0].tone | String | 语气信息。 |
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "FlowingSpeechSynthesizer",
"name": "SentenceEnd",
"status": 20000000,
"status_message": "GATEWAY|SUCCESS|Success."
},
"payload": {
"subtitles": [
{
"text": "",
"begin_time": 0,
"end_time": 0,
"begin_index": 0,
"end_index": 1,
"sentence": true,
"phoneme_list": []
},
{
"text": "今",
"begin_time": 0,
"end_time": 175,
"begin_index": 0,
"end_index": 1,
"sentence": false,
"phoneme_list": [
{
"begin_time": 0,
"end_time": 120,
"text": "j_c",
"tone": "1"
},
{
"begin_time": 120,
"end_time": 170,
"text": "in_c",
"tone": "1"
}
]
},
{
"text": "天",
"begin_time": 175,
"end_time": 320,
"begin_index": 1,
"end_index": 2,
"sentence": false,
"phoneme_list": [
{
"begin_time": 0,
"end_time": 120,
"text": "t_c",
"tone": "1"
},
{
"begin_time": 120,
"end_time": 170,
"text": "ian_c",
"tone": "1"
}
]
}
]
}
}
5. SynthesisCompleted事件
SynthesisCompleted事件表示服务端已停止了语音转写。
{
"header": {
"message_id": "05450bf69c53413f8d88aed1ee60****",
"task_id": "640bc797bb684bd6960185651307****",
"namespace": "FlowingSpeechSynthesizer",
"name": "SynthesisCompleted",
"status": 20000000,
"status_message": "GATEWAY|SUCCESS|Success."
}
}
- 本页导读 (1)