diff options
Diffstat (limited to 'rbutil/rbutilqt/tts.cpp')
-rw-r--r-- | rbutil/rbutilqt/tts.cpp | 117 |
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 | ||
107 | bool TTSExes::start() | 107 | bool 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 | **********************************************************************/ |
245 | TTSSapi::TTSSapi(QWidget *parent) : TTSBase(parent) | 246 | TTSSapi::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 | ||
255 | bool TTSSapi::start() | 257 | bool 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 | |||
306 | QStringList 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 | |||
344 | void TTSSapi::updateVoices(QString language) | ||
345 | { | ||
346 | QStringList Voices = getVoiceList(language); | ||
347 | ui.voicecombo->clear(); | ||
348 | ui.voicecombo->addItems(Voices); | ||
349 | |||
350 | |||
351 | } | ||
352 | |||
283 | bool TTSSapi::voice(QString text,QString wavfile) | 353 | bool 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() | |||
303 | void TTSSapi::reset() | 378 | void 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 | ||
309 | void TTSSapi::showCfg() | 384 | void 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(); |