用户名:  密码:   
您当前的位置:首页 > 程序设计 >  Delphi > 

delphi7调用SpeechSDK库文字转语音并播放出来

上次修改时间: 2024-03-15 18:37:32      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\Delphi语言\第三方控件的安装与使用\微软SpeechSDK库和语音包\      下一页

文字转语单并播放出来

参考:http://www.360doc.com/content/12/0121/07/1092279626_1092279626.shtml
一、安装库和语音包
首选安装微软的Speech SDK和语音包,有的系统不安装也,如我的Win11家庭版,打开delphi7,Project--Import Type Library,如果找到Microsoft Speech Object Library就不需要装
Speech SDK下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=27226 ,有X86和X64,两个都下载下来安装,我用的11版的
下载安装语音包:https://download.microsoft.com/download/4/0/D/40D6347A-AFA5-417D-A9BB-173D937BEED4/MSSpeech_TTS_zh-CN_HuiHui.msi

二、在工程中引用库
先在delphi中新建一个工程,然后导入库,就是把微软件的库导入进来,delphi会将微软的dll文件生成一个pas文件导入到当前工程
Project--Import Type Library..,选择Microsoft Speech Object Library(Version 5.4),再点Create Unit,这里就会创建一个名为SpeechLib_TLB的当前,在工程的use处引用它
注:这里有两个,选择dll路径为 C:\Windows\System32\Speech\Common\sapi.dll的那个

三、delphi7工程调用示例
剩下的就简单了, 在Uses处引用这个单元,然后调用TSpVoice的Speak将memo1中的文字转为语音并播放出来。
//发现转后的语音可以播放出来,但不能保存为文件
uses
 SpeechLib_TLB;
procedure TForm1.Button2Click(Sender: TObject);
var
  Voice:TSpVoice;
begin
  Voice:= TSpVoice.Create(nil);
  try
 SpVoice.Volume := 100; // 值范围0-100,默认是50
    SpVoice.Rate := -2; // 负值加快速度,正值降低速度
    Voice.Speak(Memo1.Text,0);
  finally
    Voice.Free;
  end;
end;

关于导入库生成的SpeechLib_TLB.pas单元文件的说明

导入库生成pas出现的警告和错误,不用管,照样可以用
//   Hint: Symbol 'Type' renamed to 'type_'
//   Error creating palette bitmap of (TSpObjectTokenCategory) : Server C:\Windows\System32\Speech\Common\sapi.dll contains no icons

const  //这是在定义常量
  SpeechLibMinorVersion = 4;  
  LIBID_SpeechLib: TGUID = '{C866CA3A-32F7-11D2-9602-00C04F8EE628}'; //定义了一个TGUID类型的常量并赋值
 //用来代表一个COM类型库的唯一标识符

type
  SpeechDataKeyLocation = TOleEnum;  
const
  SDKLDefaultLocation = $00000000;  
。。。。。

type
  SpeechVoiceSpeakFlags = TOleEnum;  //定义了一个名为SpeechVoiceSpeakFlags 的枚举类型
const
  SVSFDefault = $00000000;   //类型的第一个值, $表后面的值是16进制的
。。。

上面类型作为函数Speak的参数时的示例:
function Speak(const Text: WideString; Flags: SpeechVoiceSpeakFlags): Integer; safecall; //这里的SpeechVoiceSpeakFlags就是上步定义的的枚举类型
如:Voice.Speak(Memo1.Text,0);等于Voice.Speak(Memo1.Text,SVSFDefault); //第二个参数Flags即可是数量也可以是名称,$00000000=0

定义接口类型
type
// Forward declaration of types defined in TypeLibrary         TypeLibrary类型定义的正向声明          
  ISpeechVoice = interface;  //定义名为..的接口类型
  ISpeechVoiceDisp = dispinterface; //定义名为..的分发接口类型,dispinterface可看作disp interface
.......
  SpVoice = ISpeechVoice;  //定义SpVoice为上面的ISPeechVoice接口类型
  SpSharedRecoContext = ISpeechRecoContext; //同上

  wireHWND = ^_RemotableHandle;  //定义WireHWND为_RemotableHandle类型的指针

  __MIDL_IWinTypes_0009 = record //定义结构体,record系统会根据平台和编译器进行内存对齐,不齐会加入填充字节
    case Integer of   //定义联合类型,包含integer类型的选择器,
      0: (hInproc: Integer);  //选择器为0时hInproc字段有效,用于存本地进程的句柄
      1: (hRemote: Integer);  //为1时hRemote字段有效,用于存远程进程的句柄
  end;

  _RemotableHandle = packed record //定义结构体, Packed record不进行对齐,结构体中字段按声明先后连续存放
    fContext: Integer;   //定义结构体中整形字段
    u: __MIDL_IWinTypes_0009;  //定义u为上面的__MIDL_IWinTypes_0009结构体
  end;

  ISpeechAudioBufferInfo = interface(IDispatch) //定义一个名为ISpeechDataKey 的接口,IDispatch表该接口继承自IDispatch接口
 //继承IDispatch接口的接口可使用COM的动态调用功能
    ['{11B103D8-1142-4EDF-A093-82FB3915F8CC}'] //表示唯一识别该接口的GUID,全局唯一标识符
    function Get_MinNotification: Integer; safecall; //定义函数,Safecall表这是一个标准的COM调用约定,用于确保调用安全性
    procedure Set_MinNotification(MinNotification: Integer); safecall; //定义了一个过程
    property MinNotification: Integer read Get_MinNotification write Set_MinNotification; //该接口一个属性,Read表该属性通过接口的Get_MinNotification获取,write表属性通过接口的Set_MinNotification设置

  ISpeechDataKeyDisp = dispinterface //dispinterface表ISpeechDataKeyDisp接口为分发接口,分发接口中的函数和过程后都加分发标识符,如:dispid 1
    ['{CE17C09B-4EFA-44D5-A4C9-59D9585AB0CD}']  //标识该接口的GUID
    procedure SetBinaryValue(const ValueName: WideString; Value: OleVariant); dispid 1; //dispid 1表过程的分发标识符为1

IDispatch接口继承的路径: IInterface--IUnknown--IDispatch 
接口类型interface
是一个抽象的对象,它下面可定义多个过程和函数,还有属性,它的这些过程和函数自己不具体去实现,而是通过虚函数表动态绑定其它Dll中GUID,在其它调用的Dll中实现
接口类型可以继承
分发接口类型dispinterface
接口类型中的一种,支持通过IDispatch接口进行方法调用,一种动态调用对象函数的机制,使客户端程序在运行时再确定要调用的方法,常在脚本语言,RPC(远程过程调用),DLL(动态链接库)等场景使用
总结:
接口主要用来描述对象的操作和行为,分发接口用来对动态调用和运行时确定方法调用进行支持,如支持脚本语言对系统组件的调用和操作