所使用的DLL: http://www.cppblog.com/Files/biao/TTSSpeaker.dll.zip ///////////////////////////////////////////////////////////////////////////////////////////////////// // TTSSpeaker.cpp: Qt
///////////////////////////////////////////////////////////////////////////////////////////////////// // 调用sapi.dll, 使用里面的三个函数来初始化, 释放资源, 发音函数
// 在VS中使用TTSSpeaker.cpp生成DLL文件. 因为如果在QtCreator中使用的话, 有可能自带的mingw的不完全, 而找不到
// 某些结构的定义而出错题.
#include \
#include
#ifdef _MANAGED #pragma managed(push, off) #endif
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) {
return TRUE;
}
ISpVoice *pVoice; HRESULT hr;
extern \ __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 \ __declspec(dllexport) void release() { if (SUCCEEDED(hr)) {
pVoice->Release(); pVoice = NULL; }
::CoUninitialize(); }
extern \ __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 #pragma managed(pop) #endif
////////////////////////////////////////////////////////////////////////////////////////////////////// // Speaker.h: Qt
////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef SPEAKER_H #define SPEAKER_H
#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 初始化, 释放资源, 发音函数
InitializeFunc initializeFunc; 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
/////////////////////////////////////////////////////////////////////////////////// // 加载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:
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新幼儿教育qt 操作tts 全文阅读和word下载服务。
相关推荐: