讯飞语音 Great!!!

本文档详述了如何在Android平台上集成科大讯飞的语音SDK,涵盖语音听写、识别、合成、语义理解等功能的实现步骤,包括权限设置、初始化、接口调用等关键环节,提供了丰富的示例代码和注意事项。
摘要由CSDN通过智能技术生成

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文件中添加如下权限:

Java Code
  1. <!--连接网络权限,用于执行云端语音能力 -->  
  2. <uses-permission android:name="android.permission.INTERNET"/>  
  3. <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->  
  4. <uses-permission android:name="android.permission.RECORD_AUDIO"/>  
  5. <!--读取网络信息状态 -->  
  6. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
  7. <!--获取当前wifi状态 -->  
  8. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
  9. <!--允许程序改变网络连接状态 -->  
  10. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>  
  11. <!--读取手机信息权限 -->  
  12. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  
  13. <!--读取联系人权限,上传联系人需要用到此权限 -->  
  14. <uses-permission android:name="android.permission.READ_CONTACTS"/>  

 如需使用人脸识别,还要添加:

Java Code
  1. <!--摄相头权限,拍照需要用到 -->  
  2. <uses-permission android:name="android.permission.CAMERA" />   

注:如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码

Java Code
  1. -keep class com.iflytek.**{*;}  

step3 初始化

初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:

Java Code
  1. // 将“12345678”替换成您申请的APPID,申请地址:http://open.voicecloud.cn  
  2. SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");   

注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请使用参数:SpeechConstant.APPID +"=12345678," + SpeechConstant.FORCE_LOGIN +"=true"

3 语音听写

听写主要指将连续语音快速识别为文字的过程,科大讯飞语音听写能识别通用常见的语句、词汇,而且不限制说法。语音听写的调用方法如下: 

Java Code
  1. //1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener    
  2. SpeechRecognizer mIat= SpeechRecognizer.createRecognizer(context, null);    
  3. //2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类    
  4. mIat.setParameter(SpeechConstant.DOMAIN, "iat");    
  5. mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");    
  6. mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");    
  7. //3.开始听写   mIat.startListening(mRecoListener);    
  8. //听写监听器    
  9. private RecognizerListener mRecoListener = new RecognizerListener(){    
  10. //听写结果回调接口(返回Json格式结果,用户可参见附录12.1);    
  11. //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;    
  12. //关于解析Json的代码可参见MscDemo中JsonParser类;    
  13. //isLast等于true时会话结束。    
  14. public void onResult(RecognizerResult results, boolean isLast) {    
  15.             Log.d("Result:",results.getResultString ());}    
  16. //会话发生错误回调接口    
  17.     public void onError(SpeechError error) {    
  18. error.getPlainDescription(true//获取错误码描述}    
  19.     //开始录音    
  20.     public void onBeginOfSpeech() {}    
  21.     //音量值0~30    
  22.     public void onVolumeChanged(int volume){}    
  23.     //结束录音    
  24.     public void onEndOfSpeech() {}    
  25.     //扩展用接口    
  26.     public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {}    
  27. };    

另外,您还可以使用SDK提供的语音交互动画来使语音输入界面变得更加炫酷,也可以通过上传联系人和用户词表增强听写效果。 

3.1 语音交互动画

为了便于快速开发,SDK还提供了一套默认的语音交互动画以及调用接口,如需使用请将SDK资源包assets路径下的资源文件拷贝至Android工程asstes目录下,如图所示:

                                                                 图 3 添加动画资源

然后通过以下代码使用交互动画: 

Java Code
  1. //1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener  
  2. RecognizerDialog    iatDialog = new RecognizerDialog(this,mInitListener);  
  3. //2.设置听写参数,同上节  
  4. //3.设置回调接口  
  5. iatDialog.setListener(recognizerDialogListener);  
  6. //4.开始听写  
  7. iatDialog.show();   

 3.2 上传联系人

上传联系人可以提高联系人名称识别率,也可以提高语义理解的效果,每个用户终端设备对应一个联系人列表,联系人格式详见《科大讯飞MSC API手册(Android)》ContactManager类。 

Java Code
  1. //获取ContactManager实例化对象  
  2. ContactManager mgr = ContactManager.createManager(context, mContactListener);     
  3. //异步查询联系人接口,通过onContactQueryFinish接口回调  
  4. mgr.asyncQueryAllContactsName();  
  5. //获取联系人监听器。  
  6. private ContactListener mContactListener = new ContactListener() {  
  7.     @Override  
  8.     public void onContactQueryFinish(String contactInfos, boolean changeFlag) {  
  9.         //指定引擎类型  
  10. mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);  
  11.         mIat.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");         
  12.         ret = mIat.updateLexicon("contact", contactInfos, lexiconListener);  
  13.         if(ret != ErrorCode.SUCCESS){  
  14.             Log.d(TAG,"上传联系人失败:" + ret);  
  15. }  
  16. }};  
  17. //上传联系人监听器。  
  18. private LexiconListener lexiconListener = new LexiconListener() {  
  19.     @Override  
  20.     public void onLexiconUpdated(String lexiconId, SpeechError error) {  
  21.         if(error != null){  
  22.             Log.d(TAG,error.toString());  
  23.         }else{  
  24.             Log.d(TAG,"上传成功!");  
  25.         }  
  26.     }  
  27. };   

 3.3 上传用户词表

上传用户词表可以提高词表内词汇的识别率,也可以提高语义理解的效果,每个用户终端设备对应一个词表,用户词表的格式及构造方法详见《科大讯飞MSC API手册(Android)》UserWords类。

Java Code
  1. //上传用户词表,userwords为用户词表文件。  
  2. String contents = "您所定义的用户词表内容";  
  3. mIat.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");     
  4. //指定引擎类型  
  5. mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);  
  6. ret = mIat.updateLexicon("userword", contents, lexiconListener);  
  7. if(ret != ErrorCode.SUCCESS){  
  8.     Log.d(TAG,"上传用户词表失败:" + ret);  
  9. }  
  10. //上传用户词表监听器。  
  11. private LexiconListener lexiconListener = new LexiconListener() {  
  12.     @Override  
  13.     public void onLexiconUpdated(String lexiconId, SpeechError error) {  
  14.         if(error != null){  
  15.             Log.d(TAG,error.toString());  
  16.         }else{  
  17.             Log.d(TAG,"上传成功!");  
  18.         }  
  19.     }  
  20. };  

4 语音识别

即语法识别,主要指基于命令词的识别,识别指定关键词组合的词汇,或者固定说法的短句。语法识别分云端识别和本地识别,云端和本地分别采用ABNF和BNF语法格式。

语法详解见:http://club.voicecloud.cn/forum.php?mod=viewthread&tid=7595

Java Code
  1. //云端语法识别:如需本地识别请参照本地识别  
  2. //1.创建SpeechRecognizer对象  
  3. SpeechRecognizer mAsr = SpeechRecognizer.createRecognizer(context, null);  
  4. // ABNF语法示例,可以说”北京到上海”  
  5. String mCloudGrammar = "#ABNF 1.0 UTF-8; 
  6. languagezh-CN;  
  7. mode voice; 
  8. root $main; 
  9. $main = $place1 到$place2 ; 
  10. $place1 = 北京 | 武汉 | 南京 | 天津 | 天京 | 东京; 
  11. $place2 = 上海 | 合肥; ";  
  12. //2.构建语法文件  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值