【问题标题】:Delphi SAPI Text-To-SpeechDelphi SAPI 文字转语音
【发布时间】:2011-03-03 05:49:37
【问题描述】:

首先:这不是Delphi and SAPI 的副本。我对“Delphi 中的 SAPI”主题有一个特定的问题。

我在 Delphi 2009 中使用了出色的 Import Type-Library 指南,在组件面板中获得了一个 TSpVoice 组件。这很好用。与

var
  SpVoice: TSpVoice;

我会写

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

获取异步音频输出。

第一个问题

根据文档,我可以写

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

获取 同步 音频输出,但我得到了 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;

这显然什么也没做! (将 0 替换为 1 会给我 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;

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

【问题讨论】:

    标签: delphi text-to-speech sapi createoleobject


    【解决方案1】:

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

    【讨论】:

    • 啊,非常感谢!所以这不仅仅是我愚蠢,那么!
    • 顺便说一句:如果您想为视频赢得荣誉,请随意删除您姓名旁边的问号! :)
    【解决方案2】:

    我在 Delphi XE2 中遇到了同样的问题。问题中提出的Set8087CW(SavedCW or $4) 解决方案对我不起作用。它只是用另一个浮点异常替换了除零异常。

    对我有用的是:

    SavedCW := Get8087CW;
    SetFPUExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
    SpVoice.Speak('All floating point exceptions disabled!', 0);
    Set8087CW(SavedCW);
    

    【讨论】:

      猜你喜欢
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 2010-10-02
      • 1970-01-01
      • 2014-05-17
      • 2012-08-20
      • 2017-12-21
      相关资源
      最近更新 更多