使用Qt的文本转语音模块
前言
最近参与一个项目,已经处于收尾阶段,谁知突然又冒出一个提示音的需求,而产品经理又异想天开,直接读语音(老天,早说啊)。还好Qt有文本转语音模块,使用方法也不复杂。本次记录,笔者在win10下的测试
一、封装一个最简单的文本转语音类
笔者需要说明下,若是使用中文系统,QTextToSpeech默认会设置成支持中文的,而笔者是英文系统,所以需要增加一些设置
class Tool_Speech : public QObject
{
Q_OBJECT
public:
explicit Tool_Speech(QObject *parent = nullptr);
//可以从Qml中调用
Q_INVOKABLE void speak(const QString text);
signals:
private:
QTextToSpeech *m_speech = nullptr;
};
类的头文件很简单,只是留了一个函数,以便在qml中调用
Tool_Speech::Tool_Speech(QObject *parent)
: QObject{parent}
{
m_speech = new QTextToSpeech(this);
//需要选择中国
const QVector<QLocale> locales = m_speech->availableLocales();
// qDebug()<<"locale"<<locales;
for (const QLocale &locale : locales) {
if(locale.country() == QLocale::China)
{
m_speech->setLocale(locale);
break;
}
}
//先选择女声吧
const QVector<QVoice> voices = m_speech->availableVoices();
// qDebug()<<"voices" <<voices;
for (QVoice voice : qAsConst(voices)) {
// qDebug()<<"voice" <<voice.name()
// <<QVoice::genderName(voice.gender())
// <<QVoice::ageName(voice.age());
if(voice.gender() == QVoice::Female)
{
m_speech->setVoice(voice);
break;
}
}
qDebug()<<m_speech<<m_speech->locale();
//以下是测试用的,乱敲的
m_speech->say("高耸,高峻。女(汝)死必于崤之岩崟之下。");
}
void Tool_Speech::speak(const QString text)
{
m_speech->say(text);
}
因为笔者是英文系统,且安装了中文包,首先需要选中国,若没安装中文包,可能不会出现中国选择;
笔者测试发现,选择中文包后,只有成年女声,好吧没得先。笔者没有找到修改性别和年龄段的地方,应该是系统中没有吧
以上修改完成后,就可以使用QTextToSpeech::say()来读文本了
注:若遇到不支持的语言,是不会读的,直接跳到下一句
二、其他可供调节的参数
1.QTextToSpeech::pause()
在指定的边界位置暂停,这个位置可以是如下值:
- QTextToSpeech::BoundaryHint::Default0Uses 引擎的默认值
- QTextToSpeech::BoundaryHint::Immediate 立即停下
- QTextToSpeech::BoundaryHint::Word 读完当前的词组再停下
- QTextToSpeech::BoundaryHint::Sentence 读完当前这句话再停下
2.QTextToSpeech::resume()
暂停后,可恢复阅读
3.QTextToSpeech::stop()
在指定的边界位置停止阅读,参数同暂停
4.setPitch(double pitch)
调节音高,取值范围为-1.0到1.0
越小声音越低沉,越大声音再尖锐
5.setRate(double rate)
调节阅读速度,取值范围为-1.0到1.0
6.setVolume(double volume)
调节阅读声音大小,取值范围为0.0到1.0
后记
Qt6.4版本还未发布,但文本转语音模块已经回归,笔者在win10下测试了Qt6.4的beta3版本。 引擎又增加了一个(不支持中文),还出现了Qml导入(当前无法使用),期待正式版的发布
PS.Qt6.4版本,示例加载已默认使用CMake了