我正在開發一個帶有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
,這是否會發生?
我試圖做到這一點,但它只是增加了說話的速度,而不是講話之間的間隔。 – Sweeper
您是否嘗試過增加音高超過1. – Shekhar
我剛纔嘗試過。仍然不起作用。 :( – Sweeper