安卓利用谷歌文字转语音引擎实现离线文字播报语音

Text To Speech即TTS技术

原生Android系统自带了一个Pico TTS引擎,但不支持中文;市面上离线的文字转语音,某讯,某度都是收费的,并且还设计到版权的问题, 实际上谷歌内置TextToSpeach类帮助开发者实现这一功能, 市场上的手机很多已经内置了文字转语音的引擎, 如果没有则安装一个apk即可,切换一下, 如下图所示: 

点击Google文字转语音引擎设置, 下载中文的安装包; 即可以在代码中进行语音播报, 

package hz.hzhztech.publiclibrary.utils;

import android.content.Context;
import android.os.Build;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.support.annotation.RequiresApi;

import com.blankj.utilcode.util.ToastUtils;

import java.util.Locale;

import hz.hzhztech.publiclibrary.application.App;

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(App.getInstance(), new TextToSpeech.OnInitListener() {


            @Override
            public void onInit(int status) {
                if (status == TextToSpeech.SUCCESS) {
                    int result = mSpeech.setLanguage(Locale.CHINESE);
//                mSpeech.setPitch(1.0f); // 设置音调
//                mSpeech.setSpeechRate(1.5f); // 设置语速
                    if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                        //语音合成初始化失败,不支持语种
                        mIsInited = false;
                        ToastUtils.showLong("语音不可用,请确认是否安装语音引擎");
                    } 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 = 0;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                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();
        }
    }
}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值