在程序中加入英文朗读功能
2006-02-04 13:25:41 来源:WEB开发网其实这并不是一件困难的事,因为金山词霸实际上也只是直接使用了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属性了。
至此,一个简单的英文全文朗读器就完成了,有兴趣的朋友可以为其加入监视剪贴板,热键激活等功能。
本文程序在win NT/98 + Delphi 4/5环境下调试通过。
更多精彩
赞助商链接