转自
IntoTheWild的博客:http://blog.sina.com.cn/iuhzzy
最近写一个QT程序时需要用到文本转语音播放,在网上找了很多关于QT调用微软tts的资料,在这总结一下其中一个使用QAxObject实现的方法,下面原文地址,http://www.cnblogs.com/rockhawk/archive/2011/09/02/2164016.html
最近写一个QT程序时需要用到文本转语音播放,在网上找了很多关于QT调用微软tts的资料,在这总结一下其中一个使用QAxObject实现的方法,下面原文地址,http://www.cnblogs.com/rockhawk/archive/2011/09/02/2164016.html
为了适合像我一样的新手,为了能够完整快速的实现程序,我把没有涉及到的细节和新手会遇到的但文中没有提到的问题整理了一下。
这个程序要下载MS Speech sdk ,如果需要中英文混度,网上有sdk5.1的包以及中文语言包
首先如果我们需要新建一个C++类来完成我们的程序时,尽量要在创建时设置基类为QObject,这样使用connect函数时可以避免出现问题。
第二个要注意到的问题是因为我们要用到QAxObject,所以需要在工程的pro文件中添加这样一句话:
CONFIG += qaxcontainer
注意以上两个问题之后在编写代码时应该就不会出现什么问题了,我在使用QT4.8时无法找到QAxObject,如果出现这个问题的大概跟我一样是安装QT时出了问题,我卸载后重新完整安装了QT5.0之后这个问题得到了解决,下面开始介绍代码。我的类名为TextSpeech。因为我只需要部分函数,所以我在程序中没有使用原文中提到的所有函数,剩下的函数stop(),pause(),reseum()三个主要函数的原理相同
#ifndef TEXTSPEECH_H
#define TEXTSPEECH_H
#include <QObject>
#include<QAxObject>
class TextSpeech : public QObject
{
Q_OBJECT
public:
explicit TextSpeech(QObject *parent = 0);
~TextSpeech();
bool initSpeech();//初始化函数
bool speak(QString txt);//文本转语音函数
void setRate(int rate);//设置语速,范围-10到10
void setVolume(int value);//设置音量,范围 0到100
bool isSpeaking();
private:
QAxObject _voice;
bool _binit;
bool _bReading;
signals:
void speakComplete();
private slots:
void dealevent(QString name, int arc , void* argv);
};
#endif // TEXTSPEECH_H
#include "textspeech.h"
TextSpeech::TextSpeech(QObject *parent) :
QObject(parent),_binit(0),_bReading(0)
{
initSpeech();//初始化语音
}
TextSpeech::~TextSpeech()
{
}
bool TextSpeech::initSpeech()
{
if(_binit)
return true;
_binit = this->_voice.setControl("96749377-3391-11D2-9EE3-00C04F797396");//设置COM的名称用来初始化COM的模型,返回是否加载成功
if(_binit)
{
connect(&this->_voice,SIGNAL(signal(QString, int, void*)), this, SLOT(dealevent(QString, int, void*)));
}
return _binit;
}
//文本转语音朗读函数
bool TextSpeech::speak(QString txt)
{
if(!_binit)
return false;
int result = this->_voice.dynamicCall("Speak(QString, SpeechVoiceSpeakFlags)", txt ,1).toInt();//执行第一个参数的方法名,以第二个参数返回是否执行成功
_bReading = true;
return result;//返回是否执行阅读函数
}
//判断语音系统是否运行函数
bool TextSpeech::isSpeaking()
{
return _bReading;
}
//设置语音朗读速度-10到10
void TextSpeech::setRate(int rate)
{
if(!_binit)
return;
this->_voice.dynamicCall("SetRate(int)", rate);
}
//设置语音音量0到100
void TextSpeech::setVolume(int value)
{
if(!_binit)
return;
this->_voice.dynamicCall("SetVolume(int)", value);
}
void TextSpeech::dealevent(QString name, int arc , void* argv)
{
if(name == "EndStream(int,QVariant)")
{
_bReading = false;
emit speakComplete();
}
}
完成以上代码的编写,你就可以在别的类中申请该类的对象,调用该类的speak函数传入你需要朗读的文本就可以实现中英文混读了。代码中的关于函数或者代码段到的注释也是我阅读帮助文档后按自己理解注释的,所以建议大家还是去阅读原来的英文帮助文档,我也是新手,所以对于程序理解有误的地方希望指出。下面我上传我的测试工程下载地址,在main.cpp中调用的该类的speak函数,供大家测试使用: