Delphi SAPI Text-To-Speech

Posted by Andreas Rejbrand on Stack Overflow See other posts from Stack Overflow or by Andreas Rejbrand
Published on 2010-06-13T15:20:56Z Indexed on 2010/06/13 15:22 UTC
Read the original article Hit count: 633

First of all: this is not a duplicate of http://stackoverflow.com/questions/1021490/delphi-and-sapi. I have a specific problem with the "SAPI in Delphi" subject.

I have used the excellent Import Type-Library guide in Delphi 2009 to get a TSpVoice component in the component palette. This works great. With

var
  SpVoice: TSpVoice;

I can write

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

to get asynchronous audio output.

First question

According to the documentation, I would be able to write

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

to get synchronous audio output, but instead I get an EZeroDivide exception. Why's that?

Second question

But more importantly, I would like to be able to create the SpVoice object dynamically (I think this is called to "late-bound" the SpVoice object), partly because only a very small fraction of all sessions of my app will use it, and partly because I do not want to assume the existance of the SAPI server on the end-user's system.

To this end, I tried

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

which apparently does nothing at all! (Replacing the 0 with 1 gives me the EZeroDivide exception.)

Disclaimer

I am rather new to COM/OLE automation. I am sorry for any ignorance or stupidity shown by me in this post...

© Stack Overflow or respective owner

Related posts about delphi

Related posts about text-to-speech