2015-03-13 8 views
5

sto sviluppando un modulo per leggere il file di testo e riprodurre come voce utilizzando TTS. ho integrato con successo TTS nel mio modulo. e anche leggendo e parlando i primi 4000 caratteri.Come utilizzare TTS (TextToSpeech) mentre la stringa ha più di 4000 caratteri in Android

Ho una stringa con più di 4000 caratteri, potrebbe avere anche più di 10000. in questo momento non riesco a leggere file e riprodurre utilizzando TTS.

ho provato suddividendo la stringa grande in una piccola parte di stringa. ogni parte di stringa ha 4000 caratteri.

mentre sto suonando la prima parte di stringa, funziona correttamente come richiesto. ma dopo aver completato la prima parte di stringa, voglio iniziare subito la seconda parte. ma TTS non l'ha avviato.

sto usando

int pos = 0; 

while(true) { 

      String var = ""; 

      try { 
       var = str.substring(pos, 3999); 
       pos += 3999; 
      } catch(Exception e) { 
       var = str.substring(pos, str.length()); 
       break; 
      } 

      HashMap<String, String> map = new HashMap<String, String>(); 
      map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "utteranceId"); 
      tts.speak(var, TextToSpeech.QUEUE_ADD, map); 
     } 

ho provato un sacco. anche cercato sul web ma non ottenendo alcuna buona soluzione.

c'è un setOnUtteranceCompletedListener(), penso che questo possa essere utile. ma come può qualcuno, per favore, aiutarmi. come posso riprodurre testi di grandi dimensioni usando TTS. o qualsiasi altra tecnica disponibile?

+1

possibile duplicato di [testo TTS Android più lungo di 4 caratteri non riproducibili] (http://stackoverflow.com/questions/13440251/android-tts-text-longer-than-4k-chars-not-playing) – cygery

risposta

0

Puoi provare a utilizzare:

tts.speak(var, TextToSpeech.QUEUE_FLUSH, map); 

Suppongo che, come avete fatto nel codice scritto, dopo la prima iterazione del tubo è pieno e non sono in grado di aggiungere altro testo. Penso che lo svuotamento del contenuto della pipa con QUEUE_FLUSH e l'invocazione della sintesi con la nuova enunciazione funzionerebbero.

È possibile verificare se questo è vero ad esempio impostando la lunghezza di enunciazione su 1000. Se è come ho detto che sei in grado di riprodurre 3 blocchi di testo terminano quando si avvia il quarto, non dovrebbe funzionare più perché la pipa è pieno.

Ti suggerisco di non dividere il limite del motore. Potresti dividere il limite più vicino in modo da non perdere i ritardi. Vorrei anche suggerire di usare una variabile globale per definire il limite, perché forse cambierà nelle versioni future. È possibile ottenere il limite di coda con

tts.getMaxSpeechInputLength(); 
0

Ho anche cercato di trovare ovunque ma non ho trovato risposta esatta ma sicuramente ho avuto qualche aiuto. Devi rompere il tuo lungo paragrafo in piccoli pezzi di frasi. È possibile utilizzare il metodo qui sotto per farlo.

private void speech(String charSequence) { 
    /// 
    Pattern re = Pattern.compile("[^.!?\\s][^.!?]*(?:[.!?](?!['\"]?\\s|$)[^.!?]*)*[.!?]?['\"]?(?=\\s|$)", Pattern.MULTILINE | Pattern.COMMENTS); 
    Matcher reMatcher = re.matcher(charSequence); 
    ///// 
    int position=0 ; 
    int sizeOfChar= charSequence.length(); 
    String testStri= charSequence.substring(position,sizeOfChar); 
    while(reMatcher.find()) { 
     String temp=""; 

     try { 

      temp = testStri.substring(charSequence.lastIndexOf(reMatcher.group()), charSequence.indexOf(reMatcher.group())+reMatcher.group().length()); 
      textToSpeech.speak(temp, TextToSpeech.QUEUE_ADD, null,"speak"); 


     } catch (Exception e) { 
      temp = testStri.substring(0, testStri.length()); 
      textToSpeech.speak(temp, TextToSpeech.QUEUE_ADD, null); 
      break; 

     } 

    } 

} 

Basta passare il testo con questo metodo e leggerà il testo.

Problemi correlati