SpeechText() 不发声问题解决了,但是 SpeechTextAsync() 还是不行。
不发声的根本原因在于没调用 gpVoice->Release() 。
Windows 自带的语音库不 Release 貌似没事,但是 NeoSpeech 貌似每次 Speak() 后就必须 Release() ,否则第二次调用就不会发声。
原来的代码里 gpVoice->Release() 被注释掉了,因为不注释掉会使程序卡住然后死掉。
后来发现,原来不在 DLL_PROCESS_DETACH 里 Release() 就不会出错了(原因可能是 DLL_PROCESS_DETACH 分支执行时 TTS 库已经卸载了,所以再调用 TTS 的方法自然就出错了)。
那么解决方法就很简单了。DLLMain 里可以直接返回 TRUE 。每次调用 MT_SpeechText() 时都先初始化 gpVoice,然后 Speak 完后马上 Release 就可以了。
这样 SpeechText() 没有问题了。但是 SpeechTextAsync() 连第一次调用都没有声音了,因为你 Speak 后在函数返回前就 Release 了,这样就无法在函数返回后继续阅读了。
由于 Vim 调用完一个 DLL 函数后就立刻把 DLL 卸了,使得每次的函数调用都是独立的。第一次调用时在 DLL 内部生成的任何东西都无法保留到第二次调用(应该说函数返回时就已经全没了)。
所以现在的做法是:
如果调用的是 SpeechText(),Speak() 后能马上 Release() ,这样就不会导致第二次调用时无声。
如果调用的是 SpeechTextAsync() ,Speak() 后还是不会去 Release() 的。因为这样至少第一次调用是发声的。
想过各种办法,还是想不出有什么好办法解决 SpeechTextAsync() 多次调用不发声问题(SpeechText() 已无问题)。如果哪位大虾有好点子,欢迎回帖讨论。
于是不好意思,只能交个半成品。
