长语音识别Android SDK
下载安装
SDK及示例demo下载地址: https://github.com/data-baker/BakerAndroidSdks
Android Studio集成SDK(参考demo)
-
将以下3个aar包添加至工程主module下,lib文件夹里。
bakerlongtimeasr-release.aar basecomponent-release.aar bakerhttp-release.aar
- 在主module的build.gradle文件里,添加以下代码。
dependencies { implementation fileTree(dir: 'libs', include: ['*.aar']) implementation 'com.squareup.okhttp3:okhttp:4.2.2' implementation 'com.google.code.gson:gson:2.8.6' }
2021年6月,标贝计划开源sdk源码,所以也可以直接集成源码model。
注意:SDK内使用了okhttp、gson所以需要开发者添加以这两个库,若工程内已存在,无需重复添加。okhttp请使用4.x版本,以免出现版本兼容bug。
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
android:usesCleartextTraffic="true"
关于混淆
DK中用到了okhttp和gson,所以需要将这两个包的混淆代码添加上。具体混淆代码可以去官方文档上查阅。如果项目中已经有这两个包的混淆代码,不必重复添加。请加上我们SDK其他类的混淆代码,如下:
-keep class com.baker.sdk.longtime.asr.bean.** { *; } -keep public class com.baker.sdk.longtime.asr.LongTimeAsr{*;} -keep public class com.baker.sdk.longtime.asr.listener.LongTimeAsrCallBack{*;} -keep public class com.baker.sdk.longtime.asr.base.BakerLongTimeAsrConstants{*;} -keep class com.baker.sdk.http.**{*;} -keep class com.baker.sdk.basecomponent.**{*;}
SDK关键类
- LongTimeAsr:长语音识别关键业务处理类,全局只需一个实例即可。
- LongTimeAsrCallBack:实时识别结果源数据回调类。您可以在这些个回调方法中获取到当前识别的各类结果和状态,或者错误信息。注意回调方法是运行在子线程的。初始化SDK时 请将此callback提交给LongTimeAsr实例。
调用说明
-
实例化LongTimeAsr类,得到LongTimeAsr的实例。
LongTimeAsr longTimeAsr = new LongTimeAsr();
-
初始化SDK
如果是调用我们公有云公共识别接口,请采用以下示例代码初始化LongTimeAsr类,传入由我们授权邮件里面给到的账户相关的clientId和clientSecret。
longTimeAsr.initSdk(context, clientId, clientSecret, LongTimeAsrCallBack);
如果是私有化部署请采用以下示例代码初始化LongTimeAsr类。并注意需要在参数中设置私有化部署的识别服务器地址,仅私有化部署时需要设置该参数。
longTimeAsr.initSdk(context, LongTimeAsrCallBack); longTimeAsr.setUrl("ws://xxxx"); //设置私有化部署的识别服务器地址
-
长语音识别支持2种识别场景,第一种是SDK内调用手机麦克风录音、上传完成识别返回识别结果。此种方式需要接入方提前获取应用的录音权限。第二种场景是接收字节流,SDK收到数据后,上传服务器完成识别,返回识别结果。
第一种场景:
- 需要应用取得录音权限。
- 通过LongTimeAsr实例,设置各类参数。
- longTimeAsr.startAsr(); 开启识别。
- 在LongTimeAsrCallBack回调中接收状态、识别结果,或错误信息等。
- 通过longTimeAsr.stopAsr(); 此方法结束识别。
第二种场景:
- 通过LongTimeAsr实例,设置各类参数。
- longTimeAsr.start(); 通知SDK准备识别。
- 在LongTimeAsrCallBack的onReady() 回调方法中得到SDK已准备好后。
- 多次调用longTimeAsr.send(byte[] data);方法向SDK输入待识别语音字节 流。此方法单次接收固定长度(5120)字节数组。最后一片数据可以是 其他长度字节数组。
- 在LongTimeAsrCallBack回调中接收状态、识别结果,或错误信息等。
- longTimeAsr.end();结束识别。
- 此种方式,每次在调用longTimeAsr.send(byte[] data)时,前后2次间隔时 间不能超过60秒,私有化部署根据服务器设定具体时间为准。
- 在确定不再使用识别后,调用longTimeAsr.release()释放SDK资源。
- 如果需要发起新的识别请求,可以重复第3步。
- 长语音识别限制时长不超过3小时。
参数说明
参数 | 参数名称 | 是否必填 | 说明 |
---|---|---|---|
initSdk | 初始化SDK | 是 | 必须调用此方法初始化SDK,祥见3.2 |
setUrl | 识别服务器地址 | 否 | 仅私有化部署,需要设置服务器URL。 |
setSampleRate | 设置语音录音采样率 | 否 | 采样率支持16000/8000,默认16000。 |
setAddPct | 设置是否返回标点 | 否 | 是否在短静音处添加标点,默认true |
setDomain | 模型名称 | 否 | 模型名称,必须填写公司购买的语言模型,默认为common |
setAudioFormat | 音频编码格式 | 否 | 输入字节流方式识别时,支持设置音频编码格式pcm或wav |
setHotwordid | 热词组的id | 否 | 配置的热词组的id |
setDiylmid | 个性化模型的id | 否 | asr个性化模型的id |
LongTimeAsrCallBack回调类方法说明
参数 | 参数名称 | 说明 |
---|---|---|
onReady() | 准备就绪 | 授权验证通过,且与服务器连接成功,准备就绪回调 |
onRecording(LongTimeAsrResponse response) | 实时识别持续返回数据的接口回调 | 当识别有效,且识别到内容后,会唤起此回调方法,多次回调。回调内容是当前句的实时识别内容,回调中的字符串结果会持续变化至最新校正后的结果。祥见下表LongTimeAsrResponse参数说明。 |
onRecording(String result, boolean sentenceEnd, boolean endFlag) | 实时识别持续返回数据的接口回调 | 当识别有效,且识别到内容后,会唤起此回调方法,多次回调。回调内容是当前句的实时识别内容,回调中的字符串结果会持续变化至最新校正后的结果。第一个布尔值sentenceEnd代表当前句识别是否结束,为true时代表当前句识别最终结果,下一次回调是下一句的识别内容。第二个布尔值endFlag为true时代表识别全部结束。注意:需要开发者根据此回调逐句追加显示或处理识别结果。 |
onVolume(int volume) | 音量分贝回调 | 对识别数据进行音量分贝计算后的回调,数值范围0-100 |
onError(String code, String errorMessage) | 识别出现错误 | String code是错误码,错误码具体请参考以下错误码对照表。String message是具体的错误信息日志。识别过程中出现各种错误情况都会回调此方法。一旦出现错误,此次识别任务中断。 |
LongTimeAsrResponse参数说明
参数 | 类型 | 描述 |
---|---|---|
code | int |
错误码 4xxxx表示客户端参数错误 5xxxx表示服务端内部错误 |
message | string | 错误描述 |
trace_id | string | 任务id |
asr_text | string |
识别结果 code为9000时包含有效数据 |
sentence_id | int | 句子id,从1递增 |
sentence_end | string |
句子结束标志 false:当前句子识别未结束,后续还有识别内容 true:当前句子识别已结束,后续识别内容为下一句的识别结果 |
end_flag | int | 是否是最后一个数据块,0:否,1:是 |
sos | string | 句子起始时间(只有在sentence_end为“true"时存在 |
eos | string | 句子结束时间(只有在sentence_end为“true"时存在) |
confidence | string | 整句置信度[0-100] |
speed | int | 语速,取值[0-2000] |
speed_label | string |
语速标签: 15以下:FAST 快 15-30 : MEDIUM 适中 30-2000:SLOW 慢 |
volume | int | 音量,取值[0-100] |
volume_label | string |
音量标签: SILENT:0-15 静音 XSOFT:15-30 音量很小 SOFT:30-50 音量小 MEDIUM:50-70 音量适中 LOAD:70-85 音量大 XLOUD:85-100 音量很大 |
words | array | 词级别识别结果 |
words内部结构说明
参数 | 类型 | 描述 |
---|---|---|
confidence | string | 词置信度,置信度取值[0-100] |
sos | string | 词在音频中的绝对开始时间点 单位:秒 |
eos | string | 词在音频中的绝对结束时间点 单位:秒 |
word | string | 词 |
响应结果示例
成功时:识别文本消息json结构如下: { "asr_text": "欢迎使用标贝科技开放平台。", "code": 90000, "confidence": "73.63", "end_flag": 1, "eos": "2.96", "message": "Success", "sentence_end": "true", "sentence_id": 1, "sos": "0.08", "speed": 23, "speed_label": "MEDIUM", "trace_id": "1652342025479837", "volume": 44, "volume_label": "SOFT", "words": [{ "confidence": "0.42", "eos": "0.51", "sos": "0.08", "word": "欢迎" }, { "confidence": "0.92", "eos": "1.05", "sos": "0.51", "word": "使用" }, { "confidence": "0.58", "eos": "1.52", "sos": "1.05", "word": "标贝" }, { "confidence": "1.00", "eos": "1.95", "sos": "1.52", "word": "科技" }, { "confidence": "0.50", "eos": "2.40", "sos": "1.95", "word": "开放" }, { "confidence": "1.00", "eos": "3.13", "sos": "2.40", "word": "平台" }] } 失败时:json示例: { "code":40001, "message":"Invalid json data", "trace_id":" 1572234229176271", "sid":"b311d1cd-f7a7-4378-9730-0c12d194231f",//可能不存在 }
错误码说明
错误码 | 含义 |
---|---|
14180001 | 缺少ClientId |
14180002 | 缺少Secret |
14180003 | token获取失败 |
14180004 | 没有录音权限 |
14180005 | 本地网络不可用 |
14180006 | 网络未准备好,没有调用start方法 |
14180007 | 录音尚未初始化 |
14180008 | 正在录音 |
14180009 | 发送的数据为空 |
14180010 | response is null |
14180011 | gson to object error |
14180012 | websocket发送消息出错 |
14180013 | websocket onFailure error |
14180014 | 录音意外中断 |
90000 | 文本数据 |
30001 | HTTP请求参数错误 |
30002 | 服务内部错误 |
30003 | 识别结果解析出错 |
30004 | 应用包名未知 |
30005 | 语音质量问题 |
30006 | 输入语音过长 |
30007 | 连接识别引擎失败 |
30008 | 会话id不存在 |
30009 | Rpc调用非法 |
30010 | redis rpop操作返回空 |
30011 | redis rpop值不合法 |
30012 | rpc调用识别引擎失败 |
30013 | Redis rpop操作失败 |
30014 | redis lpush操作失败 |
30015 | 单个语音分片过长 |
30016 | 回调url失败 |
40001 | json解析失败 |
40002 | json字段不全 |
40003 | 版本错误 |
40004 | json字段值类型错误 |
40005 | 参数错误 |
40006 | idx超时 |
40007 | idx顺序错误 |
40008 | token校验失败 |
40009 | token处于未激活状态 |
40010 | token已过期 |
40011 | 使用量已超过购买量 |
40012 | qps错误 |
40013 | 音频包长度错误 |
40014 | access_token与当前服务不匹配 |
40015 | 音频大小错误 |
40016 | 错误的音频格式 |
40017 | 错误的采样率 |
40018 | 错误的req_idx |
40019 | 错误的version |
40020 | 错误的access_token |
40021 | 错误的domain |
50001 | 处理超时 |
50002 | 内部 rpc 调用失败 |
50003 | 服务端繁忙 |
50004 | 其他内部错误 |