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\" /speed:%speed \"%options\"";
28 defaultLanguage
="english";
32 void TTSSapi::generateSettings()
35 QStringList languages
= SystemInfo::languages();
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
);
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
);
47 insertSetting(eSPEED
,new EncTtsSetting(this,EncTtsSetting::eINT
,
48 tr("Speed:"),RbSettings::subValue("sapi",RbSettings::TtsSpeed
),-10,10));
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());
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
);
91 *errStr
= tr("Could not copy the Sapi-script");
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
);
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");
116 if(!voicescript
->waitForReadyRead(300))
118 *errStr
= voicescript
->readAllStandardError();
123 voicestream
= new QTextStream(voicescript
);
124 voicestream
->setCodec("UTF16-LE");
130 QStringList
TTSSapi::getVoiceList(QString language
)
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
);
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())
155 voicescript
->closeWriteChannel();
156 voicescript
->waitForReadyRead();
158 QString dataRaw
= voicescript
->readAllStandardError().data();
159 result
= dataRaw
.split(",",QString::SkipEmptyParts
);
160 if(result
.size() > 0)
163 result
.removeFirst();
164 for(int i
= 0; i
< result
.size();i
++)
166 result
[i
] = result
.at(i
).simplified();
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");
181 TTSStatus
TTSSapi::voice(QString text
,QString wavfile
, QString
*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();
196 *voicestream
<< "QUIT\r\n";
197 voicestream
->flush();
198 voicescript
->waitForFinished();
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");
209 bool TTSSapi::configOk()
211 if(RbSettings::subValue("sapi",RbSettings::TtsVoice
).toString().isEmpty())