官方的这个例子比较有意思,在此记录下,方便以后查阅。
这个例子主要是使用QTextToSpeech类将用户自定义输入的文本转换为口语,包括高低音、声音大小、读速。并且能够选择语言和声音。
包含的文件如下:
本篇博文,主要记录下如何使用QTextToSpeech将文字转换为口语。
这里先来看下这个类,使用他需要在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 #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);
}
上一篇:莉莉和狗
下一篇:C语言中程序的环境和预处理简述