语音识别
语音识别ASR模块
ASR模块主要是语音转文字的过程,支持的交互场景包括单句识别和连续识别,支持的开启方式开启录音器和输入音频数据流。
功能描述
单句识别:识别引擎中的语音边界检测(VAD)结果为完整的一句话时,整个识别过程结束;
连续识别:开启之后会一直处于识别状态,直到外部调用停止才会结束;
录音器:可以直接调用SDK内部录音器录音识别;
音频数据流:可以输入音频数据流开启识别。
备注:所有场景中,ASR通道同一时间只能开启一个,包括语音聊天、ASR识别、绘本内的录音交互。
ASR参数说明
ASR请求参数
AsrRequestConfig为语音识别必要参数,包括输入的音频格式信息,静音检测的配置等参数,具体说明如下:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| asrSrcFormatEnum | {PCM, OPUS, OPU, SPEEX} | PCM | 当不使用内部录音器的时候该值为必填 |
| asrFormatEnum | {PCM, OPUS, OPU, SPEEX} | PCM | 上传至云端的音频格式,目前仅支持PCM、OPUS、SPEEX |
| asrLanguageEnum | {CHINESE, ENGLISH} | CHINESE | 识别语言类型 |
| asrRateEnum | {RATE_8000, RATE_16000} | RATE_16000 | 音频采样率 |
| channel | {CHANNEL_IN_MONO, CHANNEL_IN_STEREO} | CHANNEL_IN_MONO | CHANNEL_IN_MONO:单声道;CHANNEL_IN_STEREO:双声道;目前仅支持CHANNEL_IN_MONO |
| enableITN | boolean | true | 返回结果的数字格式规则为阿拉伯数字格式(默认true) |
| enablePunctuation | boolean | true | 是否开启标点 |
| enableVoiceDetection | boolean | true | 是否开启VAD |
| intermediateResult | boolean | true | 是否打开中间返回结果 |
| maxEndSilence | int | 2000 | VAD末端检测值,单位为毫秒 |
| maxStartSilence | int | 800 | VAD前端检测值,单位为毫秒 |
| enableVolume | boolean | false | 使用内部录音时候,是否返回声音变化 设置为true的时候TuringOSClientAsrListener接口的onVoiceVolume方法才会回调 |
备注: VAD为语音活动检测(Voice Activity Detectio)又称语音端点检测,语音边界检测。
AsrRequestConfig参数的配置示例:
AsrRequestConfig.Builder builder = new AsrRequestConfig.Builder();
builder.asrLanguageEnum(AsrRequestConfig.CHINESE);
builder.asrFormatEnum(AsrRequestConfig.PCM);
builder.asrSrcFormatEnum(AsrRequestConfig.PCM);
builder.asrRateEnum(AsrRequestConfig.RATE_16000);
builder.enablePunctuation(false);
builder.intermediateResult(true);
builder.maxEndSilence(3000);
/**
* 目前仅支持CHANNEL_IN_MONO
*/
builder.channel(AsrRequestConfig.CHANNEL_IN_MONO);
builder.enableVoiceDetection(false);
builder.enableVolume(true);
AsrRequestConfig asrRequestConfig = builder.build();
ASR识别结果
TuringOSClientAsrListener
该接口为ASR识别结果回调接口,具体如下:
public interface TuringOSClientAsrListener {
/**
* 当使用SDK录音器开启的识别,此方法会在录音开始后回调
* 一般用于UI显示开始录音,更新UI需要放到主线程,不能再此回调方法中更新
*/
void onRecorderStart();
/**
* asr识别停止,包括请求Error或者外部调用client.stopAsr都会回调
*/
void onStop();
/**
* 允许输入音频数据流,在该方法回调之后开始调用sendAudio
*/
void onStreamOpen();
/**
*
* 请求结果返回
*
* @param code 具体参考code说明
* @param result 返回的json字符串
* @param isLast Asr识别结果;last : 是否是最终结果
* @param baseResp 返回的json字符串转换的Java对象
*/
void onResult(int code, String result, boolean isLast, BaseResp baseResp);
/**
* Asr识别单论交互倒计时 最大值20s
* 单句语音识别场景下的倒计时限制,连续识别不受影响
*
* @param second
*/
void onTimer(int second);
/**
* 请求发生错误的信息
*
* @param code
* @param msg
*/
void onError(int code, String msg);
/**
* 使用内部录音时,返回声音音量变化,该方法的回调需要先设置参数enableVolume为true
*
*/
void onVoiceVolume(int i);
}
onStop特殊说明
- 表示此次识别结束,可以开启下一次识别;
- 单句识别场景中,当云端识别结果或者本地VAD(静音检测)判定为一句话完整识别后,该方法会在识别结果输出完成后回调,表示此次识别结束;
- 所有场景中,ASR通道同一时间只能开启一个,包括语音聊天、ASR识别、绘本内的录音交互;
- 所有场景中,外部调用stop或者release时,SDK内部数据处理完毕后会回调onStop,所以不要在onStop做太多操作。
其他说明
- onRecorderStart:只有当使用SDK内部录音器开启识别时,该方法才会回调;
-
onStreamOpen:只有当使用音频流数据输入开启识别时,该方法才会回调;
-
onTimer:该方法主要是针对单句语音识别场景下的倒计时限制,单句识别一般为聊天场景,每句话都有一个而明确的结束节点;
- onVoiceVolume:该方法回调需要先配置参数enableVolume为true,具体参数说明请参考AsrRequestConfig说明;
- onStop:表示此次识别结束,可以开启下一次识别;
- SDK中使用到ASR录音功能(语音识别、语音对话、口语评测)的所有模块都会使用该接口回调结果;
- 每一次开启Asr之后,不管是外部调用Stop还是内部识别完成,都会回调onStop方法,只有在onStop成功回调之后才正常开启下一次识别;
- BaseResp请参考ASR识别输出说明。
ASR识别调用
一、SDK录音识别
方法一:使用默认参数创建录音器
/**
*
* @param isLoop 是否循环录音识别
* @param listener TuringOSClientAsrListener
*/
public void startAsrWithRecorder(boolean isLoop, TuringOSClientAsrListener listener)
//调用
turingOSClient.startAsrWithRecorder(false, listener);
方法二:指定AsrRequestConfig参数,isLoop参数同上
/**
*
* @param isLoop 是否循环录音识别
* @param asrRequestConfig AsrRequestConfig
* @param listener TuringOSClientAsrListener
*/
public void startAsrWithRecorder(boolean isLoop, final AsrRequestConfig asrRequestConfig, final TuringOSClientAsrListener listener)
//调用
turingOSClient.startAsrWithRecorder(false, asrRequestConfig, listener);
参数说明
-
isLoop是区别单句语音识别和连续识别的标志。当isLoop=false时为单句识别,反之则为连续识别;
-
在使用内部录音器时,asrRequestConfig中的asrSrcFormatEnum只能为PCM,其次asrRequestConfig中的asrFormatEnum取值只能为PCM或者OPUS。asrFormatEnum值为PCM时,会将录音的PCM数据上传进行识别,当配置为OPUS时,则会经过SDK内部编码为OPUS再上传至云端识别;
-
当isLoop为true时,开启Vad时(enableVoiceDetection参数为true),触发Vad静音检测则结束本次录音;未开启Vad时,识别结果完整返回时(asrResponse中的state=200时,具体见ASR识别输出说明),结束本次识别。当isLoop为false时,ASR会一直处于识别状态,直到外部调用stopAsr方法。
二、音频流识别
方法说明
/**
*
* @param asrRequestConfig asrRequestConfig
* @param listener TuringOSClientAsrListener
*/
public void initAsrStream(final AsrRequestConfig asrRequestConfig, final TuringOSClientAsrListener listener)
/**
*
* @param isAutoStop 当isAutoStop为false时,和上面没有isAutoStop一样,当时设置isAutoStop为
* true时,输入的音频数据在识别到完整的结果后会自动丢弃剩余数据
* @param asrRequestConfig asrRequestConfig
* @param listener TuringOSClientAsrListener
*/
public void initAsrStream(boolean isAutoStop, final AsrRequestConfig asrRequestConfig, final TuringOSClientAsrListener listener)
/**
*
* @param dataBuffer 音频数据,长度不得大于1280个byte,并且要求为320的整数倍
* @param length 音频数据长度
*/
public void sendAudio(byte[] dataBuffer, int length)
参数说明
- isAutoStop主要时为了区别单句语音识别还是连续识别。当isAutoStop=true时为单句识别,反之则为连续识别。
调用示例
//第一步:参数配置
AsrRequestConfig.Builder builder = new AsrRequestConfig.Builder();
builder.asrLanguageEnum(AsrRequestConfig.CHINESE);
//必须参数,代表最终上传服务器请求的格式参数,必须与传入可支持的格式对应
builder.asrFormatEnum(AsrRequestConfig.OPUS);
//必须参数,代表输入音频源的格式
builder.asrSrcFormatEnum(AsrRequestConfig.OPUS);
builder.asrRateEnum(AsrRequestConfig.RATE_16000);
builder.enablePunctuation(false);
builder.maxEndSilence(3000);
builder.channel(AsrRequestConfig.CHANNEL_IN_MONO);
AsrRequestConfig asrRequestConfig = builder.build();
turingOSClient = TuringOSClient.getInstance(this, userData);
//第二步:初始化
/**
*
* @param asrRequestConfig AsrRequestConfig
* @param listener TuringOSClientAsrListener
*/
turingOSClient.initAsrStream(asrRequestConfig, new TuringOSClientAsrListener() {
@Override
public void onRecorderStart() {
}
@Override
public void onStop() {
//stop后停止本轮的音频数据发送
}
@Override
public void onStreamOpen() {
//第二步:再数据流回调方法中开始输入数据
startStreamPcmInput();
}
@Override
public void onResult(int code, String result, boolean isLast,BaseResp baseResp) {
//识别结果
}
@Override
public void onTimer(int second) {
}
@Override
public void onError(int code, String msg) {
}
});
//注意事项:在音频流关闭之后调用turingOSClient.stopAsr();
private void startStreamPcmInput() {
new Thread(pcmRun).start();
}
//注意事项:在音频流关闭之后调用turingOSClient.stopAsr();
private Runnable pcmRun = new Runnable() {
@Override
public void run() {
try {
InputStream inputStream = getAssets().open("sample.pcm");
while (!Thread.currentThread().isInterrupted()){
byte[] buffer = new byte[320];
int length = inputStream.read(buffer);
if (length == -1) {
turingOSClient.stopAsr();
break;
}
if (length == 320) {
turingOSClient.sendAudio(buffer, length);
} else {
turingOSClient.sendAudio(Arrays.copyOf(buffer, length), length);
}
}
inputStream.close();
Log.i(TAG, "testFile: 流输入完成");
} catch (Exception e) {
e.printStackTrace();
}
}
};
音频流识别说明
-
在调用流输入方式时,asrFormatEnum和asrSrcFormatEnum为必须参数;
-
当asrSrcFormatEnum为PCM,即将要输入的音频数据源为PCM时,对应的asrFormatEnum的可能值只能为PCM或者OPUS,同内部录音器,SDK内部默认支持OPUS编码;
-
当asrSrcFormatEnum为其他值时,对应的asrFormatEnum必须与asrSrcFormatEnum相同。
ASR识别输出
返回的结果在TuringOSClientAsrListener的onResult方法中,其中String result为json字符串,BaseResp baseResp为result转换为json后的java对象。
json示例如下:
{
"asrResponse":{
"binarysId":"0a2071a8-2bb6-4fae-b109-32bee00c1726",
"state":200,
"value":"深圳明天的天气"
},
"code":200,
"globalId":"98412368730000000",
"message":"success"
}
BaseResp说明
| 参数 | 类型 | 说明 |
|---|---|---|
| code | int | 请求响应Code,具体可参考Code说明 |
| message | String | 请求响应的消息描述 |
| asrResponse | AsrResponse(Object) |
- 当code=200表示识别成功;
- 当code=5002时表示没有任何有效人声输入;
- 其他code表示识别异常,参考Code说明。
AsrResponse参数说明
| 参数 | 类型 | 是否必须 | 取值范围 | 说明 |
|---|---|---|---|---|
| binarysId | String | Y | - | asr二进制参数Id |
| value | String | Y | - | asr识别内容 |
| state | int | Y | 200,210 | 210:asr识别中间结果返回,200:asr识别完成结果 |
-
AsrRequestConfig的参数intermediateResult设置为true之后,语音识别会实时返回识别结果;
-
state=210表示此次返回的识别结果为中间结果,此时onResult方法中的isLast为fasle;
-
state=200表示此次返回的识别结果为最终结果,此时onResult方法中的isLast为true。
安全停止ASR
该方法会完整发送完音频数据,得到完整的识别结果后释放Asr通道,会有一定的延时,释放成功后会回调onStop方法。
/**
*方法说明
*该方法会将音频数据池中的数据发送完毕后正常结束Asr引擎
*
*/
public void stopAsr()
//调用示例
turingOSClient.stopAsr();
- 该方法针对所有的asr通道生效。
释放ASR
该方法会丢弃正在识别的数据以及结果,直接释放Asr通道,释放成功之后会回调onStop方法。
/**
*该方法会强制停止释放Asr引擎
*
*/
public void releaseAsr()
//调用示例
turingOSClient.releaseAsr();
- 该方法针对所有的asr通道生效,包括ASR识别、语音对话录音方式、绘本内录音交互、口语评测录音等模块。