首先:这不是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) 我希望能够使用Microsoft Vista的语音识别来指示我的Delphi应用程序.然而,当试图指挥TMemo时,它根本不起作用.我注意到Firefox 3.0有同样的问题,在他们联系微软之后,他们告诉他们需要为他们的应用程序实现Text Services Framework.
我想知道是否有任何方法可以在Delphi中实现这一点,以便我可以指定TMemo或TRichEdit.在Google上搜索解决方案并未返回任何相关结果.我从哪里开始寻找解决方案?
编辑:我发现有一种方法可以在所有程序中启用语音识别,即使是那些不支持语音识别的程序,只需转到Windows语音识别选项并选择在任何地方启用听写.但是,当您使用此命令进入不使用文本服务框架的编辑框时,它总是会弹出备用面板,该面板显示提示说出所需项目旁边的数字,然后单击确定.虽然这可能适用于短句,但它没有许多有用的功能,例如纠正或删除单词.所以我仍然试图弄清楚如何在不依赖于启用任何地方的听写选项的情况下启用语音识别.
delphi speech-recognition text-services-framework windows-vista