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);
}

相关内容

热门资讯

追梦少年作文850字(精简3... 追梦少年作文850字 篇一追梦少年追梦少年是指那些积极向上、勇敢追求梦想的年轻人。他们充满激情和动力...
二年级作文我喜欢狮子(优秀6... 二年级作文我喜欢狮子 篇一我喜欢狮子我喜欢狮子,因为它们是世界上最强壮的动物之一。狮子有一头浓密的金...
看电影作文200字二年级【实... 看电影作文200字二年级 篇一我喜欢看电影我喜欢看电影,因为电影可以带给我快乐和惊喜。每次我看电影,...
小宁捡到钱二年级作文【经典6... 小宁捡到钱二年级作文 篇一今天放学的时候,我在回家的路上捡到了一张钱。当时我正在走路,突然看到地上闪...
二年级游乐园冲浪作文(优秀6... 二年级游乐园冲浪作文 篇一我最喜欢的游乐园冲浪今天,我和爸爸妈妈去了一个很大很有趣的游乐园。这个游乐...
二年级有趣的游戏作文200字... 二年级有趣的游戏作文200字 篇一:捉迷藏捉迷藏是我们二年级最喜欢的游戏之一。这个游戏的规则很简单:...
我的好朋友二年级作文【实用6... 我的好朋友二年级作文 篇一我的好朋友我有一个非常好的朋友,她叫小芳。她和我在同一个班级,我们从小学一...
我的家【优质6篇】 我的家 篇一我的家是一个温馨而快乐的地方。无论是平日的热闹还是周末的宁静,家里总是充满着欢声笑语和爱...
二年级作文不少于200个字【... 二年级作文不少于600个字 篇一我的暑假生活暑假终于来了,我迫不及待地迎接了这个长假。在这个暑假里,...
二年级暑假趣事作文捉老鼠(推... 二年级暑假趣事作文捉老鼠 篇一暑假快到了,我和弟弟决定在家里玩捉老鼠的游戏。我们找来了一些小道具,准...
小学二年级避暑山庄旅游作文(... 小学二年级避暑山庄旅游作文 篇一我和家人去了一个非常有趣的地方——避暑山庄。这个地方真的很美,有很多...
二年级作文游庐山【精简6篇】 二年级作文游庐山 篇一我和爸爸妈妈一起去了庐山。庐山是中国著名的山岳风景区,被誉为“江南第一山”。我...
二年级下册看图写话春天来了作... 二年级下册看图写话春天来了作文 篇一春天来了春天来了,大地变得生机勃勃。图中的小朋友们正在户外玩耍,...
二年级打雪仗作文指导【通用6... 二年级打雪仗作文指导 篇一打雪仗是冬天最有趣的活动之一,对于二年级的小朋友来说,更是一种享受。下面是...
二年级美丽的早晨作文(实用6... 二年级美丽的早晨作文 篇一美丽的早晨早晨的阳光透过窗户洒进来,房间里弥漫着一股清新的味道。我慢慢睁开...
小学二年级海边旅游作文200... 小学二年级海边旅游作文200字作文 篇一我和家人去海边旅游了,真是一个美好的经历!早上,我们一大早就...
二年级【优秀6篇】 二年级 篇一:我的暑假生活暑假终于来了,我迫不及待地开始了我的暑假生活。在这个悠长的假期里,我过得非...
赏荷花二年级作文【通用6篇】 赏荷花二年级作文 篇一欣赏荷花的美丽今天,我和爸爸妈妈一起去公园赏荷花。公园里有一个大大的荷花池,里...
舞蹈汇演作文二年级【精彩6篇... 舞蹈汇演作文二年级 篇一舞蹈汇演是一场精彩绝伦的表演,让我感受到了舞蹈的魅力和美妙。我在二年级的时候...
二年级作文我家的厨师(优质6... 二年级作文我家的厨师 篇一我家的厨师是我妈妈。她是一个非常厉害的厨师,每天都能给我们做出美味可口的饭...