releaseFunc = (ReleaseFunc)lib.resolve(\); speakFunc = (SpeakFunc)lib.resolve(\);
if (initializeFunc && releaseFunc && speakFunc) { initializeFunc(); ttsLoaded = true;
qDebug() << \;
// When tts is loaded, initialize the speak thread.
speakThread = new SpeakThread(this);
speak(\); // 加载完后说一下,准备好,因为第一次说都会很慢
} } else {
qDebug() << lib.errorString(); } }
void Speaker::removeTts() {
// If tts is not loaded, removing process is not needed.
if (!ttsLoaded) { return; }
releaseFunc();
ttsLoaded = false; initializeFunc = 0; releaseFunc = 0; speakFunc = 0;
qDebug() << \;
// After tts is removed, speak thread is also need to be removed.
if (speakThread != 0) { speakThread->terminate(); }
delete speakThread; speakThread = 0; } /**
* After the process that loads tts is completed, the load thread is not needed, then remove it. */
void Speaker::completeLoadTts() {
delete ttsLoader; ttsLoader = 0; } /**
* After the process that removes tts is completed, the remove thread is not needed, then remove it. */
void Speaker::completeRemoveTts() {
delete ttsRemover; ttsRemover = 0; } /**
* Terminated all threads. */
void Speaker::terminateAllThreads() {
if (ttsLoader != 0) { ttsLoader->terminate(); }
if (ttsRemover != 0) { ttsRemover->terminate(); }
if (speakThread != 0) { speakThread->terminate(); } }
/////////////////////////////////////////////////////////////////////////////////// TtsLoader::TtsLoader(Speaker *speaker) { this->speaker = speaker; stopped = false; }
void TtsLoader::run() {
if (!stopped) { speaker->loadTts(); }
stopped = false; // }
void TtsLoader::stop() {
stopped = true;
}
/////////////////////////////////////////////////////////////////////////////////// TtsRemover::TtsRemover(Speaker *speaker) { this->speaker = speaker; stopped = false; }
void TtsRemover::run() {
if (!stopped) {
speaker->removeTts(); }
stopped = false; }
void TtsRemover::stop() {
stopped = true; }
/////////////////////////////////////////////////////////////////////////////////// SpeakThread::SpeakThread(Speaker *speaker) { this->speaker = speaker; stopped = false; }
void SpeakThread::run() {
if (!stopped) {
speaker->speakString(speakingString); }
stopped = false; }
void SpeakThread::stop() {
stopped = true; }
void SpeakThread::setSpeakingString(const QString &speakingString) {
this->speakingString = speakingString; } /*
很奇怪的问题: 如果直接使用loadTts()和removeTts()函数来初始化和释放TTS的资源, 就不会存在内存泄漏问题. 但是如果使用线程来处理, 即调用initializeTts(), releaseTts(), 在线程中调用loadTts(), removeTts()来初始化和释放TTS的资源, 就会存在内存泄漏. 泄漏的内存大小为初始化一次TTS的内存, 没发现会叠加.
文本发音的使用过程: 由于使用的是单态模式, 所以在使用发音函数speak前, 初始化TTS一次就可以了, 而TTS的资源释放是自动释放的, 当然也可以手动释放.
1. Speaker::getInstance().initializeTts(); // 最好程序启动的时候调用. 2. Speaker::getInstance().speak(str);
.................可以在程序的任何地方直接调用.(如果TTS没有被加载, 或者不启用语音功能, 这时调用了不起任何作用)
[不需要自己手动释放TTS的资源, 因为使用了智能指针实现单态模式] */

