Android TTS no habla gran cantidad de texto

Estoy tratando de hablar gran cantidad de texto usando Android Text To Speech. Uso el motor de voz de google predeterminado. A continuación se muestra mi código.

public class Talk extends Activity implements TextToSpeech.OnInitListener { private ImageView playBtn; private EditText textField; private TextToSpeech tts; private boolean isSpeaking = false; private String finalText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_talk); //Intialize the instance variables playBtn = (ImageView)findViewById(R.id.playBtn); textField = (EditText)findViewById(R.id.textField); //Resister the listeners playBtn.setOnClickListener(new PlayBtnAction()); //Other things tts = new TextToSpeech(this,this); //Get the web page text if called from Share-Via if (Intent.ACTION_SEND.equals(getIntent().getAction())) { new GetWebText().execute(""); } } //This class will execute the text from web pages private class GetWebText extends AsyncTask<String,Void,String> { @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub String text = getIntent().getStringExtra(Intent.EXTRA_TEXT); String websiteText = ""; try { //Create a URL for the desired page URL url = new URL(text); // Read all the text returned by the server BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; StringBuffer strBuffer = new StringBuffer(""); while ((str = in.readLine()) != null) { strBuffer.append(str+"\n"+"\n"); } in.close(); String html = strBuffer.toString(); Document doc = Jsoup.parse(html); websiteText = doc.body().text(); // "An example link" //Toast.makeText(this, websiteText, Toast.LENGTH_LONG).show(); } catch(Exception e) { Log.e("web_error", "Error in getting web text",e); } return websiteText; } @Override protected void onPostExecute(String result) { textField.setText(result); } } } //Class to speak the text private class PlayBtnAction implements OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub if(!isSpeaking) { isSpeaking = true; //speak(textField.getText().toString()); finalText = textField.getText().toString(); new SpeakTheText().execute(finalText); isSpeaking = false; } else { isSpeaking = false; tts.stop(); } } } @Override public void onInit(int status) { // TODO Auto-generated method stub if(status==TextToSpeech.SUCCESS) { int result = tts.setLanguage(Locale.UK); if(result==TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Toast.makeText(this, "Language Not Supported", Toast.LENGTH_LONG).show(); } } } //This class will speak the text private class SpeakTheText extends AsyncTask<String,Void,String> { @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub tts.speak(params[0], TextToSpeech.QUEUE_FLUSH, null); return null; } } @Override public void onDestroy() { if(tts!=null) { tts.stop(); tts.shutdown(); } super.onDestroy(); } } 

Pero el problema aquí es, cuando hay un gran trozo de texto (digamos que ha extraído texto de una página web) el TTS no logra leerlo. Si elimino la mayor parte del texto, lo leeré. ¿Por qué está pasando esto?

Cuando estoy a punto de leer el texto grande, el LogCat sin embargo muestra algo como esto

 10-11 07:26:05.566: D/dalvikvm(2638): GC_CONCURRENT freed 362K, 44% free 3597K/6312K, paused 17ms+8ms, total 93ms 

Por favor ayuda.

La longitud de la cadena no debe ser mayor que la longitud predefinida, de docs :

Parámetros

Text La cadena de texto a ser hablada. No más de los caracteres getMaxSpeechInputLength () .

El valor devuelto por getMaxSpeechInputLength() puede variar de un dispositivo a otro, pero de acuerdo con la fuente de AOSP que es enorme 4000 :

 /** * Limit of length of input string passed to speak and synthesizeToFile. * * @see #speak * @see #synthesizeToFile */ public static int getMaxSpeechInputLength() { return 4000; } 

Trate de no exceder ese límite: compare la longitud de texto de entrada con ese valor y divida en partes separadas si es necesario.

Es peor que el límite de 4000 caracteres en la práctica en Android. Hay algunos motores TTS que limitan la longitud de entrada mucho más. Por ejemplo, los motores Nuance.tts y vocalizer.tts no hablan ninguna cadena de más de 512 caracteres (de mis pruebas hace algún tiempo). Hoy he alcanzado un límite de menos de 300 caracteres en el paquete es.codefactory.eloquencetts, que simplemente se bloquea si la cadena que le envío es más de 256-300 caracteres. Divido el contenido en oraciones y guardo las oraciones más largas que el límite anterior, subdividiéndolas aún más en el código de mi aplicación.

Greg

Si sigues los consejos de ozbek, deberías estar bien. Yo también tengo grandes archivos de texto que quiero hablar. Simplemente usé el método streamreader y todo funciona bien. Heres 'parte de mi código. Es la parte que debe usar. Mi código hace un poco más de lo que quieres, pero funciona para mí y puede funcionar para usted.

Dim sReader As StreamReader = Nuevo StreamReader (Story_file) Prueba

  Do Until EndOfStream '= True Dim line_to_speak As String = sReader.ReadLine Dim vc = Mid(line_to_speak, 1, 1) <- you dont need this Select Case vc <- you dont need this Case Is = "/" <- you dont need this voice_index = Val(Mid(line_to_speak, 2, 2)) <- you dont need this srate = Val(Mid(line_to_speak, 5, 2)) <- you dont need this edassistv.lstVoices.SelectedIndex = voice_index <- you dont need this selected_voice = edassistv.lstVoices.SelectedItem <- you dont need this Case Else<- you dont need this synth.SelectVoice(selected_voice) synth.Speak(line_to_speak) End Select<- you dont need this Loop Catch ex As Exception GoTo finish 

Utilice este código … Trabajando para cualquier archivo .. acaba de enviar la cadena de función de voz ..

 private void speech(String charSequence) { int position ; int sizeOfChar= charSequence.length(); String testStri= charSequence.substring(position,sizeOfChar); int next = 20; int pos =0; while(true) { String temp=""; Log.e("in loop", "" + pos); try { temp = testStri.substring(pos, next); HashMap<String, String> params = new HashMap<String, String>(); params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, temp); engine.speak(temp, TextToSpeech.QUEUE_ADD, params); pos = pos + 20; next = next + 20; } catch (Exception e) { temp = testStri.substring(pos, testStri.length()); engine.speak(temp, TextToSpeech.QUEUE_ADD, null); break; } } } 
  • TextToSpeech versión de compilación android no reproduce audio
  • Cómo deshabilitar la accesibilidad "TalkBack" en su aplicación?
  • Cómo encuestar los motores TTS disponibles para los idiomas disponibles sin instanciar cada uno y wating para init
  • Cómo cambiar programáticamente el motor predeterminado TTS
  • KitKat tarda 6 segundos más que Froyo para reaccionar a TextToSpeech.speak () en primera llamada
  • Manejo de múltiples idiomas sin demora en el TTS de Android
  • Texto de Android a voz Voz masculina
  • Problema de STOP de texto a voz
  • ¿Cómo puedo guardar el archivo Text to Speech como formato .wav / .mp3 en idioma árabe en External Storage?
  • Pausa tono del teléfono mientras habla a través de texto a voz y luego reanudar
  • TextToSpeech.OnInitListener.onInit (int) que se llama continuamente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.