命令和响应
本文介绍使用WebSocket接口以流式方式发送音频数据时的命令和响应。
客户端使用下表中的命令向API发送开始/结束语音识别的请求以及发送数据。发送s
和e
命令后需等待API的响应再发送下一个命令。发生错误时会返回错误响应。
名称 | 说明 |
---|---|
s命令 | 客户端发送的语音识别请求命令 |
p命令 | 客户端发送音频数据的命令 |
e命令 | 客户端发送结束语音识别请求的命令 |
API会根据处理进度返回下表中的事件。
名称 | 说明 |
---|---|
S事件 | 通知语音检测进程检测到语音开始的事件 |
E事件 | 通知语音检测进程检测到语音结束的事件 |
C事件 | 通知语音识别进程开始语音识别的事件 |
U事件 | 通知语音识别进程中间结果的事件 |
A事件 | 通知语音识别进程完成识别并返回结果的事件 |
G事件 | 通知服务器生成的信息的事件。未使用相关功能时不会发生。 |
使用音频流的应用程序的命令和事件的一般流程如下图所示。
S
和E
事件是语音检测的结果,C
、U
和A
事件是语音识别的结果。根据语音段的长度和基础系统的繁忙程度,事件的顺序可能会有所不同。例如,在上图中C
出现在S
和E
之间,但也可能出现在E
之后。
这里以一个音频数据中语音检测检测到3个语音段的情况为例进行说明。
下面使用日志来说明当通过WebSocket接口从流式数据源每秒向API发送1秒数据时,客户端发送命令和API响应事件的流程。
- 以
command>>>
开头的行是客户端发送的命令 - 以
message<<<
开头的行是API返回的响应事件
完整日志如下。为了便于查看,API返回的事件已高亮显示。
0:00:00.000 open> wss://acp-api.amivoice.com/v1/
0:00:00.161 open # WebSocket连接
0:00:00.161 command>>> s 16k -a-general segmenterProperties="useDiarizer=1" resultUpdatedInterval=1000 authorization=XXXXXXXXXXXXXXXX
0:00:00.226 message<<< s # 语音识别请求s命令的响应
0:00:00.226 command>>> p [..(32000 bytes)..] # 发送第1秒数据
0:00:01.232 command>>> p [..(32000 bytes)..] # 发送第2秒数据
0:00:02.236 command>>> p [..(32000 bytes)..] # 发送第3秒数据
0:00:03.241 command>>> p [..(32000 bytes)..] # 发送第4秒数据
0:00:04.245 command>>> p [..(32000 bytes)..] # 发送第5秒数据
0:00:05.250 command>>> p [..(32000 bytes)..] # 发送第6秒数据
0:00:06.254 command>>> p [..(32000 bytes)..] # 发送第7秒数据
0:00:07.257 command>>> p [..(32000 bytes)..] # 发送第8秒数据
0:00:07.291 message<<< S 6200 # [语音1] 在6.2秒检测到语音开始
0:00:07.297 message<<< C # [语音1] 开始语音识别处理
0:00:08.262 command>>> p [..(32000 bytes)..] # 发送第9秒数据
0:00:08.315 message<<< E 7450 # [语音1] 在7.45秒检测到语音结束
0:00:08.315 message<<< U {...} # [语音1] 中间结果
0:00:08.446 message<<< A {...} # [语音1] 语音段结果
0:00:09.267 command>>> p [..(32000 bytes)..] # 发送第10秒数据
0:00:10.270 command>>> p [..(32000 bytes)..] # 发送第11秒数据
0:00:10.309 message<<< S 8600 # [语音2] 在8.6秒检测到语音开始
0:00:10.327 message<<< C # [语音2] 开始语音识别处理
0:00:11.272 command>>> p [..(32000 bytes)..] # 发送第12秒数据
0:00:11.337 message<<< U {...} # [语音2] 中间结果
0:00:12.274 command>>> p [..(32000 bytes)..] # 发送第13秒数据
0:00:12.321 message<<< U {...} # [语音2] 中间结果
0:00:13.277 command>>> p [..(32000 bytes)..] # 发送第14秒数据
0:00:13.301 message<<< E 11650 # [语音2] 在11.65秒检测到语音结束
0:00:13.304 message<<< S 12000 # [语音3] 在12.00秒检测到语音开始
0:00:13.311 message<<< U {...} # [语音3] 中间结果
0:00:13.343 message<<< A {...} # [语音3] 语音段结果
0:00:14.282 command>>> p [..(32000 bytes)..] # 发送第15秒数据
0:00:14.336 message<<< C # [语音3] 开始语音识别处理
0:00:15.287 command>>> p [..(32000 bytes)..] # 发送第16秒数据
0:00:15.344 message<<< U {...} # [语音3] 中间结果
0:00:16.289 command>>> p [..(32000 bytes)..] # 发送第17秒数据
0:00:16.337 message<<< U {...} # [语音3] 中间结果
0:00:17.291 command>>> p [..(22968 bytes)..] # 发送第18秒数据
0:00:17.345 message<<< U {...} # [语音3] 中间结果
0:00:18.297 command>>> e # 音频发送完毕,发送e命令结束会话
0:00:18.341 message<<< U {...} # [语音3] 中间结果
0:00:18.347 message<<< E 17700 # [语音3] 在17.70秒检测到语音结束
0:00:18.347 message<<< U {...} # [语音3] 中间结果
0:00:18.512 message<<< A {...} # [语音3] 语音段结果
0:00:18.574 message<<< e # 会话结束响应
0:00:18.574 close> # 客户端关闭WebSocket
0:00:18.595 close # WebSocket关闭响应
下面按步骤进行说明。
首先,通过WebSocket连接到AmiVoice API的 endpoint,然后使用s
命令发送语音识别请求。API会返回s
命令的响应。
0:00:00.000 open> wss://acp-api.amivoice.com/v1/
0:00:00.161 open # WebSocket连接
0:00:00.161 command>>> s 16k -a-general segmenterProperties="useDiarizer=1" resultUpdatedInterval=1000 authorization=XXXXXXXXXXXXXXXX
0:00:00.226 message<<< s # 语音识别请求s命令的响应
请求成功后,客户端通过p
命令每秒发送一次音频数据。在发送第8秒数据后,API发送了S
(检测到语音)事件。
0:00:00.226 command>>> p [..(32000 bytes)..] # 发送第1秒数据
0:00:01.232 command>>> p [..(32000 bytes)..] # 发送第2秒数据
0:00:02.236 command>>> p [..(32000 bytes)..] # 发送第3秒数据
0:00:03.241 command>>> p [..(32000 bytes)..] # 发送第4秒数据
0:00:04.245 command>>> p [..(32000 bytes)..] # 发送第5秒数据
0:00:05.250 command>>> p [..(32000 bytes)..] # 发送第6秒数据
0:00:06.254 command>>> p [..(32000 bytes)..] # 发送第7秒数据
0:00:07.257 command>>> p [..(32000 bytes)..] # 发送第8秒数据
0:00:07.291 message<<< S 6200 # [语音1] 在6.2秒检测到语音开始
之后,依次收到C
(开始语音识别)、A
(语音段结果)事件。另外,在中间还收到了表示在7.45秒检测到语音结束的E
(检测到语音结束)事件。由于在s
命令连接时设置了resultUpdatedInterval=1000
,所以每秒会收到一次U
(中间结果)。
0:00:07.297 message<<< C # [语音1] 开始语音识别处理
0:00:08.262 command>>> p [..(32000 bytes)..] # 发送第9秒数据
0:00:08.315 message<<< E 7450 # [语音1] 在7.45秒检测到语音结束
0:00:08.315 message<<< U {...} # [语音1] 中间结果
0:00:08.446 message<<< A {...} # [语音1] 语音段结果
之后,对剩余的2个语音重复进行语音检测和语音识别处理。
音频数据发送完成后,发送e
命令结束会话。API在完成所有语音检测和语音识别处理后,会返回e
事件作为会话结束的响应。
0:00:18.297 command>>> e # 音频发送完毕,发送e命令结束会话
0:00:18.341 message<<< U {...} # [语音3] 中间结果
0:00:18.347 message<<< E 17700 # [语音3] 在17.70秒检测到语音结束
0:00:18.347 message<<< U {...} # [语音3] 中间结果
0:00:18.512 message<<< A {...} # [语音3] 语音段结果
0:00:18.574 message<<< e # 会话结束响应
0:00:18.574 close> # 客户端关闭WebSocket
0:00:18.595 close # WebSocket关闭响应
关于这个18秒会话的整体情况,请参阅前面日志中的注释说明。
A
和U
事件的响应中包含结果。详情请参阅语音识别结果格式。关于WebSocket的命令和事件,也请参阅WebSocket 接口。
上述日志中的命令和事件序列如下图所示。该图中省略了p
命令。
错误响应
如果客户端发送的s