From bebddd42c265bf63845f42bb29f48de5ed263f69 Mon Sep 17 00:00:00 2001 From: Dominik Wenger Date: Sat, 15 Dec 2007 13:13:57 +0000 Subject: rbutil: reworked configuration of TTS engines to the new Style. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15932 a1c6a512-1295-4272-9138-f99709370657 --- rbutil/rbutilqt/configure.cpp | 143 +++---------- rbutil/rbutilqt/configure.h | 4 +- rbutil/rbutilqt/configurefrm.ui | 62 +++--- rbutil/rbutilqt/encoders.cpp | 8 +- rbutil/rbutilqt/encoders.h | 20 +- rbutil/rbutilqt/installtalkwindow.cpp | 55 +---- rbutil/rbutilqt/rbutilqt.cpp | 2 - rbutil/rbutilqt/rbutilqt.pro | 10 +- rbutil/rbutilqt/sapicfgfrm.ui | 168 +++++++++++++++ rbutil/rbutilqt/talkfile.cpp | 77 +------ rbutil/rbutilqt/talkfile.h | 65 +----- rbutil/rbutilqt/tts.cpp | 376 ++++++++++++++++++++++++++++++++++ rbutil/rbutilqt/tts.h | 116 +++++++++++ rbutil/rbutilqt/ttsexescfgfrm.ui | 158 ++++++++++++++ 14 files changed, 916 insertions(+), 348 deletions(-) create mode 100644 rbutil/rbutilqt/sapicfgfrm.ui create mode 100644 rbutil/rbutilqt/tts.cpp create mode 100644 rbutil/rbutilqt/tts.h create mode 100644 rbutil/rbutilqt/ttsexescfgfrm.ui (limited to 'rbutil') diff --git a/rbutil/rbutilqt/configure.cpp b/rbutil/rbutilqt/configure.cpp index 4e483ed894..337f5bc210 100644 --- a/rbutil/rbutilqt/configure.cpp +++ b/rbutil/rbutilqt/configure.cpp @@ -24,6 +24,7 @@ #include "ui_configurefrm.h" #include "browsedirtree.h" #include "encoders.h" +#include "tts.h" #include #if defined(Q_OS_WIN32) @@ -75,9 +76,9 @@ Config::Config(QWidget *parent,int index) : QDialog(parent) connect(ui.buttonAutodetect,SIGNAL(clicked()),this,SLOT(autodetect())); connect(ui.buttonCacheBrowse, SIGNAL(clicked()), this, SLOT(browseCache())); connect(ui.buttonCacheClear, SIGNAL(clicked()), this, SLOT(cacheClear())); - connect(ui.browseTts, SIGNAL(clicked()), this, SLOT(browseTts())); + connect(ui.configTts, SIGNAL(clicked()), this, SLOT(configTts())); connect(ui.configEncoder, SIGNAL(clicked()), this, SLOT(configEnc())); - connect(ui.comboTts, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTtsOpts(int))); + connect(ui.comboTts, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTtsState(int))); connect(ui.comboEncoder, SIGNAL(currentIndexChanged(int)), this, SLOT(updateEncState(int))); } @@ -131,20 +132,7 @@ void Config::accept() userSettings->setValue("offline", ui.cacheOfflineMode->isChecked()); // tts settings - QString preset; - preset = ui.comboTts->itemData(ui.comboTts->currentIndex(), Qt::UserRole).toString(); - userSettings->setValue("ttspreset", preset); - userSettings->beginGroup(preset); - - if(QFileInfo(ui.ttsExecutable->text()).exists()) - userSettings->setValue("binary", ui.ttsExecutable->text()); - userSettings->setValue("options", ui.ttsOptions->text()); - userSettings->setValue("language", ui.ttsLanguage->text()); - devices->beginGroup(preset); - userSettings->setValue("template", devices->value("template").toString()); - userSettings->setValue("type", devices->value("tts").toString()); - devices->endGroup(); - userSettings->endGroup(); + userSettings->setValue("tts",ui.comboTts->currentText()); //encoder settings userSettings->setValue("encoder",ui.comboEncoder->currentText()); @@ -316,86 +304,34 @@ void Config::setDevices(QSettings *dev) updateEncState(index); //tts - devices->beginGroup("tts"); - QStringList keys = devices->allKeys(); - for(int i=0; i < keys.size();i++) - { - devices->endGroup(); - devices->beginGroup(keys.at(i)); - QString os = devices->value("os").toString(); - devices->endGroup(); - devices->beginGroup("tts"); - - if(os == "all") - ui.comboTts->addItem(devices->value(keys.at(i), "null").toString(), keys.at(i)); - -#if defined(Q_OS_WIN32) - if(os == "win32") - ui.comboTts->addItem(devices->value(keys.at(i), "null").toString(), keys.at(i)); -#endif - } - devices->endGroup(); - - - index = ui.comboTts->findData(userSettings->value("ttspreset").toString(), - Qt::UserRole, Qt::MatchExactly); + ui.comboTts->addItems(getTTSList()); + + + //update index of combobox + index = ui.comboTts->findText(userSettings->value("tts").toString(),Qt::MatchExactly); if(index < 0) index = 0; ui.comboTts->setCurrentIndex(index); - updateTtsOpts(index); + updateTtsState(index); - } -void Config::updateTtsOpts(int index) +void Config::updateTtsState(int index) { - bool edit; - QString e; - bool needsLanguageCfg; - QString c = ui.comboTts->itemData(index, Qt::UserRole).toString(); - devices->beginGroup(c); - edit = devices->value("edit").toBool(); - needsLanguageCfg = devices->value("needslanguagecfg").toBool(); - ui.ttsLanguage->setVisible(needsLanguageCfg); - ui.ttsLanguageLabel->setVisible(needsLanguageCfg); - ui.ttsOptions->setText(devices->value("options").toString()); - ui.ttsOptions->setEnabled(devices->value("edit").toBool()); - e = devices->value("tts").toString(); - devices->endGroup(); - -#if defined(Q_OS_LINUX) || defined(Q_OS_MACX) - QStringList path = QString(getenv("PATH")).split(":", QString::SkipEmptyParts); -#elif defined(Q_OS_WIN) - QStringList path = QString(getenv("PATH")).split(";", QString::SkipEmptyParts); -#endif - qDebug() << path; - ui.ttsExecutable->setEnabled(true); - for(int i = 0; i < path.size(); i++) { - QString executable = QDir::fromNativeSeparators(path.at(i)) + "/" + e; -#if defined(Q_OS_WIN) - executable += ".exe"; - QStringList ex = executable.split("\"", QString::SkipEmptyParts); - executable = ex.join(""); -#endif - qDebug() << executable; - if(QFileInfo(executable).isExecutable()) { - ui.ttsExecutable->setText(QDir::toNativeSeparators(executable)); - // disallow changing the detected path if non-customizable profile - if(!edit) - ui.ttsExecutable->setEnabled(false); - break; - } - } + QString ttsName = ui.comboTts->itemText(index); + TTSBase* tts = getTTS(ttsName); + tts->setUserCfg(userSettings); - //user settings - userSettings->beginGroup(c); - QString temp = userSettings->value("binary","null").toString(); - if(temp != "null") ui.ttsExecutable->setText(temp); - temp = userSettings->value("options","null").toString(); - if(temp != "null") ui.ttsOptions->setText(temp); - temp = userSettings->value("language","null").toString(); - if(temp != "null") ui.ttsLanguage->setText(temp); - userSettings->endGroup(); + if(tts->configOk()) + { + ui.configTTSstatus->setText("Configuration OK"); + ui.configTTSstatusimg->setPixmap(QPixmap(QString::fromUtf8(":/icons/icons/go-next.png"))); + } + else + { + ui.configTTSstatus->setText("Configuration INVALID"); + ui.configTTSstatusimg->setPixmap(QPixmap(QString::fromUtf8(":/icons/icons/dialog-error.png"))); + } } void Config::updateEncState(int index) @@ -406,13 +342,13 @@ void Config::updateEncState(int index) if(enc->configOk()) { - ui.configstatus->setText("Configuration OK"); - ui.configstatusimg->setPixmap(QPixmap(QString::fromUtf8(":/icons/icons/go-next.png"))); + ui.configEncstatus->setText("Configuration OK"); + ui.configEncstatusimg->setPixmap(QPixmap(QString::fromUtf8(":/icons/icons/go-next.png"))); } else { - ui.configstatus->setText("Configuration INVALID"); - ui.configstatusimg->setPixmap(QPixmap(QString::fromUtf8(":/icons/icons/dialog-error.png"))); + ui.configEncstatus->setText("Configuration INVALID"); + ui.configEncstatusimg->setPixmap(QPixmap(QString::fromUtf8(":/icons/icons/dialog-error.png"))); } } @@ -676,24 +612,13 @@ void Config::cacheClear() } -void Config::browseTts() +void Config::configTts() { - BrowseDirtree browser(this); - browser.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); - - if(QFileInfo(ui.ttsExecutable->text()).isDir()) - { - browser.setDir(ui.ttsExecutable->text()); - } - if(browser.exec() == QDialog::Accepted) - { - qDebug() << browser.getSelected(); - QString exe = browser.getSelected(); - if(!QFileInfo(exe).exists()) - return; - ui.ttsExecutable->setText(exe); - } - + TTSBase* tts =getTTS(ui.comboTts->currentText()); + + tts->setUserCfg(userSettings); + tts->showCfg(); + updateTtsState(ui.comboTts->currentIndex()); } diff --git a/rbutil/rbutilqt/configure.h b/rbutil/rbutilqt/configure.h index 3679d0c0f5..c7068e01dc 100644 --- a/rbutil/rbutilqt/configure.h +++ b/rbutil/rbutilqt/configure.h @@ -64,9 +64,9 @@ class Config : public QDialog void setMountpoint(QString); void setCache(QString); void cacheClear(void); - void browseTts(void); + void configTts(void); void configEnc(void); - void updateTtsOpts(int); + void updateTtsState(int); void updateEncState(int); }; diff --git a/rbutil/rbutilqt/configurefrm.ui b/rbutil/rbutilqt/configurefrm.ui index 78bb929af0..d6d13f6d6f 100644 --- a/rbutil/rbutilqt/configurefrm.ui +++ b/rbutil/rbutilqt/configurefrm.ui @@ -358,8 +358,8 @@ :/icons/icons/audio-input-microphone.png - - + + TTS Engine @@ -368,66 +368,54 @@ - &Select TTS profile + &Select TTS Engine comboTts - + - TTS executable - - - ttsExecutable + Configure TTS Engine - - - - + - &Browse - - - :/icons/icons/edit-find.png + Configuration invalid ! - - + + - TTS Options + - - ttsOptions + + :/icons/icons/dialog-error.png - - - - - + + - TTS Language + Configure &TTS + + + :/icons/icons/edit-find.png - - - - + Encoder Engine @@ -454,14 +442,14 @@ - + Configuration invalid ! - + @@ -473,7 +461,7 @@ - &Configure + Configure &Enc :/icons/icons/edit-find.png @@ -483,15 +471,15 @@ - + Qt::Vertical - 226 - 51 + 458 + 131 diff --git a/rbutil/rbutilqt/encoders.cpp b/rbutil/rbutilqt/encoders.cpp index 4f25f813dd..54fc5ad201 100644 --- a/rbutil/rbutilqt/encoders.cpp +++ b/rbutil/rbutilqt/encoders.cpp @@ -7,7 +7,7 @@ * \/ \/ \/ \/ \/ * * Copyright (C) 2007 by Dominik Wenger - * $Id: talkfile.cpp 15212 2007-10-19 21:49:07Z domonoky $ + * $Id: encoders.cpp 15212 2007-10-19 21:49:07Z domonoky $ * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. @@ -33,6 +33,9 @@ void initEncoderList() // function to get a specific encoder EncBase* getEncoder(QString encname) { + // init list if its empty + if(encoderList.count() == 0) initEncoderList(); + QString encoder = encoderList.key(encname); // check cache @@ -59,6 +62,9 @@ EncBase* getEncoder(QString encname) // get the list of encoders, nice names QStringList getEncoderList() { + // init list if its empty + if(encoderList.count() == 0) initEncoderList(); + QStringList encList; QMapIterator i(encoderList); while (i.hasNext()) { diff --git a/rbutil/rbutilqt/encoders.h b/rbutil/rbutilqt/encoders.h index f69c3ba611..688ffbcd25 100644 --- a/rbutil/rbutilqt/encoders.h +++ b/rbutil/rbutilqt/encoders.h @@ -7,7 +7,7 @@ * \/ \/ \/ \/ \/ * * Copyright (C) 2007 by Dominik Wenger - * $Id: talkfile.h 15212 2007-10-19 21:49:07Z domonoky $ + * $Id: encoders.h 15212 2007-10-19 21:49:07Z domonoky $ * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. @@ -45,19 +45,19 @@ class EncBase : public QDialog Q_OBJECT public: EncBase(QWidget *parent ); - virtual ~EncBase(){} - virtual bool encode(QString input,QString output) = 0; - virtual bool start() = 0; - virtual bool stop() = 0; - virtual void showCfg() = 0; - virtual bool configOk()=0; + + virtual bool encode(QString input,QString output){return false;} + virtual bool start(){return false;} + virtual bool stop(){return false;} + virtual void showCfg(){} + virtual bool configOk(){return false;} void setUserCfg(QSettings *uSettings){userSettings = uSettings;} public slots: - virtual void accept(void)=0; - virtual void reject(void)=0; - virtual void reset(void)=0; + virtual void accept(void){} + virtual void reject(void){} + virtual void reset(void){} protected: diff --git a/rbutil/rbutilqt/installtalkwindow.cpp b/rbutil/rbutilqt/installtalkwindow.cpp index caceb03176..4634ba3eaf 100644 --- a/rbutil/rbutilqt/installtalkwindow.cpp +++ b/rbutil/rbutilqt/installtalkwindow.cpp @@ -79,26 +79,7 @@ void InstallTalkWindow::accept() connect(logger,SIGNAL(closed()),this,SLOT(close())); QString folderToTalk = ui.lineTalkFolder->text(); - - // tts - QString preset = userSettings->value("ttspreset").toString(); - userSettings->beginGroup(preset); - QString pathTTS = userSettings->value("binary").toString(); - QString ttsOpts = userSettings->value("options").toString(); - QString ttsLanguage = userSettings->value("language").toString(); - QString ttsTemplate = userSettings->value("template").toString(); - QString ttsType =userSettings->value("type").toString(); - userSettings->endGroup(); - - //encoder - QString encoderPreset = userSettings->value("encpreset").toString(); - userSettings->beginGroup(encoderPreset); - QString pathEncoder = userSettings->value("binary").toString(); - QString encOpts = userSettings->value("options").toString(); - QString encTemplate = userSettings->value("template").toString(); - QString encType =userSettings->value("type").toString(); - userSettings->endGroup(); - + if(!QFileInfo(folderToTalk).isDir()) { logger->addItem(tr("The Folder to Talk is wrong!"),LOGERROR); @@ -106,20 +87,6 @@ void InstallTalkWindow::accept() return; } - if(!QFileInfo(pathEncoder).isExecutable()) - { - logger->addItem(tr("Path to Encoder is wrong!"),LOGERROR); - logger->abort(); - return; - } - - if(!QFileInfo(pathTTS).exists()) - { - logger->addItem(tr("Path to TTS is wrong!"),LOGERROR); - logger->abort(); - return; - } - userSettings->setValue("last_talked_folder", folderToTalk); userSettings->sync(); @@ -127,11 +94,6 @@ void InstallTalkWindow::accept() talkcreator->setUserSettings(userSettings); talkcreator->setDir(QDir(folderToTalk)); talkcreator->setMountPoint(userSettings->value("mountpoint").toString()); - talkcreator->setTTSexe(pathTTS); - talkcreator->setTTsOpts(ttsOpts); - talkcreator->setTTsLanguage(ttsLanguage); - talkcreator->setTTsType(ttsType); - talkcreator->setTTsTemplate(ttsTemplate); talkcreator->setOverwriteTalk(ui.OverwriteTalk->isChecked()); talkcreator->setOverwriteWav(ui.OverwriteWav->isChecked()); @@ -150,14 +112,13 @@ void InstallTalkWindow::setDeviceSettings(QSettings *dev) devices = dev; qDebug() << "Install::setDeviceSettings:" << devices; - QString profile; - - profile = userSettings->value("ttspreset", "none").toString(); - devices->beginGroup("tts"); - ui.labelTtsProfile->setText(tr("TTS Profile: %1") - .arg(devices->value(profile, tr("Invalid TTS profile!")).toString())); - qDebug() << profile; - devices->endGroup(); + QString ttsName = userSettings->value("tts", "none").toString(); + TTSBase* tts = getTTS(ttsName); + tts->setUserCfg(userSettings); + if(tts->configOk()) + ui.labelTtsProfile->setText(tr("Selected TTS engine : %1").arg(ttsName)); + else + ui.labelTtsProfile->setText(tr("Selected TTS Engine: %1").arg("Invalid TTS configuration!")); QString encoder = userSettings->value("encoder", "none").toString(); EncBase* enc = getEncoder(encoder); diff --git a/rbutil/rbutilqt/rbutilqt.cpp b/rbutil/rbutilqt/rbutilqt.cpp index 558e903e3e..395e538040 100644 --- a/rbutil/rbutilqt/rbutilqt.cpp +++ b/rbutil/rbutilqt/rbutilqt.cpp @@ -31,7 +31,6 @@ #include "installthemes.h" #include "uninstallwindow.h" #include "browseof.h" -#include "encoders.h" #if defined(Q_OS_LINUX) #include @@ -120,7 +119,6 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent) initIpodpatcher(); initSansapatcher(); downloadInfo(); - initEncoderList(); } diff --git a/rbutil/rbutilqt/rbutilqt.pro b/rbutil/rbutilqt/rbutilqt.pro index 85f76f350b..c344d6ac70 100644 --- a/rbutil/rbutilqt/rbutilqt.pro +++ b/rbutil/rbutilqt/rbutilqt.pro @@ -36,7 +36,8 @@ SOURCES += rbutilqt.cpp \ utils.cpp \ browseof.cpp \ preview.cpp \ - encoders.cpp + encoders.cpp \ + tts.cpp HEADERS += rbutilqt.h \ install.h \ @@ -73,7 +74,8 @@ HEADERS += rbutilqt.h \ utils.h \ browseof.h \ preview.h \ - encoders.h + encoders.h \ + tts.h # Needed by QT on Win INCLUDEPATH = . irivertools zip zlib ../ipodpatcher ../sansapatcher ../../tools/rbspeex @@ -106,7 +108,9 @@ FORMS += rbutilqtfrm.ui \ browseoffrm.ui \ previewfrm.ui \ rbspeexcfgfrm.ui \ - encexescfgfrm.ui + encexescfgfrm.ui \ + ttsexescfgfrm.ui \ + sapicfgfrm.ui RESOURCES += rbutilqt.qrc diff --git a/rbutil/rbutilqt/sapicfgfrm.ui b/rbutil/rbutilqt/sapicfgfrm.ui new file mode 100644 index 0000000000..34e3591aba --- /dev/null +++ b/rbutil/rbutilqt/sapicfgfrm.ui @@ -0,0 +1,168 @@ + + SapiCfgFrm + + + + 0 + 0 + 511 + 242 + + + + Configuration + + + + + + Configure TTS Engine + + + + + + + 0 + 255 + + + + Path to TTS Engine + + + + + + + + + + + + &Browse + + + + + + + + + TTS options + + + + + + + + + + Language + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Reset + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + &Ok + + + :/icons/icons/go-next.png + + + + + + + &Cancel + + + :/icons/icons/process-stop.png + + + + + + + + + + + + + + + + buttonOk + clicked() + SapiCfgFrm + accept() + + + 253 + 147 + + + 203 + 86 + + + + + buttonCancel + clicked() + SapiCfgFrm + reject() + + + 352 + 147 + + + 203 + 86 + + + + + diff --git a/rbutil/rbutilqt/talkfile.cpp b/rbutil/rbutilqt/talkfile.cpp index 141af0b5ec..6f70111aff 100644 --- a/rbutil/rbutilqt/talkfile.cpp +++ b/rbutil/rbutilqt/talkfile.cpp @@ -30,15 +30,9 @@ bool TalkFileCreator::createTalkFiles(ProgressloggerInterface* logger) m_logger = logger; m_logger->addItem("Starting Talk file generation",LOGINFO); - if(m_curTTS == "sapi") - m_tts = new TTSSapi(); - else - m_tts = new TTSExes(); - - m_tts->setTTSexe(m_TTSexec); - m_tts->setTTsOpts(m_TTSOpts); - m_tts->setTTsLanguage(m_TTSLanguage); - m_tts->setTTsTemplate(m_curTTSTemplate); + //tts + m_tts = getTTS(userSettings->value("tts").toString()); + m_tts->setUserCfg(userSettings); if(!m_tts->start()) { @@ -183,68 +177,3 @@ void TalkFileCreator::abort() m_abort = true; } -bool TTSSapi::start() -{ - QFileInfo tts(m_TTSexec); - if(!tts.exists()) - return false; - - // create the voice process - QString execstring = m_TTSTemplate; - execstring.replace("%exe",m_TTSexec); - execstring.replace("%options",m_TTSOpts); - execstring.replace("%lang",m_TTSLanguage); - qDebug() << "init" << execstring; - voicescript = new QProcess(NULL); - voicescript->start(execstring); - if(!voicescript->waitForStarted()) - return false; - return true; -} - -bool TTSSapi::voice(QString text,QString wavfile) -{ - QString query = "SPEAK\t"+wavfile+"\t"+text+"\r\n"; - qDebug() << "voicing" << query; - voicescript->write(query.toLocal8Bit()); - voicescript->write("SYNC\tbla\r\n"); - voicescript->waitForReadyRead(); - return true; -} - -bool TTSSapi::stop() -{ - QString query = "QUIT\r\n"; - voicescript->write(query.toLocal8Bit()); - voicescript->waitForFinished(); - delete voicescript; - return true; -} - -bool TTSExes::start() -{ - QFileInfo tts(m_TTSexec); - qDebug() << "ttsexe init"; - if(tts.exists()) - { - return true; - } - else - { - return false; - } -} - -bool TTSExes::voice(QString text,QString wavfile) -{ - QString execstring = m_TTSTemplate; - - execstring.replace("%exe",m_TTSexec); - execstring.replace("%options",m_TTSOpts); - execstring.replace("%wavfile",wavfile); - execstring.replace("%text",text); - //qDebug() << "voicing" << execstring; - QProcess::execute(execstring); - return true; - -} diff --git a/rbutil/rbutilqt/talkfile.h b/rbutil/rbutilqt/talkfile.h index 2e2c3d7a01..d45d3a1907 100644 --- a/rbutil/rbutilqt/talkfile.h +++ b/rbutil/rbutilqt/talkfile.h @@ -25,30 +25,7 @@ #include "progressloggerinterface.h" #include "encoders.h" - - -class TTSBase : public QObject -{ - Q_OBJECT -public: - TTSBase(){} - virtual ~TTSBase(){} - virtual bool voice(QString text,QString wavfile){(void)text; (void)wavfile; return false;} - virtual bool start(){return false;} - virtual bool stop(){return false;} - - void setTTSexe(QString exe){m_TTSexec=exe;} - void setTTsOpts(QString opts) {m_TTSOpts=opts;} - void setTTsLanguage(QString language) {m_TTSLanguage = language;} - void setTTsTemplate(QString t) { m_TTSTemplate = t; } - -protected: - QString m_TTSexec; - QString m_TTSOpts; - QString m_TTSTemplate; - QString m_TTSLanguage; -}; - +#include "tts.h" class TalkFileCreator :public QObject { @@ -61,14 +38,6 @@ public: void setUserSettings(QSettings* setting) { userSettings = setting;} - void setTTSexe(QString exe){m_TTSexec=exe;} - - void setTTsType(QString tts) { m_curTTS = tts; } - void setTTsOpts(QString opts) {m_TTSOpts=opts;} - void setTTsLanguage(QString language) {m_TTSLanguage = language;} - void setTTsTemplate(QString t) { m_curTTSTemplate = t; } - - void setDir(QDir dir){m_dir = dir; } void setMountPoint(QString mountpoint) {m_mountpoint =mountpoint; } @@ -90,12 +59,7 @@ private: QDir m_dir; QString m_mountpoint; - QString m_curTTS; - QString m_TTSexec; - QString m_TTSOpts; - QString m_TTSLanguage; - QString m_curTTSTemplate; - + bool m_overwriteTalk; bool m_overwriteWav; bool m_removeWav; @@ -109,31 +73,6 @@ private: bool m_abort; }; -class TTSSapi : public TTSBase -{ -public: - TTSSapi() {}; - virtual bool voice(QString text,QString wavfile); - virtual bool start(); - virtual bool stop(); - -private: - QProcess* voicescript; -}; - -class TTSExes : public TTSBase -{ -public: - TTSExes() {}; - virtual bool voice(QString text,QString wavfile); - virtual bool start(); - virtual bool stop() {return true;} - -private: - -}; - - #endif diff --git a/rbutil/rbutilqt/tts.cpp b/rbutil/rbutilqt/tts.cpp new file mode 100644 index 0000000000..63e1188851 --- /dev/null +++ b/rbutil/rbutilqt/tts.cpp @@ -0,0 +1,376 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2007 by Dominik Wenger + * $Id: tts.cpp 15212 2007-10-19 21:49:07Z domonoky $ + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "tts.h" + +#include "browsedirtree.h" + +static QMap ttsList; +static QMap ttsCache; + +void initTTSList() +{ + ttsList["espeak"] = "Espeak TTS Engine"; + ttsList["flite"] = "Flite TTS Engine"; + ttsList["swift"] = "Swift TTS Engine"; +#if defined(Q_OS_WIN) + ttsList["sapi"] = "Sapi 5 TTS Engine"; +#endif + +} + +// function to get a specific encoder +TTSBase* getTTS(QString ttsname) +{ + // init list if its empty + if(ttsList.count() == 0) initTTSList(); + + QString ttsName = ttsList.key(ttsname); + + // check cache + if(ttsCache.contains(ttsName)) + return ttsCache.value(ttsName); + + TTSBase* tts; + if(ttsName == "sapi") + { + tts = new TTSSapi(); + ttsCache[ttsName] = tts; + return tts; + } + else + { + tts = new TTSExes(ttsName); + ttsCache[ttsName] = tts; + return tts; + } +} + +// get the list of encoders, nice names +QStringList getTTSList() +{ + // init list if its empty + if(ttsList.count() == 0) initTTSList(); + + QStringList ttsNameList; + QMapIterator i(ttsList); + while (i.hasNext()) { + i.next(); + ttsNameList << i.value(); + } + + return ttsNameList; +} + + +/********************************************************************* +* TTS Base +**********************************************************************/ +TTSBase::TTSBase(QWidget *parent): QDialog(parent) +{ + +} + +/********************************************************************* +* General TTS Exes +**********************************************************************/ +TTSExes::TTSExes(QString name,QWidget *parent) : TTSBase(parent) +{ + m_name = name; + + m_TemplateMap["espeak"] = "\"%exe\" \"%options\" -w \"%wavfile\" \"%text\""; + m_TemplateMap["flite"] = "\"%exe\" \"%options\" -o \"%wavfile\" \"%text\""; + m_TemplateMap["swift"] = "\"%exe\" \"%options\" -o \"%wavfile\" \"%text\""; + + ui.setupUi(this); + this->hide(); + connect(ui.reset,SIGNAL(clicked()),this,SLOT(reset())); + connect(ui.browse,SIGNAL(clicked()),this,SLOT(browse())); +} + +bool TTSExes::start() +{ + userSettings->beginGroup(m_name); + m_TTSexec = userSettings->value("ttspath","").toString(); + m_TTSOpts = userSettings->value("ttsoptions","").toString(); + userSettings->endGroup(); + + m_TTSTemplate = m_TemplateMap.value(m_name); + + QFileInfo tts(m_TTSexec); + if(tts.exists()) + { + return true; + } + else + { + return false; + } +} + +bool TTSExes::voice(QString text,QString wavfile) +{ + QString execstring = m_TTSTemplate; + + execstring.replace("%exe",m_TTSexec); + execstring.replace("%options",m_TTSOpts); + execstring.replace("%wavfile",wavfile); + execstring.replace("%text",text); + //qDebug() << "voicing" << execstring; + QProcess::execute(execstring); + return true; + +} + + +void TTSExes::reset() +{ + ui.ttspath->setText(""); + ui.ttsoptions->setText(""); +} + +void TTSExes::showCfg() +{ + // try to get config from settings + userSettings->beginGroup(m_name); + QString exepath =userSettings->value("ttspath","").toString(); + ui.ttsoptions->setText(userSettings->value("ttsoptions","").toString()); + userSettings->endGroup(); + + if(exepath == "") + { + + //try autodetect tts +#if defined(Q_OS_LINUX) || defined(Q_OS_MACX) + QStringList path = QString(getenv("PATH")).split(":", QString::SkipEmptyParts); +#elif defined(Q_OS_WIN) + QStringList path = QString(getenv("PATH")).split(";", QString::SkipEmptyParts); +#endif + qDebug() << path; + for(int i = 0; i < path.size(); i++) + { + QString executable = QDir::fromNativeSeparators(path.at(i)) + "/" + m_name; +#if defined(Q_OS_WIN) + executable += ".exe"; + QStringList ex = executable.split("\"", QString::SkipEmptyParts); + executable = ex.join(""); +#endif + qDebug() << executable; + if(QFileInfo(executable).isExecutable()) + { + exepath= QDir::toNativeSeparators(executable); + break; + } + } + + } + + ui.ttspath->setText(exepath); + + //show dialog + this->exec(); + +} + +void TTSExes::accept(void) +{ + if(userSettings != NULL) + { + //save settings in user config + userSettings->beginGroup(m_name); + userSettings->setValue("ttspath",ui.ttspath->text()); + userSettings->setValue("ttsoptions",ui.ttsoptions->text()); + userSettings->endGroup(); + // sync settings + userSettings->sync(); + } + this->close(); +} + +void TTSExes::reject(void) +{ + this->close(); +} + +bool TTSExes::configOk() +{ + userSettings->beginGroup(m_name); + QString path = userSettings->value("ttspath","").toString(); + userSettings->endGroup(); + + if (QFileInfo(path).exists()) + return true; + + return false; +} + +void TTSExes::browse() +{ + BrowseDirtree browser(this); + browser.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); + + if(QFileInfo(ui.ttspath->text()).isDir()) + { + browser.setDir(ui.ttspath->text()); + } + if(browser.exec() == QDialog::Accepted) + { + qDebug() << browser.getSelected(); + QString exe = browser.getSelected(); + if(!QFileInfo(exe).isExecutable()) + return; + ui.ttspath->setText(exe); + } +} + +/********************************************************************* +* TTS Sapi +**********************************************************************/ +TTSSapi::TTSSapi(QWidget *parent) : TTSBase(parent) +{ + m_TTSTemplate = "cscript //nologo \"%exe\" /language:%lang \"%options\""; + defaultLanguage ="english"; + ui.setupUi(this); + this->hide(); + connect(ui.reset,SIGNAL(clicked()),this,SLOT(reset())); + connect(ui.browse,SIGNAL(clicked()),this,SLOT(browse())); +} + + +bool TTSSapi::start() +{ + + userSettings->beginGroup("sapi"); + m_TTSexec = userSettings->value("ttspath","").toString(); + m_TTSOpts = userSettings->value("ttsoptions","").toString(); + m_TTSLanguage =userSettings->value("ttslanguage","").toString(); + userSettings->endGroup(); + + QFileInfo tts(m_TTSexec); + if(!tts.exists()) + return false; + + // create the voice process + QString execstring = m_TTSTemplate; + execstring.replace("%exe",m_TTSexec); + execstring.replace("%options",m_TTSOpts); + execstring.replace("%lang",m_TTSLanguage); + qDebug() << "init" << execstring; + voicescript = new QProcess(NULL); + voicescript->start(execstring); + if(!voicescript->waitForStarted()) + return false; + return true; +} + +bool TTSSapi::voice(QString text,QString wavfile) +{ + QString query = "SPEAK\t"+wavfile+"\t"+text+"\r\n"; + qDebug() << "voicing" << query; + voicescript->write(query.toLocal8Bit()); + voicescript->write("SYNC\tbla\r\n"); + voicescript->waitForReadyRead(); + return true; +} + +bool TTSSapi::stop() +{ + QString query = "QUIT\r\n"; + voicescript->write(query.toLocal8Bit()); + voicescript->waitForFinished(); + delete voicescript; + return true; +} + + +void TTSSapi::reset() +{ + ui.ttspath->setText(""); + ui.ttsoptions->setText(""); + ui.ttslanguage->setText(defaultLanguage); +} + +void TTSSapi::showCfg() +{ + // try to get config from settings + userSettings->beginGroup("sapi"); + QString exepath =userSettings->value("ttspath","").toString(); + ui.ttsoptions->setText(userSettings->value("ttsoptions","").toString()); + ui.ttslanguage->setText(userSettings->value("ttsoptions",defaultLanguage).toString()); + userSettings->endGroup(); + + ui.ttspath->setText(exepath); + + //show dialog + this->exec(); + +} + +void TTSSapi::accept(void) +{ + if(userSettings != NULL) + { + //save settings in user config + userSettings->beginGroup("sapi"); + userSettings->setValue("ttspath",ui.ttspath->text()); + userSettings->setValue("ttsoptions",ui.ttsoptions->text()); + userSettings->setValue("ttslanguage",ui.ttslanguage->text()); + userSettings->endGroup(); + // sync settings + userSettings->sync(); + } + this->close(); +} + +void TTSSapi::reject(void) +{ + this->close(); +} + +bool TTSSapi::configOk() +{ + userSettings->beginGroup("sapi"); + QString path = userSettings->value("ttspath","").toString(); + userSettings->endGroup(); + + if (QFileInfo(path).exists()) + return true; + + return false; +} + +void TTSSapi::browse() +{ + BrowseDirtree browser(this); + browser.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); + + if(QFileInfo(ui.ttspath->text()).isDir()) + { + browser.setDir(ui.ttspath->text()); + } + if(browser.exec() == QDialog::Accepted) + { + qDebug() << browser.getSelected(); + QString exe = browser.getSelected(); + if(!QFileInfo(exe).isExecutable()) + return; + ui.ttspath->setText(exe); + } +} + diff --git a/rbutil/rbutilqt/tts.h b/rbutil/rbutilqt/tts.h new file mode 100644 index 0000000000..83fcda35ac --- /dev/null +++ b/rbutil/rbutilqt/tts.h @@ -0,0 +1,116 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2007 by Dominik Wenger + * $Id: tts.h 15212 2007-10-19 21:49:07Z domonoky $ + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + + +#ifndef TTS_H +#define TTS_H + +#include "ui_ttsexescfgfrm.h" +#include "ui_sapicfgfrm.h" +#include + + +class TTSBase; + +//inits the tts List +void initTTSList(); +// function to get a specific tts +TTSBase* getTTS(QString ttsname); +// get the list of tts, nice names +QStringList getTTSList(); + + +class TTSBase : public QDialog +{ + Q_OBJECT +public: + TTSBase(QWidget *parent ); + virtual bool voice(QString text,QString wavfile) {return false;} + virtual bool start(){return false;} + virtual bool stop(){return false;} + virtual void showCfg(){} + virtual bool configOk(){return false;} + + void setUserCfg(QSettings *uSettings){userSettings = uSettings;} + +public slots: + virtual void accept(void){} + virtual void reject(void){} + virtual void reset(void){} + +protected: + QSettings *userSettings; +}; + +class TTSSapi : public TTSBase +{ + Q_OBJECT +public: + TTSSapi(QWidget *parent = NULL); + virtual bool voice(QString text,QString wavfile); + virtual bool start(); + virtual bool stop(); + virtual void showCfg(); + virtual bool configOk(); + +public slots: + virtual void accept(void); + virtual void reject(void); + virtual void reset(void); + void browse(void); + +private: + Ui::SapiCfgFrm ui; + QProcess* voicescript; + + QString defaultLanguage; + + QString m_TTSexec; + QString m_TTSOpts; + QString m_TTSTemplate; + QString m_TTSLanguage; +}; + +class TTSExes : public TTSBase +{ + Q_OBJECT +public: + TTSExes(QString name,QWidget *parent = NULL); + virtual bool voice(QString text,QString wavfile); + virtual bool start(); + virtual bool stop() {return true;} + virtual void showCfg(); + virtual bool configOk(); + +public slots: + virtual void accept(void); + virtual void reject(void); + virtual void reset(void); + void browse(void); + +private: + Ui::TTSExesCfgFrm ui; + QString m_name; + QString m_TTSexec; + QString m_TTSOpts; + QString m_TTSTemplate; + QMap m_TemplateMap; +}; + +#endif diff --git a/rbutil/rbutilqt/ttsexescfgfrm.ui b/rbutil/rbutilqt/ttsexescfgfrm.ui new file mode 100644 index 0000000000..8893d9ccf4 --- /dev/null +++ b/rbutil/rbutilqt/ttsexescfgfrm.ui @@ -0,0 +1,158 @@ + + TTSExesCfgFrm + + + + 0 + 0 + 463 + 214 + + + + Configuration + + + + + + Configure TTS Engine + + + + + + + 0 + 255 + + + + Path to TTS Engine + + + + + + + + + + + + &Browse + + + + + + + + + TTS options + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Reset + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + &Ok + + + :/icons/icons/go-next.png + + + + + + + &Cancel + + + :/icons/icons/process-stop.png + + + + + + + + + + + + + + + + buttonOk + clicked() + TTSExesCfgFrm + accept() + + + 253 + 147 + + + 203 + 86 + + + + + buttonCancel + clicked() + TTSExesCfgFrm + reject() + + + 352 + 147 + + + 203 + 86 + + + + + -- cgit v1.2.3