前言
一、首先需要到官网去创建一个应用,获取对应的APPID、APISecret和APIKey
-
1.如图一:选中语音合成-在线语音合成(流式版)
图一:控制台应用信息
- 2.导入SDK
在控制台应用管理中找到SDK下载。(文章对应的SDK版本 2019年06月18日 版本号:1138)
图二:下载SDK
下载完SDK后解压,并找到libs目录里的so库和Msc.jar包,复制你需要的so库架构都自己工程下的app\src\main\jniLibs和Msc.jar拷贝到自己工程的app\libs目录中。 - 3.在工程 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.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
<!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />
- 注意:打包发布正式版前,需要加入防混淆配置*
-keep class com.iflytek.**{*;}
-keepattributes Signature
- 完成以上步骤后,sync下项目,等待同步完成。
*## 以下代码可以直接复制到项目里使用, 支持队列顺序播放
import android.os.Bundle;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SynthesizerListener;
import com.jsgtkj.life.MyApplication;
import java.util.LinkedList;
import java.util.Queue;
/**
* @author : GuoQiang
* e-mail : 849199845@qq.com
* time : 2019/09/07 10:37
* desc : 讯飞语音科技
* version: 1.0
*/
public class TTSXFUtil {
private static volatile TTSXFUtil ttsUtil = null;
private SpeechSynthesizer mTts;
private boolean isInitSuccess = false;
//此处需要将语音添加到队列,保证一条播放完再播放下一条
//必须第一次收到消息才能在这播放,以后每次收到消息将消息添加到队列,每次播放完后去队列里面取;
private static Queue<String> queue = new LinkedList<>();
public TTSXFUtil() {
}
public static TTSXFUtil getInstance() {
if (ttsUtil == null) {
synchronized (TTSXFUtil.class) {
if (ttsUtil == null) {
ttsUtil = new TTSXFUtil();
}
}
}
return ttsUtil;
}
public void init(String msg) {
mTts = SpeechSynthesizer.createSynthesizer(MyApplication.getInstance(), new MyInitListener(msg));
initSpeechSynthesizer();
}
private void initSpeechSynthesizer(){
if (mTts!=null) {
mTts.setParameter(SpeechConstant.PARAMS, null);
mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");
mTts.setParameter(SpeechConstant.SPEED, "60");//速度
mTts.setParameter(SpeechConstant.PITCH, "50");//语调
mTts.setParameter(SpeechConstant.VOLUME, "50");//音量
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //引擎类型
mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");//设置播放合成音频打断音乐播放,默认为true
//mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflyket.pcm"); //声音文件地址
}
}
private class MyInitListener implements InitListener {
private String msg;
public MyInitListener(String msg) {
this.msg = msg;
}
@Override
public void onInit(int code) {
if (code == ErrorCode.SUCCESS) {
isInitSuccess=true;
XLog.d("语音初始化成功:" + code);
// 初始化成功,之后可以调用startSpeaking方法
// 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,
// 正确的做法是将onCreate中的startSpeaking调用移至这里
speak(msg);
} else {
XLog.d("语音初始化失败,错误码:" + code);
}
}
};
public void speak(String msg) {
if (mTts!=null&&isInitSuccess) {
queue.offer(msg);
if (!mTts.isSpeaking()) {
//stop();
mTts.startSpeaking(queue.poll(), synthesizerListener);
}
} else {
init(msg);
}
}
public void stop() {
mTts.stopSpeaking();
}
private SynthesizerListener synthesizerListener = 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 percent, int beginPos, int endPos) {
}
@Override
public void onCompleted(SpeechError error) {
if (error == null) {
if (!queue.isEmpty()) {
mTts.startSpeaking(queue.poll(), synthesizerListener);
}
} else {
XLog.i(error.getPlainDescription(true));
}
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
// 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
// 若使用本地能力,会话id为null
// if (SpeechEvent.EVENT_SESSION_ID == eventType) {
// String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
// Log.d(TAG, "session id =" + sid);
// }
}
};
public void pause() {
mTts.pauseSpeaking();
}
public void resume() {
mTts.resumeSpeaking();
}
public void release() {
if (null != mTts) {
mTts.stopSpeaking();
mTts.destroy(); //退出时释放
}
}
}
- 使用方法:
1.在Application中初始化
//初始化语音合成 在线使用讯飞科技 把以下"="号后面的"123456"更换成自己的APPID,千万不要删除"="号哦
SpeechUtility.createUtility(this, SpeechConstant.APPID +"=123456");
2.在需要使用播放的地方调用
TTSXFUtil.getInstance().speak("欢迎使用讯飞科技在线语音播放");
3.使用完毕后不要忘记释放
@Override
protected void onDestroy() {
super.onDestroy();
TTSXFUtil.getInstance().release();
}
- 至此,讯飞在线语音合成完成
网友评论