标签: createoleobject

德尔福SAPI Text-To-Speech

首先:这不是Delphi和SAPI的重复.我对"Delphi中的SAPI"主题有一个具体问题.

我在Delphi 2009中使用了优秀的Import Type-Library指南来获取组件面板中的TSpVoice组件.这非常有效.同

var
  SpVoice: TSpVoice;
Run Code Online (Sandbox Code Playgroud)

我可以写

SpVoice.Speak('This is an example.', 1);
Run Code Online (Sandbox Code Playgroud)

获得异步音频输出.

第一个问题

根据文档,我可以写

SpVoice.Speak('This is an example.', 0);
Run Code Online (Sandbox Code Playgroud)

获得同步音频输出,但我获得了EZeroDivide异常.为什么?

第二个问题

但更重要的是,我希望能够动态创建SpVoice对象(我认为这被称为"后期绑定"SpVoice对象),部分原因是我的应用程序的所有会话中只有一小部分会使用它,部分是因为我不想假设最终用户系统上存在SAPI服务器.

为此,我试过了

procedure TForm1.FormClick(Sender: TObject);
var
  SpVoice: Variant;
begin
  SpVoice := CreateOleObject('SAPI.SpVoice');
  SpVoice.Speak('this is a test', 0);
end;
Run Code Online (Sandbox Code Playgroud)

显然什么也没做!(将0替换为0可以获得EZeroDivide异常.)

放弃

我是COM/OLE自动化的新手.对于我在这篇文章中所表现出的任何无知或愚蠢,我感到很抱歉......

更新

为了让每个人遇到与我一样的问题,François的视频解释说SAPI/Windows中存在一个错误(某些地方不兼容),这使得以下代码引发了EZeroDivide异常:

procedure TForm1.FormClick(Sender: TObject);
var
  SpVoice: variant;
begin
  SpVoice := CreateOleObject('SAPI.SpVoice');
  SpVoice.Speak('This is a text.');
end;
Run Code Online (Sandbox Code Playgroud)

视频中提供的解决方案是更改FPU控制字:

procedure TForm1.FormClick(Sender: TObject);
var
  SpVoice: variant;
  SavedCW: Word;
begin
  SpVoice := CreateOleObject('SAPI.SpVoice'); …
Run Code Online (Sandbox Code Playgroud)

delphi sapi text-to-speech createoleobject

10
推荐指数
1
解决办法
1万
查看次数

Delphi CreateOleObject事件

有一个代码:

var 
myobject: OleVariant;
begin
 myobject := CreateOleObject('SomeNamespace.SomeClass');
end;
Run Code Online (Sandbox Code Playgroud)

此COM对象具有事件(例如OnClick).如何在不导入TLB的情况下连接这些事件?

delphi com events late-binding createoleobject

3
推荐指数
1
解决办法
3905
查看次数