Windows使用SAPI.SpVoice
一、概要
提示:从Qt5.8推出的QTextToSpeech类用于方便将文本转换成语音。
由于我目前使用的版本是Qt5.7.1,所以只能另辟蹊径。使用Windows自带的SAPI.SpVoice
,以下是部分核心代码。
二、生成 SAPI.SpVoice 官方接口文档
//需要在联网的情况下,才能生成成功
void TextToSpeech::exportGenerateDocumentation()
{
// "SAPI.SpVoice" 是 Windows 平台上的一个语音识别和合成引擎的 COM 组件
QAxObject axObject("SAPI.SpVoice");
// 生成 SpVoice 官方接口文档
QString doc = axObject.generateDocumentation();
// 保存文档
QFile file("SpVoice.html");
file.open(QIODevice::WriteOnly);
file.write(doc.toLocal8Bit());
file.close();
}
三、初始化
bool TextToSpeech::initSpeech()
{
if(m_binit)
return true;
/*
* 注册表中:计算机\HKEY_CLASSES_ROOT\SAPI.SpVoice\CLSID (96749377-3391-11D2-9EE3-00C04F797396)
* 设置COM的名称用来初始化COM的模型
*/
m_binit = m_voice.setControl("96749377-3391-11D2-9EE3-00C04F797396"); //返回是否加载成功
if(m_binit)
connect(&m_voice,SIGNAL(signal(QString, int, void*)), this, SLOT(dealeventSlot(QString, int, void*)));
return m_binit;
}
四、将Windows平台上已有的声音添加到下拉框以备选择
void Widget::initVoice()
{
ui->voiceComboBox->addItem("Microsoft HuihuiM",
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech_OneCore\\Voices\\Tokens\\MSTTS_V110_zhCN_HuihuiM");
ui->voiceComboBox->addItem("Microsoft YaoyaoM",
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech_OneCore\\Voices\\Tokens\\MSTTS_V110_zhCN_YaoyaoM");
//C:\Windows\Speech_OneCore\Engines\TTS\zh-CN目录下找对应文件,注册表修改一下
ui->voiceComboBox->addItem("Microsoft KangkangM",
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech_OneCore\\Voices\\Tokens\\MSTTS_V110_zhCN_KangkangM");
}
五、文本转语音朗读函数
bool TextToSpeech::Speak(QString Text, int Volume, int Rate, QString VoiceKey)
{
if(!m_binit)
return false;
setVolume(Volume);
setRate(Rate);
SetVoice(VoiceKey);
//执行第一个参数的方法名,以第二个参数返回是否执行成功
int result = m_voice.dynamicCall("Speak(QString, SpeechVoiceSpeakFlags)", Text , 1).toInt();
m_bReading = true;
return result;
}
六、设置声音、语速和音量
//设置声音
bool TextToSpeech::SetVoice(QString VoiceKey)
{
QAxObject obj(clsidSpObjectToken);
if (obj.isNull()) {
return false;
}
obj.dynamicCall("SetId(const QString&)", VoiceKey);
m_voice.setProperty("Voice", obj.asVariant());
return true;
}
//设置语音朗读速度-10到10
void TextToSpeech::setRate(int rate)
{
if(!m_binit)
return;
m_voice.dynamicCall("SetRate(int)", rate);
}
//设置语音音量0到100
void TextToSpeech::setVolume(int value)
{
if(!m_binit)
return;
m_voice.dynamicCall("SetVolume(int)", value);
}