-
DuerOS开放平台
-
技能开放平台
-
自定义技能
- 自定义技能简介
- 自定义技能创建
-
有屏技能
-
技能交互模型
-
自定义技能协议
- 处理DuerOS发送的请求
-
技能部署
-
技能开发样例
- 账户关联
-
技能测试
-
技能发布
-
技能付费
-
个性化服务
-
内容播报技能
-
小技能
-
平台能力扩展
-
SDK
-
预览版功能
- 全双工(Preview)
-
APP技能(Preview)
-
-
智能家居开放平台
- 品牌使用规范
-
开发者服务条款
本接口定义语音输入相关的功能,如果设备有麦克风,应该实现本接口,接入语音输入的能力。接口包括设备端进行语音请求(上传语音),服务端下发开始收听语音、停止收听语音指令等等。
当用户开始发起语音请求时(通过唤醒词、按键、或其他方式),设备端需要上报ListenStarted事件,并把请求语音附带上传。服务端收到ListenStarted事件,对其语音经过语音识别、意图识别、需求满足等步骤之后,会下发相应的指令到设备端执行,最终满足用户请求。
"clientContext": [
{{ai.dueros.device_interface.alerts.AlertsState}},
{{ai.dueros.device_interface.audio_player.PlaybackState}},
{{ai.dueros.device_interface.speaker_controller.VolumeState}},
{{ai.dueros.device_interface.voice_output.SpeechState}}
],
"event": {
"header": {
"namespace": "ai.dueros.device_interface.voice_input",
"name": "ListenStarted",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}"
},
"payload": {
"format": "{{STRING}}"
}
}
ListenStarted事件需要设备端上报所有端上状态。
- dialogRequestId
- 每一次的语音请求,设备端需要为其生成一个唯一的dialogRequestId,唯一辨识这一次对话
- 服务端下发本对话对应的指令时,回复中将携带这个id
- format
- 附带语音音频流的数据格式
- 取值
- "AUDIO_L16_RATE_16000_CHANNELS_1": 16bit线性PCM音频,16kHz采样率,单声道,Little endian byte order
- "AUDIO_L16_RATE_16000_CHANNELS_x_x": 16bit线性PCM音频,16kHz采样率,第一个x取值为整数代表有几通道麦克风音频,第二个x取值为整数代表有几通道回采音频,排列顺序为先麦克风音频再回采音频,Little endian byte order
ListenStarted事件是一个multipart message的HTTP请求,该HTTP请求包含两个消息(message),第一个消息为ListenStarted事件对应的JSON消息,第二个消息为语音的二进制音频数据流,数据流的格式由ListenStarted事件JSON消息中的payload.format决定。
ListenStarted事件HTTP请求样例如下:
:method = POST
:scheme = https
:path = /dcs/v1/events
authorization = Bearer {token}
content-type = multipart/form-data; boundary=this-is-a-boundary
--this-is-a-boundary
Content-Disposition: form-data; name="metadata"
Content-Type: application/json; charset=UTF-8
{
{{clientContext}},
{{event}}
}
--this-is-a-boundary
Content-Disposition: form-data; name="audio"
Content-Type: application/octet-stream
{{binary audio attachment}}
--this-is-a-boundary--
为了提高用户请求的响应速度,在用户开始语音请求之时就发起ListenStarted事件HTTP请求,并在用户边说话时实时的将音频数据流进行流式上传,而不是等用户说完之后再进行请求。音频数据流,我们建议以每10毫秒为一个数据块(chunk),进行流式上传,意味着每10毫秒的音频数据写到HTTP请求流中,并flush缓冲区。
设备端在进行ListenStarted事件请求时,如果服务端检测到VAD(Voice Activity Detection,用来检测用户是不是说完了),则会下发StopListen指令到设备端。
设备端在收到StopListen指令时,应该立即停止收听语音,并关闭麦克风。
"directive": {
"header": {
"namespace": "ai.dueros.device_interface.voice_input",
"name": "StopListen",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}"
},
"payload": {
}
}
在对话当中,如果服务端需要用户提供更多信息,需要通过多轮对话来询问,则服务端在处理完当前语音请求之后,下发Listen指令到设备端,主动发起下一轮对话。
如果设备端支持主动开启麦克风(如支持远场唤醒的硬件产品),则设备端收到Listen指令之后应该立即开启麦克风,开始收听用户语音请求。
如果设备端不支持主动开启麦克风(如仅支持按住说话的硬件产品),则设备端在执行Listen指令之后开始计时,在timeoutInMilliseconds时间之后如果用户仍然没有进行语音请求,则上报ListenTimedOut事件。
"directive": {
"header": {
"namespace": "ai.dueros.device_interface.voice_input",
"name": "Listen",
"messageId": "{{STRING}}",
"dialogRequestId": "{{STRING}}"
},
"payload": {
"timeoutInMilliseconds": {{LONG}}
}
}
- timeoutInMilliseconds
- 在不支持主动开启麦克风的设备中,当执行Listen指令之后,在指定的等待时间内如果麦克风没有被开启(用户没有发起语音请求),则等待超时,需要上报ListenTimedOut事件
在不支持主动开启麦克风的设备中(如仅支持按住说话的硬件产品),设备端在收到Listen指令并执行该指令之后,如果在Listen指令指定的timeoutInMilliseconds时间内用户仍然没有发起语音请求(麦克风没有开启),则上报ListenTimedOut事件。
"event": {
"header": {
"namespace": "ai.dueros.device_interface.voice_input",
"name": "ListenTimedOut",
"messageId": "{{STRING}}",
},
"payload": {
}
}