做QT项目时,可能会遇上朗读中文或英文,这就是TTS朗读。
我用QtCreator做了一个TTS朗读的小例子。
首先,在pro文件里面需要加上
QT += axcontainer
头文件用:
#include <ActiveQt/QAxObject>
.h文件的主要代码:
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <ActiveQt/QAxObject>//需要的头文件
namespace Ui {class Widget;}class Widget : public QWidget{Q_OBJECTpublic:
explicit Widget(QWidget *parent = 0);~Widget();private slots:void on_enButton_clicked();void on_zhButton_clicked();private:
void startSpeak(const QString& text);private:
Ui::Widget *ui;mutable QAxObject m_voice;static const QString EnglishVoiceKey;static const QString ChineseVoiceKey;static const QString clsidSpObjectToken;static const QString clsidSpVoice;};#endif // WIDGET_H
.cpp里面的主要代码:
#include "widget.h"#include "ui_widget.h"#include<QDebug>#include <oaidl.h>const QString Widget::EnglishVoiceKey = QLatin1String("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\VW Julie");const QString Widget::ChineseVoiceKey = QLatin1String("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\ScanSoftMei-Ling_Full_22kHz");//TTS引擎ID,上面是英文的,下面是中文的。这个可以根据自己电脑上的找。 通过在运行里输入regedit查找到。const QString Widget::clsidSpObjectToken = QLatin1String("{EF411752-3736-4CB4-9C8C-8EF4CCB58EFE}");const QString Widget::clsidSpVoice = QLatin1String("{96749377-3391-11D2-9EE3-00C04F797396}");//在运行里面输入regedit 查找注册表,在 HKEY_LOCAL_MACHINE\\SOFTWARE\\CLasscs\\CLSID 下可以找到,它是一个类标识符,window下的每个应用,如网上邻居,//回收站,都有自己的类识别符。 上面是TTS语音的类识别符。Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);}Widget::~Widget(){delete ui;}void Widget::on_enButton_clicked(){// 这个函数用来测试朗读英文QAxObject obj(clsidSpObjectToken);if (obj.isNull()) {qWarning() << "Failed to create SpObjectToken";return;}
obj.dynamicCall("SetId(const QString&)", EnglishVoiceKey);m_voice.setProperty("Voice", obj.asVariant());startSpeak(QLatin1String("this is a test!"));}void Widget::on_zhButton_clicked(){// 这个函数用来测试朗读中文QAxObject obj(clsidSpObjectToken);if (obj.isNull()) {qWarning() << "Failed to create SpObjectToken";return;}
obj.dynamicCall("SetId(const QString&)", ChineseVoiceKey);m_voice.setProperty("Voice", obj.asVariant());startSpeak(tr("这是一个测试例子!"));}void Widget::startSpeak(const QString& text){m_voice.setControl(clsidSpVoice);m_voice.dynamicCall("Speak(QString, SpeechVoiceSpeakFlags)", text, 0x0013);}