转贴:
在程序中加入 英文朗读功能
华中师范大学卢小海([email protected]) ----金山词霸2000的英文全文朗读功能相信一定
给尝试过的用户留下了很深刻的印象,而作为一个程序设计者,你一定也想在自己
的程序中加入类似的功能吧,因为那将让自己的程序增色不少。
----其实这并不是一件困难的事,因为金山词霸实
际上也只是直接使用了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操作是必不可少的,因为
可能有多个程序不同设置使用TTS引擎。
----然后在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
TextHeight = 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: TButton
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_
READING);
btnPause.Enabled := True;
btnStop.Enabled := True;
end;
procedure TfrmMain.btnStopClick(Sender: TObject);
begin
FISpeech.StopSpeaking;
btnPause.Enabled := False;
btnStop.Enabled := False;
btnPause.Caption :=‘暂停(&P)';
end;
...
----Speak成员函数的第一个参数向TTS引擎传递
需要朗读的文字,第二个参数由指定朗读时使用的语气和优先级的两个符号合并而
成。
---- 2.暂停与恢复
...
procedure TfrmMain.btnPauseClick(Sender: TObject);
begin
with FISpeech do
if IsSpeaking then
begin
AudioPause;
btnPause.Caption :=‘恢复(&R)';
end
else
begin
AudioResume;
btnPause.Caption :=‘暂停(&P)';
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;
property Enabled: Integer read Get_Enabled write Set_Enabled;
...
end;
...
----即可正常使用Speed和Enabled属性了。
----至此,一个简单的英文全文朗读器就完成了,
有兴趣的朋友可以为其加入监视剪贴板,热键激活等功能。
----本文程序在Win NT/98+Delphi 4/5环境下
调试通过。
在程序中加入 英文朗读功能
华中师范大学卢小海([email protected]) ----金山词霸2000的英文全文朗读功能相信一定
给尝试过的用户留下了很深刻的印象,而作为一个程序设计者,你一定也想在自己
的程序中加入类似的功能吧,因为那将让自己的程序增色不少。
----其实这并不是一件困难的事,因为金山词霸实
际上也只是直接使用了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操作是必不可少的,因为
可能有多个程序不同设置使用TTS引擎。
----然后在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
TextHeight = 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: TButton
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_
READING);
btnPause.Enabled := True;
btnStop.Enabled := True;
end;
procedure TfrmMain.btnStopClick(Sender: TObject);
begin
FISpeech.StopSpeaking;
btnPause.Enabled := False;
btnStop.Enabled := False;
btnPause.Caption :=‘暂停(&P)';
end;
...
----Speak成员函数的第一个参数向TTS引擎传递
需要朗读的文字,第二个参数由指定朗读时使用的语气和优先级的两个符号合并而
成。
---- 2.暂停与恢复
...
procedure TfrmMain.btnPauseClick(Sender: TObject);
begin
with FISpeech do
if IsSpeaking then
begin
AudioPause;
btnPause.Caption :=‘恢复(&R)';
end
else
begin
AudioResume;
btnPause.Caption :=‘暂停(&P)';
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;
property Enabled: Integer read Get_Enabled write Set_Enabled;
...
end;
...
----即可正常使用Speed和Enabled属性了。
----至此,一个简单的英文全文朗读器就完成了,
有兴趣的朋友可以为其加入监视剪贴板,热键激活等功能。
----本文程序在Win NT/98+Delphi 4/5环境下
调试通过。
还是调用其它如IBM VOICE API接口?!