[fpc-pascal] Can not set voice property of SpVoice

Toru Takubo takubo at e-parcel.co.jp
Tue Aug 23 10:33:45 CEST 2016



On 2016/08/23 16:38, Michael Van Canneyt wrote:
>
>
> On Tue, 23 Aug 2016, Toru Takubo wrote:
>
>>
>>
>> On 2016/08/23 16:22, Michael Van Canneyt wrote:
>>>
>>>
>>> On Tue, 23 Aug 2016, Toru Takubo wrote:
>>>
>>>> Hello,
>>>>
>>>> I am testing a text to speech program working on Windows SAPI, and I
>>>> encountered a problem that I can not set the Voice property because
>>>> "member not found".
>>>>
>>>> Below is the code which describe the problem. It is originally from
>>>> the freepascal wiki (http://wiki.freepascal.org/SAPI) and slightly
>>>> modified. Setting the voice property in this code is meaningless,
>>>> I know. It is just to reproduce the problem.
>>>>
>>>> The SpVoice.Speak method itself works fine. I am working with fpc
>>>> 3.0.0 on Windows 7 64bit. Any advice would be appreciated.
>>>>
>>>> Regards,
>>>>
>>>> Toru
>>>>
>>>> _______________________________________________
>>>> program TestSAPI;
>>>>
>>>> uses
>>>> SysUtils, comobj;
>>>> var
>>>> SavedCW: Word;
>>>> SpVoice: Variant;
>>>> Token: Variant;
>>>> begin
>>>> SpVoice := CreateOleObject('SAPI.SpVoice');
>>>> // Change FPU interrupt mask to avoid SIGFPE exceptions
>>>> SavedCW := Get8087CW;
>>>> try
>>>>   Set8087CW(SavedCW or $4);
>>>>
>>>>   Token := SpVoice.Voice; //I can get a voice token.
>>>>   Writeln(Token.GetDescription); //The token actually works.
>>>>
>>>>   try
>>>>     SpVoice.Voice := Token; //"member not found" exception here. I can't set  it.
>>>
>>> Did you try
>>>
>>>   spVoice.SetVoice(Token);
>>>
>>
>> I got another exception.
>>
>> "Method 'SetVoice' is not supported by automation object"
>
> Strange, because it is listed in the SAPI reference.
>
> This is probably why you cannot set it: the property seems to be read-only.
>

I wrote a JScript (saved as tts.js) and it worked fine.
_______________________________________________
var SpVoice = WScript.CreateObject("SAPI.SpVoice");

var Token = SpVoice.Voice;

WScript.Echo(Token.GetDescription());

SpVoice.Voice = Token;

SpVoice.Speak("hi");
_______________________________________________

I could even change voice with additional code.
Why my pascal code does not work as jscript does?

Regards,
Toru









More information about the fpc-pascal mailing list