QT TTS朗读

来源:互联网 发布:php 日期格式转换 编辑:程序博客网 时间:2024/05/16 10:55

做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_OBJECT
public:
    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);
}

0 0
原创粉丝点击