A Hero's Call passes text to a speech thread, which in turn calls the SAPI or Tolk APIs so that the main game thread never has to wait.
I did that because SAPI was laggy, but if I recall correctly it was in terms of single digit milliseconds, not half a second, so you may want to debug it more to see if there is something else you can fix.
You are passing the async flag when speaking text, right?
As I look at that code I also see a comment I left myself about passing null instead of an empty string when using the PurgeBeforeSpeak flag to cancel speech without having something new to speak.
I was getting big delays when passing that flag and passing an empty string instead of null, though NULL is probably the obvious choice if you are in C/C++.
This was all using the SPVoice COM object through C#, and tested on Windows 7, not Windows 10.
Hope some of that is helpful to you.
~ Ian Reed
Visit
BlindGamers.com to rate blind accessible games and see how others have rated them.
Try my free JGT addon, the easy way to play Japanese games in English.
Or try the free games I've created.