Fix wpsbuild to properly generate "-" for theme related settings (to get the default...
[kugel-rb.git] / rbutil / rbutilqt / base / ttssapi.cpp
blobb8c22f2fa70726323111c2991ffff34b29d03a9a
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
9 * Copyright (C) 2007 by Dominik Wenger
10 * $Id$
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "ttssapi.h"
21 #include "utils.h"
22 #include "rbsettings.h"
23 #include "systeminfo.h"
25 TTSSapi::TTSSapi(QObject* parent) : TTSBase(parent)
27 m_TTSTemplate = "cscript //nologo \"%exe\" /language:%lang /voice:\"%voice\" /speed:%speed \"%options\"";
28 defaultLanguage ="english";
29 m_sapi4 =false;
32 void TTSSapi::generateSettings()
34 // language
35 QStringList languages = SystemInfo::languages();
36 languages.sort();
37 EncTtsSetting* setting =new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,
38 tr("Language:"),RbSettings::subValue("sapi",RbSettings::TtsLanguage),languages);
39 connect(setting,SIGNAL(dataChanged()),this,SLOT(updateVoiceList()));
40 insertSetting(eLANGUAGE,setting);
41 // voice
42 setting = new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,
43 tr("Voice:"),RbSettings::subValue("sapi",RbSettings::TtsVoice),getVoiceList(RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString()),EncTtsSetting::eREFRESHBTN);
44 connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceList()));
45 insertSetting(eVOICE,setting);
46 //speed
47 insertSetting(eSPEED,new EncTtsSetting(this,EncTtsSetting::eINT,
48 tr("Speed:"),RbSettings::subValue("sapi",RbSettings::TtsSpeed),-10,10));
49 // options
50 insertSetting(eOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,
51 tr("Options:"),RbSettings::subValue("sapi",RbSettings::TtsOptions)));
55 void TTSSapi::saveSettings()
57 //save settings in user config
58 RbSettings::setSubValue("sapi",RbSettings::TtsLanguage,getSetting(eLANGUAGE)->current().toString());
59 RbSettings::setSubValue("sapi",RbSettings::TtsVoice,getSetting(eVOICE)->current().toString());
60 RbSettings::setSubValue("sapi",RbSettings::TtsSpeed,getSetting(eSPEED)->current().toInt());
61 RbSettings::setSubValue("sapi",RbSettings::TtsOptions,getSetting(eOPTIONS)->current().toString());
63 RbSettings::sync();
66 void TTSSapi::updateVoiceList()
68 qDebug() << "update voiceList";
69 QStringList voiceList = getVoiceList(getSetting(eLANGUAGE)->current().toString());
70 getSetting(eVOICE)->setList(voiceList);
71 if(voiceList.size() > 0) getSetting(eVOICE)->setCurrent(voiceList.at(0));
72 else getSetting(eVOICE)->setCurrent("");
75 bool TTSSapi::start(QString *errStr)
78 m_TTSOpts = RbSettings::subValue("sapi",RbSettings::TtsOptions).toString();
79 m_TTSLanguage =RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString();
80 m_TTSVoice=RbSettings::subValue("sapi",RbSettings::TtsVoice).toString();
81 m_TTSSpeed=RbSettings::subValue("sapi",RbSettings::TtsSpeed).toString();
82 m_sapi4 = RbSettings::subValue("sapi",RbSettings::TtsUseSapi4).toBool();
84 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
85 QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs");
86 m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs";
88 QFileInfo tts(m_TTSexec);
89 if(!tts.exists())
91 *errStr = tr("Could not copy the Sapi-script");
92 return false;
94 // create the voice process
95 QString execstring = m_TTSTemplate;
96 execstring.replace("%exe",m_TTSexec);
97 execstring.replace("%options",m_TTSOpts);
98 execstring.replace("%lang",m_TTSLanguage);
99 execstring.replace("%voice",m_TTSVoice);
100 execstring.replace("%speed",m_TTSSpeed);
102 if(m_sapi4)
103 execstring.append(" /sapi4 ");
105 qDebug() << "init" << execstring;
106 voicescript = new QProcess(NULL);
107 //connect(voicescript,SIGNAL(readyReadStandardError()),this,SLOT(error()));
109 voicescript->start(execstring);
110 if(!voicescript->waitForStarted())
112 *errStr = tr("Could not start the Sapi-script");
113 return false;
116 if(!voicescript->waitForReadyRead(300))
118 *errStr = voicescript->readAllStandardError();
119 if(*errStr != "")
120 return false;
123 voicestream = new QTextStream(voicescript);
124 voicestream->setCodec("UTF16-LE");
126 return true;
130 QStringList TTSSapi::getVoiceList(QString language)
132 QStringList result;
134 QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs");
135 m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs";
137 QFileInfo tts(m_TTSexec);
138 if(!tts.exists())
139 return result;
141 // create the voice process
142 QString execstring = "cscript //nologo \"%exe\" /language:%lang /listvoices";
143 execstring.replace("%exe",m_TTSexec);
144 execstring.replace("%lang",language);
146 if(RbSettings::value(RbSettings::TtsUseSapi4).toBool())
147 execstring.append(" /sapi4 ");
149 qDebug() << "init" << execstring;
150 voicescript = new QProcess(NULL);
151 voicescript->start(execstring);
152 qDebug() << "wait for started";
153 if(!voicescript->waitForStarted())
154 return result;
155 voicescript->closeWriteChannel();
156 voicescript->waitForReadyRead();
158 QString dataRaw = voicescript->readAllStandardError().data();
159 result = dataRaw.split(",",QString::SkipEmptyParts);
160 if(result.size() > 0)
162 result.sort();
163 result.removeFirst();
164 for(int i = 0; i< result.size();i++)
166 result[i] = result.at(i).simplified();
170 delete voicescript;
171 QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner
172 |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser
173 |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup
174 |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther );
175 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
176 return result;
181 TTSStatus TTSSapi::voice(QString text,QString wavfile, QString *errStr)
183 (void) errStr;
184 QString query = "SPEAK\t"+wavfile+"\t"+text+"\r\n";
185 qDebug() << "voicing" << query;
186 *voicestream << query;
187 *voicestream << "SYNC\tbla\r\n";
188 voicestream->flush();
189 voicescript->waitForReadyRead();
190 return NoError;
193 bool TTSSapi::stop()
196 *voicestream << "QUIT\r\n";
197 voicestream->flush();
198 voicescript->waitForFinished();
199 delete voicestream;
200 delete voicescript;
201 QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",QFile::ReadOwner |QFile::WriteOwner|QFile::ExeOwner
202 |QFile::ReadUser| QFile::WriteUser| QFile::ExeUser
203 |QFile::ReadGroup |QFile::WriteGroup |QFile::ExeGroup
204 |QFile::ReadOther |QFile::WriteOther |QFile::ExeOther );
205 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
206 return true;
209 bool TTSSapi::configOk()
211 if(RbSettings::subValue("sapi",RbSettings::TtsVoice).toString().isEmpty())
212 return false;
213 return true;