qt 操作tts.docx
- 文档编号:17670981
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:15
- 大小:17.82KB
qt 操作tts.docx
《qt 操作tts.docx》由会员分享,可在线阅读,更多相关《qt 操作tts.docx(15页珍藏版)》请在冰点文库上搜索。
qt操作tts
所使用的DLL:
/////////////////////////////////////////////////////////////////////////////////////////////////////
// TTSSpeaker.cpp:
Qt
/////////////////////////////////////////////////////////////////////////////////////////////////////
// 调用sapi.dll, 使用里面的三个函数来初始化, 释放资源, 发音函数
// 在VS中使用TTSSpeaker.cpp生成DLL文件. 因为如果在QtCreator中使用的话, 有可能自带的mingw的不完全, 而找不到
// 某些结构的定义而出错题.
#include "stdafx.h"
#include
#ifdef_MANAGED
#pragmamanaged(push,off)
#endif
BOOLAPIENTRYDllMain(HMODULEhModule,
DWORD ul_reason_for_call,
LPVOIDlpReserved
){
return TRUE;
}
ISpVoice*pVoice;
HRESULThr;
extern "C" __declspec(dllexport) bool initialize(){
pVoice= NULL;
if (FAILED(:
:
CoInitialize(NULL))){
return false;
}
hr=CoCreateInstance(CLSID_SpVoice, NULL,CLSCTX_ALL,IID_ISpVoice,(void**)&pVoice);
return true;
}
extern "C" __declspec(dllexport) void release(){
if (SUCCEEDED(hr)){
pVoice->Release();
pVoice= NULL;
}
:
:
CoUninitialize();
}
extern "C" __declspec(dllexport) void speak(char *szU8){
if (SUCCEEDED(hr)){
int wcsLen=:
:
MultiByteToWideChar(CP_UTF8, NULL,szU8,strlen(szU8), NULL, 0);
wchar_t*wszString= new wchar_t[wcsLen+ 1];
:
:
MultiByteToWideChar(CP_UTF8, NULL,szU8,strlen(szU8),wszString,wcsLen);
wszString[wcsLen]= '\0';
hr=pVoice->Speak(wszString, 0, NULL);
}
}
#ifdef_MANAGED
#pragmamanaged(pop)
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Speaker.h:
Qt
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndefSPEAKER_H
#defineSPEAKER_H
#include
#include
#include
class Speaker;
class TtsLoader;
class TtsRemover;
class SpeakThread;
// 对应sapi.dll里的三个TTS函数, 从DLL中得到的
typedef bool (*InitializeFunc)();
typedef void (*ReleaseFunc)();
typedef void (*SpeakFunc)(char *szU8);
/**
* 管理TTS的类, 对TTS进行加载, 释放TTS占用的资源, 调用TTS进行文本发音.
*/
class Speaker:
public QObject{
Q_OBJECT
public:
static Speaker&getInstance();
void setSpeakEnabled(bool enabled);
bool isSpeakEnabled() const;
bool isTtsLoaded() const;
void speak(const QString&str); // 启动发音线程
void initializeTts(); // 启动TTS加载线程
void releaseTts(); // 启动释放TTS资源的线程
void terminateAllThreads();
protected:
void loadTts(); // 真正加载TTS的函数
void removeTts(); // 真正释放TTS占用资源的函数
void speakString(const QString&str); // 真正发音的函数
private slots:
void completeLoadTts(); //TTS加载线程结束的处理糟函数
void completeRemoveTts(); // 释放TTS资源线程结束的处理糟函数
private:
Speaker();
~Speaker();
Speaker(const Speaker&other);
Speaker& operator=(const Speaker&other);
//TTS 初始化, 释放资源, 发音函数
InitializeFuncinitializeFunc;
ReleaseFunc releaseFunc;
SpeakFunc speakFunc;
bool ttsLoaded; //TTS 加载成功
bool speakEnabled; // 启用语音功能
friend class TtsLoader;
TtsLoader *ttsLoader; //TTS 加载线程
friend class TtsRemover;
TtsRemover *ttsRemover;
friend class SpeakThread;
SpeakThread *speakThread; // 发音线程
friend class std:
:
auto_ptr
static std:
:
auto_ptr
};
///////////////////////////////////////////////////////////////////////////////////
// 加载TTS的线程
// 如果不使用线程来加载, 在加载的时候就会感觉到卡
class TtsLoader:
public QThread{
public:
TtsLoader(Speaker*speaker);
virtual void run();
void stop();
private:
Speaker*speaker;
volatile bool stopped;
};
///////////////////////////////////////////////////////////////////////////////////
// 释放TTS资源的线程
class TtsRemover:
public QThread{
public:
TtsRemover(Speaker*speaker);
void stop();
protected:
virtual void run();
private:
Speaker*speaker;
volatile bool stopped;
};
///////////////////////////////////////////////////////////////////////////////////
//TTS发音线程,
class SpeakThread:
public QThread{
public:
SpeakThread(Speaker*speaker);
void stop();
void setSpeakingString(const QString&speakingString);
protected:
virtual void run();
private:
Speaker*speaker;
volatile bool stopped;
QStringspeakingString;
};
#endif //SPEAKER_H
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Speaker.cpp:
Qt
//////////////////////////////////////////////////////////////////////////////////////////////////////
#include "Speaker.h"
#include
#include
std:
:
auto_ptr
:
instance;
Speaker:
:
Speaker(){
ttsLoaded= false;
speakEnabled= true;
//Threads
ttsLoader= 0;
ttsRemover= 0;
speakThread= 0;
//TTSfunctions
initializeFunc= 0;
releaseFunc= 0;
speakFunc= 0;
}
Speaker:
:
~Speaker(){
terminateAllThreads();
delete ttsLoader;
delete ttsRemover;
delete speakThread;
//这里释放不用线程,而是直接释放
if (ttsLoaded){
removeTts();
}
}
Speaker&Speaker:
:
getInstance(){
if (instance.get()== 0){
instance.reset(new Speaker());
}
return *(instance.get());
}
void Speaker:
:
setSpeakEnabled(bool enabled){
speakEnabled=enabled;
}
bool Speaker:
:
isSpeakEnabled() const {
return speakEnabled;
}
bool Speaker:
:
isTtsLoaded() const {
return ttsLoaded;
}
void Speaker:
:
speak(const QString&str){
if (ttsLoaded&&speakEnabled&&(0 !
=speakThread)){
if (speakThread->isRunning()){
qDebug()<< "speakThreadisrunning";
speakThread->stop();
}
qDebug()<< "Speaking:
" < speakString(""); // 不加这一句, 不知道为什么不行 speakThread->setSpeakingString(str); speakThread->start(); } } void Speaker: : speakString(const QString&str){ if (speakFunc! = 0){ speakFunc(str.toUtf8().data()); } } void Speaker: : initializeTts(){ //Ifttsisloaded,don'tneedtoloadagain. if (ttsLoaded){ return; } // 启动加载线程 //IfttsLoaderisnoteuqal0,thatmeansttsLoaderisrunning. //BecauseafterttsLoaderisfinished,itwillberemoved. if (ttsLoader== 0){ ttsLoader= new TtsLoader(this); connect(ttsLoader,SIGNAL(finished()), this,SLOT(completeLoadTts())); ttsLoader->start(); } } void Speaker: : releaseTts(){ //Ifttsisnotloaded,removingprocessisnotneeded. if (! ttsLoaded){ return; } if (0 ==ttsRemover){ ttsRemover= new TtsRemover(this); connect(ttsRemover,SIGNAL(finished()), this,SLOT(completeRemoveTts())); ttsRemover->start(); } } void Speaker: : loadTts(){ // 如果TTS引擎已经加载了, 就不需要再次加载 if (ttsLoaded){ return; } QLibrarylib("TTSSpeaker"); if (lib.load()){ initializeFunc=(InitializeFunc)lib.resolve("initialize"); releaseFunc=(ReleaseFunc)lib.resolve("release"); speakFunc=(SpeakFunc)lib.resolve("speak"); if (initializeFunc&&releaseFunc&&speakFunc){ initializeFunc(); ttsLoaded= true; qDebug()<< "TTSisloaded."; //Whenttsisloaded,initializethespeakthread. speakThread= new SpeakThread(this); speak(""); // 加载完后说一下,准备好,因为第一次说都会很慢 } } else { qDebug()< } } void Speaker: : removeTts(){ //Ifttsisnotloaded,removingprocessisnotneeded. if (! ttsLoaded){ return; } releaseFunc(); ttsLoaded= false; initializeFunc= 0; releaseFunc= 0; speakFunc= 0; qDebug()<< "TTSisremoved."; //Afterttsisremoved,speakthreadisalsoneedtoberemoved. if (speakThread! = 0){ speakThread->terminate(); } delete speakThread; speakThread= 0; } /** *Aftertheprocessthatloadsttsiscompleted,theloadthreadisnotneeded,thenremoveit. */ void Speaker: : completeLoadTts(){ delete ttsLoader; ttsLoader= 0; } /** *Aftertheprocessthatremovesttsiscompleted,theremovethreadisnotneeded,thenremoveit. */ void Speaker: : completeRemoveTts(){ delete ttsRemover; ttsRemover= 0; } /** *Terminatedallthreads. */ 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; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- qt 操作tts 操作 tts