最近要做与机器的对话app,包括命中词,唤醒啥的,持续监听语音输入,做语义解析,播报解析结果,但科大讯飞只提供单次的点击式语音监听解析,所以需要手动实现,解放双手,话不多说,开干!!!
1、首先在科大官网去申请秘钥,然后在控制台找到创建的应用,点击下载demo 集成
2、集成完毕看两个回调函数:
private RecognizerListener mRecognizerListener = new RecognizerListener() {
@Override
public void onBeginOfSpeech() {
}
@Override
public void onError(SpeechError error) {
Log.d(TAG, "======onError=======" + error.getErrorCode());
// Tips:
// 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
// if (mTranslateEnable && error.getErrorCode() == 14002) {
// showTip(error.getPlainDescription(true) + "\n请确认是否已开通翻译功能");
// } else {
// if (error.getErrorCode() == 20006) {
// LogUtil.d("xiaopeng", "捕获到开启录音失败的bug");
// }
// showTip(error.getPlainDescription(true));
// }
}
@Override
public void onEndOfSpeech() {
// 这里是 讯飞 自己停止之后的回调
// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理 我这里设置的3秒
// mIat.setParameter(SpeechConstant.VAD_BOS, SpUtils.getInstance().getString(SpUtils.iatVadbos, "3000"));
IatStart(); // 这里实现自己断掉之后再开启监听
}
@Override
public void onResult(RecognizerResult results, boolean isLast) {
if (results != null) {
// 这里是你断断续续的语音输入,是不连续的语音输入
}
if(isLast){
// 此处是 手动点击识别语音完毕之后的回调,这里会将你断断续续的说话拼接成一个完成句子;
// 就是你从 Down 事件,到Up事件 所说的一条句子
}
}
@Override
public void onVolumeChanged(int volume, byte[] data) {
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
}
};
说明:要实现持续监听做到2点:
1、 在讯飞自己检测到停止的回调中再次开启;
@Override
public void onEndOfSpeech() {
// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
IatStart();
}
2、在语音解析回来的回调中,先 IatStop() 停止监听,送后端做语义解析,解析完成之后再手动开启 IatStart()
@Override
public void onResult(RecognizerResult results, boolean isLast) {
if (results != null) {
// 这里是你断断续续的语音输入,是不连续的语音输入
}
if(isLast){
// 此处是 手动点击识别语音完毕之后的回调,这里会将你断断续续的说话拼接成一个完成句子;
// 就是你从 Down 事件,到Up事件 所说的一条句子
}
}
这样就能持续的监听了,就不需要手动识别语音了!附上 start 和 stop 的方法!
/**
* 开始录音监听
*
* @return
*/
public void IatStart() {
mIatResults.clear();
int ret = mIat.startListening(mRecognizerListener);
if (ret != ErrorCode.SUCCESS) {
showTip("听写错误,错误码:" + ret);
}
}
/**
* 停止录音监听
*/
public void IatStop() {
mIat.stopListening();
}