summaryrefslogtreecommitdiffstats
path: root/rbutil/rbutilqt/base/talkgenerator.cpp
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2011-10-01 19:48:58 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2011-10-01 19:48:58 +0000
commit4f56b50df45cf81370c3a29bd443b91cf5fca1b0 (patch)
tree92b105d056a47401949c9db6b5529570a63cb3f9 /rbutil/rbutilqt/base/talkgenerator.cpp
parent7f2defc453045e037cccf50456753d310c7d7e88 (diff)
downloadrockbox-4f56b50df45cf81370c3a29bd443b91cf5fca1b0.tar.gz
rockbox-4f56b50df45cf81370c3a29bd443b91cf5fca1b0.zip
Voicefile generation: implement string corrections.
Voicefile generation now can correct strings for the TTS system similar to what voice.pl does. The current implementation has some limitations: - only implemented for voicefile creation. - the corrections file is built in and can't get changed. - string corrections can be disabled in the configuration dialog. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30628 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'rbutil/rbutilqt/base/talkgenerator.cpp')
-rw-r--r--rbutil/rbutilqt/base/talkgenerator.cpp81
1 files changed, 80 insertions, 1 deletions
diff --git a/rbutil/rbutilqt/base/talkgenerator.cpp b/rbutil/rbutilqt/base/talkgenerator.cpp
index 9b0cbf4066..4dffe69a42 100644
--- a/rbutil/rbutilqt/base/talkgenerator.cpp
+++ b/rbutil/rbutilqt/base/talkgenerator.cpp
@@ -25,6 +25,7 @@
TalkGenerator::TalkGenerator(QObject* parent): QObject(parent), encFutureWatcher(this), ttsFutureWatcher(this)
{
m_userAborted = false;
+ m_lang = "";
}
//! \brief Creates Talkfiles.
@@ -113,6 +114,11 @@ TalkGenerator::Status TalkGenerator::voiceList(QList<TalkEntry>* list,int wavtri
(*list)[i].refs.tts = m_tts;
(*list)[i].refs.wavtrim = wavtrimth;
(*list)[i].refs.generator = this;
+ // enable voice corrections only if a language is set.
+ if(!m_lang.isEmpty()) {
+ QString s = (*list)[i].toSpeak;
+ (*list)[i].toSpeak = correctString(s);
+ }
// skip duplicated wav entries
if(!duplicates.contains(list->at(i).wavfilename))
@@ -247,7 +253,7 @@ TalkGenerator::Status TalkGenerator::encodeList(QList<TalkEntry>* list)
TalkGenerators.*/
}
- connect(&encFutureWatcher, SIGNAL(progressValueChanged(int)),
+ connect(&encFutureWatcher, SIGNAL(progressValueChanged(int)),
this, SLOT(encProgress(int)));
encFutureWatcher.setFuture(QtConcurrent::map(*list, &TalkGenerator::encEntryPoint));
@@ -302,3 +308,76 @@ void TalkGenerator::abort()
m_userAborted = true;
}
+QString TalkGenerator::correctString(QString s)
+{
+ QString corrected = s;
+ int i = 0;
+ int max = m_corrections.size();
+ while(i < max) {
+ corrected = corrected.replace(QRegExp(m_corrections.at(i).search,
+ m_corrections.at(i).modifier.contains("i")
+ ? Qt::CaseInsensitive : Qt::CaseSensitive),
+ m_corrections.at(i).replace);
+ i++;
+ }
+
+ if(corrected != s)
+ qDebug() << "[VoiceFileCreator] corrected string" << s << "to" << corrected;
+
+ return corrected;
+}
+
+
+void TalkGenerator::setLang(QString name)
+{
+ m_lang = name;
+
+ // re-initialize corrections list
+ m_corrections.clear();
+ QFile correctionsFile(":/builtin/voice-corrections.txt");
+ correctionsFile.open(QIODevice::ReadOnly);
+
+ QString engine = RbSettings::value(RbSettings::Tts).toString();
+ TTSBase* tts = TTSBase::getTTS(this,RbSettings::value(RbSettings::Tts).toString());
+ QString vendor = tts->voiceVendor();
+ delete tts;
+
+ if(m_lang.isEmpty())
+ m_lang = "english";
+ qDebug() << "[TalkGenerator] building string corrections list for"
+ << m_lang << engine << vendor;
+ QTextStream stream(&correctionsFile);
+ while(!stream.atEnd()) {
+ QString line = stream.readLine();
+ if(line.startsWith(" ") || line.length() < 10)
+ continue;
+ // separator is first character
+ QString separator = line.at(0);
+ line.remove(0, 1);
+ QStringList items = line.split(separator);
+ // we need to have at least 6 separate entries.
+ if(items.size() < 6)
+ continue;
+
+ QRegExp re_lang(items.at(0));
+ QRegExp re_engine(items.at(1));
+ QRegExp re_vendor(items.at(2));
+ if(!re_lang.exactMatch(m_lang)) {
+ continue;
+ }
+ if(!re_vendor.exactMatch(vendor)) {
+ continue;
+ }
+ if(!re_engine.exactMatch(engine)) {
+ continue;
+ }
+ struct CorrectionItems co;
+ co.search = items.at(3);
+ co.replace = items.at(4);
+ // Qt uses backslash for back references, Perl uses dollar sign.
+ co.replace.replace(QRegExp("\\$(\\d+)"), "\\\\1");
+ co.modifier = items.at(5);
+ m_corrections.append(co);
+ }
+ correctionsFile.close();
+}