Two things:
1. SpVoice is an OleVariant, not a variant. There's a huge difference.
2, Interfacing with MS dll's, including some COM objects requires you to save and load the 8087 Control word, since ms messes up the fpu error flags.
AD 2: google for example, basically:
Save8087CW := Get8087ControlWord;
Set8087CW($133F); // ms compatible FPU flags, it basically says "Do not raise floating point exceptions. EVER!"
... your code
... when done:
Set8087CW(Save8087CW);
I haven't got the time to compile this on Windows (I am on Linux), but this answer is correct. Maybe there are more errors, but ad 2 is REALLY important.