1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
9 * Copyright (C) 2007 by Dominik Wenger
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 ****************************************************************************/
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";
33 void TTSSapi::generateSettings()
36 QStringList languages
= SystemInfo::languages();
38 EncTtsSetting
* setting
=new EncTtsSetting(this,EncTtsSetting::eSTRINGLIST
,
39 tr("Language:"),RbSettings::subValue("sapi",RbSettings::TtsLanguage
),
41 connect(setting
,SIGNAL(dataChanged()),this,SLOT(updateVoiceList()));
42 insertSetting(eLANGUAGE
,setting
);
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
);
51 insertSetting(eSPEED
,new EncTtsSetting(this,EncTtsSetting::eINT
,
52 tr("Speed:"),RbSettings::subValue("sapi",RbSettings::TtsSpeed
),-10,10));
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());
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
);
99 *errStr
= tr("Could not copy the Sapi-script");
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
);
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");
124 if(!voicescript
->waitForReadyRead(300))
126 *errStr
= voicescript
->readAllStandardError();
131 voicestream
= new QTextStream(voicescript
);
132 voicestream
->setCodec("UTF16-LE");
138 QStringList
TTSSapi::getVoiceList(QString language
)
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
);
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())
163 voicescript
->closeWriteChannel();
164 voicescript
->waitForReadyRead();
166 QString dataRaw
= voicescript
->readAllStandardError().data();
167 result
= dataRaw
.split(",",QString::SkipEmptyParts
);
168 if(result
.size() > 0)
171 result
.removeFirst();
172 for(int i
= 0; i
< result
.size();i
++)
174 result
[i
] = result
.at(i
).simplified();
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");
190 TTSStatus
TTSSapi::voice(QString text
,QString wavfile
, QString
*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();
205 *voicestream
<< "QUIT\r\n";
206 voicestream
->flush();
207 voicescript
->waitForFinished();
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");
219 bool TTSSapi::configOk()
221 if(RbSettings::subValue("sapi",RbSettings::TtsVoice
).toString().isEmpty())