Packard Bell Vibe 500: correct the path to a proper one in rbutil (proper directory...
[kugel-rb.git] / rbutil / rbutilqt / base / ttssapi.cpp
blob4f69de56ae3025c1e1780f26b90790229cfd9e9d
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\""
28 " /speed:%speed \"%options\"";
29 defaultLanguage ="english";
30 m_sapi4 =false;
33 void TTSSapi::generateSettings()
35 // language
36 QStringList languages = SystemInfo::languages();
37 languages.sort();
38 EncTtsSetting* setting =new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,
39 tr("Language:"),RbSettings::subValue("sapi",RbSettings::TtsLanguage),
40 languages);
41 connect(setting,SIGNAL(dataChanged()),this,SLOT(updateVoiceList()));
42 insertSetting(eLANGUAGE,setting);
43 // voice
44 setting = new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST,
45 tr("Voice:"),RbSettings::subValue("sapi",RbSettings::TtsVoice),
46 getVoiceList(RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString()),
47 EncTtsSetting::eREFRESHBTN);
48 connect(setting,SIGNAL(refresh()),this,SLOT(updateVoiceList()));
49 insertSetting(eVOICE,setting);
50 //speed
51 insertSetting(eSPEED,new EncTtsSetting(this,EncTtsSetting::eINT,
52 tr("Speed:"),RbSettings::subValue("sapi",RbSettings::TtsSpeed),-10,10));
53 // options
54 insertSetting(eOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,
55 tr("Options:"),RbSettings::subValue("sapi",RbSettings::TtsOptions)));
59 void TTSSapi::saveSettings()
61 //save settings in user config
62 RbSettings::setSubValue("sapi",RbSettings::TtsLanguage,
63 getSetting(eLANGUAGE)->current().toString());
64 RbSettings::setSubValue("sapi",RbSettings::TtsVoice,
65 getSetting(eVOICE)->current().toString());
66 RbSettings::setSubValue("sapi",RbSettings::TtsSpeed,
67 getSetting(eSPEED)->current().toInt());
68 RbSettings::setSubValue("sapi",RbSettings::TtsOptions,
69 getSetting(eOPTIONS)->current().toString());
71 RbSettings::sync();
74 void TTSSapi::updateVoiceList()
76 qDebug() << "update voiceList";
77 QStringList voiceList = getVoiceList(getSetting(eLANGUAGE)->current().toString());
78 getSetting(eVOICE)->setList(voiceList);
79 if(voiceList.size() > 0) getSetting(eVOICE)->setCurrent(voiceList.at(0));
80 else getSetting(eVOICE)->setCurrent("");
83 bool TTSSapi::start(QString *errStr)
86 m_TTSOpts = RbSettings::subValue("sapi",RbSettings::TtsOptions).toString();
87 m_TTSLanguage =RbSettings::subValue("sapi",RbSettings::TtsLanguage).toString();
88 m_TTSVoice=RbSettings::subValue("sapi",RbSettings::TtsVoice).toString();
89 m_TTSSpeed=RbSettings::subValue("sapi",RbSettings::TtsSpeed).toString();
90 m_sapi4 = RbSettings::subValue("sapi",RbSettings::TtsUseSapi4).toBool();
92 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
93 QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs");
94 m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs";
96 QFileInfo tts(m_TTSexec);
97 if(!tts.exists())
99 *errStr = tr("Could not copy the Sapi-script");
100 return false;
102 // create the voice process
103 QString execstring = m_TTSTemplate;
104 execstring.replace("%exe",m_TTSexec);
105 execstring.replace("%options",m_TTSOpts);
106 execstring.replace("%lang",m_TTSLanguage);
107 execstring.replace("%voice",m_TTSVoice);
108 execstring.replace("%speed",m_TTSSpeed);
110 if(m_sapi4)
111 execstring.append(" /sapi4 ");
113 qDebug() << "init" << execstring;
114 voicescript = new QProcess(NULL);
115 //connect(voicescript,SIGNAL(readyReadStandardError()),this,SLOT(error()));
117 voicescript->start(execstring);
118 if(!voicescript->waitForStarted())
120 *errStr = tr("Could not start the Sapi-script");
121 return false;
124 if(!voicescript->waitForReadyRead(300))
126 *errStr = voicescript->readAllStandardError();
127 if(*errStr != "")
128 return false;
131 voicestream = new QTextStream(voicescript);
132 voicestream->setCodec("UTF16-LE");
134 return true;
138 QStringList TTSSapi::getVoiceList(QString language)
140 QStringList result;
142 QFile::copy(":/builtin/sapi_voice.vbs",QDir::tempPath() + "/sapi_voice.vbs");
143 m_TTSexec = QDir::tempPath() +"/sapi_voice.vbs";
145 QFileInfo tts(m_TTSexec);
146 if(!tts.exists())
147 return result;
149 // create the voice process
150 QString execstring = "cscript //nologo \"%exe\" /language:%lang /listvoices";
151 execstring.replace("%exe",m_TTSexec);
152 execstring.replace("%lang",language);
154 if(RbSettings::value(RbSettings::TtsUseSapi4).toBool())
155 execstring.append(" /sapi4 ");
157 qDebug() << "init" << execstring;
158 voicescript = new QProcess(NULL);
159 voicescript->start(execstring);
160 qDebug() << "wait for started";
161 if(!voicescript->waitForStarted())
162 return result;
163 voicescript->closeWriteChannel();
164 voicescript->waitForReadyRead();
166 QString dataRaw = voicescript->readAllStandardError().data();
167 result = dataRaw.split(",",QString::SkipEmptyParts);
168 if(result.size() > 0)
170 result.sort();
171 result.removeFirst();
172 for(int i = 0; i< result.size();i++)
174 result[i] = result.at(i).simplified();
178 delete voicescript;
179 QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",
180 QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner
181 | QFile::ReadUser | QFile::WriteUser | QFile::ExeUser
182 | QFile::ReadGroup | QFile::WriteGroup | QFile::ExeGroup
183 | QFile::ReadOther | QFile::WriteOther | QFile::ExeOther );
184 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
185 return result;
190 TTSStatus TTSSapi::voice(QString text,QString wavfile, QString *errStr)
192 (void) errStr;
193 QString query = "SPEAK\t"+wavfile+"\t"+text+"\r\n";
194 qDebug() << "voicing" << query;
195 *voicestream << query;
196 *voicestream << "SYNC\tbla\r\n";
197 voicestream->flush();
198 voicescript->waitForReadyRead();
199 return NoError;
202 bool TTSSapi::stop()
205 *voicestream << "QUIT\r\n";
206 voicestream->flush();
207 voicescript->waitForFinished();
208 delete voicestream;
209 delete voicescript;
210 QFile::setPermissions(QDir::tempPath() +"/sapi_voice.vbs",
211 QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner
212 | QFile::ReadUser | QFile::WriteUser | QFile::ExeUser
213 | QFile::ReadGroup | QFile::WriteGroup | QFile::ExeGroup
214 | QFile::ReadOther | QFile::WriteOther | QFile::ExeOther );
215 QFile::remove(QDir::tempPath() +"/sapi_voice.vbs");
216 return true;
219 bool TTSSapi::configOk()
221 if(RbSettings::subValue("sapi",RbSettings::TtsVoice).toString().isEmpty())
222 return false;
223 return true;