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

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);
        }
    }
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值