這里主要用到了TTS的語音朗讀SDK
最近玩語音朗讀的時候比較多,也在兩個軟件中應用過。其實大多語音朗讀的代碼還是很好寫的,只是像判斷TTS語音朗讀是否結束或者當前語音引擎的狀態稍微要查找一下參數。這里記錄一下:
原本在網上查到的一條關於判斷TTS朗讀完成事件的代碼WaitForSingleObject(spvoice.SpeakCompleteEvent, 200);在delphi 中使用時並沒有達到原本看似應該有的功效,測試時發現這東西只是在TTS合成朗讀流后就返回了,說白了就是TTS剛要朗讀,就被判定成朗讀完成了。仔細查找了一下spvoice的參數,里面有個statdus屬性,這個返回的對象中可以獲取一些有用的屬性參數如:RunningState(運行狀態), inputWordLegth(朗讀句子所有詞匯長度總和),inputWordPosition(當前朗讀詞匯的末位置)……
其中RunningState有三個狀態: 朗讀文本被全部渲染合成后返回 SRSEDone = 1 正在朗讀中會返回 SRSEIsSpeaking = 2 暫停朗讀時會返回0
利用這三個屬性就可以判斷朗讀是否已經完成,加兩個計時器,朗讀句子開始時,啟動判斷朗讀狀態的計時器,完成后再重新激活計時器進行朗讀:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.Enabled:=false;
learnTTS.Speak('this is voa explorations in special english!',1);
WaitForSingleObject(learnTTS.SpeakCompleteEvent, 200);
timer2.Enabled:=true;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
edit1.Text:=inttostr(learnTTS.Status.RunningState);
if learnTTS.Status.RunningState=1 then //朗讀完成后會返回1
timer1.Enabled:=true;
end;