] }}
状态码:400 失败响应示例
{ "error_code":"SIS.0001", "error_msg":"***"
}
状态码
状态码请参见状态码。
错误码
错误码请参见错误码。
6.2 websocket 接口
功能介绍
一句话识别websocket接口支持识别1min以内的音频,交互过程如图 客户端和服务端
交互流程所示,主要分为开始识别、发送音频数据,结束识别、断开连接四个步骤。
websocket接口同http接口一致按次计费,只要建立连接成功,发送音频,服务开始识 别,则本次调用计费生效。如果用户发送错误end请求或者持续20s未发送音频而产生 了报错,该次调用依然认为生效。如果连接成功后未发送音频直接断开,或者请求字 段不正确而产生异常,则认为本次调用无效,不会纳入计费次数。
图6-1 客户端和服务端交互流程
wss-URI
● wss-URI格式
wss /v1/{project_id}/asr/short-audio
● 参数说明
表6-11 参数说明
参数名 是否必选 说明
project_id 是 项目编号。获取方法,请参见获取项
目ID。
开始识别
● 功能介绍
当wss握手请求收到成功响应后,客户端到服务端的通信协议会升级为Websocket 协议。通过Websocket协议,客户端发送开始识别请求,用于配置一句话识别的 配置信息。
● 请求消息
表6-12 参数说明
参数名 是否必
选
参数类型 说明
command 是 String 需设置为START,表示开始识别请 求。
config 是 Object 配置信息。结构信息请参见表
config数据结构。
表6-13 config 数据结构
参数 是否必
选
参数类型 说明
audio_format 是 String 支持语音的格式,请参见表
audio_format取值范围。
property 是 String 所使用的模型特征串。通常是 “语 种_采样率_领域”的形式,例如 chinese_8k_common。请参见表
property取值范围。
add_punc 否 String 表示是否在识别结果中添加标点,
取值为yes 、 no,默认no。
digit_norm 否 String 表示是否将语音中的数字识别为阿 拉伯数字,取值为yes 、 no,默认 为yes。
interim_results 否 String 是否输出中间结果,可以为yes或 no。默认为no,表示不输出中间结 果。
vocabulary_id 否 String 热词表id,不使用热词则不填写。
创建热词表信息请参考创建热词
表。
need_word_info 否 String 表示是否在识别结果中输出分词结 果信息,取值为“yes”和“no”,
默认为“no”。
表6-14 property 取值范围
property取值 说明
chinese_8k_common 支持采样率为8k的中文普通话语音识别。
chinese_16k_common 支持采样率为16k的中文普通话语音识别。
property取值 说明
sichuan_16k_common 支持采样率为16k的中文普通话与四川话方言 语音识别。区域仅支持cn-north-4。
cantonese_16k_common 支持采样率为16k的粤语方言语音识别。区域 仅支持cn-north-4。
shanghai_16k_common 支持采样率为16k的上海话方言语音识别。区 域仅支持cn-north-4。
表6-15 audio_format 取值范围 audio_format取值 说明
pcm16k16bit 16k16bit单通道录音数据。
pcm8k16bit 8k16bit单通道录音数据。
ulaw16k8bit 16k8bit ulaw单通道录音数据。
ulaw8k8bit 8k8bit ulaw单通道录音数据。
alaw16k8bit 16k8bit alaw单通道录音数据。
alaw8k8bit 8k8bit alaw单通道录音数据。
说明
目前仅支持裸音频格式,仅支持pcm编码的wav格式,不支其他wav头或者arm格式的编 码。
● 示例
{ "command": "START", "config":
{ "audio_format": "pcm8k16bit", "property": "chinese_8k_common", "add_punc": "yes",
"interim_results": "yes", "need_word_info": "yes"
}}
● 状态码
状态码请参见状态码。
● 错误码
错误码请参见错误码。
发送音频数据
在收到“开始识别”的响应之后,可以开始发送音频数据。为节省流量,音频以二进 制数据帧形式(binary message)的方式发送。
音频数据将分片发送,也即在获得一定量音频数据的同时就可以发送一个binary message,每个分片建议在50ms~1000ms之间,建议在需要实时反馈的情况下 100ms,不需要实时反馈的情况下500ms。
结束识别
● 功能介绍
对于识别中的对话,需要在Websocket上发送“结束识别”的请求来取消或结束 识别。 "结束识别"请求使用文本类型的数据帧(text message)发送,命令和参数 以json字符串的形式提供。
● 请求消息
表6-16 参数说明
参数名 是否必
选
参数类型 说明
command 是 String 设置为END,表示结束识别请求。
● 示例
{ "command": "END"
}
● 状态码
状态码请参见状态码。
● 错误码
错误码请参见错误码。
响应结果
● 开始识别响应
由于WebSocket是全双工的,因此响应就是从服务器端发送给客户端的消息,但 也并不是所有的请求信息都有一条对应的响应。服务器端收到“开始识别”请求 时,会给出如下响应消息,以json字符串形式放置在text message中。
表6-17 响应参数
参数名 参数类型 说明
resp_type String 参数值为START,表示开始识别响应。
trace_id String 服务内部的令牌,可用于在日志中追溯 具体流程。
示例
{ "resp_type": "START",
"trace_id": "567e8537-a89c-13c3-a882-826321939651"
}
● 事件响应
服务器端检测到某些事件时,会给出如下响应消息,以json字符串形式放置在text message中。
表6-18 响应参数
参数名 参数类型 说明
resp_type String 参数值为EVENT,表示开始识别响应。
trace_id String 服务内部的令牌,可用于在日志中追溯 具体流程。
event String 具体的事件,一句话识别中仅会出现
"EXCEEDED_AUDIO”,当输入音频超过 1min时,会返回该事件。
timestamp Integer 保留字段。将来会用于此事件发生的具 体时间,以会话开始作为0点,单位为 ms。
示例
{ "resp_type": "EVENT",
"trace_id": "567e8537-a89c-13c3-a882-826321939651", "event": "EXCEEDED_AUDIO",
"timestamp": 1500 }
● 结果响应
服务端在收到客户端发送的连续音频数据后, 当服务端识别出结果后会实时向客 户端按句推送识别结果响应消息, 以json字符串形式放置在text message中。
表6-19 响应参数
参数名 参数类型 说明
resp_type String 参数值为RESULT,表示识别结果响应。
trace_id String 服务内部的令牌,可用于在日志中追溯具体 流程。
segments Array of
objects 多句结果。
请参考表 segment 数据结构。
表6-20 segment 数据结构
参数名 参数类型 说明
start_time Integer 一句的起始时间戳,单位为 ms。
参数名 参数类型 说明
end_time Integer 一句的结束时间戳,单位为 ms。
is_final Boolen true表示是最终结果, false表 示为中间临时结果。
result Object 调用成功表示识别结果,调用失
败时无此字段。
请参考表 result数据结构。
表6-21 result 数据结构
参数名 参数类型 说明
text String 识别结果。
score Float 识别结果的置信度,取值范围:0~1。此 值仅会在最终结果时被赋值,在中间结果 时统一置为“0.0”。
说明
目前置信度作用不是太大,请勿过多依赖此 值。
word_info Array of
Object 分词输出列表。
表6-22 word_info 数据结构
参数名 是否必
选
参数类型 说明
start_time 否 Integer 起始时间 end_time 否 Integer 结束时间
word 否 String 分词
示例
{ "resp_type": "RESULT",
"trace_id": "567e8537-a89c-13c3-a882-826321939651", "segments":
[ {
"word_info": [
resp_type String 参数值为ERROR,表示错误响应。
trace_id String 服务内部的跟踪令牌,可用于在日志中 追溯具体流程。
在某些错误情况下,可能没有此字段。
error_code String 错误码列表。详细错误码解释,请参见
错误码。
error_msg String 返回错误信息。
示例
{ "resp_type": "ERROR",
"trace_id": "567e8537-a89c-13c3-a882-826321939651", "error_code": "SIS.0002",
"error_msg": "***"
}
● 结束识别响应
服务器端收到“结束识别”请求时或语音识别过程中发生错误,服务端会向客户 端推送如下响应消息,以json字符串形式放置在text message中。
表6-24 响应参数
参数名 参数类型 说明
resp_type String 参数值为END,表示结束识别响应。
trace_id String 服务内部的令牌,可用于在日志中追溯 具体流程。
reason String 结束原因,详情请参见表 结束原因表。
表6-25 结束原因表
参数名 说明
NORMAL 正常结束。
ERROR 识别过程中发生错误。
示例
{ "resp_type": "END",
"trace_id": "567e8537-a89c-13c3-a882-826321939651", "reason": "NORMAL",
}
代码示例
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;
/** * 此demo仅供测试使用,强烈建议使用SDK
* 使用前需已配置okhttp、okio jar包。jar包可通过下载SDK获取。
*/public class SasrWebsocketDemo { public void sasrWebsocketDemo() { try {
// endpoint和projectId需要替换成实际信息。
String url = "wss://{{endpoint}}/v1/{{project_id}}/asr/short-audio";
String token = "对应region的token";
byte[] data = null; // 存放将要发送音频的byte数组 OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).header("X-Auth-Token", token).build();
WebSocket webSocket = okHttpClient.newWebSocket(request, new MyListener());
webSocket.send("{\"command\": \"START\", \"config\": {\"audio_format\": \"pcm8k16bit\", \"property\":
\"chinese_8k_common\"}}");
webSocket.send(ByteString.of(data)); // audio太大注意要分片发送,否则会报错。建议分片大小3200 webSocket.send("{ \"command\": \"END\"}");
Thread.sleep(10000);
webSocket.close(1000, null);
} catch (Exception e) { e.printStackTrace();
}
}
class MyListener extends WebSocketListener { @Override
public void onOpen(WebSocket webSocket, Response response) { System.out.println("conneected");
}
@Override
public void onClosed(WebSocket webSocket, int code, String reason) { System.out.println("closed");
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) { t.printStackTrace();
}
@Override
public void onMessage(WebSocket webSocket, String text) { System.out.println(text);
} }
public static void main(String[] args) {
SasrWebsocketDemo sasrWebsocketDemo = new SasrWebsocketDemo();
sasrWebsocketDemo.sasrWebsocketDemo();
}}