转贴:
 在程序中加入         英文朗读功能
         
       华中师范大学卢小海([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环境下
       调试通过。