http://www.xfyun.cn/doccenter/awd
开发集成 > Android平台
1 概述
本文档是集成科大讯飞MSC(Mobile Speech Client,移动语音终端)Android版SDK的用户指南,介绍了语音听写、语音识别、语音合成、语义理解、语音评测等接口的使用。MSC SDK的主要功能接口如下图所示:
图1 MSC主要功能接口
为了更好地理解后续内容,这里先对文档中出现的若干专有名词进行解释说明:
表1 名词解释
名词 |
解释 |
语音合成 |
将一段文字转换为成语音,可根据需要合成出不同音色、语速和语调的声音,让机器像人一样开口说话。 |
语音听写 |
将一段语音转换成文字内容,能识别常见的词汇、语句、语气并自动断句。 |
语音识别(语法识别) |
判断所说的内容是否与预定义的语法相符合,主要用于判断用户是否下达某项命令。 |
语义理解 |
分析用户语音或文字的意图,给出相应的回答,如输入“今天合肥的天气”,云端即返回今天合肥的天气信息。 |
语音评测 |
通过智能语音技术对发音水平进行评价,给出得分。 |
声纹密码 |
一种基于每个人的声音都具有唯一性的认证机制,使用声音作为密码。 |
人脸识别 |
从照片、视频流中检测出人脸,或者识别两张人脸照片是否为同一个人。 |
2 预备工作
step1 导入SDK
将开发工具包中libs目录下的Msc.jar和armeabi复制到Android工程的libs目录(如果工程无libs目录,请自行创建)中,如下图所示:
图 2 导入SDK
step2 添加用户权限
在工程AndroidManifest.xml文件中添加如下权限:
- <!--连接网络权限,用于执行云端语音能力 -->
- <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.CAMERA" />
注:如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码
- -keep class com.iflytek.**{*;}
step3 初始化
初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:
- // 将“12345678”替换成您申请的APPID,申请地址:http://open.voicecloud.cn
- SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");
注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请使用参数:SpeechConstant.APPID +"=12345678," + SpeechConstant.FORCE_LOGIN +"=true"。
3 语音听写
听写主要指将连续语音快速识别为文字的过程,科大讯飞语音听写能识别通用常见的语句、词汇,而且不限制说法。语音听写的调用方法如下:
- //1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener
- SpeechRecognizer mIat= SpeechRecognizer.createRecognizer(context, null);
- //2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类
- mIat.setParameter(SpeechConstant.DOMAIN, "iat");
- mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
- mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");
- //3.开始听写 mIat.startListening(mRecoListener);
- //听写监听器
- private RecognizerListener mRecoListener = new RecognizerListener(){
- //听写结果回调接口(返回Json格式结果,用户可参见附录12.1);
- //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
- //关于解析Json的代码可参见MscDemo中JsonParser类;
- //isLast等于true时会话结束。
- public void onResult(RecognizerResult results, boolean isLast) {
- Log.d("Result:",results.getResultString ());}
- //会话发生错误回调接口
- public void onError(SpeechError error) {
- error.getPlainDescription(true) //获取错误码描述}
- //开始录音
- public void onBeginOfSpeech() {}
- //音量值0~30
- public void onVolumeChanged(int volume){}
- //结束录音
- public void onEndOfSpeech() {}
- //扩展用接口
- public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {}
- };
另外,您还可以使用SDK提供的语音交互动画来使语音输入界面变得更加炫酷,也可以通过上传联系人和用户词表增强听写效果。
3.1 语音交互动画
为了便于快速开发,SDK还提供了一套默认的语音交互动画以及调用接口,如需使用请将SDK资源包assets路径下的资源文件拷贝至Android工程asstes目录下,如图所示:
图 3 添加动画资源
然后通过以下代码使用交互动画:
- //1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener
- RecognizerDialog iatDialog = new RecognizerDialog(this,mInitListener);
- //2.设置听写参数,同上节
- //3.设置回调接口
- iatDialog.setListener(recognizerDialogListener);
- //4.开始听写
- iatDialog.show();
3.2 上传联系人
上传联系人可以提高联系人名称识别率,也可以提高语义理解的效果,每个用户终端设备对应一个联系人列表,联系人格式详见《科大讯飞MSC API手册(Android)》ContactManager类。
- //获取ContactManager实例化对象
- ContactManager mgr = ContactManager.createManager(context, mContactListener);
- //异步查询联系人接口,通过onContactQueryFinish接口回调
- mgr.asyncQueryAllContactsName();
- //获取联系人监听器。
- private ContactListener mContactListener = new ContactListener() {
- @Override
- public void onContactQueryFinish(String contactInfos, boolean changeFlag) {
- //指定引擎类型
- mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
- mIat.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");
- ret = mIat.updateLexicon("contact", contactInfos, lexiconListener);
- if(ret != ErrorCode.SUCCESS){
- Log.d(TAG,"上传联系人失败:" + ret);
- }
- }};
- //上传联系人监听器。
- private LexiconListener lexiconListener = new LexiconListener() {
- @Override
- public void onLexiconUpdated(String lexiconId, SpeechError error) {
- if(error != null){
- Log.d(TAG,error.toString());
- }else{
- Log.d(TAG,"上传成功!");
- }
- }
- };
3.3 上传用户词表
上传用户词表可以提高词表内词汇的识别率,也可以提高语义理解的效果,每个用户终端设备对应一个词表,用户词表的格式及构造方法详见《科大讯飞MSC API手册(Android)》UserWords类。
- //上传用户词表,userwords为用户词表文件。
- String contents = "您所定义的用户词表内容";
- mIat.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");
- //指定引擎类型
- mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
- ret = mIat.updateLexicon("userword", contents, lexiconListener);
- if(ret != ErrorCode.SUCCESS){
- Log.d(TAG,"上传用户词表失败:" + ret);
- }
- //上传用户词表监听器。
- private LexiconListener lexiconListener = new LexiconListener() {
- @Override
- public void onLexiconUpdated(String lexiconId, SpeechError error) {
- if(error != null){
- Log.d(TAG,error.toString());
- }else{
- Log.d(TAG,"上传成功!");
- }
- }
- };
4 语音识别
即语法识别,主要指基于命令词的识别,识别指定关键词组合的词汇,或者固定说法的短句。语法识别分云端识别和本地识别,云端和本地分别采用ABNF和BNF语法格式。
语法详解见:http://club.voicecloud.cn/forum.php?mod=viewthread&tid=7595
- //云端语法识别:如需本地识别请参照本地识别
- //1.创建SpeechRecognizer对象
- SpeechRecognizer mAsr = SpeechRecognizer.createRecognizer(context, null);
- // ABNF语法示例,可以说”北京到上海”
- String mCloudGrammar = "#ABNF 1.0 UTF-8;
- languagezh-CN;
- mode voice;
- root $main;
- $main = $place1 到$place2 ;
- $place1 = 北京 | 武汉 | 南京 | 天津 | 天京 | 东京;
- $place2 = 上海 | 合肥; ";
- //2.构建语法文件