zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    SharePoint 2013 商务智能报表发布
    sharepoint designer web 服务器似乎没有安装microsoft sharepoint foundation
    SharePoint 2013 Designer系列之数据视图
    SharePoint 2013 Designer系列之数据视图筛选
    SharePoint 2013 Designer系列之自定义列表表单
    SharePoint 2013 入门教程之创建及修改母版页
    SharePoint 2013 入门教程之创建页面布局及页面
    SharePoint 2010 级联下拉列表 (Cascading DropDownList)
    使用SharePoint Designer定制开发专家库系统实例!
    PL/SQL Developer 建立远程连接数据库的配置 和安装包+汉化包+注册机
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/10057730.html
Copyright © 2011-2022 走看看