使用TextToSpeech阅读带语音的长文本

时间:2017-10-15 18:02:06

标签: java android text-to-speech

我正在上使用语音实现文字阅读。

代码有效,但我发现TextToSpeech一次只能读取超过4000个字符的难度。

当超出TextToSpeech允许的限制时,如何让我的方法读取所有文字?

似乎最好的方法是创建一种机制,将几个部分中的文本分开,并在一种读数队列中读取它。我试图通过在循环tts.speak (partText, TextToSpeech.QUEUE_ADD, bundle, null)内调用来读取不同的部分,但只读取第一次出现的循环。

我一直在研究并在几个网站上谈论使用QUEUE_ADDonUtterance,但我无法弄清楚如何实现或创建该读取队列。

这是我的代码:

单击阅读图标时调用的方法:

public void ttsFunction() {
        tts = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if (status == TextToSpeech.SUCCESS) {
                    Locale locSpanish = new Locale("spa", "ESP");
                    int result = tts.setLanguage(locSpanish);
                    if (result == TextToSpeech.LANG_MISSING_DATA
                            || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                        Toast.makeText(getApplicationContext(), "Lenguaje no soportado", Toast.LENGTH_SHORT).show();
                    } else {
                        Log.v(TAG, "onInit exitoso");
                        final TextView mTextView = (TextView) findViewById(R.id.txt_oficio);

                        String strTexto = mTextView.getText().toString();
                        leerTexto(strTexto);
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "Falló la inicialización", Toast.LENGTH_SHORT).show();
                }

            }
        });
    }

语音朗读方法

void leerTexto(String strTexto){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Log.v(TAG, "API 21+");
        Bundle bundle = new Bundle();
        bundle.putInt(TextToSpeech.Engine.KEY_PARAM_STREAM, AudioManager.STREAM_MUSIC);
        strTexto = strTexto.substring(0,3999); //Así funciona
        tts.speak(strTexto, TextToSpeech.QUEUE_FLUSH, bundle, null);
    } else {
        Log.v(TAG, "API 15-");
        HashMap<String, String> param = new HashMap<>();
        param.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));
        tts.speak(strTexto, TextToSpeech.QUEUE_FLUSH, param);
    }
}

0 个答案:

没有答案