android 语音提醒,文字转语音播放

版权声明: https://blog.csdn.net/xu_coding/article/details/81879338

android本身具有文字转语音播放的TTS,一些第三方的sdk,想百度语音,科大讯飞语音等等都提供了文字转语音播放的功能,但这些第三方sdk大都收费,还挺贵的。
这里推荐两种方法:1、android自带的TTS,适合播放量比较大的文本。部分手机不支持中文播放。声音比较难听
2、MediaPlayer播放语音,就类似支付宝语音到账的提醒等,不适合播放大量的文本,声音可以定制,可以由声优的录音播放。

下面介绍一下两种播放的代码。 代码地址

第一种播放方式 TTS

public class MyTTS extends UtteranceProgressListener {
    private  TextToSpeech tts;
    private boolean isSupportCN = true;
    private static MyTTS instance;

    public static MyTTS getInstance(Context context){
        if(instance == null){
            synchronized(MyTTS.class){
                instance = new MyTTS(context.getApplicationContext());
            }
        }
        return instance;
    }

    private MyTTS(final Context context){
        tts =  new TextToSpeech(context , new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if(status==TextToSpeech.SUCCESS){
                    int result = tts.setLanguage(Locale.CHINA);
                    tts.setPitch(1.0f);
                    tts.setSpeechRate(1.0f);
                    tts.setOnUtteranceProgressListener(MyTTS.this);
                    if(result == TextToSpeech.LANG_NOT_SUPPORTED || result ==TextToSpeech.LANG_MISSING_DATA){
                        isSupportCN = false;
                        Toast.makeText(context,"抱歉,不支持中文播放",Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
    }

    @Override
    public void onStart(String utteranceId) {
        Log.d("xulc","onStart---utteranceId--->"+utteranceId);
    }

    @Override
    public void onDone(String utteranceId) {
        Log.d("xulc","onDone---utteranceId--->"+utteranceId);
    }

    @Override
    public void onError(String utteranceId) {
        Log.d("xulc","onError---utteranceId--->"+utteranceId);
    }


    public TextToSpeech getTts() {
        return tts;
    }

    public boolean isSupportCN() {
        return isSupportCN;
    }

}

第二种 Mediaplayer播放的方法

public class VoicePlayer {
    private ConcurrentLinkedQueue<VoiceUnit> voiceUnitList;
    private int index = 0;   //播放的下标位置
    private MediaPlayer mediaPlayer;
    private Context mcontext;
    private boolean isPlaying = false;

    private static VoicePlayer instance;
    public static VoicePlayer getInstance(Context context){
        if(instance==null){
            synchronized (VoicePlayer.class){
                instance = new VoicePlayer(context.getApplicationContext());
            }
        }
        return instance;
    }

    private VoicePlayer(Context context){
        voiceUnitList = new ConcurrentLinkedQueue<>();
        mcontext = context;
    }

    public void addVoiceUnit(VoiceUnit unit){
        voiceUnitList.add(unit);
    }

    public void play(){   //调动播放
        if(isPlaying){  //正在播放

        }else{
            isPlaying = true;
            playVoice();
        }
    }


    private void playVoice(){
        if(mediaPlayer==null){
            mediaPlayer = new MediaPlayer();
        }
        VoiceUnit voiceUnit = voiceUnitList.peek();
        if(voiceUnit!=null) {     //内容不为空,播放当前信息
            if (index < voiceUnit.getVoices().length) {   //当前信息未播放完成。播放下一条
                final Uri uri = Uri.parse("android.resource://"+mcontext.getApplicationContext().getPackageName()+"/" +voiceUnitList.peek().getVoices()[index]);
                try {
                    mediaPlayer.setDataSource(mcontext, uri);
                    mediaPlayer.prepare();
                    mediaPlayer.start();
                    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            Log.d("xulc", "播放了一个音频(index = ):"+index+"   "+uri.getPath());
                            mediaPlayer.reset();
                            index++;
                            playVoice();
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }else{  //播放下一项
                Log.d("xulvcheng","播放下一项....");
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        voiceUnitList.poll();
                        index = 0;
                        playVoice();
                    }
                },2000);       //确定是否会造成  内存泄漏
                //200ms 读取下一条
            }
        }else{
            isPlaying = false;  //播放完成
            index = 0;
            Log.d("xulvcheng","播放完成的状态....");
        }
    }

    private Handler handler = new MyHnadler();



    private static class MyHnadler extends Handler {}

    public void destory(){
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
        if(handler!=null){
            handler.removeCallbacksAndMessages(null);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/xu_coding/article/details/81879338