讯飞语音是科大讯飞推出的以语音交互技术为核心的人工智能开放平台,为开发者免费提供语音识别、语音合成等语音技术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 {
@Override
public 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 ArrayList
ws;
public class WS{
public ArrayList
cw;
}
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类里的对象.
ArrayList
ws = 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对象,第二参数就是一个初始化的监听,我们用不上就设置为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");
//创建一个装每次解析数据的容器(你说话有停顿,解析就是一段一段的,而用容器就能拼接成一句话了)
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对象, 第一个参数上下文,第二个参数:本地合成时传InitListener
SpeechSynthesizer 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~100
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端,这些功能用到讯飞服务器,所以要有网络.
//设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm”
//保存在SD卡需要在AndroidManifest.xml添加写SD卡权限
//如果不需要保存合成音频,注释该行代码
mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
//3.开始合成,第一个参数就是转成声音的文字,可以自定义 第二个参数是合成监听器对象.我们不需要对声音有什么特殊处理,就传null
mTts.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);
提示:程序没有办法运行到模拟器上,因为模拟器没有麦克风的回调接口,只能运行在真机上。
讯飞官方提供的错误码及解决办法: