要做到语音识别,大概可以分为四步:
初始化–>设置参数–>开始识别–>解析
1.首先我们要去官网注册一个讯飞登录账号,,在用户菜单栏里就有创建我的应用.这里的登陆也可以采用第三方的方式.在创建应用的界面填写相关的信息即可.然后就会有一个SDK下载的链接.如果没有,直接去SDK下载中心按照三步选项去进行新的下载即可.这里不做过多的描述;
传送门 讯飞安卓SDK用户指南
2.然后将下载下来的SDK,打开libs文件夹,里面有很多文件,这里我们暂时只需要armeabi文件夹和Msc.jar包拷贝到工程的libs下。
这里需要注意的是,如果使用的开发工具为Android Studio需要打开app下面的build.gradle在android节点下复制上以下代码。
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
- 接下来就是代码部分了,在所有操作之前都要设置APPID,即你在讯飞官网上创建的应用的ID,用于登录。这句话必须放在oncreate方法里
SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID + "=12345678");
4.起初我看了网上很多别人的demo源码,发现看不懂,然后我就参照讯飞官方的demo。我们这里只实现听写的功能,只需要参照一下TatDemo里的代码。我们直接在讯飞的demo上找到那个语音听写的button,再在代码里
找到此按钮的监听事件。我们这里做一个无界面识别的(就是点击识别button不会弹出听写界面),所以有Dialog的代码全部不考虑。然后其实就是挨片的赋值筛选代码了。。。。
5.声明并且初始化识别对象
// 初始化识别无UI识别对象
// 使用SpeechRecognizer对象,可根据回调消息自定义界面;
mIat = SpeechRecognizer.createRecognizer(getApplicationContext(), mInitListener);
6.初始化完成后,设置参数在setParam()函数里,官方说是只需要三个参数就可以分别是Domain识别领域设置为iat,Lanage国家语言zh_cn表示中文 ,Accent语言区域mandarin表示普通话
这里我不管直接从他的代码里扒
public void setParam() {
// 清空参数
mIat.setParameter(SpeechConstant.PARAMS, null);
// 设置听写引擎
mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
// 设置返回结果格式
mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
// 设置语言
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
// 设置语言区域
mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
mIat.setParameter(SpeechConstant.ASR_PTT, "1");
// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
// 注:AUDIO_FORMAT参数语记需要更新版本才能生效
mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/iat.wav");
}
7.然后就是开始识别了
int ret = mIat.startListening(mRecognizerListener);
8.在开始识别的时候我们可以看到,后面带了一个recognizerlistener的回调函数,我们再把回调函数的代码扒出来
private RecognizerListener mRecognizerListener = new RecognizerListener() {
@Override
public void onBeginOfSpeech() {
// 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
Toast.makeText(MainActivity.this, "开始说话", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(SpeechError error) {
// Tips:
// 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
// 如果使用本地功能(语记)需要提示用户开启语记的录音权限。
Toast.makeText(MainActivity.this, "" + error.getPlainDescription(true), Toast.LENGTH_SHORT).show();
}
@Override
public void onEndOfSpeech() {
// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
Toast.makeText(MainActivity.this, "结束说话", Toast.LENGTH_SHORT).show();
}
@Override
public void onResult(RecognizerResult results, boolean isLast) {
printResult(results);
if (isLast) {
// TODO 最后的结果
}
}
@Override
public void onVolumeChanged(int volume, byte[] data) {
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
}
};
这里的onBeginOfSpeech就是开始录音的时候会回调,
onEndOfSpeech结束录音会回调,onResult在一次录音中会回调很多次,onVolumeChanged是返回音量,onError是返回的错误码
9.把讯飞的JsonParser类拷贝过来,如果里面有用不到的方法直接删了
10.写一个打印结果的方法,这里我用的一个textview
private void printResult(RecognizerResult results) {
String text = JsonParser.parseIatResult(results.getResultString());
String sn = null;
// 读取json结果中的sn字段
try {
JSONObject resultJson = new JSONObject(results.getResultString());
sn = resultJson.optString("sn");
} catch (JSONException e) {
e.printStackTrace();
}
mIatResults.put(sn, text);
StringBuffer resultBuffer = new StringBuffer();
for (String key : mIatResults.keySet()) {
resultBuffer.append(mIatResults.get(key));
}
textView.setText(resultBuffer.toString());
}
11.添加录音网络等权限,这个直接复制上面那个传送门里的就行
另附上源码下载链接AS工程。源码下载
OK,结束。