5

I unten Code verwendet haben .txt Datei zu .mp3 Datei mit Android eingebaute in TTS Engine zur Synthese.TextToSpeech nimmt zu viel Zeit, während synthesizeToFile in Android

Code:

textToSpeech.synthesizeToFile(readFileText, utterParam, destinationFileName); 

textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() { 
       @Override 
       public void onStart(final String utteranceId) { 
        Log.e(TAG, "onStart..."); 
       } 

       @Override 
       public void onDone(final String utteranceId) { 
        Log.e(TAG, "onDone..."); 
       } 

       @Override 
       public void onError(String utteranceId) { 
        Log.e(TAG, "onError..."); 
       } 
      }); 

Oben ist Beispielcode. ist hier Fluss Anwendungsausführung:

  1. Get-Datei von SD-Karte
  2. Synthesize-Datei mp3
  3. eine MP3-Datei

    Ausgabe

Spielen: Wenn Datei Synthetisierung erfolgt dann nur Ich kann MP3-Datei abspielen. Für eine gerade Datei der Größe 1 mb dauert es etwa 1 Minute.

Gibt es eine Verbesserung, die ich tun kann?

Hinweis: Wir müssen MediaPlayer verwenden, da wir den Leser abspielen/pausieren müssen.

Danke.

+0

Kann nützlicher Link sein [http://code.tutsplus.com/tutorials/android-sdk-using-the-text-to-speech -engine - mobile-8540) –

+1

Synthetisiert schneller als sprechen? Wenn ja, warum nicht synthetisieren und in kleineren Stücken abspielen? Die erste MP3-Datei wird dann erstellt und kann schneller abgespielt werden, und wenn die anderen Stücke schnell genug im Hintergrund bearbeitet werden können, sind sie immer bereit, auf die Wiedergabe zu warten, wenn die vorherige abgespielt wurde. –

+0

Ist der einzige Grund, dass Sie vor dem "Sprechen" der Äußerung synthetisieren müssen, weil Sie die Wiedergabe anhalten müssen? Wie viele Zeichen versuchst du zu synthetisieren? Motoren haben eine Grenze, wie viele sie akzeptieren können - dies unterscheidet sich pro Motor. Die Ausgabe ist wav/pcm nicht mp3 - führen Sie dies durch eine Konvertierung oder ist dies ein Fehler bei der Kennzeichnung der Datei? – brandall

Antwort

3

Ich habe dieses Problem gelöst, ganze Datei in Abschnitte von Absätzen umzuwandeln und Absätze in TTS Engine hinzuzufügen und direkt zu spielen.

public static String[] convertFileToParagraph(String fileContent) { 

//  String pattern = "(?<=(rn|r|n))([ \t]*$)+"; 
     String pattern = "([ \\t\\r]*\\n[ \\t\\r]*)+"; 
     return Pattern.compile(pattern, Pattern.MULTILINE).split(fileContent); 
    } 

/** 
    * Divides files in to paragraphs 
    */ 
    private void divideFileToChunks() { 
     try { 
      currentFileChunks = convertFileToParagraph(fileContent); 
      currentFileChunks = makeSmallChunks(currentFileChunks); 
      addChunksToTTS(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Divides file paragraphs into sentences of 200 characters 
    * 
    * @param currentFileChunks : list of paragraphs 
    * @return : list of divided file 
    */ 
    private String[] makeSmallChunks(String[] currentFileChunks) { 
     try { 
      ArrayList<String> smallChunks = new ArrayList<>(); 
      for (int i = 0; i < currentFileChunks.length; i++) { 
       String chunk = currentFileChunks[i]; 
       if (chunk != null && chunk.length() > 200) { 
        int length = chunk.length(); 
        int count = length/200; 
        int modulo = length % 200; 
        for (int j = 0; j < count; j++) { 
         smallChunks.add(chunk.substring(200 * j, (200 * j) + 199)); 
        } 
        if (modulo > 0) { 
         smallChunks.add(chunk.substring(chunk.length() - 1 - modulo, chunk.length() - 1)); 
        } 
       } else { 
        smallChunks.add(chunk); 
       } 
      } 
      return smallChunks.toArray(new String[smallChunks.size()]); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return currentFileChunks; 
     } 
    } 

    /** 
    * Add all chunks to TTS(Text to Speech) Engine 
    */ 
    private void addChunksToTTS() { 
     try { 
      String[] chunks = getCurrentFileChunks(); 
      if (chunks != null && chunks.length > 0) { 
       for (int i = currentChunk; i < chunks.length; i++) { 
        utterParam.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, String.valueOf(i)); 
        textToSpeech.speak(chunks[i], TextToSpeech.QUEUE_ADD, utterParam); 
        imgBtnT2SPlay.setImageResource(R.drawable.icon_pause_white); 
        edtT2SFileContents.setEnabled(false); 
        isPlaying = true; 
       } 
      } 

      if (progressDialog != null && progressDialog.isShowing()) { 
       progressDialog.dismiss(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Danke.

+0

Bitte fügen Sie auch getCurrentFileChunks() Methode hinzu – Ragini