官方的这个例子比较有意思,在此记录下,方便以后查阅。
Hello Speak Example
这个例子主要是使用QTextToSpeech类将用户自定义输入的文本转换为口语,包括高低音、声音大小、读速。并且能够选择语言和声音。
包含的文件如下:
本篇博文,主要记录下如何使用QTextToSpeech将文字转换为口语。
QTextToSpeech Class
这里先来看下这个类,使用他需要在pro文件添加texttospeech。关于这个类的描述如下:
QTextToSpeech类提供了text-to-speech的引擎,这个引擎使用及其方便。
使用say(),就能将文字转换为口语,并且他能通过setLocale()指定语言,使用setVoice()选择声音。这里有点要注意这些语言和声音依赖于本地机器是否支持。
下面是关于QTextToSpeech::State
constant | value | description |
QTextToSpeech::Ready | 0 | 文本输入完后,准备将输入的文本转换为口语。 |
QTextToSpeech::Speaking | 1 | 文本正在转换为口语。 |
QTextToSpeech::Paused | 2 | 暂停,调用resume()进行恢复。 |
QTextToSpeech::BackendError | 3 | 转换口语后端发生错误时 |
解析
下面主要是来看下,这个例子,是如何将文本转换为口语的。
关键.h文件:
mainwindow.h
-
#ifndef MAINWINDOW_H
-
#define MAINWINDOW_H
-
-
#include <QtWidgets/qmainwindow.h>
-
-
#include "ui_mainwindow.h"
-
-
#include <QTextToSpeech>
-
-
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<QVoice> m_voices;
-
};
-
-
#endif
关键.cpp文件
mainwindow.cpp
-
#include "mainwindow.h"
-
#include <QLoggingCategory>
-
-
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 list
-
ui.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<
void (QComboBox::*)(
int)>(&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...");
-
else
-
ui.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);
-
else
-
m_speech =
new
QTextToSpeech(engineName,
this);
-
disconnect(ui.language,
static_cast<
void (QComboBox::*)(
int)>(&QComboBox::currentIndexChanged),
this, &MainWindow::languageSelected);
-
ui.language->
clear();
-
// Populate the languages combobox before connecting its signal.
-
QVector<QLocale> 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<
void (QComboBox::*)(
int)>(&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<
void (QComboBox::*)(
int)>(&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<
void (QComboBox::*)(
int)>(&QComboBox::currentIndexChanged),
this, &MainWindow::voiceSelected);
-
}
下面来跟一下这个m_speech是如何用的。
在.cpp中可以看到:
将engineName传入了QTextToSpeech的构造函数,而engineName的值来自于
QTextToSpeech::availableEngines()。
这里来看下,他是如何选择语言和音频的,
-
connect(ui.language,
static_cast<
void (QComboBox::*)(
int)>(&QComboBox::currentIndexChanged),
this, &MainWindow::languageSelected);
-
connect(ui.voice,
static_cast<
void (QComboBox::*)(
int)>(&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);
-
}
转载:https://blog.csdn.net/qq78442761/article/details/127486924
查看评论