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

TTS实现方案

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

  • 1.使用系统内置的TTS

    • 优点:集成简单,免费,google语音引擎对于外语支持友好,中文也还不错
    • 缺点:扩展性相对来说低一点,只用于语音合成(文字转语音),需要设备安装语音引擎并在系统设置中设置默认
  • 2.集成第三方的SDK如百度语音、讯飞语音等

    • 优点:随应用一起部署,功能可扩展性强(语音合成,语音听写,唤醒词)
    • 缺点:集成相对来说复杂,收费,国际化问题,国内的一些语音方案目前对于外语的支持并不是很好

系统内置TTS集成

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

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

  • google text to speech
  • 讯飞语记

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

设置
无障碍
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集成

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

你可能感兴趣的:(TTS(Text To Speech)文字转语音简单实现)