TextToSpeech的多个实例

时间:2017-12-23 09:33:42

标签: android

我需要说多种语言。我为TextToSpeech创建了一个数组。

private TextToSpeech[]              mTextSpeechs_;
mTextSpeechs_           = new TextToSpeech[5];
    mTextSpeechs_[0] = new TextToSpeech(this, new TextToSpeech.OnInitListener()
    {
        @Override
        public void onInit(int status) 
        {
            mTextSpeechs_[0].setLanguage(Locale.CHINESE);
            mTextSpeechs_[0].speak(getString(R.string.string_main_chineseready), TextToSpeech.QUEUE_FLUSH, null,"Display");
        }           
    });
    mTextSpeechs_[1] = new TextToSpeech(this, new TextToSpeech.OnInitListener()
    {
        @Override
        public void onInit(int status) 
        {
            mTextSpeechs_[1].setLanguage(Locale.forLanguageTag("yue-HK"));
            mTextSpeechs_[1].speak(getString(R.string.string_main_hongkong), TextToSpeech.QUEUE_FLUSH, null,"Display");
        }           
    });
    mTextSpeechs_[2] = new TextToSpeech(this, new TextToSpeech.OnInitListener()
    {
        @Override
        public void onInit(int status) 
        {
            mTextSpeechs_[2].setLanguage(Locale.JAPAN);
            mTextSpeechs_[2].speak(getString(R.string.string_main_japan), TextToSpeech.QUEUE_FLUSH, null,"Display");
        }           
    });
    mTextSpeechs_[3] = new TextToSpeech(this, new TextToSpeech.OnInitListener()
    {
        @Override
        public void onInit(int status) 
        {
            mTextSpeechs_[3].setLanguage(Locale.KOREA);
            mTextSpeechs_[3].speak(getString(R.string.string_main_korea), TextToSpeech.QUEUE_FLUSH, null,"Display");
        }           
    });
    mTextSpeechs_[4] = new TextToSpeech(this, new TextToSpeech.OnInitListener()
    {
        @Override
        public void onInit(int status) 
        {
            mTextSpeechs_[4].setLanguage(Locale.ENGLISH);
            mTextSpeechs_[4].speak(getString(R.string.string_main_english), TextToSpeech.QUEUE_FLUSH, null,"Display");
        }           
    });
....
//type 0 flush
//type 1 add
public void speakMultiLanguage(String text, int type,int langidx)
{       
    if( type == 0 )
        mTextSpeechs_[langidx_].speak(text, TextToSpeech.QUEUE_FLUSH, null,"Display");
    else if( type == 1)
        mTextSpeechs_[langidx_].speak(text, TextToSpeech.QUEUE_ADD, null,"Display");
}

现在,当我调用speakMultiLanguage函数说出指定语言时,它会延迟大约5秒钟发言。如果最后一种语言相同,则不会延迟。有没有人给我解决延迟的解决方案?

1 个答案:

答案 0 :(得分:0)

我没有测试你在阵列中多次使用TTS的特殊情况。但对我来说,它看起来没有生产力,特别是内存和资源使用。 在我的例子中,我只在My Activity的tts.setLanguge(Locale)方法中初始化了一个TTS对象。当我需要将语言改为另一个时,我将使用@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS){ tts.setLanguage(Locale.ENGLISH); }else{ Log.e(TAG, "TTS fault"); } } }); //.... } 。 在我的情况下和我的虚拟设备这个解决方案立即工作。 初始化:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private void prepareTTS(Locale newLocale){
        if (!tts.getVoice().getLocale().getISO3Language().equals(newLocale.getISO3Language())) {
            tts.setLanguage(newLocale);
            Log.d(TAG, "ChangeTo: " + newLocale.getISO3Language());
        }else{
            Log.d(TAG, "The same");
        }
    }

变化:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
    private void ttsSpeak21(String text){

        String utteranceId = this.hashCode() + "";
        int result = tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
        if (result == TextToSpeech.ERROR){
            Log.d(TAG, "Can't say");
        }else {
            Log.d(TAG, lang + "speaking!");
        }
    }

语音:

@Override
    protected void onDestroy() {
        if (tts != null){
            tts.stop();
            tts.shutdown();
        }
        super.onDestroy();
    }

免费资源:

id
相关问题