Index: rbutil/rbutilqt/rbutilqt.pro =================================================================== --- rbutil/rbutilqt/rbutilqt.pro (Revision 21525) +++ rbutil/rbutilqt/rbutilqt.pro (Arbeitskopie) @@ -153,7 +153,7 @@ } !dbg { CONFIG += release thread qt - DEFINES += QT_NO_DEBUG_OUTPUT + DEFINES -= QT_NO_DEBUG_OUTPUT message("release") } Index: rbutil/rbutilqt/encttscfggui.cpp =================================================================== --- rbutil/rbutilqt/encttscfggui.cpp (Revision 21525) +++ rbutil/rbutilqt/encttscfggui.cpp (Arbeitskopie) @@ -356,7 +356,7 @@ QString curPath = setting->current().toString(); // show file dialog QString exe = QFileDialog::getOpenFileName(this, tr("Select excutable"), curPath, "*"); - if(!QFileInfo(exe).isExecutable()) + if(!QFileInfo(exe).exists()) return; // set new value, gui will update automatically setting->setCurrent(exe); Index: rbutil/rbutilqt/configure.cpp =================================================================== --- rbutil/rbutilqt/configure.cpp (Revision 21525) +++ rbutil/rbutilqt/configure.cpp (Arbeitskopie) @@ -680,7 +680,7 @@ QTemporaryFile file(this); file.open(); - QString filename = file.fileName(); + QString filename = file.fileName() + ".wav"; file.close(); if(tts->voice(tr("Rockbox Utility Voice Test"),filename,&errstr) == FatalError) Index: rbutil/rbutilqt/base/tts.cpp =================================================================== --- rbutil/rbutilqt/base/tts.cpp (Revision 21525) +++ rbutil/rbutilqt/base/tts.cpp (Arbeitskopie) @@ -36,6 +36,7 @@ ttsList["espeak"] = "Espeak TTS Engine"; ttsList["flite"] = "Flite TTS Engine"; ttsList["swift"] = "Swift TTS Engine"; + ttsList["open-sapi"] = "Open Sapi Engine"; #if defined(Q_OS_WIN) ttsList["sapi"] = "Sapi TTS Engine"; #endif @@ -47,26 +48,24 @@ // function to get a specific encoder TTSBase* TTSBase::getTTS(QObject* parent,QString ttsName) { - TTSBase* tts; -#if defined(Q_OS_WIN) if(ttsName == "sapi") { tts = new TTSSapi(parent); return tts; } - else -#endif -#if defined(Q_OS_LINUX) - if (ttsName == "festival") + else if (ttsName == "festival") { tts = new TTSFestival(parent); return tts; } - else -#endif - if (true) // fix for OS other than WIN or LINUX + else if(ttsName == "open-sapi") { + tts = new TTSOpenSapi(parent); + return tts; + } + else // fix for OS other than WIN or LINUX + { tts = new TTSExes(ttsName,parent); return tts; } @@ -664,3 +663,162 @@ } +/********************************************************************* +* OpenSapi +**********************************************************************/ +TTSOpenSapi::TTSOpenSapi(QObject* parent) : TTSBase(parent) +{ + m_path = ""; +} + +void TTSOpenSapi::generateSettings() +{ + // server path + QString exepath = RbSettings::subValue("open-sapi",RbSettings::TtsPath).toString(); + if(exepath == "" ) exepath = findExecutable("server.exe"); + EncTtsSetting* setting =new EncTtsSetting(this,EncTtsSetting::eSTRING,"Path to Open-Sapi server:",exepath,EncTtsSetting::eBROWSEBTN); + connect(setting,SIGNAL(dataChanged()),this,SLOT(updateVoiceList())); + insertSetting(eSERVERPATH,setting); + + //TODO language is missing ? or not needed for this ? + + //TODO Format + + // voice + insertSetting(eVOICE,new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST, + tr("Voice:"),RbSettings::subValue("open-sapi",RbSettings::TtsVoice),getVoiceList(exepath))); + + //Volume + insertSetting(eVOLUME,new EncTtsSetting(this,EncTtsSetting::eINT, + tr("Volume:"),RbSettings::subValue("open-sapi",RbSettings::TtsVolume),0,100)); + + //speed + insertSetting(eSPEED,new EncTtsSetting(this,EncTtsSetting::eINT, + tr("Rate:"),RbSettings::subValue("open-sapi",RbSettings::TtsSpeed),-10,10)); + + //pitch + insertSetting(ePITCH,new EncTtsSetting(this,EncTtsSetting::eINT, + tr("Pitch:"),RbSettings::subValue("open-sapi",RbSettings::TtsPitch),-10,10)); + +} + +void TTSOpenSapi::saveSettings() +{ + RbSettings::setSubValue("open-sapi",RbSettings::TtsPath,getSetting(eSERVERPATH)->current().toString()); + RbSettings::setSubValue("open-sapi",RbSettings::TtsVoice,getSetting(eVOICE)->current().toString()); + RbSettings::setSubValue("open-sapi",RbSettings::TtsVolume,getSetting(eVOLUME)->current().toInt()); + RbSettings::setSubValue("open-sapi",RbSettings::TtsSpeed,getSetting(eSPEED)->current().toInt()); + RbSettings::setSubValue("open-sapi",RbSettings::TtsPitch,getSetting(ePITCH)->current().toInt()); + + //TODO save other settings +} + +void TTSOpenSapi::updateVoiceList() +{ + QStringList voiceList = getVoiceList(getSetting(eSERVERPATH)->current().toString()); + getSetting(eVOICE)->setList(voiceList); + if(voiceList.size() > 0) getSetting(eVOICE)->setCurrent(voiceList.at(0)); + else getSetting(eVOICE)->setCurrent(""); +} + +QStringList TTSOpenSapi::getVoiceList(QString path) +{ + QStringList result; + QString errstr; + m_path = path; + if(start(&errstr)) + { + // TODO ask server for list + stop(); + } + m_path = ""; + return result; +} + +bool TTSOpenSapi::start(QString *errStr) +{ + if(!configOk()) + return false; + + QString exe; + QStringList args; + + // allow to overwrite the exe path + if(m_path == "") + exe = RbSettings::subValue("open-sapi",RbSettings::TtsPath).toString(); + else + exe = m_path; + +#if defined(Q_OS_LINUX) + args.append(exe); + exe = findExecutable("wine"); +#endif + + args.append("-v"); + qDebug() << "starting: " << exe << args; + + m_serverProcess.start(exe,args); + if(!m_serverProcess.waitForStarted()) + qDebug() << "wait for started failed"; + + if(!m_serverProcess.waitForReadyRead()) + qDebug() << "wait for Ready Read failed"; + + //wait a bit + QDateTime endTime = QDateTime::currentDateTime().addMSecs(3000); + while(QDateTime::currentDateTime() < endTime) + QCoreApplication::processEvents(QEventLoop::AllEvents); + + qDebug() << "outout:" < " + + " " + + " "+text+"\n"; + m_clientSocket.write(message.toUtf8()); + m_clientSocket.flush(); + qDebug() << "outout:" < voiceDescriptions; }; +class TTSOpenSapi : public TTSBase +{ + enum ESettings + { + eSERVERPATH, + eVOICE, + eVOLUME, + eSPEED, + ePITCH + }; + + 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(); + public slots: + void updateVoiceList(); + private slots: + QStringList getVoiceList(QString path); + private: + QTcpSocket m_clientSocket; + QProcess m_serverProcess; + QString m_path; +}; + + #endif Index: rbutil/rbutilqt/base/rbsettings.h =================================================================== --- rbutil/rbutilqt/base/rbsettings.h (Revision 21525) +++ rbutil/rbutilqt/base/rbsettings.h (Arbeitskopie) @@ -56,6 +56,8 @@ TtsOptions, TtsPath, TtsVoice, + TtsVolume, + TtsPitch, EncoderPath, EncoderOptions, WavtrimThreshold,