summaryrefslogtreecommitdiff
path: root/rbutil/rbutilqt/tts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rbutil/rbutilqt/tts.cpp')
-rw-r--r--rbutil/rbutilqt/tts.cpp117
1 files changed, 110 insertions, 7 deletions
diff --git a/rbutil/rbutilqt/tts.cpp b/rbutil/rbutilqt/tts.cpp
index b7c89ecbe9..de8e1d4468 100644
--- a/rbutil/rbutilqt/tts.cpp
+++ b/rbutil/rbutilqt/tts.cpp
@@ -104,7 +104,7 @@ TTSExes::TTSExes(QString name,QWidget *parent) : TTSBase(parent)
104 connect(ui.browse,SIGNAL(clicked()),this,SLOT(browse())); 104 connect(ui.browse,SIGNAL(clicked()),this,SLOT(browse()));
105} 105}
106 106
107bool TTSExes::start() 107bool TTSExes::start(QString *errStr)
108{ 108{
109 userSettings->beginGroup(m_name); 109 userSettings->beginGroup(m_name);
110 m_TTSexec = userSettings->value("ttspath","").toString(); 110 m_TTSexec = userSettings->value("ttspath","").toString();
@@ -120,6 +120,7 @@ bool TTSExes::start()
120 } 120 }
121 else 121 else
122 { 122 {
123 *errStr = tr("TTS executable not found");
123 return false; 124 return false;
124 } 125 }
125} 126}
@@ -244,42 +245,111 @@ void TTSExes::browse()
244**********************************************************************/ 245**********************************************************************/
245TTSSapi::TTSSapi(QWidget *parent) : TTSBase(parent) 246TTSSapi::TTSSapi(QWidget *parent) : TTSBase(parent)
246{ 247{
247 m_TTSTemplate = "cscript //nologo \"%exe\" /language:%lang \"%options\""; 248 m_TTSTemplate = "cscript //nologo \"%exe\" /language:%lang /voice:\"%voice\" /speed:%speed \"%options\"";
248 defaultLanguage ="english"; 249 defaultLanguage ="english";
249 ui.setupUi(this); 250 ui.setupUi(this);
250 this->hide(); 251 this->hide();
251 connect(ui.reset,SIGNAL(clicked()),this,SLOT(reset())); 252 connect(ui.reset,SIGNAL(clicked()),this,SLOT(reset()));
253 connect(ui.languagecombo,SIGNAL(currentIndexChanged(QString)),this,SLOT(updateVoices(QString)));
252} 254}
253 255
254 256
255bool TTSSapi::start() 257bool TTSSapi::start(QString *errStr)
256{ 258{
257 259
258 userSettings->beginGroup("sapi"); 260 userSettings->beginGroup("sapi");
259 m_TTSOpts = userSettings->value("ttsoptions","").toString(); 261 m_TTSOpts = userSettings->value("ttsoptions","").toString();
260 m_TTSLanguage =userSettings->value("ttslanguage","").toString(); 262 m_TTSLanguage =userSettings->value("ttslanguage","").toString();
263 m_TTSVoice=userSettings->value("ttsvoice","").toString();
264 m_TTSSpeed=userSettings->value("ttsspeed","").toString();
261 userSettings->endGroup(); 265 userSettings->endGroup();
262 266
267 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
263 QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs"); 268 QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs");
264 m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs"; 269 m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs";
265 270
266 QFileInfo tts(m_TTSexec); 271 QFileInfo tts(m_TTSexec);
267 if(!tts.exists()) 272 if(!tts.exists())
273 {
274 *errStr = tr("Could not copy the Sapi-script");
268 return false; 275 return false;
269 276 }
270 // create the voice process 277 // create the voice process
271 QString execstring = m_TTSTemplate; 278 QString execstring = m_TTSTemplate;
272 execstring.replace("%exe",m_TTSexec); 279 execstring.replace("%exe",m_TTSexec);
273 execstring.replace("%options",m_TTSOpts); 280 execstring.replace("%options",m_TTSOpts);
274 execstring.replace("%lang",m_TTSLanguage); 281 execstring.replace("%lang",m_TTSLanguage);
282 execstring.replace("%voice",m_TTSVoice);
283 execstring.replace("%speed",m_TTSSpeed);
284
275 qDebug() << "init" << execstring; 285 qDebug() << "init" << execstring;
276 voicescript = new QProcess(NULL); 286 voicescript = new QProcess(NULL);
287 //connect(voicescript,SIGNAL(readyReadStandardError()),this,SLOT(error()));
288
277 voicescript->start(execstring); 289 voicescript->start(execstring);
278 if(!voicescript->waitForStarted()) 290 if(!voicescript->waitForStarted())
291 {
292 *errStr = tr("Could not start the Sapi-script");
279 return false; 293 return false;
294 }
295
296 if(!voicescript->waitForReadyRead(100))
297 {
298 *errStr = voicescript->readAllStandardError();
299 if(*errStr != "")
300 return false;
301 }
280 return true; 302 return true;
281} 303}
282 304
305
306QStringList TTSSapi::getVoiceList(QString language)
307{
308 QStringList result;
309
310 QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs");
311 m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs";
312
313 QFileInfo tts(m_TTSexec);
314 if(!tts.exists())
315 return result;
316
317 // create the voice process
318 QString execstring = "cscript //nologo \"%exe\" /language:%lang /listvoices";;
319 execstring.replace("%exe",m_TTSexec);
320 execstring.replace("%lang",language);
321 qDebug() << "init" << execstring;
322 voicescript = new QProcess(NULL);
323 voicescript->start(execstring);
324 if(!voicescript->waitForStarted())
325 return result;
326
327 voicescript->waitForReadyRead();
328
329 QString dataRaw = voicescript->readAllStandardError().data();
330 result = dataRaw.split(",",QString::SkipEmptyParts);
331 result.sort();
332 result.removeFirst();
333
334 delete voicescript;
335 QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner
336 |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser
337 |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup
338 |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther );
339 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
340
341 return result;
342}
343
344void TTSSapi::updateVoices(QString language)
345{
346 QStringList Voices = getVoiceList(language);
347 ui.voicecombo->clear();
348 ui.voicecombo->addItems(Voices);
349
350
351}
352
283bool TTSSapi::voice(QString text,QString wavfile) 353bool TTSSapi::voice(QString text,QString wavfile)
284{ 354{
285 QString query = "SPEAK\t"+wavfile+"\t"+text+"\r\n"; 355 QString query = "SPEAK\t"+wavfile+"\t"+text+"\r\n";
@@ -296,6 +366,11 @@ bool TTSSapi::stop()
296 voicescript->write(query.toUtf8()); 366 voicescript->write(query.toUtf8());
297 voicescript->waitForFinished(); 367 voicescript->waitForFinished();
298 delete voicescript; 368 delete voicescript;
369 QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner
370 |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser
371 |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup
372 |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther );
373 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
299 return true; 374 return true;
300} 375}
301 376
@@ -303,7 +378,7 @@ bool TTSSapi::stop()
303void TTSSapi::reset() 378void TTSSapi::reset()
304{ 379{
305 ui.ttsoptions->setText(""); 380 ui.ttsoptions->setText("");
306 ui.ttslanguage->setText(defaultLanguage); 381 ui.languagecombo->setCurrentIndex(ui.languagecombo->findText(defaultLanguage));
307} 382}
308 383
309void TTSSapi::showCfg() 384void TTSSapi::showCfg()
@@ -311,9 +386,35 @@ void TTSSapi::showCfg()
311 // try to get config from settings 386 // try to get config from settings
312 userSettings->beginGroup("sapi"); 387 userSettings->beginGroup("sapi");
313 ui.ttsoptions->setText(userSettings->value("ttsoptions","").toString()); 388 ui.ttsoptions->setText(userSettings->value("ttsoptions","").toString());
314 ui.ttslanguage->setText(userSettings->value("ttslanguage",defaultLanguage).toString()); 389 QString selLang = userSettings->value("ttslanguage",defaultLanguage).toString();
390 QString selVoice = userSettings->value("ttsvoice","").toString();
391 ui.speed->setValue(userSettings->value("ttsspeed",0).toInt());
315 userSettings->endGroup(); 392 userSettings->endGroup();
316 393
394 // fill in language combobox
395
396 deviceSettings->beginGroup("languages");
397 QStringList keys = deviceSettings->allKeys();
398 QStringList languages;
399 for(int i =0 ; i < keys.size();i++)
400 {
401 languages << deviceSettings->value(keys.at(i)).toString();
402 }
403 deviceSettings->endGroup();
404
405 languages.sort();
406 ui.languagecombo->clear();
407 ui.languagecombo->addItems(languages);
408
409 // set saved lang
410 ui.languagecombo->setCurrentIndex(ui.languagecombo->findText(selLang));
411
412 // fill in voice combobox
413 updateVoices(selLang);
414
415 // set saved lang
416 ui.voicecombo->setCurrentIndex(ui.voicecombo->findText(selVoice));
417
317 //show dialog 418 //show dialog
318 this->exec(); 419 this->exec();
319 420
@@ -326,7 +427,9 @@ void TTSSapi::accept(void)
326 //save settings in user config 427 //save settings in user config
327 userSettings->beginGroup("sapi"); 428 userSettings->beginGroup("sapi");
328 userSettings->setValue("ttsoptions",ui.ttsoptions->text()); 429 userSettings->setValue("ttsoptions",ui.ttsoptions->text());
329 userSettings->setValue("ttslanguage",ui.ttslanguage->text()); 430 userSettings->setValue("ttslanguage",ui.languagecombo->currentText());
431 userSettings->setValue("ttsvoice",ui.voicecombo->currentText());
432 userSettings->setValue("ttsspeed",QString("%1").arg(ui.speed->value()));
330 userSettings->endGroup(); 433 userSettings->endGroup();
331 // sync settings 434 // sync settings
332 userSettings->sync(); 435 userSettings->sync();