Index: rbutil/rbutilqt/rbutilqt.pro =================================================================== --- rbutil/rbutilqt/rbutilqt.pro (Revision 21505) +++ rbutil/rbutilqt/rbutilqt.pro (Arbeitskopie) @@ -151,7 +151,7 @@ } !dbg { CONFIG += release thread qt - DEFINES += QT_NO_DEBUG_OUTPUT + DEFINES -= QT_NO_DEBUG_OUTPUT message("release") } Index: rbutil/rbutilqt/base/tts.cpp =================================================================== --- rbutil/rbutilqt/base/tts.cpp (Revision 21505) +++ rbutil/rbutilqt/base/tts.cpp (Arbeitskopie) @@ -36,10 +36,13 @@ ttsList["espeak"] = "Espeak TTS Engine"; ttsList["flite"] = "Flite TTS Engine"; ttsList["swift"] = "Swift TTS Engine"; + ttsList["sapi-spk"] = "Open-Sapi TTS CLI"; #if defined(Q_OS_WIN) ttsList["sapi"] = "Sapi TTS Engine"; + #endif #if defined(Q_OS_LINUX) + ttsList["open-sapi"] = "Open - Sapi"; ttsList["festival"] = "Festival TTS Engine"; #endif } @@ -63,6 +66,11 @@ tts = new TTSFestival(parent); return tts; } + else if(ttsName == "open-sapi") + { + tts = new TTSOpenSapi(parent); + return tts; + } else #endif if (true) // fix for OS other than WIN or LINUX @@ -100,8 +108,8 @@ m_TemplateMap["espeak"] = "\"%exe\" %options -w \"%wavfile\" \"%text\""; m_TemplateMap["flite"] = "\"%exe\" %options -o \"%wavfile\" -t \"%text\""; - m_TemplateMap["swift"] = "\"%exe\" %options -o \"%wavfile\" \"%text\""; - + m_TemplateMap["swift"] = "\"%exe\" %options -o \"%wavfile\" \"%text\""; + m_TemplateMap["sapi-spk"] = "\"%exe\" -o \"%wavfile\" -t \"%text\" \"@@\""; } void TTSExes::generateSettings() @@ -664,3 +672,55 @@ } +/********************************************************************* +* OpenSapi +**********************************************************************/ +TTSOpenSapi::TTSOpenSapi(QObject* parent) : TTSBase(parent) +{ +} + +void TTSOpenSapi::generateSettings() +{ +} + +void TTSOpenSapi::saveSettings() +{ +} + +bool TTSOpenSapi::start(QString *errStr) +{ + m_clientSocket.connectToHost("localhost",5491); + if(!m_clientSocket.waitForConnected(2000)) + { + *errStr = tr("Could not connect to open-sapi server"); + return false; + } + + return true; +} + +bool TTSOpenSapi::stop() +{ + m_clientSocket.disconnectFromHost(); + return true; +} + +TTSStatus TTSOpenSapi::voice(QString text,QString wavfile, QString *errStr) +{ + (void) errStr; + + //set outfile + QString message = "outFile "+wavfile+"\n"; + m_clientSocket.write(message.toUtf8()); + message = "speakMe "+text+"\n"; + m_clientSocket.write(message.toUtf8()); + m_clientSocket.flush(); + + return NoError; + +} + +bool TTSOpenSapi::configOk() +{ + return true; +} Index: rbutil/rbutilqt/base/tts.h =================================================================== --- rbutil/rbutilqt/base/tts.h (Revision 21505) +++ rbutil/rbutilqt/base/tts.h (Arbeitskopie) @@ -177,4 +177,24 @@ QMap voiceDescriptions; }; +class TTSOpenSapi : public TTSBase +{ + + Q_OBJECT + public: + TTSOpenSapi(QObject* parent=NULL); + TTSStatus voice(QString text,QString wavfile, QString *errStr); + bool start(QString *errStr); + bool stop(); + + // for settings + void generateSettings(); + void saveSettings(); + bool configOk(); + + private: + QTcpSocket m_clientSocket; +}; + + #endif Index: rbutil/rbutilqt/talkfile.cpp =================================================================== --- rbutil/rbutilqt/talkfile.cpp (Revision 21505) +++ rbutil/rbutilqt/talkfile.cpp (Arbeitskopie) @@ -259,7 +259,9 @@ return FatalError; } - QString filename = QDir::tempPath()+ "/"+ toSpeak[i] + ".wav"; + //use md5sum of toSpeak for temporary filename + QString filename = QDir::tempPath()+ "/"+ QCryptographicHash::hash(toSpeak[i].toUtf8(), + QCryptographicHash::Md5).toHex() + ".wav"; QString error; TTSStatus status = m_tts->voice(toSpeak[i],filename, &error); @@ -304,9 +306,15 @@ return false; } - QString wavfilename = QDir::tempPath()+ "/"+ toEncode[i] + ".wav"; - QString filename = QDir::tempPath()+ "/"+ toEncode[i] + ".talk"; + //use md5sum of the texts for temporary filenames + QString wavfilename = QDir::tempPath()+ "/"+ QCryptographicHash::hash(toEncode[i].toUtf8(), + QCryptographicHash::Md5).toHex() + ".wav"; + QString filename = QDir::tempPath()+ "/"+ QCryptographicHash::hash(toEncode[i].toUtf8(), + QCryptographicHash::Md5).toHex() + ".talk"; + if(QFileInfo(wavfilename).exists() == false) + m_logger->addItem(tr(" %1 doesn exist").arg(wavfilename), LOGERROR); + if(!m_enc->encode(wavfilename,filename)) { m_logger->addItem(tr("Encoding of %1 failed").arg(filename), LOGERROR); @@ -341,7 +349,8 @@ return false; } - QString source = QDir::tempPath()+ "/"+ it.value() + ".talk"; + QString source = QDir::tempPath()+ "/"+ QCryptographicHash::hash(it.value().toUtf8(), + QCryptographicHash::Md5).toHex() + ".talk"; if(!QFileInfo(source).exists()) continue; // this file was skipped in one of the previous steps @@ -398,9 +407,11 @@ // correct source if we hav stripExtension enabled if(m_stripExtensions) - source = QDir::tempPath()+ "/"+ stripExtension(it.value()) + ".talk"; + source = QDir::tempPath()+ "/"+ QCryptographicHash::hash(stripExtension(it.value()).toUtf8(), + QCryptographicHash::Md5).toHex() + ".talk"; else - source = QDir::tempPath()+ "/"+ it.value() + ".talk"; + source = QDir::tempPath()+ "/"+ QCryptographicHash::hash(it.value().toUtf8(), + QCryptographicHash::Md5).toHex() + ".talk"; if(!QFileInfo(source).exists()) continue; // this file was skipped in one of the previous steps @@ -439,13 +450,18 @@ for(int i=0; i < list.size(); i++) { - if(QFile::exists(QDir::tempPath()+ "/"+ list[i] + ".wav")) - QFile::remove(QDir::tempPath()+ "/"+ list[i] + ".wav"); - if(QFile::exists(QDir::tempPath()+ "/"+ list[i] + ".talk")) - QFile::remove(QDir::tempPath()+ "/"+ list[i] + ".talk"); + if(QFile::exists(QDir::tempPath()+ "/"+ QCryptographicHash::hash(list[i].toUtf8(), + QCryptographicHash::Md5).toHex() + ".wav")) + QFile::remove(QDir::tempPath()+ "/"+ QCryptographicHash::hash(list[i].toUtf8(), + QCryptographicHash::Md5).toHex() + ".wav"); + if(QFile::exists(QDir::tempPath()+ "/"+ QCryptographicHash::hash(list[i].toUtf8(), + QCryptographicHash::Md5).toHex() + ".talk")) + QFile::remove(QDir::tempPath()+ "/"+ QCryptographicHash::hash(list[i].toUtf8(), + QCryptographicHash::Md5).toHex() + ".talk"); QCoreApplication::processEvents(); } + return true; }