• TTS与MediaPlayer混合使用


    package com.xxx.xxx.Util;
    
    import android.content.Context;
    import android.media.MediaPlayer;
    import android.speech.tts.TextToSpeech;
    import android.util.Log;
    
    import java.io.File;
    import java.util.HashMap;
    import java.util.Locale;
    import java.util.concurrent.ConcurrentLinkedQueue;
    
    public class TTSUtil implements TextToSpeech.OnInitListener {
        private MediaPlayer mediaPlayer = new MediaPlayer();
        private final TextToSpeech mTextToSpeech;//TTS对象
        private final ConcurrentLinkedQueue mBufferedMessages;//消息队列
        private Context mContext;
        private boolean mIsReady;//标识符
    
    
        public TTSUtil(Context context){
            this.mContext=context;//获取上下文
            this.mBufferedMessages=new ConcurrentLinkedQueue();//实例化队列
            this.mTextToSpeech=new TextToSpeech(this.mContext,this);//实例化TTS
        }
    
        //初始化TTS引擎
        @Override
        public void onInit(int status) {
            Log.i("TextToSpeechDemo",String.valueOf(status));
            if(status==TextToSpeech.SUCCESS){
                int result = this.mTextToSpeech.setLanguage(Locale.CHINA);//设置识别语音为英文或者中文
    
                synchronized (this){
                    this.mIsReady=true;//设置标识符为true
                    for(Object bufferedMessage : this.mBufferedMessages){
                        String s = String.valueOf(bufferedMessage);
                        speakText(s);//读语音
                    }
                    this.mBufferedMessages.clear();//读完后清空队列
                }
            }
        }
        //释放资源
        public void release(){
            synchronized (this){
                this.mTextToSpeech.shutdown();
                this.mIsReady=false;
            }
        }
    
        //更新消息队列,或者读语音
        public void notifyNewMessage(String text){
            //如果已经有音频文件,使用MediaPlayer播放
            try {
                File file = new File(mContext.getCacheDir().getAbsolutePath()+"//", text+".wav");
                if(file.exists()) {
    mediaPlayer.reset();
               mediaPlayer.setDataSource(file.getPath()); // 指定音频文件的路径
                    mediaPlayer.prepare(); // 让MediaPlayer进入到准备状态
                    mediaPlayer.start();
                    return;
                }
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
    
            String message=text;
            synchronized (this){
                if(this.mIsReady){
                    speakText(message);
                }else{
                    this.mBufferedMessages.add(message);
                }
            }
        }
        //把TTS朗读结果保存
        public void sayTofile(String text)
        {
            HashMap<String,
                    String> ttsRender = new HashMap<String,
                    String>();
            String destFileName =  mContext.getCacheDir().getAbsolutePath()+"//"+text+".wav";
                ttsRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
                        text);
                this.mTextToSpeech.synthesizeToFile(text,
                        ttsRender, destFileName);
    
        }
        //自定义文字播放
        public void sayFromFile(String text)
        {
            String destFileName = mContext.getCacheDir().getAbsolutePath()+"//"+text+".wav";
            this.mTextToSpeech.addSpeech(text,destFileName);
            this.mTextToSpeech.speak(text,TextToSpeech.QUEUE_FLUSH, null);
        }
        //读语音处理
        private void speakText(String message){
            HashMap params=new HashMap();
            params.put(TextToSpeech.Engine.KEY_PARAM_STREAM,"STREAM_NOTIFICATION");//设置播放类型(音频流类型)
            this.mTextToSpeech.speak(message, TextToSpeech.QUEUE_ADD, params);//将这个发音任务添加当前任务之后
            this.mTextToSpeech.playSilence(100,TextToSpeech.QUEUE_ADD,params);//间隔多长时间
        }
    }

    有些平板上tts有bug,比如华为某64G存储 平板,有时启动不起来,需要点击一下收听示例才行,通过以上程序,第一次使用时可以实现把需要的几个语音文件生成出来,会自动保存语音到文件,之后就可以直接mediaplayer播放语音文件。

    ttsUtil.sayTofile("测试语音");
    ttsUtil.notifyNewMessage("测试语音");
    比如上面第一句话执行后,第二句话直接调用wav文件。
    注:程序中代码片段来自网友分享。

    有的时候播放tts还是会无声情况,直接把wav文件放入程序资源中调用方法:https://www.cnblogs.com/zhaogaojian/p/10128827.html
  • 相关阅读:
    html 输入框 只能输入数字 只能输入字母数字 等组合
    element中table高度自适应问题
    设置千分位问题(改变数据结构形式--转成字符串)
    在element的table接受数据设置千分位问题(不改变数据类型)
    element在使用tab页时,echarts只在第一个页面加载(第二个tab页也在默认tab页显示)问题
    css1
    B/S(Web)实时通讯解决方案
    WebRTC介绍及简单应用
    webpack的编译流程
    01 写一个 mySetInterVal(fn, a, b),每次间隔 a,a+b,a+2b 的时间,然后写一个 myClear,停止上面的 mySetInterVal
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/10057730.html
Copyright © 2020-2023  润新知