Qt文档阅读笔记-Hello Speak Example
创始人
2024-01-16 19:13:00
0

官方的这个例子比较有意思,在此记录下,方便以后查阅。

Hello Speak Example

这个例子主要是使用QTextToSpeech类将用户自定义输入的文本转换为口语,包括高低音、声音大小、读速。并且能够选择语言和声音。

包含的文件如下:

 

本篇博文,主要记录下如何使用QTextToSpeech将文字转换为口语。

QTextToSpeech Class

这里先来看下这个类,使用他需要在pro文件添加texttospeech。关于这个类的描述如下:

QTextToSpeech类提供了text-to-speech的引擎,这个引擎使用及其方便。

使用say(),就能将文字转换为口语,并且他能通过setLocale()指定语言,使用setVoice()选择声音。这里有点要注意这些语言和声音依赖于本地机器是否支持。

下面是关于QTextToSpeech::State

constantvaluedescription
QTextToSpeech::Ready0文本输入完后,准备将输入的文本转换为口语。
QTextToSpeech::Speaking1文本正在转换为口语。
QTextToSpeech::Paused2暂停,调用resume()进行恢复。
QTextToSpeech::BackendError3转换口语后端发生错误时

解析

下面主要是来看下,这个例子,是如何将文本转换为口语的。

关键.h文件:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include #include "ui_mainwindow.h"#include class MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = 0);public slots:void speak();void stop();void setRate(int);void setPitch(int);void setVolume(int volume);void stateChanged(QTextToSpeech::State state);void engineSelected(int index);void languageSelected(int language);void voiceSelected(int index);void localeChanged(const QLocale &locale);private:Ui::MainWindow ui;QTextToSpeech *m_speech;QVector m_voices;
};#endif

关键.cpp文件

mainwindow.cpp

#include "mainwindow.h"
#include MainWindow::MainWindow(QWidget *parent): QMainWindow(parent),m_speech(0)
{ui.setupUi(this);//QLoggingCategory::setFilterRules(QStringLiteral("qt.speech.tts=true \n qt.speech.tts.*=true"));// Populate engine selection listui.engine->addItem("Default", QString("default"));foreach (QString engine, QTextToSpeech::availableEngines())ui.engine->addItem(engine, engine);ui.engine->setCurrentIndex(0);engineSelected(0);connect(ui.speakButton, &QPushButton::clicked, this, &MainWindow::speak);connect(ui.pitch, &QSlider::valueChanged, this, &MainWindow::setPitch);connect(ui.rate, &QSlider::valueChanged, this, &MainWindow::setRate);connect(ui.volume, &QSlider::valueChanged, this, &MainWindow::setVolume);connect(ui.engine, static_cast(&QComboBox::currentIndexChanged), this, &MainWindow::engineSelected);
}void MainWindow::speak()
{m_speech->say(ui.plainTextEdit->toPlainText());
}
void MainWindow::stop()
{m_speech->stop();
}void MainWindow::setRate(int rate)
{m_speech->setRate(rate / 10.0);
}void MainWindow::setPitch(int pitch)
{m_speech->setPitch(pitch / 10.0);
}void MainWindow::setVolume(int volume)
{m_speech->setVolume(volume / 100.0);
}void MainWindow::stateChanged(QTextToSpeech::State state)
{if (state == QTextToSpeech::Speaking) {ui.statusbar->showMessage("Speech started...");} else if (state == QTextToSpeech::Ready)ui.statusbar->showMessage("Speech stopped...", 2000);else if (state == QTextToSpeech::Paused)ui.statusbar->showMessage("Speech paused...");elseui.statusbar->showMessage("Speech error!");ui.pauseButton->setEnabled(state == QTextToSpeech::Speaking);ui.resumeButton->setEnabled(state == QTextToSpeech::Paused);ui.stopButton->setEnabled(state == QTextToSpeech::Speaking || state == QTextToSpeech::Paused);
}void MainWindow::engineSelected(int index)
{QString engineName = ui.engine->itemData(index).toString();delete m_speech;if (engineName == "default")m_speech = new QTextToSpeech(this);elsem_speech = new QTextToSpeech(engineName, this);disconnect(ui.language, static_cast(&QComboBox::currentIndexChanged), this, &MainWindow::languageSelected);ui.language->clear();// Populate the languages combobox before connecting its signal.QVector locales = m_speech->availableLocales();QLocale current = m_speech->locale();foreach (const QLocale &locale, locales) {QString name(QString("%1 (%2)").arg(QLocale::languageToString(locale.language())).arg(QLocale::countryToString(locale.country())));QVariant localeVariant(locale);ui.language->addItem(name, localeVariant);if (locale.name() == current.name())current = locale;}setRate(ui.rate->value());setPitch(ui.pitch->value());setVolume(ui.volume->value());connect(ui.stopButton, &QPushButton::clicked, m_speech, &QTextToSpeech::stop);connect(ui.pauseButton, &QPushButton::clicked, m_speech, &QTextToSpeech::pause);connect(ui.resumeButton, &QPushButton::clicked, m_speech, &QTextToSpeech::resume);connect(m_speech, &QTextToSpeech::stateChanged, this, &MainWindow::stateChanged);connect(m_speech, &QTextToSpeech::localeChanged, this, &MainWindow::localeChanged);connect(ui.language, static_cast(&QComboBox::currentIndexChanged), this, &MainWindow::languageSelected);localeChanged(current);
}void MainWindow::languageSelected(int language)
{QLocale locale = ui.language->itemData(language).toLocale();m_speech->setLocale(locale);
}void MainWindow::voiceSelected(int index)
{m_speech->setVoice(m_voices.at(index));
}void MainWindow::localeChanged(const QLocale &locale)
{QVariant localeVariant(locale);ui.language->setCurrentIndex(ui.language->findData(localeVariant));disconnect(ui.voice, static_cast(&QComboBox::currentIndexChanged), this, &MainWindow::voiceSelected);ui.voice->clear();m_voices = m_speech->availableVoices();QVoice currentVoice = m_speech->voice();foreach (const QVoice &voice, m_voices) {ui.voice->addItem(QString("%1 - %2 - %3").arg(voice.name()).arg(QVoice::genderName(voice.gender())).arg(QVoice::ageName(voice.age())));if (voice.name() == currentVoice.name())ui.voice->setCurrentIndex(ui.voice->count() - 1);}connect(ui.voice, static_cast(&QComboBox::currentIndexChanged), this, &MainWindow::voiceSelected);
}

下面来跟一下这个m_speech是如何用的。

在.cpp中可以看到:

将engineName传入了QTextToSpeech的构造函数,而engineName的值来自于

QTextToSpeech::availableEngines()。

这里来看下,他是如何选择语言和音频的,

connect(ui.language, static_cast(&QComboBox::currentIndexChanged), this, &MainWindow::languageSelected);
connect(ui.voice, static_cast(&QComboBox::currentIndexChanged), this, &MainWindow::voiceSelected);

对应的槽函数分别为:

void MainWindow::languageSelected(int language)
{QLocale locale = ui.language->itemData(language).toLocale();m_speech->setLocale(locale);
}void MainWindow::voiceSelected(int index)
{m_speech->setVoice(m_voices.at(index));
}

从中可以看到,这里封装好的,应用层调用的确是简单太多。

下面看下,他是如何播放、暂停、续播:

connect(ui.stopButton, &QPushButton::clicked, m_speech, &QTextToSpeech::stop);
connect(ui.pauseButton, &QPushButton::clicked, m_speech, &QTextToSpeech::pause);
connect(ui.resumeButton, &QPushButton::clicked, m_speech, &QTextToSpeech::resume);

关于设置音调,读速的相关代码如下:

void MainWindow::setRate(int rate)
{m_speech->setRate(rate / 10.0);
}void MainWindow::setPitch(int pitch)
{m_speech->setPitch(pitch / 10.0);
}void MainWindow::setVolume(int volume)
{m_speech->setVolume(volume / 100.0);
}

相关内容

热门资讯

山西省榆次常家庄园简介导游词 山西省榆次常家庄园简介导游词  常家庄园位于榆次西南东阳镇车辋村,距榆次17.5公里。车辋由四个小自...
黄山的景点导游词 黄山的景点导游词(通用7篇)  作为一名导游,通常需要准备好一份导游词,导游词一般是根据实际的游览景...
西双版纳热带植物园导游词 西双版纳热带植物园导游词推荐  各位朋友,大家好。今天我们将游览闻名遐迩、风光绚丽的中国科学院西双版...
浙江仙华山导游词 浙江仙华山导游词  作为一名具备丰富知识的导游,通常会被要求编写导游词,导游词事实上是一种对旅游景点...
广州资政大夫祠的导游词 广州资政大夫祠的导游词  新华镇三华村,有一处资政大夫祠古建筑群,建于清同治二年(1863)  整个...
贵州万峰林导游词 贵州万峰林导游词  作为一位杰出的导游,总不可避免地需要编写导游词,导游词具有极强的实用性,涉及的知...
鸟巢导游词英文 鸟巢导游词英文范文  作为一名乐于为游客排忧解难的'导游,通常需要准备好一份导游词,导游词的主要特点...
开封包公祠导游词 开封包公祠导游词  包公祠全名“包公孝肃祠”,位于合肥市 环城南路东段的一个土墩上,是包河公园的主 ...
浙江省安吉大竹海导游词 浙江省安吉大竹海导游词  导游内容:大竹海概况→五女湖.五女船→竹龙引泉→动感影视吧→投缘池→幽泉煮...
斗篷山导游词最新 斗篷山导游词最新范文  作为一位不辞辛劳的导游,就不得不需要编写导游词,导游词是讲解当地的基本情况,...
云南省大理概况导游词 云南省大理概况导游词(精选5篇)  作为一无名无私奉献的导游,通常会被要求编写导游词,导游词是导游员...
武当山南岩宫导游词 武当山南岩宫导游词(精选12篇)  作为一名可信赖的导游人员,常常需要准备导游词,导游词具有极强的实...
合肥包公园导游词 合肥包公园导游词  包公园,位于安徽省合肥市芜湖路72号,始建于北宋嘉祐七年,是为纪念北宋著名清官包...
景点贵阳花溪公园导游词 景点贵阳花溪公园导游词  作为一位兢兢业业的旅游从业人员,时常需要用到导游词,借助导游词可以更好地宣...
孔庙导游词   孔庙导游词(一)  尊敬的各位来宾:  你们好!我受旅游、接待部门的委托,对光临名城曲阜参观游览...
石家庄驼梁景区导游词 石家庄驼梁景区导游词尊敬的各位游客:  大家好!  欢迎大家来到驼梁,我是中游旅行社的一名导游员,我...
介绍傣家竹楼导游词300 傣家竹楼是傣族固有的典型建筑。下层高约七八尺,四无遮栏,牛马拴束于柱上。上层近梯处有一露台,转进为长...
电视剧《乱世佳人》简介及经典... 电视剧《乱世佳人》简介及经典台词  电视剧简介:  《乱世佳人》亦可称为民国版《美人心计》,由唐嫣饰...
丹东鸭绿江导游词 丹东鸭绿江导游词  鸭绿江是我们中国和朝鲜的分界线,各位导游,请看下面的丹东鸭绿江导游词,希望可以帮...
幼儿园运动会闭幕式主持词 幼儿园运动会闭幕式主持词  主持人在台上表演的灵魂就表现在主持词中。随着社会一步步向前发展,各种场合...