Changed TextToSpeech{Open/Close}InMemory to use the same error handling approach as buffers, which should ensure that the engine never gets stuck in an invalid state.
Further research is needed to determine whether TextToSpeechReset is necessary/enough to release the buffer if Sync() fails, in which case it should be moved to the CloseInMemory() method (with try/finally to ensure TextToSpeechCloseInMemory is still always called).

I also added two regions to group the Buffer and InMemory handling each.
Changed SpeakerParams access to a property
Copy SpeakerParams value directly to the target pointer to rule out memory leaks in case an exception is thrown (the alternative would be proper try/finally).

It might be a good idea to add a unit test asserting the marshalled size if SpeakerParams is the same as in the documentation, to definitely rule out segfaults.

(I also used auto format this time, which changed some whitespace from the previous commit and in one unrelated line.)
Removed code duplication and potential NullReferenceException during FonixTalkEngine disposal