调用dll文件阅读文本

Vim、Emacs配置和使用
lh-n
帖子: 40
注册时间: 2009-02-23 15:52

Re: 调用dll文件阅读文本

#16

帖子 lh-n » 2012-08-29 8:29

wz520 写了:
lh-n 写了:非常感谢,用你的方法不不但不会崩溃,也可以阅读中文。
但是还有个问题,该函数只能用一次,第二次用就不会发声了。
----------------------------------------------------------
可能是我的语音引擎的问题,前面用的是Neospeech的引擎,我又试了系统自带的语音引擎没问题。这到底是什么原因呢?
这我就不知道了,没搞过TTS相关的编程。我只是在你贴的代码的基础上做了很简单的修改,没有改动核心的东西。
而且我的系统也只装了自带的引擎,没办法调试 NeoSpeech 的效果。
要么……求个 NeoSpeech 语音库下载,让我试着调试一下? :em03
不好意思,因为有事,好久没关注这个帖子了。我的语音库实在汉辞网下的,地址:http://www.hydcd.com/softdown.htm
谢谢你了
wz520
帖子: 36
注册时间: 2010-09-23 13:47

Re: 调用dll文件阅读文本

#17

帖子 wz520 » 2012-09-04 11:12

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 内部生成的任何东西都无法保留到第二次调用(应该说函数返回时就已经全没了)。 :em20

所以现在的做法是:
如果调用的是 SpeechText(),Speak() 后能马上 Release() ,这样就不会导致第二次调用时无声。
如果调用的是 SpeechTextAsync() ,Speak() 后还是不会去 Release() 的。因为这样至少第一次调用是发声的。

想过各种办法,还是想不出有什么好办法解决 SpeechTextAsync() 多次调用不发声问题(SpeechText() 已无问题)。如果哪位大虾有好点子,欢迎回帖讨论。

于是不好意思,只能交个半成品。 :em06
附件
SpeechText.zip
(20.96 KiB) 已下载 105 次
lh-n
帖子: 40
注册时间: 2009-02-23 15:52

Re: 调用dll文件阅读文本

#18

帖子 lh-n » 2012-09-05 22:27

wz520 写了: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 内部生成的任何东西都无法保留到第二次调用(应该说函数返回时就已经全没了)。 :em20

所以现在的做法是:
如果调用的是 SpeechText(),Speak() 后能马上 Release() ,这样就不会导致第二次调用时无声。
如果调用的是 SpeechTextAsync() ,Speak() 后还是不会去 Release() 的。因为这样至少第一次调用是发声的。

想过各种办法,还是想不出有什么好办法解决 SpeechTextAsync() 多次调用不发声问题(SpeechText() 已无问题)。如果哪位大虾有好点子,欢迎回帖讨论。

于是不好意思,只能交个半成品。 :em06
你太牛了,其实只要SpeechText()就行了,就已经完美实现了这个功能。再次感谢!!!
回复