2015-11-14 28 views
0

我正在開發一個帶有TextToSpeech的節拍器應用程序。我有點發了Metronome類來處理所有的這些東西(這是完整的代碼,但我會告訴你在哪裏稍後重點關注。):如何讓TextToSpeech講得更快?

public class Metronome { 
    private static final int DEFAULT_BPM = 115; 
    private Timer timer; 
    private int tempo; 
    private int maxBeats; 
    private int currentBeat; 
    private BeatDivider inBeat; 
    private BeatType beatType; 

    private TextToSpeech tts; 

    public void setMaxBeats(int maxBeats) { 
     this.maxBeats = maxBeats; 
    } 

    public void setTempo (int tempo) { 
     timer.setInterval (getMillisecondsFromBpm (tempo, beatType)); 
     this.tempo = tempo; 
    } 

    public void setBeatType (BeatType type) { 
     beatType = type; 
     setTempo (tempo); 
    } 

    public int getMaxBeats() { 
     return maxBeats; 
    } 

    public BeatDivider getInBeat() { 
     return inBeat; 
    } 

    public int getTempo() { 
     return tempo; 
    } 

    public void reset() { 
     if (!timer.isPaused()) 
      throw new IllegalStateException ("Timer cannot be running when reset"); 

     inBeat = BeatDivider.ON_BEAT; 
     currentBeat = 1; 
    } 

    public void start() { 
     timer.startTimer(); 
    } 

    public void stop() { 
     timer.stopTimer(); 
     reset(); 
    } 

    public boolean isRunning() { 
     return !timer.isPaused(); 
    } 

    public Metronome (Context c) { 
     timer = new Timer (new Runnable() { 
      @Override 
      public void run() { 
       beep(); 
       increment(); 
      } 
     }, getMillisecondsFromBpm (DEFAULT_BPM, BeatType.QUARTER), false); 
     tts = new TextToSpeech (c, new TextToSpeech.OnInitListener() { 
      @Override 
      public void onInit(int status) { 

      } 
     }); 
     tts.setSpeechRate (2); 
     setBeatType (BeatType.QUARTER); 
     setMaxBeats (4); 
     setTempo (DEFAULT_BPM); 
    } 

    private int getMillisecondsFromBpm (int bpm, BeatType type) { 
     int ms = (int)Math.pow (bpm/60.0, -1) * 1000; 

     switch (type) { 
      case QUARTER: 
       return ms; 
      case EIGHTH: 
       return ms/2; 
      case SIXTEENTH: 
       return ms/4; 
     } 

     return ms; 
    } 

    private void increment() { 
     if (beatType == BeatType.QUARTER) { 
      incrementBeat(); 
     } else if (beatType == BeatType.EIGHTH) { 
      incrementEighth(); 
     } else if (beatType == BeatType.SIXTEENTH) { 
      incrementSixteenth(); 
     } 
    } 

    private void incrementSixteenth() { 
     switch (inBeat) { 
      case E: 
       inBeat = BeatDivider.AND; 
       break; 
      case A: 
       inBeat = BeatDivider.ON_BEAT; 
       incrementBeat(); 
       break; 
      case ON_BEAT: 
       inBeat = BeatDivider.E; 
       break; 
      case AND: 
       inBeat = BeatDivider.A; 
     } 
    } 

    private void incrementEighth() { 
     switch (inBeat) { 
      case E: 
      case ON_BEAT: 
       inBeat = BeatDivider.AND; 
       break; 
      case A: 
      case AND: 
       inBeat = BeatDivider.ON_BEAT; 
       incrementBeat(); 
       break; 
     } 
    } 

    private void incrementBeat() { 
     inBeat = BeatDivider.ON_BEAT; 
     if (currentBeat < maxBeats) { 
      currentBeat++; 
     } else { 
      currentBeat = 1; 
     } 
    } 

    private void beep() { 
     tts.speak (getBeatString(), TextToSpeech.QUEUE_FLUSH, null); 
    } 

    private String getBeatString() { 
     switch (inBeat) { 
      case ON_BEAT: 
       default: 
       return Integer.toString (currentBeat); 
      case E: 
       return "e"; 
      case AND: 
       return "and"; 
      case A: 
       return "Ah"; 
     } 
    } 

    public enum BeatDivider { 
     ON_BEAT, 
     E, 
     AND, 
     A 
    } 

    public enum BeatType { 
     QUARTER, 
     EIGHTH, 
     SIXTEENTH 
    } 
} 

說明:

Timer類剛做它說的。這是我的自定義實現。那裏應該沒有問題。這個想法是,用戶可以設置節奏(tempo),拍號(maxBeats)和音符類型(BeatType)。使用四分音符時,它會變成1 2 3 4,第八個音符變成1和2以及3和4,依此類推。 TextToSpeech會說出這些話。

問題:

當我增加了BPM爲80或90的東西時,TTS不說話!不知何故,當我減少bpm時,它會像1 3 1 3 1 3一樣。原因是它說得太慢。

我試圖解決它:

因爲我認爲它說話慢慢的,我增加了語速爲4。但是同樣的事情再次發生!然後我嘗試使用QUEUE_ADD而不是QUEUE_FLUSH。當我將bpm從60增加到150時,tts仍然以最初的速度說話!然後我試着按下停止按鈕,但在那之後,tts仍然不停地說話,說話和說話,直到我的活動finish()

我真的很想知道如何解決這個問題。我想減少發言時間是我需要做的。但是如何?或者,如果我用「嗶」聲替換tts並使用MediaPlayer,這是否會發生?

回答

0

您可以通過tts.setPitch(1)更改速度;和tts.setSpeechRate(2);

+0

我試圖做到這一點,但它只是增加了說話的速度,而不是講話之間的間隔。 – Sweeper

+0

您是否嘗試過增加音高超過1. – Shekhar

+0

我剛纔嘗試過。仍然不起作用。 :( – Sweeper