如何调用微软的Text-To-Speech engine(TTS)(50分)

  • 主题发起人 主题发起人 xiaolu
  • 开始时间 开始时间
记住自己学会查询以前答案。

来自:Fudei 时间:2000-4-10 1:16:54 ID:216708
金山词霸发声使用的是微软TTS引擎。
当金山词霸安好后会在windows下产生speech目录, 里面存放的就是TTS文件.
从delphi中选择工程菜单中的导入类型库菜单,选择windows/
speech目录下的vtxtauto.tlb文件,单击确定后delphi会自动生成vtxauto_TLB.pas文件,它包含了TTS的com接口。
应用如下:
uses vtxauto_TLB;

var TTS: ivtxtauto;

用前:
TTS:=covtxtauto_.Create
TTS.Register('project1','project1');

用后:
TTS:=nil;

TTs.speak('要读的字符串',vtxtst_reading);
TTs.stopspeaking;
// 停止
TTs.set_speed(1);
// 速度

我试过同金山词霸的发音一样的。


 
^-^ 我也学会了!
 
用"Delphi源程序"在网上找一下,你会发现有例子。
我抄一些给你吧!
ftp://ftp02.softhouse.com.cn/download3/22945speakout.zip
ftp://ftp02.softhouse.com.cn/download3/22961sapi.zip
 
我写了一下程序,可以运行。但是点击按钮时不会发声。
界面很简单,只有一个窗体和一个按钮。
请各位大侠诊断,我会给100分。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs,VTxtAuto_TLB, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
TTS: IVTxtAuto;
public
{ Public declarations }
end;


var
Form1: TForm1;


implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin

TTS:=CoVtxtauto_.Create
TTS.Register('project1','project1');

end;


procedure TForm1.Button1Click(Sender: TObject);
begin


TTs.Speak('this is a test',vtxtst_READING);
TTs.stopspeaking;
// 停止

end;


procedure TForm1.FormDestroy(Sender: TObject);
begin

TTS:=nil;

end;


end.

 
以下是来自<中国计算机报>的文章:
Delphi编程技巧

经乾

  1.通过DDE创建程序组和快捷方式

  若要在应用程序执行过程中动态创建程序组和快捷方式,可以通过向程序管理器发送DDE命令来完成。实现过程如下:

  在Form上放一个 TDDEClientConv控件,命名为:DdeClientConv1,将其DdeService属性设置为ProgMan,DdeTopic设置为Progman,ConnectMode设置为ddeManual。添加一个“创建”按钮,并编写如下代码:

  DdeClientConv1.OpenLink {打开DDE会话}

  sMacro:=′[CreateGroup(′+′新建程序组′+′,′ +′Test′+′)]′;{宏}

  StrPCopy(szMacro, sMacro);{将宏复制到字符缓冲区}

  DdeClientConv1.ExecuteMacro(szMacro, False);{执行宏}

  sProgIcon:=′C:/Windows/Notepad.Exe′;{快捷方式命令行}

  sProgDesc:=′记事本′;{快捷方式描述}

  sMacro:= [AddItem(′ + sProgIcon + ′,′ + sProgDesc + ′)]′;

  StrPCopy(szMacro, sMacro);

  DdeClientConv1.ExecuteMacro(szMacro, False);


  DdeClientConv1.CloseLink;
{关闭DDE会话}

  创建结果如图1所示。若要删除或显示已有的程序组,可以使用如下宏命令:


  图1

  sMacro:=′[DeleteGroup(″附件″)]′;{删除“附件”组}

  sMacro:=′[ShowGroup(″启动″)]′;{显示″启动″组}

  2.实现英文朗读功能

  很多软件具有英文发音和朗读功能,它们都使用了MSTTS(Microsoft Text To Speech)技术。微软遵照COM的标准,提供了一套Speech API来对MSTTS进行编程。要在程序中使用这套API,必须确保系统已经安装了MSTTS和Spchapi软件包。

  Speech API可以作为类型库引用到Delphi中,方法是:打开Project选单下的Import Type Litrary,点击“Add”加入Windows/Speech目录下的Vtxauto.tlb文件,在Delphi的Import目录中就会生成VTxtAuto—TLB.pas文件,其中定义了VTxtAuto—TLB单元,把它加到Uses成员中来。设计如图2所示的窗口,定义全局变量:


  图2

  var VoTxt:IVTxtAuto;

  然后在Form的OnCreate事件中加入:

  VoTxt:=CoVTxtAuto_.Create;

  VoTxt.Register(′′,′Speech Test′);{注册}

  “Read”按钮代码为:

  VoTxt.Speak(Memo1.Lines.Text,10);{朗读}

  “Stop”按钮代码为:

  VoTxt.StopSpeaking;
{停止朗读}

  至此,应用程序已具有朗读功能,10表示使用普通语气。借住VoTxt的属性和方法,我们还可以控制阅读速度和语气,实现暂停、跳句等功能,Speech API编程就这么简单。

  3.抓获全屏

  根据Windows GDI与设备无关的特点,利用BitBlt或StretchBlt函数将显示设备上的位数据传输到目标设备上,然后在目标设备上创建兼容位图:

  SourceDC:=CreateDC(′DISPLAY′,′′,′′,nil);{创建源设备环境,DISPLAY为显示器}

  DestDC:=CreateCompatibleDC(SourceDC);

  {创建和SourceDC兼容的目标设备环境}

  BHandle:=CreateCompatibleBitmap(SourceDC,Screen.Width,Screen.Height)

  {创建一个和SourceDC兼容的内存设备环境,并返回其设备句柄}

  SelectObject(DestDC,BHandle);

  BitBlt(DestDC,0,0,Screen.Width,Screen.Height,SourceDC,0,0,SRCCOPY)

  {抓图}

  Bitmap:=TBitmap.Create;

   {Bitmap为TBitmap类型}

  Bitmap.Handle:=BHandle;

  Bitmap.SaveToStream(′C:/Mydo
cuments/FullScreen.bmp′) {保存到文件}

  DeleteDC(DestDC)

  ReleaseDC(BHandle,SourceDC)

  {释放设备环境}

  以上程序中,各设备环境的数据类型为Integer。

  4.更改桌面墙纸

  通过修改注册表,可以动态改变桌面墙纸及其显示方式(平铺还是居中):

  Reg.OpenKey(′Control Panel/Desktop′,False);{打开Control Panel下的Desktop键}

  Reg.WriteString(′Wallpaper′,′C:/Windows/Bubbles.Bmp′);{指定位图}

  Reg.WriteString(′TileWallpaper′,′1′);{设置平铺方式}

  Reg.CloseKey;{关闭键,Reg为Tregistry类型}

  SystemParametersInfo(SPISETDESKWALLPAPER,0,nil,SPIF—SENDWININICHANGE)

  {更新用户配置文件并刷新桌面}

  5.隐藏桌面图标

  原理:桌面也是一个窗口,将其设置为不可见即可达到隐藏桌面图标的目的。

  Var hDesktop:THandle;

  begin


   hDesktop:= FindWindow(′Progman′, nil);

   {获取桌面窗口句柄}

   ShowWindow(hDesktop, SW—HIDE);{隐藏}

  End

  6.锁定鼠标

  原理:利用ClipCursor函数将鼠标限制在某一矩形区域。

  Var rect:TRect;

  begin


   rect.Left:=0;
rect.Top:=0;
rect.Right:=0;
rect.Bottom:=Screen.Height;


   ClipCursor(@rect);
{将鼠标锁定在屏幕左侧}

  end;


  7.创建不规则窗口

  原理:用CreateRectRgn、CreateEllipticRgn等函数创建一个区域,然后用SetWindowRgn函数将其设置为窗口的显示区域。如下程序创建一个椭圆窗口:

  r1:=CreateEllipticRgn(0,0,form1.width,form1.height);

  SetSindowRgn(Form1.Handle,r1,True);{r1为LongInt类型}

  8.让应用程序自身删除

  原理:在应用程序刚要退出之前创建一个Delse
lf.bat文件,让它先删除应用程序,然后删除自身。在Form的OnClose事件中加入下列代码:

  AssignFile(F, ′delse
lf.bat′);Rewrite(F);{F为TextFile类型}

  WriteLn(F,′del ′+ExtractFileName(Application.ExeName));

  WriteLn(F,′del %0′);CloseFile(F);

  WinExec(′delse
lf.bat′,SW—HIDE);

***************************
供你参考。我试过,可以用。

 
行了,我自己搞定了。
 
接受答案了.
 
aboutdv:
你没设速度,由于速度太快了,所以你听不清。
 
后退
顶部