我正在android上使用语音实现文字阅读。
代码有效,但我发现TextToSpeech
一次只能读取超过4000个字符的难度。
当超出TextToSpeech
允许的限制时,如何让我的方法读取所有文字?
似乎最好的方法是创建一种机制,将几个部分中的文本分开,并在一种读数队列中读取它。我试图通过在循环tts.speak (partText, TextToSpeech.QUEUE_ADD, bundle, null)
内调用来读取不同的部分,但只读取第一次出现的循环。
我一直在研究并在几个网站上谈论使用QUEUE_ADD
和onUtterance
,但我无法弄清楚如何实现或创建该读取队列。
这是我的代码:
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);
}
}