5

Użyłem poniżej kod do syntetyzowania .txt plik .mp3 pliku przy użyciu Android wbudowaną TTS Engine.TextToSpeech zajmuje zbyt dużo czasu podczas synthesizeToFile w Androidzie

Kod:

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..."); 
       } 
      }); 

Powyżej znajduje się przykładowy kod. Oto przepływ wykonywania aplikacji:

  1. plik uzyskać z karty SD
  2. plik Synthesize mp3
  3. odtworzyć plik mp3

Problem: Gdy plik Synthesization odbywa się wówczas wyłącznie Mogę odtwarzać plik mp3. Nawet w przypadku pliku o rozmiarze 1 mb zajmuje to około 1 minuty.

Czy mogę coś poprawić?

Musimy użyć MediaPlayer, ponieważ potrzebujemy grać/wstrzymać czytnik.

Dzięki.

+0

Może być użytecznym łączem [android-sdk-using-text-to-speech-engine] (http://code.tutsplus.com/tutorials/android-sdk-using-the-text-to-speech -engine - mobile-8540) –

+1

Czy syntetyzuje się szybciej niż mówienie? Jeśli tak, to dlaczego nie zsyntetyzować i nie odtwarzać w mniejszych porcjach? Pierwszy plik MP3 zostanie utworzony i będzie gotowy do szybkiego odtwarzania, a jeśli inne porcje zostaną przetworzone wystarczająco szybko w tle, będą zawsze gotowe do odtwarzania po odtworzeniu poprzedniego. –

+0

Czy jest to jedyny powód, dla którego musisz dokonać syntezy przed "wypowiedzeniem" wypowiedzi, ze względu na konieczność wstrzymania odtwarzania? Ile znaków próbujesz zsyntetyzować? Silniki mają limit na to, ile mogą zaakceptować - to zależy od silnika. Dane wyjściowe to wav/pcm, a nie mp3 - czy uruchamiasz to przez jakąś konwersję, czy jest to błąd w sposobie oznaczania pliku? – brandall

Odpowiedz

3

Rozwiązałem ten problem, konwertując cały plik na fragmenty akapitów i dodając akapity do mechanizmu TTS i odtwarzane bezpośrednio.

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(); 
     } 
    } 

Dzięki.

+0

Proszę również dodać metodę getCurrentFileChunks() – Ragini

Powiązane problemy