gpt4 book ai didi

Delphi SAPI 文本转语音

转载 作者:行者123 更新时间:2023-12-03 14:42:13 26 4
gpt4 key购买 nike

首先:这不是 Delphi and SAPI 的重复项。我对“SAPI in Delphi”主题有一个具体问题。

我使用了 Delphi 2009 中出色的导入类型库指南来在组件选项板中获取 TspVoice 组件。这很好用。与

var
SpVoice: TSpVoice;

我会写

SpVoice.Speak('This is an example.', 1);

获得异步音频输出。

第一个问题

根据文档,我可以写

SpVoice.Speak('This is an example.', 0);

获得同步音频输出,但我得到了 EZeroDivide 异常。这是为什么?

第二个问题

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

为此,我尝试过

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

这显然什么也没做! (用 1 替换 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;

如视频所示,解决方案是更改 FPU 控制字:

procedure TForm1.FormClick(Sender: TObject);
var
SpVoice: variant;
SavedCW: Word;
begin
SpVoice := CreateOleObject('SAPI.SpVoice');
SavedCW := Get8087CW;
Set8087CW(SavedCW or $4);
SpVoice.Speak('This is a text.');
Set8087CW(SavedCW);
end;

此外,如果您想异步播放声音,那么您必须确保播放器不会超出范围!

最佳答案

您可能会觉得有趣this CodeRage 4 session"Speech Enabling Delphi Applications (zip)"您将获得您正在寻找的“操作方法”...(我猜你使用的是 Vista 或 +,因为 XP 上没有发生零除法)

关于Delphi SAPI 文本转语音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3032739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com