Qt 文本转语言(QTextToSpeech类)详解 - 实践

news/2025/12/9 20:14:39/文章来源:https://www.cnblogs.com/yangykaifa/p/19328274

Qt 文本转语言(QTextToSpeech类)详解

  • 一、QTextToSpeech类详解
    • 1、核心功能
    • 2、重要信号
    • 3、 基本使用示例
    • 4、进阶控制示例 (带暂停/恢复)
    • 5、注意事项
    • 6、总结
  • 二、示例
    • 1、效果展示
    • 2、源码分享

一、QTextToSpeech类详解

QTextToSpeech 是 Qt6 中引入的一个核心类,属于 Qt TextToSpeech 模块。它提供了一种将文本转换为语音(语音合成)的接口。开发者可以利用这个类为应用程序添加语音输出功能,例如用于无障碍支持、语音助手、教育应用、导航提示等场景。

1、核心功能

  1. 文本转语音: 核心功能是将提供的字符串文本朗读出来。
  2. 控制播放:
    • speak(): 开始朗读文本。
    • stop(): 立即停止当前朗读。
    • pause(): 暂停当前朗读。
    • resume(): 从暂停处恢复朗读。
  3. 状态查询: 通过 state() 方法获取当前状态(ReadySpeakingPausedBackendError)。
  4. 语音属性设置:
    • 音量 (volume): 范围通常在 0.0 (静音) 到 1.0 (最大音量) 之间。
    • 语速 (rate): 范围通常在 -1.0 (最慢) 到 1.0 (最快) 之间,0.0 表示正常语速。
    • 音高 (pitch): 范围通常在 -1.0 (最低音高) 到 1.0 (最高音高) 之间,0.0 表示默认音高。
  5. 语音选择:
    • 可以获取系统可用的语音引擎 (availableEngines())。
    • 可以获取特定引擎支持的语言 (availableLocales())。
    • 可以获取特定引擎和语言下可用的声音 (availableVoices())。
    • 可以设置当前使用的 locale (语言和区域组合,如 en_US) 或具体的 voice (特定的发音人)。
  6. 引擎管理:
    • 可以设置当前使用的语音引擎 (setEngine()),引擎名称通常与平台相关(如 "sapi" 在 Windows, "speechd" 在 Linux)。
    • 可以获取当前引擎名称 (engine())。

2、重要信号

  • stateChanged(QTextToSpeech::State state): 当语音状态改变时触发。
  • volumeChanged(double volume): 当音量改变时触发。
  • rateChanged(double rate): 当语速改变时触发。
  • pitchChanged(double pitch): 当音高改变时触发。
  • voiceChanged(const QVoice &voice): 当语音(发音人)改变时触发。
  • localeChanged(const QLocale &locale): 当语言区域改变时触发。
  • engineChanged(const QString &engine): 当语音引擎改变时触发。
  • errorOccurred(QTextToSpeech::ErrorReason reason, const QString &errorString): 当发生错误时触发。

3、 基本使用示例

#include <QTextToSpeech>#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 1. 创建 QTextToSpeech 对象QTextToSpeech *speech = new QTextToSpeech(&app);// 2. (可选) 设置语音属性 - 这里设置正常音量、语速和音高speech->setVolume(1.0);speech->setRate(0.0);speech->setPitch(0.0);// 3. (可选) 设置语言或发音人// 例如,设置中文:QLocale chineseLocale(QLocale::Chinese, QLocale::China);if (speech->availableLocales().contains(chineseLocale)) {speech->setLocale(chineseLocale);} else {qWarning() << "Chinese voice not available.";}// 4. 朗读文本QString textToSpeak = "你好,世界!欢迎使用Qt语音合成功能。";speech->say(textToSpeak);// 5. (可选) 连接信号,例如监听状态变化QObject::connect(speech, &QTextToSpeech::stateChanged, [](QTextToSpeech::State state) {qDebug() << "Speech state changed to:" << state;});return app.exec();}

4、进阶控制示例 (带暂停/恢复)

// ... 创建 speech 对象后 ...
// 连接按钮信号 (假设有 pauseButton 和 resumeButton)
QObject::connect(pauseButton, &QPushButton::clicked, [speech]() {
if (speech->state() == QTextToSpeech::Speaking) {
speech->pause();
}
});
QObject::connect(resumeButton, &QPushButton::clicked, [speech]() {
if (speech->state() == QTextToSpeech::Paused) {
speech->resume();
}
});
// 连接停止按钮
QObject::connect(stopButton, &QPushButton::clicked, [speech]() {
speech->stop();
});

5、注意事项

  1. 平台依赖:QTextToSpeech 的功能和质量高度依赖于底层操作系统提供的语音合成引擎。不同平台(Windows, Linux, macOS, Android, iOS)可用的引擎、声音和支持的语言可能差异很大。
  2. 引擎初始化: 在某些平台上,引擎的初始化可能是异步的。在调用 say() 之前,最好确认 state() 是否为 Ready,或者监听 stateChanged 信号。
  3. 语音队列: 如果在当前语音尚未完成时调用 say() 朗读新文本,新文本会加入队列,并在当前语音结束后自动播放。调用 stop() 会清空队列。
  4. 资源管理: 创建 QTextToSpeech 对象可能消耗较多资源。如果应用中只在特定时刻需要语音,可以考虑在需要时创建,用完即删。
  5. 错误处理: 务必监听 errorOccurred 信号,以便处理可能发生的错误(如引擎加载失败、文本过长、网络问题等)。

6、总结

QTextToSpeech 为 Qt 应用程序提供了便捷的文本转语音功能接口。开发者可以通过它设置音量、语速、音高,选择不同的语言和发音人,并控制语音的播放、暂停、恢复和停止。了解其平台依赖性、状态管理和错误处理对于开发健壮的语音功能至关重要。

二、示例

1、效果展示

在这里插入图片描述

2、源码分享

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
// 1. 创建 QTextToSpeech 对象
QTextToSpeech *speech = new QTextToSpeech(this);
// 2. (可选) 设置语音属性 - 这里设置正常音量、语速和音高
speech->setVolume(1.0);
speech->setRate(0.0);
speech->setPitch(0.0);
// 3. (可选) 设置语言或发音人
// 例如,设置中文:
QLocale chineseLocale(QLocale::Chinese, QLocale::China);
if (speech->availableLocales().contains(chineseLocale)) {
speech->setLocale(chineseLocale);
} else {
qWarning() << "Chinese voice not available.";
}
// 4. 朗读文本
QString textToSpeak = this->ui->lineEdit->text();
speech->say(textToSpeak);
// 5. (可选) 连接信号,例如监听状态变化
QObject::connect(speech, &QTextToSpeech::stateChanged, [=](QTextToSpeech::State state) {
qDebug() << "Speech state changed to:" << state;
this->ui->textBrowser->append(QString("Speech state changed to:").append(QString::number(state)));
});
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/995485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS发布网络扫描指南:构建更安全云环境的守则

亚马逊云科技(AWS)正式发布针对客户工作负载的网络扫描行为指导原则。该指南旨在帮助合规扫描工具获取更准确数据,减少滥用报告,并提升整体互联网安全,涵盖了扫描行为的可观测性、可识别性、协作性与保密性四大核…

# 题解#洛谷P2880 Balanced Lineup #ST表#

P2880 [USACO07JAN] Balanced Lineup G - 洛谷 分析f[i][j]记录以i开头,长度为2^i的子段的最值f[i][j+1]=max( f[i][j] , f[i+2^(j-1)][j-1] )代码实现 #include<bits/stdc++.h> #define int long long #defin…

2025年12月包头保洁公司最新推荐:信达家政,包头保洁开荒、包头高空清洗保洁、包头保姆公司、包头保姆家政、包头保姆月嫂、包头保姆护工、服务品质新标准

随着城市生活节奏加快及家庭服务需求多元化发展,家政服务行业正朝着专业化、标准化、精细化的方向升级。2025年,市场对高品质、可信赖的家政服务需求持续增长,但服务机构水平参差不齐、服务标准不一、人员素质差异大…

机器视觉测量与建模

基于机器视觉的空间信息数据获取与处理技术在当今发展迅速、应用前景巨大,它与计算机视觉、计算机图像学、机器人视觉导航、测绘遥感、地理信息系统等学科方向密切相关。本课程将系统地讲解介绍基于机器视觉的三维空间…

2025最值得报的雅思封闭班:高性价比/冲高分/打基础三类优选清单

2025最值得报的雅思封闭班:高性价比/冲高分/打基础三类优选清单一、2025 雅思封闭班选课指南:五维评测体系揭秘 在雅思备考白热化的当下,封闭式培训以沉浸式学习优势成为提分 “加速器”。本文联合 ETS 官方合作机构…

[Java EE] 多线程 -- 初阶(1) - 详解

[Java EE] 多线程 -- 初阶(1) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

AQS与CAS深度讲解

下面我给你 一口气把 AQS 与 CAS 讲透。你有十年 Java 经验,我直接按“面试+底层原理+源码模型”这种工程师能秒懂的方式来讲,不整花里胡哨的。🔥 一、CAS:并发世界的基石(Compare-And-Swap) 1. CAS 是什么? 一…

PKU 数据结构与算法 2025 复习题 坐公交

题目大意 A 城市有 n 个路口,由 n-1 条道路连接,保证所有路口可以通过这些道路相互联通。 A 城市总共有 m 条公交线路,第 i 条公交在路口 x[i] , y[i] 之间双向往复开行。经过并停靠路口 x[i] , y[i] 最短路径上每一…

2025 雅思培训班怎么选?5 大热门机构深度测评 + 避坑指南

2025 雅思培训班怎么选?5 大热门机构深度测评 + 避坑指南作为一名深耕留学备考领域的教育博主,最近后台被问爆了 “雅思培训班该怎么选”。毕竟市面上机构鱼龙混杂,“保分承诺”“名师授课” 的噱头满天飞,稍不注意…

2025年12月模内注塑技术标杆厂商最新推荐:腾达鑫电子科技,引领IML/IMD/IMR/IMP个性化新标准

随着消费电子、家电、汽车等产业对产品外观、耐用性与环保性要求不断提高,模内注塑技术已从传统制造业逐步渗透至智能终端、高端装饰、功能性面板等多个领域。2025年,模内注塑市场规模预计持续增长,但市场上厂商技术…

2025年12月广东佛山智能电动伸缩门厂家TOP推荐:圣田智能科技,安全智能双标杆

随着智慧城市建设加速推进,智能出入口管理需求持续攀升,电动伸缩门作为机关单位、工业园区、住宅小区等场景的核心安防设备,市场规模预计 2025 年将突破 210 亿元。行业快速发展的同时,也出现厂商技术水平、产品质…

ISCTF misc+web部分wp

Web b@by n0t1ce b0ard 可以通过搜索发现作者复现的文章 作者文章: 可以直接利用POC POST /registration.php HTTP/1.1 Host: 127.0.0.1:8081 Content-Length: 1172 Cache-Control: max-age=0 sec-ch-ua: "Chromi…

CF1046I Say Hello - crazy-

二分/三分,模拟 题意 平面上有两个人。有 \(n\) 个时刻,对于每个人,已知他在每个时刻的位置,且他们总会在两个位置间匀速移动。 如果他们的距离小于等于 \(d _ 1\),并且这是他们第一次交谈或者在他们上次互相打招…

church函数与区间算术

上一篇随笔漏了练习2.5和2.6,这边补充一下。 练习2.5要求证明如果能够将a和b的序对表示为乘积(2a)*(3b)对应的整数,我们可以只用非负整数和算术运算表示序对。 这个表述有点绕口,我最初理解为用(2a)*(3b)表示任意整…

day31-GraphRAG

GraphRAG快速入门与原理详解 一、GraphRAG快速入门介绍 当前阶段大模型的应用落地急需解决的核心问题有一个是:如何与私域数据交互。而私域数据主要的问题是:需要有效地将企业数据整合进大语言模型中,但由于大模型的…

Python 函数与 lambda 表达式的结合

示例代码 def calculate(data, func): """高阶函数:对数据列表中的每个元素应用指定函数""" result = [] for item in data: result.append(func(item)) return result numbers = [1, …

最短路径 - Dijkstra(堆优化)中优先队列的懒删除如何理解?

什么是懒删除? 在Dijkstra算法中,同一个节点可能被多次加入优先队列,但只有最短的那次才是有效的。懒删除就是"推迟删除",直到真正从队列中取出时再判断是否有效。 举个例子理解 假设有这样一个图: A -…

最短路径 - Dijkstra(堆优化)中优先队列的懒删除如何理解?

什么是懒删除? 在Dijkstra算法中,同一个节点可能被多次加入优先队列,但只有最短的那次才是有效的。懒删除就是"推迟删除",直到真正从队列中取出时再判断是否有效。 举个例子理解 假设有这样一个图: A -…

中小企业走向境外资本市场:境外上市辅导、美股上市实践与中国境外券商投行机构角色——以顺安资本为例

一、为什么境外上市辅导机构突然变得这么“重要”? 过去几年,一个现象在资本市场悄悄变得常见:很多原本只考虑新三板、北交所甚至区域股权市场的中小企业,开始把目光直接投向美股、港股等境外市场,关键词搜索里,…

解码生命蓝图,预见健康未来:北京守嘉健康基因检测业务介绍

在精准医疗时代,基因是决定个体健康、特质与潜能的核心密码。守嘉(北京)健康管理服务有限公司,作为中国文化信息协会中医药文化工作委员会的战略共建单位,以前沿的科技视野与专业的服务体系,将基因检测从科研殿堂…