TTS(Text To Speech)文字轉(zhuǎn)語音簡單實現(xiàn)

TTS實現(xiàn)方案

實現(xiàn)TTS有大體上有兩種方案:

  • 1.使用系統(tǒng)內(nèi)置的TTS

    • 優(yōu)點:集成簡單,免費,google語音引擎對于外語支持友好,中文也還不錯
    • 缺點:擴展性相對來說低一點,只用于語音合成(文字轉(zhuǎn)語音),需要設(shè)備安裝語音引擎并在系統(tǒng)設(shè)置中設(shè)置默認(rèn)
  • 2.集成第三方的SDK如百度語音、訊飛語音等

    • 優(yōu)點:隨應(yīng)用一起部署,功能可擴展性強(語音合成,語音聽寫,喚醒詞)
    • 缺點:集成相對來說復(fù)雜,收費,國際化問題,國內(nèi)的一些語音方案目前對于外語的支持并不是很好

系統(tǒng)內(nèi)置TTS集成

1.安裝語音引擎并在設(shè)置為默認(rèn)TTS

原生Android系統(tǒng)自帶了一個Pico TTS引擎,但不支持中文;國產(chǎn)手機大部分中默認(rèn)裝了訊飛TTS引擎

下載安裝后,打開無障礙進(jìn)行設(shè)置

設(shè)置
無障礙
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); // 設(shè)置音調(diào)
//                mSpeech.setSpeechRate(1.5f); // 設(shè)置語速
                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();
        }
    }
}

使用

//在應(yīng)用啟動時初始化一次
TtsManager.getInstance().init();

//在需要使用的地方調(diào)用
TtsManager.getInstance().speakText("需要合成的內(nèi)容");

第三方SDK集成

具體集成步驟請看其官網(wǎng)集成文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容