

文字转语单并播放出来
参考: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(动态链接库)等场景使用
总结:
接口主要用来描述对象的操作和行为,分发接口用来对动态调用和运行时确定方法调用进行支持,如支持脚本语言对系统组件的调用和操作