讯飞语音识别RecognizerDialog自定义view
·
集成语音识别的过程中,语音识别的那个RecognizerDialog下面有 “语音识别能力由讯飞输入法提供”看着很别扭, 想去掉或者完全使用自定义的View,研究了一波。
RecognizerDialog自定义view需要先看官方直接提供demo里的部分代码,选择是否显示对话框。
if (isShowDialog) {
// 显示听写对话框
mIatDialog.setListener(mRecognizerDialogListener);
mIatDialog.show();
showTip(getString(R.string.text_begin));
} else {
// 不显示听写对话框
ret = mIat.startListening(mRecognizerListener);
if (ret != ErrorCode.SUCCESS) {
showTip("听写失败,错误码:" + ret);
} else {
showTip(getString(R.string.text_begin));
}
}
1.isShowDialog为true
当isShowDialog为true时是直接使用官方的RecognizerDialog,但是我又不想看到对话框下边那一行字,研究许久,发现可以修改UI,获取字体所在的控件,设置为”“,隐藏字体,也可改写成自己想要的字体效果,重写字体的点击事件
隐藏字体:
mIatDialog.setListener(mRecognizerDialogListener);
mIatDialog.show();
showTip(getString(R.string.text_begin));
//获取字体所在的控件,设置为"",隐藏字体,
TextView txt = (TextView)mIatDialog.getWindow().getDecorView().findViewWithTag("textlink");
txt.setText("");
重写修改字体效果:
mIatDialog.setListener(mRecognizerDialogListener);
mIatDialog.show();
showTip(getString(R.string.text_begin));
// 也可改写成自己想要的字体效果,重写字体的点击事件
TextView txt = (TextView)mIatDialog.getWindow().getDecorView().findViewWithTag("textlink");
txt.setText("xxxxxxxxxx");
txt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//点击后想做的事件
}
});
2.isShowDialog为false
当isShowDialog为false时,完全抛开官方RecognizerDialog,自定义dialog,在听写监听器RecognizerListener中处理显示或隐藏自定义dialog逻辑。
/**
* 听写监听器。
*/
private RecognizerListener mRecognizerListener = new RecognizerListener() {
@Override
public void onBeginOfSpeech() {
// 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
showTip("开始说话");
//显示自定义的dialog
}
@Override
public void onError(SpeechError error) {
//隐藏自定义dialog
// Tips:
// 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
// 如果使用本地功能(语记)需要提示用户开启语记的录音权限。
if(mTranslateEnable && error.getErrorCode() == 14002) {
showTip( error.getPlainDescription(true)+"\n请确认是否已开通翻译功能" );
} else {
showTip(error.getPlainDescription(true));
}
}
@Override
public void onEndOfSpeech() {
//隐藏自定义dialog
// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
showTip("结束说话");
}
@Override
public void onResult(RecognizerResult results, boolean isLast) {
Log.d(TAG, results.getResultString());
if( mTranslateEnable ){
printTransResult( results );
}else{
printResult(results);
}
if (isLast) {
// TODO 最后的结果
}
}
@Override
public void onVolumeChanged(int volume, byte[] data) {
showTip("当前正在说话,音量大小:" + volume);
Log.d(TAG, "返回音频数据:"+data.length);
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
// 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
// 若使用本地能力,会话id为null
// if (SpeechEvent.EVENT_SESSION_ID == eventType) {
// String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
// Log.d(TAG, "session id =" + sid);
// }
}
};
值得一提的是,onVolumeChanged方法中会一直回调声音音量的大小,有业务需求的可以在这个方法里处理自己的逻辑。
@Override
public void onVolumeChanged(int volume, byte[] data) {
showTip("当前正在说话,音量大小:" + volume);
Log.d(TAG, "返回音频数据:"+data.length);
}
更多推荐



所有评论(0)