导语
自从上次看了锤子M1发布会之后,一直对发布会上大放光彩的讯飞语音识别很感兴趣,最近正好有时间,便做了一个小Demo与大家分享一下。
效果演示
下载SDK
我们的Demo开发需要借助讯飞开放平台提供的SDK,所以第一步我们需要先下载SDK
首先我们需要先创建一个应用
应用创建完成后,我们再次来到SDK下载页面,选择相应的服务
选中刚才创建的应用(该应用会和下载的SDK进行绑定)
导入SDK
将下载的SDK文件解压
将 libs 里面的jar文件和so库文件拷贝到项目的 libs 目录
选中两个jar文件右键选择“Add As Libary”,将jar文件添加到库
接下来就是导入assets目录里面的资源文件,Android Studio默认并没有创建该目录,所以我们需要自己手动创建,在项目的app目录上面右键 New/Folder/Assets Folder
最后,我们打开Module的 build.gradle 文件在 android 标签下添加如下代码,指定so库的位置
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
添加用户权限
在工程AndroidManifest.xml 文件中添加如下权限
初始化
进入我的应用,复制自己的id
初始化即创建语音配置对象,只有初始化后才可以使用MSC 的各项服务。建议将初始化放在程序入口处(如Application、Activity 的 onCreate 方法),初始化代码如下:
//将“12345678”替换成您申请的APPID
SpeechUtility.createUtility(this,SpeechConstant.APPID+"=12345678");
按钮监听
//按钮监听
public void startListener(View view){
//1.创建RecognizerDialog对象
RecognizerDialog mDialog = new RecognizerDialog(this,null);
//2.设置accent、language等参数
mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
// 3.设置回调接口
mDialog.setListener(new RecognizerDialogListener() {
//识别结果的回调接口,会进行多次回调
//当isLast为true时,识别结束
@Override
public void onResult(RecognizerResult result, boolean isLast) {
//System.out.println("识别结果:"+result);
mBuffer.append(parseDatd(result.getResultString()));
if (isLast){
editText.setText(mBuffer.toString());
}
}
@Override
public void onError(SpeechError speechError) {
}
});
//4.显示dialog,接收语音输入
mDialog.show();
}
解析数据
由于识别结果返回的是json格式的数据,我们并不能直接使用,此时需要将json转换为普通的String数据
我们可以借助一个开源的类库 GSON 添加方法如下:
按快捷键Ctrl + Shift + Alt + S
打开 项目结构 对话框,切换到 依赖 选项卡,点击右上角“+”号,搜索 gson ,如下图:
或者直接在项目的 build.gradle 文件的 dependencies 标签下,添加如下代码:
compile 'com.google.code.gson:gson:2.8.0'
解析json数据时,我们需要创建一个Bean类,可以借助Android Studio的一个插件 GsonFormat 帮我们快速生成,安装步骤如下:
按快捷键Ctrl + Alt + S
打开 Settings 对话框,选择 Plugins
1.编写Bean类
我们可以先运行程序进行测试,将结果打印出来
新建一个VoiceBean类,在该类的编辑界面 按Alt + S
快捷键,打开GsonFormat插件,复制刚才打印的json数据
从打印出的json中发现,我们只需要 “w” 对应的数据
点击 OK 即可创建完成
2.解析代码
//解析数据
private String parseDatd(String json) {
//创建Gson对象
Gson gson = new Gson();
VoiceBean voiceBean = gson.fromJson(json,VoiceBean.class);
StringBuffer sb = new StringBuffer();
List ws = voiceBean.getWs();
for (VoiceBean.WsBean wsBean : ws){
String word = wsBean.getCw().get(0).getW();
sb.append(word);
}
return sb.toString();
}