diff options
author | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2009-06-09 21:46:05 +0000 |
---|---|---|
committer | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2009-06-09 21:46:05 +0000 |
commit | 86041b1d330dfe933b9114ea0d0e252f27b1be59 (patch) | |
tree | c0ea83fe2bd2d1c2ee8af36ca20dcec99daf00a1 /rbutil/rbutilqt | |
parent | 0711190db13cebeb526246840d7160551cbfea45 (diff) | |
download | rockbox-86041b1d330dfe933b9114ea0d0e252f27b1be59.tar.gz rockbox-86041b1d330dfe933b9114ea0d0e252f27b1be59.zip |
Make labels in generated TTS / Encoder setting dialogs translatable.
Code police: break some long lines, remove trailing spaces.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21237 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'rbutil/rbutilqt')
-rw-r--r-- | rbutil/rbutilqt/base/encoders.cpp | 64 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/tts.cpp | 483 |
2 files changed, 283 insertions, 264 deletions
diff --git a/rbutil/rbutilqt/base/encoders.cpp b/rbutil/rbutilqt/base/encoders.cpp index 59add74a0d..43c43a8a8f 100644 --- a/rbutil/rbutilqt/base/encoders.cpp +++ b/rbutil/rbutilqt/base/encoders.cpp | |||
@@ -79,20 +79,22 @@ QStringList EncBase::getEncoderList() | |||
79 | EncExes::EncExes(QString name,QObject *parent) : EncBase(parent) | 79 | EncExes::EncExes(QString name,QObject *parent) : EncBase(parent) |
80 | { | 80 | { |
81 | m_name = name; | 81 | m_name = name; |
82 | 82 | ||
83 | m_TemplateMap["lame"] = "\"%exe\" %options \"%input\" \"%output\""; | 83 | m_TemplateMap["lame"] = "\"%exe\" %options \"%input\" \"%output\""; |
84 | 84 | ||
85 | } | 85 | } |
86 | 86 | ||
87 | 87 | ||
88 | 88 | ||
89 | void EncExes::generateSettings() | 89 | void EncExes::generateSettings() |
90 | { | 90 | { |
91 | QString exepath =RbSettings::subValue(m_name,RbSettings::EncoderPath).toString(); | 91 | QString exepath =RbSettings::subValue(m_name,RbSettings::EncoderPath).toString(); |
92 | if(exepath == "") exepath = findExecutable(m_name); | 92 | if(exepath == "") exepath = findExecutable(m_name); |
93 | 93 | ||
94 | insertSetting(eEXEPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Path to Encoder:",exepath,EncTtsSetting::eBROWSEBTN)); | 94 | insertSetting(eEXEPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING, |
95 | insertSetting(eEXEOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Encoder options:",RbSettings::subValue(m_name,RbSettings::EncoderOptions))); | 95 | tr("Path to Encoder:"),exepath,EncTtsSetting::eBROWSEBTN)); |
96 | insertSetting(eEXEOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING, | ||
97 | tr("Encoder options:"),RbSettings::subValue(m_name,RbSettings::EncoderOptions))); | ||
96 | } | 98 | } |
97 | 99 | ||
98 | void EncExes::saveSettings() | 100 | void EncExes::saveSettings() |
@@ -106,7 +108,7 @@ bool EncExes::start() | |||
106 | { | 108 | { |
107 | m_EncExec = RbSettings::subValue(m_name, RbSettings::EncoderPath).toString(); | 109 | m_EncExec = RbSettings::subValue(m_name, RbSettings::EncoderPath).toString(); |
108 | m_EncOpts = RbSettings::subValue(m_name, RbSettings::EncoderOptions).toString(); | 110 | m_EncOpts = RbSettings::subValue(m_name, RbSettings::EncoderOptions).toString(); |
109 | 111 | ||
110 | m_EncTemplate = m_TemplateMap.value(m_name); | 112 | m_EncTemplate = m_TemplateMap.value(m_name); |
111 | 113 | ||
112 | QFileInfo enc(m_EncExec); | 114 | QFileInfo enc(m_EncExec); |
@@ -138,10 +140,10 @@ bool EncExes::encode(QString input,QString output) | |||
138 | bool EncExes::configOk() | 140 | bool EncExes::configOk() |
139 | { | 141 | { |
140 | QString path = RbSettings::subValue(m_name, RbSettings::EncoderPath).toString(); | 142 | QString path = RbSettings::subValue(m_name, RbSettings::EncoderPath).toString(); |
141 | 143 | ||
142 | if (QFileInfo(path).exists()) | 144 | if (QFileInfo(path).exists()) |
143 | return true; | 145 | return true; |
144 | 146 | ||
145 | return false; | 147 | return false; |
146 | } | 148 | } |
147 | 149 | ||
@@ -150,46 +152,54 @@ bool EncExes::configOk() | |||
150 | **********************************************************************/ | 152 | **********************************************************************/ |
151 | EncRbSpeex::EncRbSpeex(QObject *parent) : EncBase(parent) | 153 | EncRbSpeex::EncRbSpeex(QObject *parent) : EncBase(parent) |
152 | { | 154 | { |
153 | 155 | ||
154 | } | 156 | } |
155 | 157 | ||
156 | void EncRbSpeex::generateSettings() | 158 | void EncRbSpeex::generateSettings() |
157 | { | 159 | { |
158 | insertSetting(eVOLUME,new EncTtsSetting(this,EncTtsSetting::eDOUBLE,"Volume:",RbSettings::subValue("rbspeex",RbSettings::EncoderVolume),1.0,10.0)); | 160 | insertSetting(eVOLUME,new EncTtsSetting(this,EncTtsSetting::eDOUBLE, |
159 | insertSetting(eQUALITY,new EncTtsSetting(this,EncTtsSetting::eDOUBLE,"Quality:",RbSettings::subValue("rbspeex",RbSettings::EncoderQuality),0,10.0)); | 161 | tr("Volume:"),RbSettings::subValue("rbspeex",RbSettings::EncoderVolume),1.0,10.0)); |
160 | insertSetting(eCOMPLEXITY,new EncTtsSetting(this,EncTtsSetting::eINT,"Complexity:",RbSettings::subValue("rbspeex",RbSettings::EncoderComplexity),0,10)); | 162 | insertSetting(eQUALITY,new EncTtsSetting(this,EncTtsSetting::eDOUBLE, |
161 | insertSetting(eNARROWBAND,new EncTtsSetting(this,EncTtsSetting::eBOOL,"Use Narrowband:",RbSettings::subValue("rbspeex",RbSettings::EncoderNarrowBand))); | 163 | tr("Quality:"),RbSettings::subValue("rbspeex",RbSettings::EncoderQuality),0,10.0)); |
164 | insertSetting(eCOMPLEXITY,new EncTtsSetting(this,EncTtsSetting::eINT, | ||
165 | tr("Complexity:"),RbSettings::subValue("rbspeex",RbSettings::EncoderComplexity),0,10)); | ||
166 | insertSetting(eNARROWBAND,new EncTtsSetting(this,EncTtsSetting::eBOOL, | ||
167 | tr("Use Narrowband:"),RbSettings::subValue("rbspeex",RbSettings::EncoderNarrowBand))); | ||
162 | } | 168 | } |
163 | 169 | ||
164 | void EncRbSpeex::saveSettings() | 170 | void EncRbSpeex::saveSettings() |
165 | { | 171 | { |
166 | //save settings in user config | 172 | //save settings in user config |
167 | RbSettings::setSubValue("rbspeex",RbSettings::EncoderVolume,getSetting(eVOLUME)->current().toDouble()); | 173 | RbSettings::setSubValue("rbspeex",RbSettings::EncoderVolume, |
168 | RbSettings::setSubValue("rbspeex",RbSettings::EncoderQuality,getSetting(eQUALITY)->current().toDouble()); | 174 | getSetting(eVOLUME)->current().toDouble()); |
169 | RbSettings::setSubValue("rbspeex",RbSettings::EncoderComplexity,getSetting(eCOMPLEXITY)->current().toInt()); | 175 | RbSettings::setSubValue("rbspeex",RbSettings::EncoderQuality, |
170 | RbSettings::setSubValue("rbspeex",RbSettings::EncoderNarrowBand,getSetting(eNARROWBAND)->current().toBool()); | 176 | getSetting(eQUALITY)->current().toDouble()); |
171 | 177 | RbSettings::setSubValue("rbspeex",RbSettings::EncoderComplexity, | |
178 | getSetting(eCOMPLEXITY)->current().toInt()); | ||
179 | RbSettings::setSubValue("rbspeex",RbSettings::EncoderNarrowBand, | ||
180 | getSetting(eNARROWBAND)->current().toBool()); | ||
181 | |||
172 | RbSettings::sync(); | 182 | RbSettings::sync(); |
173 | } | 183 | } |
174 | 184 | ||
175 | bool EncRbSpeex::start() | 185 | bool EncRbSpeex::start() |
176 | { | 186 | { |
177 | 187 | ||
178 | // try to get config from settings | 188 | // try to get config from settings |
179 | quality = RbSettings::subValue("rbspeex", RbSettings::EncoderQuality).toDouble(); | 189 | quality = RbSettings::subValue("rbspeex", RbSettings::EncoderQuality).toDouble(); |
180 | complexity = RbSettings::subValue("rbspeex", RbSettings::EncoderComplexity).toInt(); | 190 | complexity = RbSettings::subValue("rbspeex", RbSettings::EncoderComplexity).toInt(); |
181 | volume = RbSettings::subValue("rbspeex", RbSettings::EncoderVolume).toDouble(); | 191 | volume = RbSettings::subValue("rbspeex", RbSettings::EncoderVolume).toDouble(); |
182 | narrowband = RbSettings::subValue("rbspeex", RbSettings::EncoderNarrowBand).toBool(); | 192 | narrowband = RbSettings::subValue("rbspeex", RbSettings::EncoderNarrowBand).toBool(); |
183 | 193 | ||
184 | 194 | ||
185 | return true; | 195 | return true; |
186 | } | 196 | } |
187 | 197 | ||
188 | bool EncRbSpeex::encode(QString input,QString output) | 198 | bool EncRbSpeex::encode(QString input,QString output) |
189 | { | 199 | { |
190 | qDebug() << "encoding " << input << " to "<< output; | 200 | qDebug() << "encoding " << input << " to "<< output; |
191 | char errstr[512]; | 201 | char errstr[512]; |
192 | 202 | ||
193 | FILE *fin,*fout; | 203 | FILE *fin,*fout; |
194 | if ((fin = fopen(input.toLocal8Bit(), "rb")) == NULL) { | 204 | if ((fin = fopen(input.toLocal8Bit(), "rb")) == NULL) { |
195 | qDebug() << "Error: could not open input file\n"; | 205 | qDebug() << "Error: could not open input file\n"; |
@@ -219,16 +229,16 @@ bool EncRbSpeex::configOk() | |||
219 | { | 229 | { |
220 | bool result=true; | 230 | bool result=true; |
221 | // check config | 231 | // check config |
222 | 232 | ||
223 | if(RbSettings::subValue("rbspeex", RbSettings::EncoderVolume).toDouble() <= 0) | 233 | if(RbSettings::subValue("rbspeex", RbSettings::EncoderVolume).toDouble() <= 0) |
224 | result =false; | 234 | result =false; |
225 | 235 | ||
226 | if(RbSettings::subValue("rbspeex", RbSettings::EncoderQuality).toDouble() <= 0) | 236 | if(RbSettings::subValue("rbspeex", RbSettings::EncoderQuality).toDouble() <= 0) |
227 | result =false; | 237 | result =false; |
228 | 238 | ||
229 | if(RbSettings::subValue("rbspeex", RbSettings::EncoderComplexity).toInt() <= 0) | 239 | if(RbSettings::subValue("rbspeex", RbSettings::EncoderComplexity).toInt() <= 0) |
230 | result =false; | 240 | result =false; |
231 | 241 | ||
232 | return result; | 242 | return result; |
233 | } | 243 | } |
234 | 244 | ||
diff --git a/rbutil/rbutilqt/base/tts.cpp b/rbutil/rbutilqt/base/tts.cpp index 5bc4c058c8..4b0727f78c 100644 --- a/rbutil/rbutilqt/base/tts.cpp +++ b/rbutil/rbutilqt/base/tts.cpp | |||
@@ -47,7 +47,7 @@ void TTSBase::initTTSList() | |||
47 | // function to get a specific encoder | 47 | // function to get a specific encoder |
48 | TTSBase* TTSBase::getTTS(QObject* parent,QString ttsName) | 48 | TTSBase* TTSBase::getTTS(QObject* parent,QString ttsName) |
49 | { | 49 | { |
50 | 50 | ||
51 | TTSBase* tts; | 51 | TTSBase* tts; |
52 | #if defined(Q_OS_WIN) | 52 | #if defined(Q_OS_WIN) |
53 | if(ttsName == "sapi") | 53 | if(ttsName == "sapi") |
@@ -55,13 +55,13 @@ TTSBase* TTSBase::getTTS(QObject* parent,QString ttsName) | |||
55 | tts = new TTSSapi(parent); | 55 | tts = new TTSSapi(parent); |
56 | return tts; | 56 | return tts; |
57 | } | 57 | } |
58 | else | 58 | else |
59 | #endif | 59 | #endif |
60 | #if defined(Q_OS_LINUX) | 60 | #if defined(Q_OS_LINUX) |
61 | if (ttsName == "festival") | 61 | if (ttsName == "festival") |
62 | { | 62 | { |
63 | tts = new TTSFestival(parent); | 63 | tts = new TTSFestival(parent); |
64 | return tts; | 64 | return tts; |
65 | } | 65 | } |
66 | else | 66 | else |
67 | #endif | 67 | #endif |
@@ -97,20 +97,22 @@ QString TTSBase::getTTSName(QString tts) | |||
97 | TTSExes::TTSExes(QString name,QObject* parent) : TTSBase(parent) | 97 | TTSExes::TTSExes(QString name,QObject* parent) : TTSBase(parent) |
98 | { | 98 | { |
99 | m_name = name; | 99 | m_name = name; |
100 | 100 | ||
101 | m_TemplateMap["espeak"] = "\"%exe\" %options -w \"%wavfile\" \"%text\""; | 101 | m_TemplateMap["espeak"] = "\"%exe\" %options -w \"%wavfile\" \"%text\""; |
102 | m_TemplateMap["flite"] = "\"%exe\" %options -o \"%wavfile\" -t \"%text\""; | 102 | m_TemplateMap["flite"] = "\"%exe\" %options -o \"%wavfile\" -t \"%text\""; |
103 | m_TemplateMap["swift"] = "\"%exe\" %options -o \"%wavfile\" \"%text\""; | 103 | m_TemplateMap["swift"] = "\"%exe\" %options -o \"%wavfile\" \"%text\""; |
104 | 104 | ||
105 | } | 105 | } |
106 | 106 | ||
107 | void TTSExes::generateSettings() | 107 | void TTSExes::generateSettings() |
108 | { | 108 | { |
109 | QString exepath =RbSettings::subValue(m_name,RbSettings::TtsPath).toString(); | 109 | QString exepath =RbSettings::subValue(m_name,RbSettings::TtsPath).toString(); |
110 | if(exepath == "") exepath = findExecutable(m_name); | 110 | if(exepath == "") exepath = findExecutable(m_name); |
111 | 111 | ||
112 | insertSetting(eEXEPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Path to TTS engine:",exepath,EncTtsSetting::eBROWSEBTN)); | 112 | insertSetting(eEXEPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING, |
113 | insertSetting(eOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,"TTS engine options:",RbSettings::subValue(m_name,RbSettings::TtsOptions))); | 113 | tr("Path to TTS engine:"),exepath,EncTtsSetting::eBROWSEBTN)); |
114 | insertSetting(eOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING, | ||
115 | tr("TTS engine options:"),RbSettings::subValue(m_name,RbSettings::TtsOptions))); | ||
114 | } | 116 | } |
115 | 117 | ||
116 | void TTSExes::saveSettings() | 118 | void TTSExes::saveSettings() |
@@ -124,7 +126,7 @@ bool TTSExes::start(QString *errStr) | |||
124 | { | 126 | { |
125 | m_TTSexec = RbSettings::subValue(m_name,RbSettings::TtsPath).toString(); | 127 | m_TTSexec = RbSettings::subValue(m_name,RbSettings::TtsPath).toString(); |
126 | m_TTSOpts = RbSettings::subValue(m_name,RbSettings::TtsOptions).toString(); | 128 | m_TTSOpts = RbSettings::subValue(m_name,RbSettings::TtsOptions).toString(); |
127 | 129 | ||
128 | m_TTSTemplate = m_TemplateMap.value(m_name); | 130 | m_TTSTemplate = m_TemplateMap.value(m_name); |
129 | 131 | ||
130 | QFileInfo tts(m_TTSexec); | 132 | QFileInfo tts(m_TTSexec); |
@@ -141,7 +143,7 @@ bool TTSExes::start(QString *errStr) | |||
141 | 143 | ||
142 | TTSStatus TTSExes::voice(QString text,QString wavfile, QString *errStr) | 144 | TTSStatus TTSExes::voice(QString text,QString wavfile, QString *errStr) |
143 | { | 145 | { |
144 | (void) errStr; | 146 | (void) errStr; |
145 | QString execstring = m_TTSTemplate; | 147 | QString execstring = m_TTSTemplate; |
146 | 148 | ||
147 | execstring.replace("%exe",m_TTSexec); | 149 | execstring.replace("%exe",m_TTSexec); |
@@ -157,10 +159,10 @@ TTSStatus TTSExes::voice(QString text,QString wavfile, QString *errStr) | |||
157 | bool TTSExes::configOk() | 159 | bool TTSExes::configOk() |
158 | { | 160 | { |
159 | QString path = RbSettings::subValue(m_name,RbSettings::TtsPath).toString(); | 161 | QString path = RbSettings::subValue(m_name,RbSettings::TtsPath).toString(); |
160 | 162 | ||
161 | if (QFileInfo(path).exists()) | 163 | if (QFileInfo(path).exists()) |
162 | return true; | 164 | return true; |
163 | 165 | ||
164 | return false; | 166 | return false; |
165 | } | 167 | } |
166 | 168 | ||
@@ -178,18 +180,22 @@ void TTSSapi::generateSettings() | |||
178 | { | 180 | { |
179 | // language | 181 | // language |
180 | QStringList languages = RbSettings::languages(); | 182 | QStringList languages = RbSettings::languages(); |
181 | languages.sort(); | 183 | languages.sort(); |
182 | EncTtsSetting* setting =new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,"Language:",RbSettings::subValue("sapi",RbSettings::TtsLanguage),languages); | 184 | EncTtsSetting* setting =new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST, |
185 | tr("Language:"),RbSettings::subValue("sapi",RbSettings::TtsLanguage),languages); | ||
183 | connect(setting,SIGNAL(dataChanged()),this,SLOT(updateVoiceList())); | 186 | connect(setting,SIGNAL(dataChanged()),this,SLOT(updateVoiceList())); |
184 | insertSetting(eLANGUAGE,setting); | 187 | insertSetting(eLANGUAGE,setting); |
185 | // voice | 188 | // voice |
186 | setting = new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,"Voice:",RbSettings::subValue("sapi",RbSettings::TtsVoice),getVoiceList(RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString()),EncTtsSetting::eREFRESHBTN); | 189 | setting = new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST, |
190 | tr("Voice:"),RbSettings::subValue("sapi",RbSettings::TtsVoice),getVoiceList(RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString()),EncTtsSetting::eREFRESHBTN); | ||
187 | connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceList())); | 191 | connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceList())); |
188 | insertSetting(eVOICE,setting); | 192 | insertSetting(eVOICE,setting); |
189 | //speed | 193 | //speed |
190 | insertSetting(eSPEED,new EncTtsSetting(this,EncTtsSetting::eINT,"Speed:",RbSettings::subValue("sapi",RbSettings::TtsSpeed),-10,10)); | 194 | insertSetting(eSPEED,new EncTtsSetting(this,EncTtsSetting::eINT, |
195 | tr("Speed:"),RbSettings::subValue("sapi",RbSettings::TtsSpeed),-10,10)); | ||
191 | // options | 196 | // options |
192 | insertSetting(eOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Options:",RbSettings::subValue("sapi",RbSettings::TtsOptions))); | 197 | insertSetting(eOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING, |
198 | tr("Options:"),RbSettings::subValue("sapi",RbSettings::TtsOptions))); | ||
193 | 199 | ||
194 | } | 200 | } |
195 | 201 | ||
@@ -200,7 +206,7 @@ void TTSSapi::saveSettings() | |||
200 | RbSettings::setSubValue("sapi",RbSettings::TtsVoice,getSetting(eVOICE)->current().toString()); | 206 | RbSettings::setSubValue("sapi",RbSettings::TtsVoice,getSetting(eVOICE)->current().toString()); |
201 | RbSettings::setSubValue("sapi",RbSettings::TtsSpeed,getSetting(eSPEED)->current().toInt()); | 207 | RbSettings::setSubValue("sapi",RbSettings::TtsSpeed,getSetting(eSPEED)->current().toInt()); |
202 | RbSettings::setSubValue("sapi",RbSettings::TtsOptions,getSetting(eOPTIONS)->current().toString()); | 208 | RbSettings::setSubValue("sapi",RbSettings::TtsOptions,getSetting(eOPTIONS)->current().toString()); |
203 | 209 | ||
204 | RbSettings::sync(); | 210 | RbSettings::sync(); |
205 | } | 211 | } |
206 | 212 | ||
@@ -210,28 +216,28 @@ void TTSSapi::updateVoiceList() | |||
210 | QStringList voiceList = getVoiceList(getSetting(eLANGUAGE)->current().toString()); | 216 | QStringList voiceList = getVoiceList(getSetting(eLANGUAGE)->current().toString()); |
211 | getSetting(eVOICE)->setList(voiceList); | 217 | getSetting(eVOICE)->setList(voiceList); |
212 | if(voiceList.size() > 0) getSetting(eVOICE)->setCurrent(voiceList.at(0)); | 218 | if(voiceList.size() > 0) getSetting(eVOICE)->setCurrent(voiceList.at(0)); |
213 | else getSetting(eVOICE)->setCurrent(""); | 219 | else getSetting(eVOICE)->setCurrent(""); |
214 | } | 220 | } |
215 | 221 | ||
216 | bool TTSSapi::start(QString *errStr) | 222 | bool TTSSapi::start(QString *errStr) |
217 | { | 223 | { |
218 | 224 | ||
219 | m_TTSOpts = RbSettings::subValue("sapi",RbSettings::TtsOptions).toString(); | 225 | m_TTSOpts = RbSettings::subValue("sapi",RbSettings::TtsOptions).toString(); |
220 | m_TTSLanguage =RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString(); | 226 | m_TTSLanguage =RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString(); |
221 | m_TTSVoice=RbSettings::subValue("sapi",RbSettings::TtsVoice).toString(); | 227 | m_TTSVoice=RbSettings::subValue("sapi",RbSettings::TtsVoice).toString(); |
222 | m_TTSSpeed=RbSettings::subValue("sapi",RbSettings::TtsSpeed).toString(); | 228 | m_TTSSpeed=RbSettings::subValue("sapi",RbSettings::TtsSpeed).toString(); |
223 | m_sapi4 = RbSettings::subValue("sapi",RbSettings::TtsUseSapi4).toBool(); | 229 | m_sapi4 = RbSettings::subValue("sapi",RbSettings::TtsUseSapi4).toBool(); |
224 | 230 | ||
225 | QFile::remove(QDir::tempPath() +"/sapi_voice.vbs"); | 231 | QFile::remove(QDir::tempPath() +"/sapi_voice.vbs"); |
226 | QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs"); | 232 | QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs"); |
227 | m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs"; | 233 | m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs"; |
228 | 234 | ||
229 | QFileInfo tts(m_TTSexec); | 235 | QFileInfo tts(m_TTSexec); |
230 | if(!tts.exists()) | 236 | if(!tts.exists()) |
231 | { | 237 | { |
232 | *errStr = tr("Could not copy the Sapi-script"); | 238 | *errStr = tr("Could not copy the Sapi-script"); |
233 | return false; | 239 | return false; |
234 | } | 240 | } |
235 | // create the voice process | 241 | // create the voice process |
236 | QString execstring = m_TTSTemplate; | 242 | QString execstring = m_TTSTemplate; |
237 | execstring.replace("%exe",m_TTSexec); | 243 | execstring.replace("%exe",m_TTSexec); |
@@ -239,31 +245,31 @@ bool TTSSapi::start(QString *errStr) | |||
239 | execstring.replace("%lang",m_TTSLanguage); | 245 | execstring.replace("%lang",m_TTSLanguage); |
240 | execstring.replace("%voice",m_TTSVoice); | 246 | execstring.replace("%voice",m_TTSVoice); |
241 | execstring.replace("%speed",m_TTSSpeed); | 247 | execstring.replace("%speed",m_TTSSpeed); |
242 | 248 | ||
243 | if(m_sapi4) | 249 | if(m_sapi4) |
244 | execstring.append(" /sapi4 "); | 250 | execstring.append(" /sapi4 "); |
245 | 251 | ||
246 | qDebug() << "init" << execstring; | 252 | qDebug() << "init" << execstring; |
247 | voicescript = new QProcess(NULL); | 253 | voicescript = new QProcess(NULL); |
248 | //connect(voicescript,SIGNAL(readyReadStandardError()),this,SLOT(error())); | 254 | //connect(voicescript,SIGNAL(readyReadStandardError()),this,SLOT(error())); |
249 | 255 | ||
250 | voicescript->start(execstring); | 256 | voicescript->start(execstring); |
251 | if(!voicescript->waitForStarted()) | 257 | if(!voicescript->waitForStarted()) |
252 | { | 258 | { |
253 | *errStr = tr("Could not start the Sapi-script"); | 259 | *errStr = tr("Could not start the Sapi-script"); |
254 | return false; | 260 | return false; |
255 | } | 261 | } |
256 | 262 | ||
257 | if(!voicescript->waitForReadyRead(300)) | 263 | if(!voicescript->waitForReadyRead(300)) |
258 | { | 264 | { |
259 | *errStr = voicescript->readAllStandardError(); | 265 | *errStr = voicescript->readAllStandardError(); |
260 | if(*errStr != "") | 266 | if(*errStr != "") |
261 | return false; | 267 | return false; |
262 | } | 268 | } |
263 | 269 | ||
264 | voicestream = new QTextStream(voicescript); | 270 | voicestream = new QTextStream(voicescript); |
265 | voicestream->setCodec("UTF16-LE"); | 271 | voicestream->setCodec("UTF16-LE"); |
266 | 272 | ||
267 | return true; | 273 | return true; |
268 | } | 274 | } |
269 | 275 | ||
@@ -271,31 +277,31 @@ bool TTSSapi::start(QString *errStr) | |||
271 | QStringList TTSSapi::getVoiceList(QString language) | 277 | QStringList TTSSapi::getVoiceList(QString language) |
272 | { | 278 | { |
273 | QStringList result; | 279 | QStringList result; |
274 | 280 | ||
275 | QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs"); | 281 | QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs"); |
276 | m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs"; | 282 | m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs"; |
277 | 283 | ||
278 | QFileInfo tts(m_TTSexec); | 284 | QFileInfo tts(m_TTSexec); |
279 | if(!tts.exists()) | 285 | if(!tts.exists()) |
280 | return result; | 286 | return result; |
281 | 287 | ||
282 | // create the voice process | 288 | // create the voice process |
283 | QString execstring = "cscript //nologo \"%exe\" /language:%lang /listvoices"; | 289 | QString execstring = "cscript //nologo \"%exe\" /language:%lang /listvoices"; |
284 | execstring.replace("%exe",m_TTSexec); | 290 | execstring.replace("%exe",m_TTSexec); |
285 | execstring.replace("%lang",language); | 291 | execstring.replace("%lang",language); |
286 | 292 | ||
287 | if(RbSettings::value(RbSettings::TtsUseSapi4).toBool()) | 293 | if(RbSettings::value(RbSettings::TtsUseSapi4).toBool()) |
288 | execstring.append(" /sapi4 "); | 294 | execstring.append(" /sapi4 "); |
289 | 295 | ||
290 | qDebug() << "init" << execstring; | 296 | qDebug() << "init" << execstring; |
291 | voicescript = new QProcess(NULL); | 297 | voicescript = new QProcess(NULL); |
292 | voicescript->start(execstring); | 298 | voicescript->start(execstring); |
293 | qDebug() << "wait for started"; | 299 | qDebug() << "wait for started"; |
294 | if(!voicescript->waitForStarted()) | 300 | if(!voicescript->waitForStarted()) |
295 | return result; | 301 | return result; |
296 | voicescript->closeWriteChannel(); | 302 | voicescript->closeWriteChannel(); |
297 | voicescript->waitForReadyRead(); | 303 | voicescript->waitForReadyRead(); |
298 | 304 | ||
299 | QString dataRaw = voicescript->readAllStandardError().data(); | 305 | QString dataRaw = voicescript->readAllStandardError().data(); |
300 | result = dataRaw.split(",",QString::SkipEmptyParts); | 306 | result = dataRaw.split(",",QString::SkipEmptyParts); |
301 | if(result.size() > 0) | 307 | if(result.size() > 0) |
@@ -306,13 +312,13 @@ QStringList TTSSapi::getVoiceList(QString language) | |||
306 | { | 312 | { |
307 | result[i] = result.at(i).simplified(); | 313 | result[i] = result.at(i).simplified(); |
308 | } | 314 | } |
309 | } | 315 | } |
310 | 316 | ||
311 | delete voicescript; | 317 | delete voicescript; |
312 | QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner | 318 | QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner |
313 | |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser | 319 | |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser |
314 | |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup | 320 | |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup |
315 | |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther ); | 321 | |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther ); |
316 | QFile::remove(QDir::tempPath() +"/sapi_voice.vbs"); | 322 | QFile::remove(QDir::tempPath() +"/sapi_voice.vbs"); |
317 | return result; | 323 | return result; |
318 | } | 324 | } |
@@ -321,7 +327,7 @@ QStringList TTSSapi::getVoiceList(QString language) | |||
321 | 327 | ||
322 | TTSStatus TTSSapi::voice(QString text,QString wavfile, QString *errStr) | 328 | TTSStatus TTSSapi::voice(QString text,QString wavfile, QString *errStr) |
323 | { | 329 | { |
324 | (void) errStr; | 330 | (void) errStr; |
325 | QString query = "SPEAK\t"+wavfile+"\t"+text+"\r\n"; | 331 | QString query = "SPEAK\t"+wavfile+"\t"+text+"\r\n"; |
326 | qDebug() << "voicing" << query; | 332 | qDebug() << "voicing" << query; |
327 | *voicestream << query; | 333 | *voicestream << query; |
@@ -332,17 +338,17 @@ TTSStatus TTSSapi::voice(QString text,QString wavfile, QString *errStr) | |||
332 | } | 338 | } |
333 | 339 | ||
334 | bool TTSSapi::stop() | 340 | bool TTSSapi::stop() |
335 | { | 341 | { |
336 | 342 | ||
337 | *voicestream << "QUIT\r\n"; | 343 | *voicestream << "QUIT\r\n"; |
338 | voicestream->flush(); | 344 | voicestream->flush(); |
339 | voicescript->waitForFinished(); | 345 | voicescript->waitForFinished(); |
340 | delete voicestream; | 346 | delete voicestream; |
341 | delete voicescript; | 347 | delete voicescript; |
342 | QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner | 348 | QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner |
343 | |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser | 349 | |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser |
344 | |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup | 350 | |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup |
345 | |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther ); | 351 | |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther ); |
346 | QFile::remove(QDir::tempPath() +"/sapi_voice.vbs"); | 352 | QFile::remove(QDir::tempPath() +"/sapi_voice.vbs"); |
347 | return true; | 353 | return true; |
348 | } | 354 | } |
@@ -358,7 +364,7 @@ bool TTSSapi::configOk() | |||
358 | **********************************************************************/ | 364 | **********************************************************************/ |
359 | TTSFestival::~TTSFestival() | 365 | TTSFestival::~TTSFestival() |
360 | { | 366 | { |
361 | stop(); | 367 | stop(); |
362 | } | 368 | } |
363 | 369 | ||
364 | void TTSFestival::generateSettings() | 370 | void TTSFestival::generateSettings() |
@@ -366,21 +372,24 @@ void TTSFestival::generateSettings() | |||
366 | // server path | 372 | // server path |
367 | QString exepath = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString(); | 373 | QString exepath = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString(); |
368 | if(exepath == "" ) exepath = findExecutable("festival"); | 374 | if(exepath == "" ) exepath = findExecutable("festival"); |
369 | insertSetting(eSERVERPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Path to Festival server:",exepath,EncTtsSetting::eBROWSEBTN)); | 375 | insertSetting(eSERVERPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Path to Festival server:",exepath,EncTtsSetting::eBROWSEBTN)); |
370 | 376 | ||
371 | // client path | 377 | // client path |
372 | QString clientpath = RbSettings::subValue("festival-client",RbSettings::TtsPath).toString(); | 378 | QString clientpath = RbSettings::subValue("festival-client",RbSettings::TtsPath).toString(); |
373 | if(clientpath == "" ) clientpath = findExecutable("festival_client"); | 379 | if(clientpath == "" ) clientpath = findExecutable("festival_client"); |
374 | insertSetting(eCLIENTPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,"Path to Festival client:",clientpath,EncTtsSetting::eBROWSEBTN)); | 380 | insertSetting(eCLIENTPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING, |
375 | 381 | tr("Path to Festival client:"),clientpath,EncTtsSetting::eBROWSEBTN)); | |
382 | |||
376 | // voice | 383 | // voice |
377 | EncTtsSetting* setting = new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,"Voice:",RbSettings::subValue("festival",RbSettings::TtsVoice),getVoiceList(exepath),EncTtsSetting::eREFRESHBTN); | 384 | EncTtsSetting* setting = new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST, |
385 | tr("Voice:"),RbSettings::subValue("festival",RbSettings::TtsVoice),getVoiceList(exepath),EncTtsSetting::eREFRESHBTN); | ||
378 | connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceList())); | 386 | connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceList())); |
379 | connect(setting,SIGNAL(dataChanged()),this,SLOT(clearVoiceDescription())); | 387 | connect(setting,SIGNAL(dataChanged()),this,SLOT(clearVoiceDescription())); |
380 | insertSetting(eVOICE,setting); | 388 | insertSetting(eVOICE,setting); |
381 | 389 | ||
382 | //voice description | 390 | //voice description |
383 | setting = new EncTtsSetting(this,EncTtsSetting::eREADONLYSTRING,"Voice description:","",EncTtsSetting::eREFRESHBTN); | 391 | setting = new EncTtsSetting(this,EncTtsSetting::eREADONLYSTRING, |
392 | tr("Voice description:"),"",EncTtsSetting::eREFRESHBTN); | ||
384 | connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceDescription())); | 393 | connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceDescription())); |
385 | insertSetting(eVOICEDESC,setting); | 394 | insertSetting(eVOICEDESC,setting); |
386 | } | 395 | } |
@@ -391,13 +400,13 @@ void TTSFestival::saveSettings() | |||
391 | RbSettings::setSubValue("festival-server",RbSettings::TtsPath,getSetting(eSERVERPATH)->current().toString()); | 400 | RbSettings::setSubValue("festival-server",RbSettings::TtsPath,getSetting(eSERVERPATH)->current().toString()); |
392 | RbSettings::setSubValue("festival-client",RbSettings::TtsPath,getSetting(eCLIENTPATH)->current().toString()); | 401 | RbSettings::setSubValue("festival-client",RbSettings::TtsPath,getSetting(eCLIENTPATH)->current().toString()); |
393 | RbSettings::setSubValue("festival",RbSettings::TtsVoice,getSetting(eVOICE)->current().toString()); | 402 | RbSettings::setSubValue("festival",RbSettings::TtsVoice,getSetting(eVOICE)->current().toString()); |
394 | 403 | ||
395 | RbSettings::sync(); | 404 | RbSettings::sync(); |
396 | } | 405 | } |
397 | 406 | ||
398 | void TTSFestival::updateVoiceDescription() | 407 | void TTSFestival::updateVoiceDescription() |
399 | { | 408 | { |
400 | // get voice Info with current voice and path | 409 | // get voice Info with current voice and path |
401 | QString info = getVoiceInfo(getSetting(eVOICE)->current().toString(),getSetting(eSERVERPATH)->current().toString()); | 410 | QString info = getVoiceInfo(getSetting(eVOICE)->current().toString(),getSetting(eSERVERPATH)->current().toString()); |
402 | getSetting(eVOICEDESC)->setCurrent(info); | 411 | getSetting(eVOICEDESC)->setCurrent(info); |
403 | } | 412 | } |
@@ -417,241 +426,241 @@ void TTSFestival::updateVoiceList() | |||
417 | 426 | ||
418 | void TTSFestival::startServer(QString path) | 427 | void TTSFestival::startServer(QString path) |
419 | { | 428 | { |
420 | if(!configOk()) | 429 | if(!configOk()) |
421 | return; | 430 | return; |
422 | 431 | ||
423 | if(path == "") | 432 | if(path == "") |
424 | path = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString(); | 433 | path = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString(); |
425 | 434 | ||
426 | serverProcess.start(QString("%1 --server").arg(path)); | 435 | serverProcess.start(QString("%1 --server").arg(path)); |
427 | serverProcess.waitForStarted(); | 436 | serverProcess.waitForStarted(); |
428 | 437 | ||
429 | queryServer("(getpid)",300,path); | 438 | queryServer("(getpid)",300,path); |
430 | if(serverProcess.state() == QProcess::Running) | 439 | if(serverProcess.state() == QProcess::Running) |
431 | qDebug() << "Festival is up and running"; | 440 | qDebug() << "Festival is up and running"; |
432 | else | 441 | else |
433 | qDebug() << "Festival failed to start"; | 442 | qDebug() << "Festival failed to start"; |
434 | } | 443 | } |
435 | 444 | ||
436 | void TTSFestival::ensureServerRunning(QString path) | 445 | void TTSFestival::ensureServerRunning(QString path) |
437 | { | 446 | { |
438 | if(serverProcess.state() != QProcess::Running) | 447 | if(serverProcess.state() != QProcess::Running) |
439 | { | 448 | { |
440 | startServer(path); | 449 | startServer(path); |
441 | } | 450 | } |
442 | } | 451 | } |
443 | 452 | ||
444 | bool TTSFestival::start(QString* errStr) | 453 | bool TTSFestival::start(QString* errStr) |
445 | { | 454 | { |
446 | (void) errStr; | 455 | (void) errStr; |
447 | ensureServerRunning(); | 456 | ensureServerRunning(); |
448 | if (!RbSettings::subValue("festival",RbSettings::TtsVoice).toString().isEmpty()) | 457 | if (!RbSettings::subValue("festival",RbSettings::TtsVoice).toString().isEmpty()) |
449 | queryServer(QString("(voice.select '%1)") | 458 | queryServer(QString("(voice.select '%1)") |
450 | .arg(RbSettings::subValue("festival", RbSettings::TtsVoice).toString())); | 459 | .arg(RbSettings::subValue("festival", RbSettings::TtsVoice).toString())); |
451 | 460 | ||
452 | return true; | 461 | return true; |
453 | } | 462 | } |
454 | 463 | ||
455 | bool TTSFestival::stop() | 464 | bool TTSFestival::stop() |
456 | { | 465 | { |
457 | serverProcess.terminate(); | 466 | serverProcess.terminate(); |
458 | serverProcess.kill(); | 467 | serverProcess.kill(); |
459 | 468 | ||
460 | return true; | 469 | return true; |
461 | } | 470 | } |
462 | 471 | ||
463 | TTSStatus TTSFestival::voice(QString text, QString wavfile, QString* errStr) | 472 | TTSStatus TTSFestival::voice(QString text, QString wavfile, QString* errStr) |
464 | { | 473 | { |
465 | qDebug() << text << "->" << wavfile; | 474 | qDebug() << text << "->" << wavfile; |
466 | 475 | ||
467 | QString path = RbSettings::subValue("festival-client",RbSettings::TtsPath).toString(); | 476 | QString path = RbSettings::subValue("festival-client",RbSettings::TtsPath).toString(); |
468 | QString cmd = QString("%1 --server localhost --otype riff --ttw --withlisp --output \"%2\" - ").arg(path).arg(wavfile); | 477 | QString cmd = QString("%1 --server localhost --otype riff --ttw --withlisp --output \"%2\" - ").arg(path).arg(wavfile); |
469 | qDebug() << cmd; | 478 | qDebug() << cmd; |
470 | 479 | ||
471 | QProcess clientProcess; | 480 | QProcess clientProcess; |
472 | clientProcess.start(cmd); | 481 | clientProcess.start(cmd); |
473 | clientProcess.write(QString("%1.\n").arg(text).toAscii()); | 482 | clientProcess.write(QString("%1.\n").arg(text).toAscii()); |
474 | clientProcess.waitForBytesWritten(); | 483 | clientProcess.waitForBytesWritten(); |
475 | clientProcess.closeWriteChannel(); | 484 | clientProcess.closeWriteChannel(); |
476 | clientProcess.waitForReadyRead(); | 485 | clientProcess.waitForReadyRead(); |
477 | QString response = clientProcess.readAll(); | 486 | QString response = clientProcess.readAll(); |
478 | response = response.trimmed(); | 487 | response = response.trimmed(); |
479 | if(!response.contains("Utterance")) | 488 | if(!response.contains("Utterance")) |
480 | { | 489 | { |
481 | qDebug() << "Could not voice string: " << response; | 490 | qDebug() << "Could not voice string: " << response; |
482 | *errStr = tr("engine could not voice string"); | 491 | *errStr = tr("engine could not voice string"); |
483 | return Warning; | 492 | return Warning; |
484 | /* do not stop the voicing process because of a single string | 493 | /* do not stop the voicing process because of a single string |
485 | TODO: needs proper settings */ | 494 | TODO: needs proper settings */ |
486 | } | 495 | } |
487 | clientProcess.closeReadChannel(QProcess::StandardError); | 496 | clientProcess.closeReadChannel(QProcess::StandardError); |
488 | clientProcess.closeReadChannel(QProcess::StandardOutput); | 497 | clientProcess.closeReadChannel(QProcess::StandardOutput); |
489 | clientProcess.terminate(); | 498 | clientProcess.terminate(); |
490 | clientProcess.kill(); | 499 | clientProcess.kill(); |
491 | 500 | ||
492 | return NoError; | 501 | return NoError; |
493 | } | 502 | } |
494 | 503 | ||
495 | bool TTSFestival::configOk() | 504 | bool TTSFestival::configOk() |
496 | { | 505 | { |
497 | QString serverPath = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString(); | 506 | QString serverPath = RbSettings::subValue("festival-server",RbSettings::TtsPath).toString(); |
498 | QString clientPath = RbSettings::subValue("festival-client",RbSettings::TtsVoice).toString(); | 507 | QString clientPath = RbSettings::subValue("festival-client",RbSettings::TtsVoice).toString(); |
499 | 508 | ||
500 | bool ret = QFileInfo(serverPath).isExecutable() && | 509 | bool ret = QFileInfo(serverPath).isExecutable() && |
501 | QFileInfo(clientPath).isExecutable(); | 510 | QFileInfo(clientPath).isExecutable(); |
502 | if(RbSettings::subValue("festival",RbSettings::TtsVoice).toString().size() > 0 && voices.size() > 0) | 511 | if(RbSettings::subValue("festival",RbSettings::TtsVoice).toString().size() > 0 && voices.size() > 0) |
503 | ret = ret && (voices.indexOf(RbSettings::subValue("festival",RbSettings::TtsVoice).toString()) != -1); | 512 | ret = ret && (voices.indexOf(RbSettings::subValue("festival",RbSettings::TtsVoice).toString()) != -1); |
504 | return ret; | 513 | return ret; |
505 | } | 514 | } |
506 | 515 | ||
507 | QStringList TTSFestival::getVoiceList(QString path) | 516 | QStringList TTSFestival::getVoiceList(QString path) |
508 | { | 517 | { |
509 | if(!configOk()) | 518 | if(!configOk()) |
510 | return QStringList(); | 519 | return QStringList(); |
511 | 520 | ||
512 | if(voices.size() > 0) | 521 | if(voices.size() > 0) |
513 | { | 522 | { |
514 | qDebug() << "Using voice cache"; | 523 | qDebug() << "Using voice cache"; |
515 | return voices; | 524 | return voices; |
516 | } | 525 | } |
517 | |||
518 | QString response = queryServer("(voice.list)",3000,path); | ||
519 | 526 | ||
520 | // get the 2nd line. It should be (<voice_name>, <voice_name>) | 527 | QString response = queryServer("(voice.list)",3000,path); |
521 | response = response.mid(response.indexOf('\n') + 1, -1); | ||
522 | response = response.left(response.indexOf('\n')).trimmed(); | ||
523 | 528 | ||
524 | voices = response.mid(1, response.size()-2).split(' '); | 529 | // get the 2nd line. It should be (<voice_name>, <voice_name>) |
530 | response = response.mid(response.indexOf('\n') + 1, -1); | ||
531 | response = response.left(response.indexOf('\n')).trimmed(); | ||
525 | 532 | ||
526 | voices.sort(); | 533 | voices = response.mid(1, response.size()-2).split(' '); |
527 | if (voices.size() == 1 && voices[0].size() == 0) | 534 | |
528 | voices.removeAt(0); | 535 | voices.sort(); |
529 | if (voices.size() > 0) | 536 | if (voices.size() == 1 && voices[0].size() == 0) |
530 | qDebug() << "Voices: " << voices; | 537 | voices.removeAt(0); |
531 | else | 538 | if (voices.size() > 0) |
532 | qDebug() << "No voices."; | 539 | qDebug() << "Voices: " << voices; |
533 | 540 | else | |
534 | return voices; | 541 | qDebug() << "No voices."; |
542 | |||
543 | return voices; | ||
535 | } | 544 | } |
536 | 545 | ||
537 | QString TTSFestival::getVoiceInfo(QString voice,QString path) | 546 | QString TTSFestival::getVoiceInfo(QString voice,QString path) |
538 | { | 547 | { |
539 | if(!configOk()) | 548 | if(!configOk()) |
540 | return ""; | 549 | return ""; |
541 | 550 | ||
542 | if(!getVoiceList().contains(voice)) | 551 | if(!getVoiceList().contains(voice)) |
543 | return ""; | 552 | return ""; |
544 | 553 | ||
545 | if(voiceDescriptions.contains(voice)) | 554 | if(voiceDescriptions.contains(voice)) |
546 | return voiceDescriptions[voice]; | 555 | return voiceDescriptions[voice]; |
547 | 556 | ||
548 | QString response = queryServer(QString("(voice.description '%1)").arg(voice), 3000,path); | 557 | QString response = queryServer(QString("(voice.description '%1)").arg(voice), 3000,path); |
549 | 558 | ||
550 | if (response == "") | 559 | if (response == "") |
551 | { | 560 | { |
552 | voiceDescriptions[voice]=tr("No description available"); | 561 | voiceDescriptions[voice]=tr("No description available"); |
553 | } | 562 | } |
554 | else | 563 | else |
555 | { | 564 | { |
556 | response = response.remove(QRegExp("(description \"*\")", Qt::CaseInsensitive, QRegExp::Wildcard)); | 565 | response = response.remove(QRegExp("(description \"*\")", Qt::CaseInsensitive, QRegExp::Wildcard)); |
557 | qDebug() << "voiceInfo w/o descr: " << response; | 566 | qDebug() << "voiceInfo w/o descr: " << response; |
558 | response = response.remove(')'); | 567 | response = response.remove(')'); |
559 | QStringList responseLines = response.split('(', QString::SkipEmptyParts); | 568 | QStringList responseLines = response.split('(', QString::SkipEmptyParts); |
560 | responseLines.removeAt(0); // the voice name itself | 569 | responseLines.removeAt(0); // the voice name itself |
561 | 570 | ||
562 | QString description; | 571 | QString description; |
563 | foreach(QString line, responseLines) | 572 | foreach(QString line, responseLines) |
564 | { | 573 | { |
565 | line = line.remove('('); | 574 | line = line.remove('('); |
566 | line = line.simplified(); | 575 | line = line.simplified(); |
567 | 576 | ||
568 | line[0] = line[0].toUpper(); // capitalize the key | 577 | line[0] = line[0].toUpper(); // capitalize the key |
569 | 578 | ||
570 | int firstSpace = line.indexOf(' '); | 579 | int firstSpace = line.indexOf(' '); |
571 | if (firstSpace > 0) | 580 | if (firstSpace > 0) |
572 | { | 581 | { |
573 | line = line.insert(firstSpace, ':'); // add a colon between the key and the value | 582 | line = line.insert(firstSpace, ':'); // add a colon between the key and the value |
574 | line[firstSpace+2] = line[firstSpace+2].toUpper(); // capitalize the value | 583 | line[firstSpace+2] = line[firstSpace+2].toUpper(); // capitalize the value |
575 | } | 584 | } |
576 | 585 | ||
577 | description += line + "\n"; | 586 | description += line + "\n"; |
578 | } | 587 | } |
579 | voiceDescriptions[voice] = description.trimmed(); | 588 | voiceDescriptions[voice] = description.trimmed(); |
580 | } | 589 | } |
581 | 590 | ||
582 | return voiceDescriptions[voice]; | 591 | return voiceDescriptions[voice]; |
583 | } | 592 | } |
584 | 593 | ||
585 | QString TTSFestival::queryServer(QString query, int timeout,QString path) | 594 | QString TTSFestival::queryServer(QString query, int timeout,QString path) |
586 | { | 595 | { |
587 | if(!configOk()) | 596 | if(!configOk()) |
588 | return ""; | 597 | return ""; |
589 | 598 | ||
590 | // this operation could take some time | 599 | // this operation could take some time |
591 | emit busy(); | 600 | emit busy(); |
592 | 601 | ||
593 | ensureServerRunning(path); | 602 | ensureServerRunning(path); |
594 | 603 | ||
595 | qDebug() << "queryServer with " << query; | 604 | qDebug() << "queryServer with " << query; |
596 | QString response; | 605 | QString response; |
597 | 606 | ||
598 | QDateTime endTime; | 607 | QDateTime endTime; |
599 | if(timeout > 0) | 608 | if(timeout > 0) |
600 | endTime = QDateTime::currentDateTime().addMSecs(timeout); | 609 | endTime = QDateTime::currentDateTime().addMSecs(timeout); |
601 | 610 | ||
602 | /* Festival is *extremely* unreliable. Although at this | 611 | /* Festival is *extremely* unreliable. Although at this |
603 | * point we are sure that SIOD is accepting commands, | 612 | * point we are sure that SIOD is accepting commands, |
604 | * we might end up with an empty response. Hence, the loop. | 613 | * we might end up with an empty response. Hence, the loop. |
605 | */ | 614 | */ |
606 | while(true) | 615 | while(true) |
607 | { | 616 | { |
608 | QCoreApplication::processEvents(QEventLoop::AllEvents, 50); | 617 | QCoreApplication::processEvents(QEventLoop::AllEvents, 50); |
609 | QTcpSocket socket; | 618 | QTcpSocket socket; |
610 | 619 | ||
611 | socket.connectToHost("localhost", 1314); | 620 | socket.connectToHost("localhost", 1314); |
612 | socket.waitForConnected(); | 621 | socket.waitForConnected(); |
613 | 622 | ||
614 | if(socket.state() == QAbstractSocket::ConnectedState) | 623 | if(socket.state() == QAbstractSocket::ConnectedState) |
615 | { | 624 | { |
616 | socket.write(QString("%1\n").arg(query).toAscii()); | 625 | socket.write(QString("%1\n").arg(query).toAscii()); |
617 | socket.waitForBytesWritten(); | 626 | socket.waitForBytesWritten(); |
618 | socket.waitForReadyRead(); | 627 | socket.waitForReadyRead(); |
619 | 628 | ||
620 | response = socket.readAll().trimmed(); | 629 | response = socket.readAll().trimmed(); |
621 | 630 | ||
622 | if (response != "LP" && response != "") | 631 | if (response != "LP" && response != "") |
623 | break; | 632 | break; |
624 | } | 633 | } |
625 | socket.abort(); | 634 | socket.abort(); |
626 | socket.disconnectFromHost(); | 635 | socket.disconnectFromHost(); |
627 | 636 | ||
628 | if(timeout > 0 && QDateTime::currentDateTime() >= endTime) | 637 | if(timeout > 0 && QDateTime::currentDateTime() >= endTime) |
629 | { | 638 | { |
630 | emit busyEnd(); | 639 | emit busyEnd(); |
631 | return ""; | 640 | return ""; |
632 | } | 641 | } |
633 | /* make sure we wait a little as we don't want to flood the server with requests */ | 642 | /* make sure we wait a little as we don't want to flood the server with requests */ |
634 | QDateTime tmpEndTime = QDateTime::currentDateTime().addMSecs(500); | 643 | QDateTime tmpEndTime = QDateTime::currentDateTime().addMSecs(500); |
635 | while(QDateTime::currentDateTime() < tmpEndTime) | 644 | while(QDateTime::currentDateTime() < tmpEndTime) |
636 | QCoreApplication::processEvents(QEventLoop::AllEvents); | 645 | QCoreApplication::processEvents(QEventLoop::AllEvents); |
637 | } | 646 | } |
638 | if(response == "nil") | 647 | if(response == "nil") |
639 | { | 648 | { |
640 | emit busyEnd(); | 649 | emit busyEnd(); |
641 | return ""; | 650 | return ""; |
642 | } | 651 | } |
643 | 652 | ||
644 | QStringList lines = response.split('\n'); | 653 | QStringList lines = response.split('\n'); |
645 | if(lines.size() > 2) | 654 | if(lines.size() > 2) |
646 | { | 655 | { |
647 | lines.removeFirst(); | 656 | lines.removeFirst(); |
648 | lines.removeLast(); | 657 | lines.removeLast(); |
649 | } | 658 | } |
650 | else | 659 | else |
651 | qDebug() << "Response too short: " << response; | 660 | qDebug() << "Response too short: " << response; |
652 | 661 | ||
653 | emit busyEnd(); | 662 | emit busyEnd(); |
654 | return lines.join("\n"); | 663 | return lines.join("\n"); |
655 | 664 | ||
656 | } | 665 | } |
657 | 666 | ||