科大讯飞纯离线语音合成的快速集成

1,注册科大讯飞开发者,新建应用,下载离线语音合成SDK到本地

2,将下载好的SDK中的jar,assets文件下的tts包,.so文件复制到项目中

3,将下面的工具类复制到项目中

/**
 * 语音合成器
 *
 * @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();
                }
            }
        });

    }

    /**
     * 开始语音合成
     */
    public void start(String text) {
        // 设置参数
        setParam();
        int code = mTts.startSpeaking(text, mTtsListener);
        if (code != ErrorCode.SUCCESS) {
            Toast.makeText(mContext, "语音合成失败,错误码: " + code, Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 结束语音合成
     */
    public void stop() {
        if (null != mTts) {
            mTts.stopSpeaking();
            // 退出时释放连接
            mTts.destroy();
        }
    }

    /**
     * 合成回调监听。
     */
    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 speechError) {
            if (speechError == null) {
                Log.i(TAG, "合成完成");
            } else {
                Log.i(TAG, "error : " + speechError.toString());
            }
        }

        @Override
        public void onEvent(int i, int i1, int i2, Bundle bundle) {

        }

    };

    /**
     * 参数设置
     */
    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() {
        // 合成通用资源
        // 发音人资源
        return ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "tts/common.jet") + ";" +
                ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "tts/xiaoyan.jet");
    }
}

4,项目中使用

首先在Application中初始化:

String param = "appid=5c6224f9," + SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC;
SpeechUtility.createUtility(this, param); //将这里的appid的值替换成你在第一步中拿到的appid的值

然后在有需要的页面使用:

在onCreate中初始化工具类:mKqwSpeechSynthesizer = new KqwSpeechSynthesizer(this);

在具体要语音播报的地方调用:mKqwSpeechSynthesizer.start(speckContent);

在onDestory中释放:mKqwSpeechSynthesizer.stop();

OK!完成,就是这么简单!

猜你喜欢

转载自blog.csdn.net/look_up_at/article/details/87926694