# 语音识别器

# 协议类型

消息类型 名称 必须实现
event audio_in 语音请求
text_in 文本请求
directive intermediate_text 识别结果
stop_capture 结束录音
expect_reply 追问

应用场景

终端使用语音请求和文本输入(输入文本、有屏设备触屏操作)的场景

# context

"unios_context": {
  ...
  "recognizer": {
    "version": "1.0",
  },
  ...
}
1
2
3
4
5
6
7
参数 类型 说明 必填
version String 模块版本,现在是1.0

# event

语音请求
语音请求分两部分:

  1. 构建语音处理的 unios_event
  2. 发送语音数据

在一个语音交互开始之后,麦克风需要一直开启直到:

  1. 接收到stop_capture指令
  2. 语音流被云端结束
  3. 用户手工关闭了麦克风,场景:长按录音,松开结束录音

构建语音处理的 unios_event

请求示例

{
    "unios_header": {},
    "unios_context": {},
    "unios_event": {
        "header": {
            "name": "recognizer.audio_in",
            "message_id": "xxxxxxxx"
        },
        "payload": {
            "format": "PCM",
            "enable_vad": true
        }
    }
}
1
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
    }
  }
}
1
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":"明天的天气怎么样"
      }
    }
  ]
}
1
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": {}
    }
  ]
}
1
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
            }
        }
    ]
}
1
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 追问等待的超时时间,单位为:毫秒