讯飞语音的使用及常遇到的问题
讯飞语音是科大讯飞推出的以语音交互技术为核心的人工智能开放平台,为开发者免费提供语音识别、语音合成等语音技术SDK,人脸识别、声纹识别等。
最常遇到问题:
一、错误码21001,没有安装语音组件(在最下方有全部的错误码和解决方案)
解决方案:
1、有没有使用SpeechUtility.createUtility()设置appid。
2、有没有将libmsc.so放到工程中。
3、如果使用的是讯飞语音+的本地功能,有没有安装讯飞语音+。
4、如果设备是android 5.0及其以上,需要将工程中的armeabi和armeabi-v7a文件夹中都放上libmsc.so,如果你下载的SDK中没有armeabi-v7a对应的库,可以将armeabi中的libmsc.so复制一份到armeabi-v7a文件夹中。
5、SpeechUtility.createUtility()如在Application中调用,需要在Mainifest中注册该Applicaiton。此方法不是必须在Appcation中调用,可在需要使用语音能力之前,例如进入语音搜索页面调用。
6、使用Android Studio的开发者注意将so放在jniLib目录下,或者在配置文件中指定so加载的路径。
二、错误码:10407,用户校验失败
原因:是因为没有下载跟应用名称对应的sdk,讯飞语音一个应用对应一个sdk,所以要下载跟我开发的应用名称相对应的sdk,将其lib库考到project的libs文件夹下。也就是首先对照注册的appid与在Application初始化中的appid是不是一样。
三、错误码:11208,授权应用失败
原因:先检查appid的申请时间(35天期限),还要注意所有的资源文件都是最新的。
使用步骤:
一、讯飞语音SDK的获取
讯飞语音官网:http://www.xfyun.cn/
集成讯飞功能的流程(实际上集成大部分开发平台的SDK,其流程都是如此)
填写信息方可使用第三方平台提供功能
语音听写,创建应用
选择自己应用的功能
选择对应功能的SDK,进行下载
最终的应用信息,注意要记住appid
下载后的文件夹,其中assets是图片资源,doc是官方文档及使用说明(下面代码和注释都是用的官方使用文档)
libs是我们需要拷贝到项目中的资源,sample是一个些demo。
二、导入SDK
将下载的开发工具包中libs目录下的Msc.jar和armeabi(实际还有多个文件,全部拷贝进来,以便机型适配)复制到Android工程的libs目录。
三、在项目build.gradle文件的android{}内,配置下面一段代码,同步一下gradle文件。
empty sourceSets{main{jniLibs.srcDir'libs'}}
四、在清单文件进行权限配置
<!--连接网络权限,用于执行云端语音能力 -->
<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" />
五、为了便于快速开发,SDK提供了一套默认的语音输入UI,若使用,请将SDK资源包assets下的文件拷贝至项目的asstes目录下(studio没有,就把assets复制到src->main下)。
六、初始化讯飞语音SDK:
只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下(注意在清单文件中注册Application,这里的appid就是上面注册的appid):
public class MyApplication extends Application {@Overridepublic void onCreate() {// 将“12345678”替换成您申请的 APPID,申请地址:http://www.xfyun.cn// 请勿在“=”与 appid 之间添加任务空字符或者转义符SpeechUtility.createUtility(this, SpeechConstant.APPID + "=586365ef");super.onCreate();}
}
七、执行识别语音为文字的的逻辑代码(放到点击事件中):
//1.创建RecognizerDialog对象,第二参数就是一个初始化的监听,我们用不上就设置为null
RecognizerDialog mDialog = new RecognizerDialog(this,null);
//2.设置accent、language等参数
mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//设置为中文模式
mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//设置为普通话模式
//若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解
//mDialog.setParameter("asr_sch", "1");
//mDialog.setParameter("nlp_version", "2.0");
//3.设置回调接口,语音识别后,得到数据,做响应的处理.
mDialog.setListener(new RecognizerDialogListener() {
//识别成功执行 参数1 recognizerResult:识别出的结果,Json格式(用户可参见附录12.1)
// 参数2 b:等于true时会话结束。方法才不会继续回调
//一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加,(关于解析Json的代码可参见MscDemo中JsonParser类)
@Override
public void onResult(RecognizerResult recognizerResult, boolean b) {
//拿到讯飞识别的结果
String resultString = recognizerResult.getResultString();
System.out.println("讯飞识别的结果 "+resultString);
System.out.println("b参数是什么 "+b);
}
@Override//识别失败执行 speechError:错误码
public void onError(SpeechError speechError) {
}
});
//4.显示dialog,接收语音输入
mDialog.show();
八、创建Bean类,以用来存放讯飞语音识别的结果json数据。
public class XFBean {public ArrayListws;public class WS{public ArrayListcw;}public class CW{public String w;}
}
九、创建解析讯飞识别结果bean数据的方法,使用谷歌的Gson。
private String parseData(String resultString) {//创建gson对象,记得要关联一下gson.jar包方可以使用.Gson gson = new Gson();//参数 1.String类型的json数据 参数 2.存放json数据对应的bean类XFBean xfBean = gson.fromJson(resultString, XFBean.class);//创建一个集合,用来存放bean类里的对象.ArrayListws = xfBean.ws;//创建一个容器,用来存放从每个集合里拿到的数据,使用StringBuilder效率更高StringBuilder stringBuilder = new StringBuilder();//使用高级for循环,取出特定属性的特有数据,装入StringBuilder中for ( XFBean.WS w: ws) {String text = w.cw.get(0).w;stringBuilder.append(text);}//把容器内的数据转为字符串返回出去.return stringBuilder.toString();}
十、执行识别语音为文字的的逻辑代码(之前的拿到的数据是无法直接使用的bean数据,现在就是解析出来的最终String类型数据)。
//1.创建RecognizerDialog对象,第二参数就是一个初始化的监听,我们用不上就设置为nullRecognizerDialog mDialog = new RecognizerDialog(this,null);//2.设置accent、language等参数mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//设置为中文模式mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//设置为普通话模式//若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解//mDialog.setParameter("asr_sch", "1");//mDialog.setParameter("nlp_version", "2.0");//创建一个装每次解析数据的容器(你说话有停顿,解析就是一段一段的,而用容器就能拼接成一句话了)mStringBuilder = new StringBuilder();//3.设置回调接口,语音识别后,得到数据,做响应的处理.mDialog.setListener(new RecognizerDialogListener() {//识别成功执行 参数1 recognizerResult:识别出的结果,Json格式(用户可参见附录12.1) // 参数2 b:等于true时会话结束。方法才不会继续回调//一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加,(关于解析Json的代码可参见MscDemo中JsonParser类)public void onResult(RecognizerResult recognizerResult, boolean b) {//拿到讯飞识别的结果String resultString = recognizerResult.getResultString();System.out.println("讯飞识别的结果 "+resultString);//自定义解析bean数据的一个方法.用到了Gson,在项目里关联一下.String text = parseData(resultString);//容器装解析出来的数据mStringBuilder.append(text);//对参数2进行判断,如果为true,代表这个方法不会再回调,就把容器里的数据转成字符串.拿来使用.if(b){String result = mStringBuilder.toString();System.out.println("话说完,最终的结果 : "+ result);}}@Override//识别失败执行 speechError:错误码public void onError(SpeechError speechError) {}});//4.显示dialog,接收语音输入mDialog.show();
十一、讯飞固定的把文字转文语音的逻辑代码,把String参数传进去,然后调用此方法即可
public void TextToVoice(String text){
//1.创建SpeechSynthesizer对象, 第一个参数上下文,第二个参数:本地合成时传InitListenerSpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null);//2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//设置发音人mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围0~100mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端,这些功能用到讯飞服务器,所以要有网络.//设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm”//保存在SD卡需要在AndroidManifest.xml添加写SD卡权限//如果不需要保存合成音频,注释该行代码mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");//3.开始合成,第一个参数就是转成声音的文字,可以自定义 第二个参数是合成监听器对象.我们不需要对声音有什么特殊处理,就传nullmTts.startSpeaking(text,null);}
十二、使智能语音能根据用户说的话,回答相映的内容,这就需要拿到用户说话的结果,进行判断,回答对应的内容。
//回答对象,在没有匹配到用户说的话,默认输出语句
String answer="不好意思,没有听清楚";
//这里的result参数,就是我们通过讯飞听写里最终拿到用户说话的结果
if(result.contains("你好")){answer="你好,我是智能语音助手";
}else if(result.contains("谁是世界上最帅的人")){answer="哈哈,当然是您";
}else if (result.contains("中午吃什么")) {String[] anwserList = new String[]{"火锅", "烧烤", "烤鱼", "麻辣烫"};int random = (int) (Math.random() * anwserList.length);anwser = anwserList[random];
}
//调用语音助手说话的方法,把回答对象传进去.
TextToVoice(answer);
提示:程序没有办法运行到模拟器上,因为模拟器没有麦克风的回调接口,只能运行在真机上。
讯飞官方提供的错误码及解决办法:
讯飞语音的使用及常遇到的问题相关推荐
- Android自带语音播报+讯飞语音播报封装(直接用)
一.Android自带的语音播报 1.查看是否支持中文,在测试的设备中打开'设置' -->找到 '语言和输入法'-->查看语音选项,是否支持中文,默认仅支持英文. 使用如下: public ...
- (原创)用讯飞语音实现人机交互的功能
目前在做一款车载的项目,其中有一个需求是在开车的时候实现人与手机的对话,全过程不需要用手,只用语音操控. 这个就类似于人与机器人的对话,机器人在后台一直待命,用户说话 机器人做出对应的反映. 但由于用 ...
- UNITY 接讯飞语音过程总结
UNITY 接讯飞语音过程总结 11:13 2017/3/14 1,安装问题:JDK与ECLIPSE位数一定要对应,32位对64位会出现 java was returned ....code 13的弹 ...
- iOS: 讯飞语音的使用
一.介绍: 讯飞语音做的相当不错,容错率达到90%多,如果需要做语音方面的功能,它绝对是一个不错的选择.讯飞语音的功能很多:语音听写.语音识别.语音合成等,但我们最常用的还是语音听写.讯飞语音中包含界 ...
- 搜狗语音输入提示服务器繁忙,讯飞语音输入如何提高识别率 提高方法
讯飞语音是一款语音输入软件,能够帮助用户进行通过语音说话,进行智能识别,帮助用户在繁忙的时候,直接语音输入,不过语言描述要清晰哦!小编在这里分享一下识别率提高方法,不要错过哦! 讯飞语音输入如何提高识 ...
- 讯飞语音——带你简单实现语音听写
语音听写 de 简单实现 一.前言 如果你没有在讯飞语音平台上创建应用,请先参考讯飞语音的详细配置使用 二.功能描述 语音听写和语音合成都是较为基础也是最常使用的两个基本功能. 语音合成是将文本转化为 ...
- 讯飞语音转文字 PHP demo
讯飞语音转文字PHP tp6 demo 讯飞官网没有PHP demo我是很诧异的 改成了我需要的tp6 demo 讯飞官网没有PHP demo我是很诧异的 我php天下第一就这么没牌面吗 网上找了很久 ...
- Unity与讯飞语音交互:使用aiui技能
语音交互 说到人工智能,离不开语音,大家会认为一个设备可以跟人对话是有智能的体现,在国内语音智能研发,讯飞是公认的做的最好的,在了解语音智能时,客户提的是讯飞,因为他们目标是要做一个好的语音交互.客户 ...
- 讯飞社区android 源码,android 讯飞语音 demo
[实例简介] android 讯飞语音 demo 博客地址:http://blog.csdn.net/chenshufei2/article/details/8496905 [实例截图] [核心代码] ...
- Android中集成讯飞语音,语音转文字以及文字转语音操作
讯飞语音 * 在讯飞语音开发者平台上http://www.xfyun.cn/doccenter/newer具体准备工作按照开发文档操作.注意的是创建一个项目,appid和adk是一一对应的* 在这里, ...
最新文章
- zend studio自动添加文件注释和方法注释
- 单位员工通讯录管理系统(线性表的应用)
- html 下标签,html标签下
- 【HDU - 2717】【POJ - 3278】Catch That Cow (经典bfs,类似dp)
- Linux内存管理的设计与实现,Linux内核设计与实现-内存管理学习小结
- 字典树-大量字符串前缀及出现次数是否存在统计(Trie树-java)算法实现
- 找不到所需的 Adobe Flash Player 调试器版本
- python手册中文版-python手册中文
- 边缘计算是什么,对企业有什么影响?
- Python之——网站访问流量统计
- python阳历转阴历,阴历转阳历
- MS SQL Server 数据库连接字符串详解
- 如何计算机器人的工作范围,如何根据工业机器人的工作范围选择合适的机器人型号?...
- Spring Boot 项目结构介绍
- iOS基础_C语言第一讲
- HBCTF第三场WP
- scrapy爬取豆瓣电影
- 测试cpu的简单工具-dhrystone【转】
- 关闭hp打印机 cd_打开和关闭CD托盘
- Linux CentOs 搭建Discuz论坛全过程
热门文章
- 腾达无线路由器dns服务器,腾达无线路由器如何设置DNS
- 国外的android手机号码,Android - 手机号码格式化和删除国家/地区代码
- 机器学习笔记 十七:基于Gini Importance、Permutation Importance、Boruta的随机森林模型重要性评估的比较
- 仙剑5手游服务器维护,仙剑奇侠传手游5月27日例行维护与活动公告
- 第一章 : JVM与体系结构
- Angular实现微博发布功能
- BUUCTF:[WUSTCTF2020]alison_likes_jojo
- Verilog语言要素(三)
- github snap android,轻量级的viewpager指示器
- RK3066移动鼠标,有时会卡顿一会儿