语音输入

摘要

本接口定义语音输入相关的功能,如果设备有麦克风,应该实现本接口,接入语音输入的能力。接口包括设备端进行语音请求(上传语音),服务端下发开始收听语音、停止收听语音指令等等。

ListenStarted事件

当用户开始发起语音请求时(通过唤醒词、按键、或其他方式),设备端需要上报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}}"
    }
}

Client Context说明

ListenStarted事件需要设备端上报所有端上状态。

Header参数说明

  • dialogRequestId
    • 每一次的语音请求,设备端需要为其生成一个唯一的dialogRequestId,唯一辨识这一次对话
    • 服务端下发本对话对应的指令时,回复中将携带这个id

Payload参数说明

  • 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缓冲区。

StopListen指令

设备端在进行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指令之后应该立即开启麦克风,开始收听用户语音请求。

如果设备端不支持主动开启麦克风(如仅支持按住说话的硬件产品),则设备端在执行Listen指令之后开始计时,在timeoutInMilliseconds时间之后如果用户仍然没有进行语音请求,则上报ListenTimedOut事件。

消息样例

"directive": {
    "header": {
        "namespace": "ai.dueros.device_interface.voice_input",
        "name": "Listen",
        "messageId": "{{STRING}}",
        "dialogRequestId": "{{STRING}}"
    },
    "payload": {
        "timeoutInMilliseconds": {{LONG}}
    }
}

Payload参数说明

  • timeoutInMilliseconds
    • 在不支持主动开启麦克风的设备中,当执行Listen指令之后,在指定的等待时间内如果麦克风没有被开启(用户没有发起语音请求),则等待超时,需要上报ListenTimedOut事件

ListenTimedOut事件

在不支持主动开启麦克风的设备中(如仅支持按住说话的硬件产品),设备端在收到Listen指令并执行该指令之后,如果在Listen指令指定的timeoutInMilliseconds时间内用户仍然没有发起语音请求(麦克风没有开启),则上报ListenTimedOut事件。

消息样例

"event": {
    "header": {
        "namespace": "ai.dueros.device_interface.voice_input",
        "name": "ListenTimedOut",
        "messageId": "{{STRING}}",
    },
    "payload": {
    }
}