[fpc-pascal] Microsoft SAPI on Freepascal
James Richters
james.richters at productionautomation.net
Tue Jun 27 11:25:09 CEST 2023
I changed to Compiler Version 3.3.1-12875-gadf843196a which is what
FPCUPDeluxe installed when I installed Trunk and now it runs just fine.
So I guess there was a bug in 3.3.1-10077-gc8403ad49e that was fixed
already. I was so convinced that I was doing something wrong I didn't even
think to try another version.
>Because I use a screen reader, I have multiple sapi voices installed,
(though I rarely use them), but I haven't played with the code enough just
yet to see why it fails when it tries to select one, when not selecting one
works just fine <shrug>
Here's a sample program that now works on the updated 3.3.1, I guess it
should work on 3.2 as well. It lists all available voices and lets you
choose one. Maybe that would let you select another voice?
{$Mode OBJFPC}
program VoiceSelection;
uses
ComObj;
var
v: OleVariant;
selectedVoiceIndex: Integer;
voiceName: string;
speechText: string;
begin
v := CreateOleObject('SAPI.SpVoice');
Writeln('Available Voices:');
for selectedVoiceIndex := 0 to v.GetVoices.Count - 1 do
begin
voiceName := v.GetVoices.Item(selectedVoiceIndex).GetDescription;
Writeln('Voice ', selectedVoiceIndex + 1, ': ', voiceName);
end;
Writeln;
Writeln('Enter the index of the voice you want to use:');
Readln(selectedVoiceIndex);
if (selectedVoiceIndex < 1) or (selectedVoiceIndex > v.GetVoices.Count)
then
begin
Writeln('Invalid voice index.');
Exit;
end;
voiceName := v.GetVoices.Item(selectedVoiceIndex - 1).GetDescription;
v.Voice := v.GetVoices.Item(selectedVoiceIndex - 1);
Writeln('Selected Voice: ', voiceName);
speechText := 'Hello World, this is ' + voiceName;
Writeln('Speech Text: ', speechText);
v.Speak(speechText);
end.
James
More information about the fpc-pascal
mailing list