其實這並不是一件困難的事,因為金山詞霸實際上也只是直接使用了MS的TTS(Text-to-Speech)技術而已,通過對MS Speech API 的編程,我們完全可以實現比其更強大的功能。下面,讓我們在Delphi環境下實際嘗試一下。
首先從金山詞霸的光盤上 ciba目錄下運行並安裝mstts. Exe(MS TTs engine)和spchapi. Exe (MS Speech API).
再在Delphi 裡新建一個application。
然後從Delphi的菜單Project/Import Type Library. . .中選擊Add. . .,浏覽到Windows目錄下的Speech子目錄裡,打開vtxtauto. Tlb,可以看到下面Class names中會出現我們需要的接口的包裝類的名字TVTxtAuto,注意對話框底部的Generate Component Wrapper需要被選中,點擊Create Unit 就可以打開一個名為VtxtAuTo_TLB的Unit。
至此,我們就可以開始實際編程了。
首先在Form的OnCreate中對需要使用接口初始化並進行注冊:
...
Procedure TfrmMain. FormCreate (Sender. Tobject); begin
FISpeech: = CoVTxtAuto_Create;
FISpeech. Register (“Demo Site’, ‘Demo App’); end;
...
由於Delphi對接口進行了良好的包裝,因此,只需直接建立包裝類,其他後台的操作如接口的查詢、釋放等交給Delphi在後台自動完成。
注意這裡的Register操作是必不可少的,因為可能有多個程序不同設置使用TIS引擎。
然後在MainForm上放一個Tmemo和若干個Tbutton,並在其OnClick中加入對應的代碼。
Form定義如下:
Object frmMain: TfrmMain
Left = 296
Top = 187
BorderStyle = bsDialog
Caption = ‘英文全文朗讀演示’
ClIEntHeight = 185
ClIEntWidth = 456
Color = clBtnFace
Font. Charset = GB2312_CHARSET
Font. Color = clWindowText
Font. Height = -12
Font. Name = ‘宋體’
Font. Style = [ ]
OldCreateOrder = False
Position = poDesktopCenter
OnCreate = FormCreate
PixelsPerInch = 96
TexHeight = 12
Object memText: Tmemo
Left =8
Top = 8
Width = 361
Height = 169
ScrollBars = ssVertical
TabOrder = 0
End
Object btnRead: Tbutton
Left = 376
Top = 8
Width = 75
Height = 25
Caption = ‘朗讀(&R)’
TabOrder = 1
OnClick = btnReadClick
End
Object btnPause: Tbutton
Left = 376
Top = 40
Width = 75
Height = 25
Caption = ‘暫停(&P)’
Enabled = False
TabOrder = 2
OnClick = btnPauseClick
End
Object btnStop: Tbutton
Left = 376
Top = 72
Width = 75
Height = 25
Caption = ‘停止(&S)’
Enabled = False
TabOrder = 3
OnClick = btnStopClick
End
Object btnForward: Tbrtton
Left = 376
Top = 120
Width = 75
Height = 25
Caption = ‘下一句(&N)’
Enabled = False
TabOrder =4
OnClick = btnForwardClick
End
Object btnRewind: Tbutton
Left = 376
Top = 152
Width = 75
Height = 25
Caption = ‘上一句(&W)’
Enabled = false
TabOrder = 5
OnClick = btnRewindClick
End
End
關鍵代碼段如下:
1.朗讀與停止
...
procedure TfrmMain. BtnReadClick (Sender: Tobject); begin
FISpeech. Speak (memText. Lines. Text, vtxtst_READING0;
BtnPause. Enabled : = True;
BtuStop. Enabled : = True;
End;
Procedure TfrmMain. BtnStopClicl (Sender: Tobject); begin
FISpeech. StopSpeaking;
BtnPause. Enabled : = False;
BtnStop. Enabled : = False;
BtnPause. Caption : = ‘暫停(&P)’;end;
...
speak成員函數的第一個參數向TTS引擎傳遞需要朗讀的文字,第二個參數由指定朗讀時使用的語氣和優先級的兩個符號合並而成。
符號
值
意義
語氣
vtxtst_STATEMENT
$00000001
平常說話的語氣(缺省)vtxtst_QUESTION
$00000002
提問的語氣vtxtst_COMMAND
$00000004
命令的語氣vtxtst_WARNING
$00000008
警告的語氣vtxtst_READING
$00000010
閱讀文檔時的語氣vtxtst_NUMBERS
$00000020
適合閱讀數字的語氣vtxtst_SPREADSHEET
$00000040
適合閱讀電子表格中元素的語氣優先級
vtxtsp_VERYHING
$00000080
立即讀出,可打斷正在讀的內容vtxtsp_HIGH
$00000100
盡快讀出,加入播放隊列開始vtxtsp_NORMAL
$00000200
僅僅加入播放隊列末尾(缺省)
2.暫停為與恢復
...
procedure TfrmMain. BtnPauseClick (Sender: Tobject);
begin
with FISpeech do
if IsSpeaking then
begin
AudioPause;
BtnPause. Caption : = ‘恢復(&R)’;
End
Else
Begin
AudioResume;
BtnPause. Caption : = ‘暫停(&R)’;
End;
End;
...
這裡通過IsSpeaking屬性可以取得當前狀態,然後通過audioPause和AudioResume暫停和恢復朗讀。
另外用成員函數AudioFastForward和AudioRewind可以向前和後跳過一句朗讀,通過讀寫speed屬性還可以取得或調協朗讀的語速,單位是字/分,缺省值為170。
注意speed和Enabled屬性缺省設置是只寫的,但實際上IVTxtAuto提供了Get_Speed和Get_Enabled函數,所以我們只要把VtxtAuto_TLB單元中的聲明修改一下,如:
...
IVTxtAuto = interface (Idispatch)
...
property Speed: Integer read Get_Speed write Set_Speed;
propert Enabled: Integer read Get_Speed write Set_Speed;
...
end;
...
即可正常使用Speed和enabled屬性了。
至此,一個簡單的英文全文朗讀器就完成了,有興趣的朋友可以為其加入監視剪貼板,熱鍵激活等功能。