科大讯飞离线语音合成简单实例
讯飞语音开发集成地址http://www.xfyun.cn/
如何使用科大讯飞开放平台的语音合成呢?
1.首先要注册开发者账户, 创建我的新应用,创建完后就有一个专属APPID(非常重要),添加我的应用 , 下载你所需要的sdk,这里我们下载离线语音合成。注意:下载的sdk文件,都是自己创建的应用生成的,申请appid时就与自己的应用绑定了的。所以一定要使用自己下载的文件,appid的值也要使用自己的。
2.下载后将sdk解压,将libs下的两个jar包添加到libs目录下(jar包还要右键 add to Libraries), 同路径下的其它 .so文件(与c进行交互)复制到main路径下新建的 jniLibs(L要大写)目录下, 将assert目录拷贝到main目录下,将res目录下的tts文件复制到assert目录下。并在你的继承了Application的类中添加下图的几行代码进行配置(appid的值写自己注册的)。这些文件的安放位置在我的项目中体现如下:
3.在MainActivity同目录下创建类KqwSpeechSynthesizer,并创建类SoundTipUtil,再通过下图方框圈出的代码,即可实现在activity内进行语音合成的使用了。不妨试试!
KqwSpeechSynthesizer类的代码如下:
-
import android.content.Context;
-
import android.os.Bundle;
-
import android.util.Log;
-
import android.widget.Toast;
-
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.iflytek.cloud.util.ResourceUtil;
-
/**
-
* 语音合成器
-
*
-
* @author kongqw
-
*/
-
public class KqwSpeechSynthesizer {
-
// Log标签
-
private static final String TAG = "KqwSpeechSynthesizer";
-
private Context mContext;
-
// 语音合成对象
-
private SpeechSynthesizer mTts;
-
public KqwSpeechSynthesizer(Context context) {
-
mContext = context;
-
// 初始化合成对象
-
mTts = SpeechSynthesizer.createSynthesizer(context, new InitListener() {
-
@Override
-
public void onInit(int code) {
-
Log.d(TAG, "InitListener init() code = " + code);
-
if (code != ErrorCode.SUCCESS) {
-
Toast.makeText(mContext, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();
-
}
-
}
-
});
-
}
-
/**
-
* 开始语音合成
-
*
-
* @param text
-
*/
-
public void start(String text) {
-
// 设置参数
-
setParam();
-
int code = mTts.startSpeaking(text, mTtsListener);
-
if (code != ErrorCode.SUCCESS) {
-
Toast.makeText(mContext, "语音合成失败,错误码: " + code, Toast.LENGTH_SHORT).show();
-
}
-
}
-
/**
-
* 合成回调监听。
-
*/
-
private SynthesizerListener mTtsListener = new SynthesizerListener() {
-
@Override
-
public void onSpeakBegin() {
-
Log.i(TAG, "开始合成");
-
}
-
@Override
-
public void onSpeakPaused() {
-
Log.i(TAG, "暂停合成");
-
}
-
@Override
-
public void onSpeakResumed() {
-
Log.i(TAG, "继续合成");
-
}
-
@Override
-
public void onBufferProgress(int percent, int beginPos, int endPos, String info) {
-
Log.i(TAG, "传冲进度 :" + percent);
-
}
-
@Override
-
public void onSpeakProgress(int percent, int beginPos, int endPos) {
-
Log.i(TAG, "合成进度 : " + percent);
-
}
-
@Override
-
public void onCompleted(SpeechError error) {
-
if (error == null) {
-
Log.i(TAG, "合成完成");
-
} else if (error != null) {
-
Log.i(TAG, "error : " + error.toString());
-
}
-
}
-
@Override
-
public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
-
// TODO Auto-generated method stub
-
}
-
};
-
/**
-
* 参数设置
-
*
-
* @return
-
*/
-
private void setParam() {
-
// 清空参数
-
mTts.setParameter(SpeechConstant.PARAMS, null);
-
// 设置使用本地引擎
-
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
-
// 设置发音人资源路径
-
mTts.setParameter(ResourceUtil.TTS_RES_PATH, getResourcePath());
-
// 设置发音人
-
mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");
-
// 设置语速
-
mTts.setParameter(SpeechConstant.SPEED, "50");
-
// 设置音调
-
mTts.setParameter(SpeechConstant.PITCH, "50");
-
// 设置音量
-
mTts.setParameter(SpeechConstant.VOLUME, "50");
-
// 设置播放器音频流类型
-
mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
-
}
-
// 获取发音人资源路径
-
private String getResourcePath() {
-
StringBuffer tempBuffer = new StringBuffer();
-
// 合成通用资源
-
tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "tts/common.jet"));
-
tempBuffer.append(";");
-
// 发音人资源
-
tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "tts/xiaoyan.jet"));
-
return tempBuffer.toString();
-
}
-
}
SoundTipUtill类代码如下:
-
import android.content.Context;
-
public class SoundTipUtil {
-
private static KqwSpeechSynthesizer kqwSpeechSynthesizer;
-
public static void soundTip(Context context,String text) {
-
kqwSpeechSynthesizer = new KqwSpeechSynthesizer(context);
-
kqwSpeechSynthesizer.start(text);
-
}
-
}
如果不是在activity内进行语音播报,那该咋办?
按以下步骤即可实现:1.在继承了Application的类中添加如下几行代码(图1);
2.在非Activity类中调用方法即可(如图2)