# 语音识别器
# 协议类型
消息类型 | 名称 | 必须实现 |
---|---|---|
event | audio_in | 语音请求 |
text_in | 文本请求 | |
directive | intermediate_text | 识别结果 |
stop_capture | 结束录音 | |
expect_reply | 追问 |
应用场景
终端使用语音请求和文本输入(输入文本、有屏设备触屏操作)的场景
# context
"unios_context": {
...
"recognizer": {
"version": "1.0",
},
...
}
2
3
4
5
6
7
参数 | 类型 | 说明 | 必填 |
---|---|---|---|
version | String | 模块版本,现在是1.0 | 是 |
# event
语音请求
语音请求分两部分:
- 构建语音处理的
unios_event
- 发送语音数据
在一个语音交互开始之后,麦克风需要一直开启直到:
- 接收到stop_capture指令
- 语音流被云端结束
- 用户手工关闭了麦克风,场景:长按录音,松开结束录音
构建语音处理的 unios_event
请求示例
{
"unios_header": {},
"unios_context": {},
"unios_event": {
"header": {
"name": "recognizer.audio_in",
"message_id": "xxxxxxxx"
},
"payload": {
"format": "PCM",
"enable_vad": true
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
参数名 | 类型 | 必传 | 描述 |
---|---|---|---|
format | String | 否 | 语音压缩格式,默认:opus |
enable_vad | Boolean | 否 | 是否开启服务端vad功能(false: 不开启,true: 开启),默认:true |
format 取值
format | 说明 |
---|---|
pcm | pcm,Little-Endian |
opus | opus 压缩,16000bps/32000bps 固定比特率 (CBR),VOIP 模式 |
adpcm | adpcm 压缩 |
语音流上传
发送完音频上传指令之后,客户端应尽快开始发送二进制语音数据。除非平台硬件有特殊限制,请使用上述format格式语音数据,封装到一个 websocket binary 消息中发送。如果打开了服务端 vad ,那么在收到服务端recognizer.stop_capture
时,应该结束本地录音;如果没有打开服务端 vad,那么客户端可以根据本地 vad 或者按键请求等,自己确定什么时候结束录音。
注意
无论通过哪种方式结束录音,结束本地录音,关闭设备麦克风后,客户端都应该统一发送音频结束标志:
- 字符串__END__ 代表发送的音频流结束,请求云端进行后续操作(如语义理解等)。
- 字符串__CANCEL__ 代表发送的音频流结束,取消之前发送的语音请求,云端无需进行后续操作。
文本请求
UniOS 不仅支持语音的请求,还支持文本请求,这让多模态交互成为可能。在以下场景,我们建议使用text_in
。
- 当用户点击设备的GUI按键或实体按键时,设备可以将某些动作绑定转化为
text_in
请求,请求云端语义处理 - 支持用户在设备上进行文本输入
请求示例
{
"unios_header": {...},
"unios_context": {...},
"unios_event": {
"header": {
"name": "recognizer.text_in",
"message_id": "xxxxxxxx"
},
"payload": {
"query": "请求的文本",
"with_tts": true
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
参数 名 | 类型 | 说明 | 必填 |
---|---|---|---|
unios_header | Object | 构建的通用 unios_header | 是 |
unios_context | Object | 构建的通用 unios_context | 是 |
query | String | 需要请求的文本 | 是 |
with_tts | Boolean | 是否需要语音回复,如果希望用户点击按钮的时候,不要出现提示音,那么可以设置为 false,默认为:true | 否 |
# directive
识别结果
当需要实时显示用户说话时,可以使用recognizer.intermediate_text
来获得用户实时的转写结果,这个是一个可选项,按需实现即可。
回复示例
{
"unios_directives": [
...,
{
"header": {
"name": "recognizer.intermediate_text"
},
"payload": {
"text": "天气怎么样",
"is_end": true,
"is_variable":false,
"show_text":"明天的天气怎么样"
}
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
参数 名 | 类型 | 说明 | 必填 |
---|---|---|---|
text | String | ASR识别的语音流片段结果 | 是 |
is_end | Boolean | 是否为最终结果,true表示当前文本为最终结果,false表示当前文本不是最终状态 | 是 |
is_variable | Boolean | 是否为可变结果,true表示可变结果。 | 否 |
show_text | String | 最终显示的文本结果 | 是 |
结束录音
一般情况下,我们在上传音频的时候使用的是音频流,当服务端识别出用户意图,或用户语音结束时,UVS会下发该指令给设备端。
当设备端收到recognizer.stop_capture
的消息的时候,需要在设备上执行关闭麦克风的操作,关闭后发送__END__来结束音频上传。
在收到recognizer.stop_capture
前,可以随时通过 __END__来主动结束语音音频流并等待云端返回结果;当然也可以通过__CANCEL__来取消本次语音请求。
回复示例
{
"unios_directives": [
...,
{
"header": {
"name": "recognizer.stop_capture"
},
"payload": {}
}
]
}
2
3
4
5
6
7
8
9
10
11
追问
当服务端需要追问更多信息时将发送recognizer.expect_reply 指令,该指令要求客户端打开麦克风并开始传送用户语音。
追问是UniOS的一种响应,当接收到 name 为 recognizer.expect_reply 的指令时,应该使用recognizer.audio_in进行进一步的交互。当然也可以使用recognizer.text_in 来进行回复。
注意
- 如果同时打开recognizer.audio_in和recognizer.text_in的情况下,用户通过屏幕进行点击操作的时候,应该发送__CANCEL__来通知云端取消语音输入。
- 如果设备进入了持续交互模式,此时设备想要退出本轮持续交互(如打开了一个不应该继续和用户交互的音乐播放app),可以发送__CANCEL__并在设备端自行关闭麦克风。
回复示例
{
"unios_directives": [
{
"header": {
"name": "tts_player.voice_out"
},
"payload": {
"url": "http://music.unios.cn/tts/sadf.mp3?token=xxxxxxxx",
"behavior": "UPCOMING",
"metadata": {
"text": "请问哪个城市的?"
}
}
},
{
"header": {
"name": "recognizer.expect_reply"
},
"payload": {
"background_recognize": true,
"timeout": 8000
}
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
参数名 | 类型 | 说明 | 必填 |
---|---|---|---|
background_recognize | Boolean | 是否为背景录音,默认为flase,代表为前景录音。如果取值为true,则设备在处理录音时,显示背景录音的状态(不影响用户当前的使用的情况下的录音)。只有在设备支持持续交互的情况下才会收到这个字段。 | 否 |
timeout | Long | 追问等待的超时时间,单位为:毫秒 | 是 |