当用户对你的产品发出语音问句时,即需透过SpeechSynthesizer接口来取得TVS的语音回复。例如,当某个用户问了TVS:「杭州的天气怎样?」TVS将会回复一个带有二进制音频附件的Speak指令给客户端,客户端应该处理此指令并播放该音频。
SpeechSynthesizer有以下状态:
PLAYING:当TmallGenie正在说话时,SpeechSynthesizer应该处在playing状态。当TmallGenie的语音播放完成后,SpeechSynthesizer应该转移至 finished 状态。
FINISHED:当TmallGenie说完话后,SpeechSynthesizer应该转移至 finished 状态,并随后上报 SpeechFinished 事件。
TmallGenie预期客户端在每个需要上下文的事件中都为当前播放的TTS上报 playerActivity(播放状态)与 offsetInMilliseconds 。
{
"header": {
"namespace": "SpeechSynthesizer",
"name": "SpeechState"
},
"payload": {
"token": "{{STRING}}",
"offsetInMilliseconds": {{LONG}},
"playerActivity": "{{STRING}}"
}
}
| 参数 | 描述 | 型态 |
|---|---|---|
| token | 在 Speak 指令中所提供的opaque token。 |
字串 |
| offsetInMilliseconds | 用以标记目前TTS的offset | 长整数 |
| playerActivity | 用以识别SpeechSynthesizer的状态。 允许值: PLAYING或FINISHED |
字串 |
| 播放器行为 | 描述 |
|---|---|
| PLAYING | 语音正在播放中。 |
| FINISHED | 语音播放结束。 |
此指令会在用户的问句需要TmallGenie的语音回复时由TVS下发至客户端。大多数情况下,Speak指令是作为用户请求的回复而下发的,例如Recognize事件。然而,Speak 指令也有可能作为接下来会进行动作的开场白,例如当用户想设置计时器时,TVS除了会下发 SetAlert 指令要求客户端设置闹钟外,也会下发一个 Speak 指令来播放语音,用以提醒用户计时器成功设置。
此指令会以multipart报文的形式下发给客户端:一部分是JSON格式指令,另一部分为二进制音频附件。
{
"directive": {
"header": {
"namespace": "SpeechSynthesizer",
"name": "Speak",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}"
},
"payload": {
"url": "{{STRING}}",
"format": "{{STRING}}",
"token": "{{STRING}}"
}
}
}
{
"directive": {
"header": {
"name": "Speak",
"namespace": "SpeechSynthesizer",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}"
},
"payload": {
"url": "{{STRING}}",
"format": "{{STRING}}",
"token": "{{STRING}}",
"ttsText": "{{STRING}}",
"text": "{{STRING}}"
}
}
}
每个Speak指令都会有一个对应的二进制音频附件作为multipart报文中的其中一部分。以下headers会置于该附件之前:
Content-Type: application/octet-stream
Content-ID: {{Audio Item CID}}
{{BINARY AUDIO ATTACHMENT}}
| 参数 | 描述 | 型态 |
|---|---|---|
| messageId | 用以代表一个特定报文的唯一ID。 | 字串 |
| dialogRequestId | 由客户端为每一个发送给TVS的 Recognize 事件所生成的唯一ID。此参数用以将TVS所下发的指令与某个特定Recognize事件进行关连。 |
字串 |
| 参数 | 描述 | 型态 |
|---|---|---|
| url | 对音频内容的唯一识别符。此URL总是使用cid:前缀Example: cid:{{STRING}} |
字串 |
| format | 回传音频的格式。 允许值: “AUDIO_MPEG” |
长整数 |
| token | 用来表示目前合成语音 (Text-to-Speech; TTS) 对象的一个opaque token | 字串 |
| ttsText | 返回文案 | 字串 |
| text | 返回文案 | 字串 |
与Speak指令使用流式音频不同的是,SpeakUrl指令直接播放一个url,适合不支持流式TTS音频播放的设备使用。
{
"directive": {
"header": {
"namespace": "SpeechSynthesizer",
"name": "SpeakUrl",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}"
},
"payload": {
"url": "{{STRING}}",
"format": "{{STRING}}",
"effectiveCount": 3,
}
}
}
| 参数 | 描述 | 型态 |
|---|---|---|
| messageId | 用以代表一个特定message的唯一ID。 | 字串 |
| dialogRequestId | 由客户端为每一个发送给TVS的 Recognize 事件所生成的唯一ID。此参数用以将TVS所下发的指令与某个特定Recognize事件。 |
字串 |
| 参数 | 描述 | 型态 |
|---|---|---|
| url | TTS音频播放地址 | string |
| format | 音频的格式。 允许值:AUDIO_MPEG |
string |
| effectiveCount | 有效播放次数,默认为3 | int |
在处理了 Speak 指令并开始合成语音的播报后,客户端应该上报 SpeechStarted 事件给TVS。
{
"event": {
"header": {
"namespace": "SpeechSynthesizer",
"name": "SpeechStarted",
"messageId": "{{STRING}}"
},
"payload": {
"token": "{{STRING}}"
}
}
}
| 参数 | 描述 | 型态 |
|---|---|---|
| messageId | 用以代表一个特定报文的唯一ID。 | 字串 |
| 参数 | 描述 | 型态 |
|---|---|---|
| token | 由 Speak 指令所提供的opaque token。 |
字串 |
在处理了 Speak 指令而且TmallGenie TTS已经完整播放给用户后,客户端必须上报 SpeechFinished 事件。
{
"event": {
"header": {
"namespace": "SpeechSynthesizer",
"name": "SpeechFinished",
"messageId": "{{STRING}}"
},
"payload": {
"token": "{{STRING}}"
}
}
}
| 参数 | 描述 | 型态 |
|---|---|---|
| messageId | 用以代表一个特定报文的唯一ID。 | 字串 |
| 参数 | 描述 | 型态 |
|---|---|---|
| token | 由 Speak 指令所提供的opaque token。 |
字串 |