Just some advice when working on the "Speak Buttons Actions" feature, if you create a thread to loop through each button, you should not use SpeechVoiceSpeakFlags.SVSFDefault or WaitUntilDone because "The WaitUntilDone method explicitly blocks program execution until the voice finishes." You must use the SpeechVoiceSpeakFlags.SVSFlagsAsync flag with the SpeakCompleteEvent Method and the WaitForSingleObject() API function.
So first you create thread for method SpeakButtons()
Eg. Some pseudo code...
SpeakButtons()
{
loop(through each button)
{
light up button on LEDWiz
get button action
voice.Speak(button action, SpeechVoiceSpeakFlags.SVSFlagsAsync);
int handle = voice.SpeakCompleteEvent();
WaitForSingleObject(handle, INFINITE);
}
}
It's important you do it that way otherwise the whole FE will freeze up until each word is spoken. Using the above method in a thread, it will continue executing.
Just thought I'd share my results, hope it helps.