||
简单的语音交互(5)-- 讯飞语音关键字提取
前面介绍到讯飞的语音识别,可以连续转换,这在讯飞的定义中这叫做语音听写,讯飞定义的语音识别实际上像是语音关键词提取,前面介绍了百度语义唤醒,可以持续检测简单的词令,连续不断的讯飞语音识别其实也就相当于唤醒功能了,而且使用方便。
有了前面的讯飞编程基础,接下来就好办了,首先在讯飞语音官网给需要程序添加语音识别功能。可以参考两个官方demo中的AsrDemo,也可以参考官方文档:http://www.xfyun.cn/doccenter/awd 的4语音识别部分。
讯飞的语音识别和语音听写只能够同一时间运行一个,不过很多代码却是重复的。主要步骤:
1.
ANBF语法编写词令,本例程使用是:
#ABNF 1.0 UTF-8;
language zh-CN;
mode voice;
root $main;
$main = $place1;
$place1 = 开灯|关灯;
然后将文本保存为:grammar_sample.abnf,然后在\src\main中新建assets文件夹将其放入。
2. 初始化:
public void setParamAsr(){ int ret; mIat.setParameter(SpeechConstant.PARAMS, null); mIat.setParameter(SpeechConstant.VAD_BOS, mSharedPreferences.getString("iat_vadbos_preference", "10000")); mIat.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8"); ret = mIat.buildGrammar("abnf", mCloudGrammar , mCloudGrammarListener); if (ret != ErrorCode.SUCCESS){ Log.d(TAG,"语法构建失败,错误码:" + ret); }else{ Log.d(TAG,"语法构建成功"); } //3.开始识别,设置引擎类型为云端 mIat.setParameter(SpeechConstant.ENGINE_TYPE, "cloud"); //设置grammarId String grammarId = mSharedPreferences.getString(KEY_GRAMMAR_ABNF_ID, null); mIat.setParameter(SpeechConstant.CLOUD_GRAMMAR, grammarId); }
3.
构建语法监听器
private GrammarListener grammarListener = new GrammarListener() {
@Override
public void onBuildFinish(String grammarId, SpeechError error) {
if(error == null){
if(!TextUtils.isEmpty(grammarId)){
//构建语法成功,请保存grammarId用于识别
}else{
Log.d(TAG,"语法构建失败,错误码:" + error.getErrorCode());
}
}};
4. 在监听器的onResult中显示
String text ; text = JsonParser.parseGrammarResult(results.getResultString()); mResultText.append(text);
mResultText.append("\n");
mResultText.setSelection(mResultText.length());
5. 开启连续转换功能,在监听器的onError和onResult中添加:
if (mIsRecognizer) { mIat.startListening(mRecognizerListener); }
弄一个witch进行功能切换,需要先切换功能,然后在点击开始按钮或者开启连续转换。
下面是语音听写的效果图:
下面是语音识别的效果图:
源码:https://github.com/flyloong/XF_Voice/tree/V0.02
APK文件:app-debug.apk