接触了语音合成的第三方讯飞,就导入时出现的问题特记录说明:
首先我们来说一下讯飞接入的流程,大致很简单,一般的第三方接入过程:
1、将开发工具包中libs目录下的Msc.jar和armeabi复制到Android工程的libs目录(如果工程无libs目录,请自行创建)中,详细图片官方网站有提供,这里注明一个地方:就是在eclipse中药添加依赖,选择build添加jar到项目。在AS中,则右键jar包,Add library或者选择file-project structure-Dependencies-加号
添加依赖
2、清单文件添加权限(官方都有提供,不做说明)
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"/>
3、关于初始化的问题,要说明的是,
SpeechUtility.createUtility(context, SpeechConstant.APPID +
"=12345678"
); 方法中,appid一定要自己申请的应用下载的sdk包和对应的appid,否则会报错用户校验失败的错误
4、对应的初始化方法,官方建议在application中初始化,这里写了一个管理类来实现,方便全局调用语音合成方法
public class MscManager {
private Context mContext;
private SpeechSynthesizer speechSynthesizer ;
private static MscManager instance;
private static final String APPID = "自己申请的id";
public static MscManager getInstance() {
if (instance == null) {
synchronized (MscManager.class) {
if (null == instance) {
instance = new MscManager();
}
}
}
return instance;
}
public void init(Context context) {
this.mContext = context;
SpeechUtility.createUtility(context, SpeechConstant.APPID + APPID);
initTts();
}
/**
* 普通语音
*
* @param content 播放内容
*/
public void speech(String content) {
if (TextUtils.isEmpty(content)) {
return;
}
speechSynthesizer.startSpeaking(content, mSynListener);
}
/**
*
初始化语音合成
*/
private void
initTts() {
speechSynthesizer= SpeechSynthesizer.createSynthesizer(mContext, null);
speechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, "设置官方提供的语音人");//设置发音人
speechSynthesizer.setParameter(SpeechConstant.SPEED, "80");//设置语速
speechSynthesizer.setParameter(SpeechConstant.VOLUME, "100");//设置音量,范围0~100
speechSynthesizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端
}
/**
*
语音回调
*/
private SynthesizerListener
mSynListener =
new SynthesizerListener() {
@Override
public void
onSpeakBegin() { }
@Override
public void
onBufferProgress(
int i
, int i1
, int i2
, String s) { }
@Override
public void
onSpeakPaused() { }
@Override
public void
onSpeakResumed() { }
@Override
public void
onSpeakProgress(
int i
, int i1
, int i2) { }
@Override
public void
onCompleted(SpeechError speechError) {
}
@Override
public void
onEvent(
int i
, int i1
, int i2
, Bundle bundle) { } }
;}然后调用speech方法,传语音提示内容。
整个过程如果没有问题,就不需要往下看了,如果你遇到了和我一样的问题,程序导入sdk后无法正常启动,可能是此类问题
ERROR_ENGINE_NOT_SUPPORTED | 21002 | 引擎不支持 |
如果你找不到问题打印日志,你可以在
private SynthesizerListener mSynListener = new SynthesizerListener() {
方法中
@Override
public void onCompleted(SpeechError speechError) {
Log.e("错误",speechError.toString());
}打印问题原因,遇到这种情况,很可能是你的libs下的jar没有引入程序,只是你以为引入依赖而已, 所以每次初始化程序找不到对应的jar包
修改方法:找到你的build.gradle文件,添加
sourceSets {
main {
jniLibs.srcDir 'libs'
}