前言
最近需要对接语音识别业务,毕竟现在是AI时代,一个产品如果能通过AI能力给用户带来全新的体验,也是很值得尝试的。技术对接上选择的是科大讯飞开放平台,也算是国内最早一批做语音识别的企业了,文档方面都比较全面,对接起来也很方便。
技术基础
开发技术栈为Cordova
+Angular
+Ionic
,这篇分享会介绍如何从头开始创建Cordova插件,并实现科大讯飞Android sdk与App端的数据交互。
Apache Cordova
是一个开源的移动开发框架。允许你用标准的web技术——HTML5,CSS3和JavaScript做跨平台开发。 应用在每个平台的具体执行被封装了起来,并依靠符合标准的API绑定去访问每个设备的功能,比如说:传感器、数据、网络状态等。
在继续阅读之前,应该确保你有通过Cordova
创建并打包一个简单Hybrid App
的经验,感兴趣的童鞋可以到Ionic官网和Cordova官网学习下。
创建Cordova插件
全局安装plugman
plugman
用于创建Cordova插件,在项目目录下执行cnpm i -g plugman
创建插件
创建一个插件并添加android平台,并生成package.json,插件名xFeiVoice
,插件idcom.qinsilk.xFeiVoice
,版本号为0.01
1
2
3
4plugman create --name xFeiVoice --plugin_id com.qinsilk.xFeiVoice --plugin_version 0.0.1
cd xFeiVoice
plugman createpackagejson ./
plugman platform add --platform_name android
创建成功可以看到对应目录如下
- src目录存放原生代码,此处为java文件
- www目录存放js暴露给设备的接口,如下
1
2
3
4
5var exec = require('cordova/exec');
exports.coolMethod = function (arg0, success, error) {
exec(success, error, 'xFeiVoice', 'coolMethod', [arg0]);
};
此时我们做下修改,让参数名跟业务命名更加相关。1
2
3
4
5var exec = require('cordova/exec');
exports.record = function (arg0, success, error) {
exec(success, error, 'xFeiVoice', 'record', [arg0]);
};
安装插件
执行cordova plugin add xFeiVoice
,再执行cordova plugin ls
可以查看当前App安装的插件。
此时用Android Studio打开项目,可以看到这个插件已经添加成功。
到这里我们的准备工作就完成了。
对接语音识别
导入sdk
Android sdk可以去科大讯飞开放平台下载。将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。如下图所示:
添加权限
在工程 AndroidManifest.xml 文件中添加如下权限:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25<!--连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!--读取手机信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!--外存储写权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
<!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />
初始化语音识别对象
此处调用的是60秒语音听写功能。excute
是在开发插件时,用户的自定义方法,当页面调用插件时系统首先将会运行此方法。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
this.callbackContext = callbackContext;
if (action.equals("record")) {
// 初始化语音识别对象
SpeechUtility.createUtility(cordova.getActivity(), "appid=yourAppid,force_login=true");
// 使用SpeechRecognizer对象,可根据回调消息自定义界面;
mIat = SpeechRecognizer.createRecognizer(cordova.getActivity(), mInitListener);
// 设置参数
setParam();
// 监听事件
mIat.startListening(mRecognizerListener);
return true;
}
return false;
}
初始化监听器
1 | private InitListener mInitListener = new InitListener() { |
设置参数
1 | public void setParam() { |
识别监听器
1 | private RecognizerListener mRecognizerListener = new RecognizerListener() { |
处理结果并返回App端
1 | // 处理结果 |
App端调用sdk并监听数据返回
1 | //语音识别 |
结语
插件代码我已经上传到github了,有需要的可以clone。走过路过给个star吧~