ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

为何无法始终使用文本转语音(TTS)?

2019-11-22 02:24:09  阅读:635  来源: 互联网

标签:text-to-speech android


我无法弄清楚为什么TTS无法始终如一地工作.我想了解如何改善当前设置.该应用程序从TTS开始,欢迎用户或提示用户说出语音命令.因此,在onCreate中,我仅具有以下内容:

textToSpeech = new TextToSpeech(TTSActivity.this, this); 

我的TTSActivity类实现OnInitListener,所以我也有以下重写方法:

@Override
    public void onInit(int status) {

        if (status == TextToSpeech.SUCCESS) {
            textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {

                @Override
                public void onStart(String utteranceId) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void one rror(String utteranceId) {               
                    // TODO Auto-generated method stub

                }

                @Override
                public void onDone(String utteranceId) {
                    //do some work here
                }
            });

            textToSpeech.setLanguage(Locale.US);
            map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "UniqueID");

            ttsString(0);

        } else if (status == TextToSpeech.ERROR){
            //try to restart TTS
            textToSpeech = new TextToSpeech(TTSActivity.this, this);
            ttsString(0);
        }
    } //end onInit() method

一些解释:存在textToSpeech.setOnUtteranceProgressListener(),以便在TTS引擎停止讲话后就可以激活语音识别. map来自HashMap map = new HashMap()和ttsString是我希望TTS讲话的所有字符串.因此,我的ttsString(id#)方法如下所示.在说TTS之前,我先调用ttsString(id#)设置字符串.

private void ttsString(int id)
    {   

        switch (id)
        {
            case 0:{
                metaString = "Say string one";
                    speakText(metaString);
                    break;
            }
            case 1:{
                    metaString = "Say string two";
                    speakText(metaString);
                    break;
            }
            case 2:{
                    metaString = "Say string three";
                    speakText(metaString);
                    break;
            }

        }
    }

这就是我让TTS发言的方式:

private void speakText(String text) {
        if(textToSpeech.isSpeaking()) {
            return;
        } else {
            textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, map);
        } 
    }

我没有收到TTS未绑定的错误,所有操作都在某个时间点进行,但并不一致.换句话说,有时程序会说话,有时却不会.你建议我做什么?重组?

解决方法:

一些提示:

在您的if(状态== TextToSpeech.ERROR)中,调用ttsString(0);将始终失败,因为TTS尚未初始化.

您似乎没有调用tts.shutdown().实际上,我会在onStart()中初始化tts,并在onStop()中调用shutdown().

在我的应用程序中,我已将TTS投入使用,因此在配置更改期间重新创建我的活动/片段时,不必理会所有初始化/取消初始化.

查看logcat,应该看到任何错误.据我记得,问题出在使用svox语音时,出现了奇怪的错误,原因是未正确调用shutdown.

标签:text-to-speech,android
来源: https://codeday.me/bug/20191122/2056447.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有