1.下载官网demo后倒入此jar包放入lib下
2.在main目录下导入相对应的so文件
3.添加权限,权限可按自己需求而定
<!--连接网络权限,用于执行云端语音能力 -->
<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" />
4.同步项目 并进行初始化操作
private void initKDXF() {
SpeechUtility.createUtility(this, SpeechConstant.APPID + "=APPID");
}
5.放入语音播报的语音文件(语音文件在官网demo里面附带可自行搜索)
注:免费的
6.在相对应的播报页面进行播报
private void initTTS() {
SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(this, mTtsInitListener);
if (mTts != null) {
mTts.setParameter(ResourceUtil.TTS_RES_PATH, getResourcePath());
mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaofeng"); // 设置发音人
mTts.setParameter(SpeechConstant.SPEED, "1");// 设置语速
mTts.setParameter(SpeechConstant.VOLUME, "80");// 设置音量,范围 0~100
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端
//这里出现的问题是因为多次进入语音播报页面会导致语音未播报,只是稍微简单处理一下
boolean speaking = mTts.isSpeaking();
ToastUtils.showShort(speaking + "");
if (speaking) {
if (mTts != null) {
mTts.pauseSpeaking();
mTts.stopSpeaking();
mTts.destroy();
}
mTts1 = SpeechSynthesizer.createSynthesizer(this, mTtsInitListener);
mTts1.setParameter(ResourceUtil.TTS_RES_PATH, getResourcePath());
mTts1.setParameter(SpeechConstant.VOICE_NAME, "xiaofeng"); // 设置发音人
mTts1.setParameter(SpeechConstant.SPEED, "1");// 设置语速
mTts1.setParameter(SpeechConstant.VOLUME, "80");// 设置音量,范围 0~100
mTts1.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端
mTts1.startSpeaking("需要播报的文字", new MySynthesizerListener());
} else {
mTts.startSpeaking("需要播报的文字"", new MySynthesizerListener());
}
}
}
6.1获取发言人资源方法
//获取发音人资源路径
private String getResourcePath() {
StringBuffer tempBuffer = new StringBuffer();
String type = "tts";
if (mEngineType.equals(SpeechConstant.TYPE_XTTS)) {
type = "xtts";
}
//合成通用资源
tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, type + "/common.jet"));
tempBuffer.append(";");
//发音人资源
if (mEngineType.equals(SpeechConstant.TYPE_XTTS)) {
tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, type + "/" + LeaveDatailsActivity.voicerXtts + ".jet"));
} else {
tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, type + "/" + LeaveDatailsActivity.voicerLocal + ".jet"));
}
return tempBuffer.toString();
}
6.2初始化监听操作
/**
* 初始化监听。
*/
private InitListener mTtsInitListener = new InitListener() {
@Override
public void onInit(int code) {
LogUtil.e("InitListener init() code = " + code);
if (code != ErrorCode.SUCCESS) {
LogUtil.e("初始化失败,错误码:" + code + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");
} else {
// 初始化成功,之后可以调用startSpeaking方法
// 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,
// 正确的做法是将onCreate中的startSpeaking调用移至这里
}
}
};
6.3使用的相对应的全局变量
// 引擎类型
private String mEngineType = SpeechConstant.TYPE_CLOUD;
public static String voicerXtts = "xiaofeng";
// 默认本地发音人
public static String voicerLocal = "xiaofeng";
private SpeechSynthesizer mTts;
private SpeechSynthesizer mTts1;
7.最后只需要在播报页面相对应的生命周期里加入和SpeechSynthesizer相对应的生命周期即可
例:
@Override
protected void onResume() {
super.onResume();
if (mTts != null) {
mTts.resumeSpeaking();
}
if (mTts1 != null) {
mTts1.resumeSpeaking();
}
}
@Override
protected void onPause() {
super.onPause();
if (mTts != null) {
mTts.pauseSpeaking();
}
if (mTts1 != null) {
mTts1.pauseSpeaking();
}
}
@Override
protected void onStop() {
super.onStop();
if (mTts1 != null) {
if (mTts != null) {
mTts.stopSpeaking();
}
mTts1.stopSpeaking();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mTts != null) {
mTts.destroy();
}
if (mTts1 != null) {
mTts1.destroy();
}
}
大致就是这个样子,其他的请默认移步官网