金山词霸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操作是必不可少的,因为可能有多个程序不同设置使用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环境下调试通过。
平常说话的语气(缺省)
提问的语气
命令的语气
警告的语气
阅读文档时的语气
适合阅读数字的语气
适合阅读电子表格中元素的语气
立即读出,可打断正在读的内容
尽快读出,加入播放队列开始
仅仅加入播放队列末尾(缺省)
