TTS(Text To Speech)文字转语音简单实现

2020-04-13  本文已影响0人  kermitye

TTS实现方案

实现TTS有大体上有两种方案:

系统内置TTS集成

1.安装语音引擎并在设置为默认TTS

原生Android系统自带了一个Pico TTS引擎,但不支持中文;国产手机大部分中默认装了讯飞TTS引擎

下载安装后,打开无障碍进行设置

设置 无障碍 TTS输出

2.代码中集成

这里提供一个工具类TtsManager.java,直接使用或参考

public class TtsManager {
    private TtsManager() {
    }

    private static class SingletonHoler {
        public static final TtsManager INSTANCE = new TtsManager();
    }

    public static TtsManager getInstance() {
        return SingletonHoler.INSTANCE;
    }

    private TextToSpeech mSpeech;
    private boolean mIsInited;
    private UtteranceProgressListener mSpeedListener;

    public void init() {
        destory();
        mSpeech = new TextToSpeech(MyApp.getInstance(), status -> {
            if (status == TextToSpeech.SUCCESS) {
                int result = mSpeech.setLanguage(Locale.getDefault());
//                mSpeech.setPitch(1.0f); // 设置音调
//                mSpeech.setSpeechRate(1.5f); // 设置语速
                if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                    //语音合成初始化失败,不支持语种
                    mIsInited = false;
                } else {
                    mIsInited = true;
                }
                mSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                    @Override
                    public void onStart(String utteranceId) {
                        //======语音合成 Start
                        if (mSpeedListener != null)
                            mSpeedListener.onStart(utteranceId);
                    }

                    @Override
                    public void onDone(String utteranceId) {
                        //======语音合成 Done
                        if (mSpeedListener != null)
                            mSpeedListener.onDone(utteranceId);
                    }

                    @Override
                    public void onError(String utteranceId) {
                        //======语音合成 Error
                        if (mSpeedListener != null)
                            mSpeedListener.onError(utteranceId);
                    }
                });
            }
        });
    }

    public void setSpeechListener(UtteranceProgressListener listener) {
        this.mSpeedListener = listener;
    }

    public boolean speakText(String text) {
        if (!mIsInited) {
            //语音合成失败,未初始化成功
            init();
            return false;
        }
        if (mSpeech != null) {
            int result = mSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, "");
            return result == TextToSpeech.SUCCESS;
        }
        return false;
    }

    public void stop() {
        if (mSpeech != null && mSpeech.isSpeaking()) {
            mSpeech.stop();
        }
    }

    public boolean isSpeaking() {
        if (mSpeech == null)
            return false;
        return mSpeech.isSpeaking();
    }


    public void destory() {
        if (mSpeech != null) {
            mSpeech.stop();
            mSpeech.shutdown();
        }
    }
}

使用

//在应用启动时初始化一次
TtsManager.getInstance().init();

//在需要使用的地方调用
TtsManager.getInstance().speakText("需要合成的内容");

第三方SDK集成

具体集成步骤请看其官网集成文档

上一篇 下一篇

猜你喜欢

热点阅读