首先:这不是
Delphi and SAPI
. 我对“Delphi中的SAPI”主题有一个特别的问题。
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异常。)
免责声明
更新
为了让每个人都能遇到和我一样的问题,弗兰的视频§ois解释说SAPI/Windows中有一个bug(某些地方不兼容),这使得下面的代码引发了EZeroDivide异常:
procedure TForm1.FormClick(Sender: TObject);
var
SpVoice: variant;
begin
SpVoice := CreateOleObject('SAPI.SpVoice');
SpVoice.Speak('This is a text.');
end;
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;
另外,如果你想异步播放声音,那么你必须确保播放器没有超出范围!