Qt 6.5.2中QTextToSpeech用winrt引擎朗读仅读一个词即停止
解决Qt 6.5.2中WinRT语音引擎朗读中断问题
针对你遇到的WinRT引擎仅朗读开头单词就停止的问题,可尝试以下几种解决方案:
1. 等待引擎初始化完成后再执行朗读
setEngine() 操作是异步的,直接调用 say() 可能在引擎未完全就绪时触发,导致朗读中断。可以通过监听 stateChanged 信号,等待引擎状态就绪后再发起朗读:
#include <QtWidgets/QApplication> #include <QTextToSpeech> int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextToSpeech *speech = new QTextToSpeech(); QObject::connect(speech, &QTextToSpeech::stateChanged, [speech](QTextToSpeech::State state) { if (state == QTextToSpeech::Ready) { speech->setLocale(QLocale(QLocale::English, QLocale::LatinScript, QLocale::UnitedStates)); speech->say("Mary had a little lamb, its fleece was white as snow. How did that sound?"); } }); speech->setEngine("winrt"); return app.exec(); }
2. 明确指定WinRT引擎对应的语音
WinRT引擎可能无法通过 setLocale() 自动匹配到合适的语音,可枚举可用语音后手动选择目标语音:
#include <QtWidgets/QApplication> #include <QTextToSpeech> int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextToSpeech *speech = new QTextToSpeech("winrt"); // 枚举所有可用语音并选择英语(美国)语音 const auto voices = speech->availableVoices(); for (const QVoice &voice : voices) { if (voice.locale().name() == "en_US") { speech->setVoice(voice); break; } } speech->say("Mary had a little lamb, its fleece was white as snow. How did that sound?"); return app.exec(); }
3. 升级Qt版本至6.5.3或更高
Qt 6.5.2的WinRT语音引擎存在已知的朗读中断bug,后续版本(如6.5.3、6.6.x及以上)已修复该问题。升级Qt版本后,原代码可能无需修改即可正常运行。
4. 检查系统语音服务状态
确保Windows 11系统的语音服务正常:
- 打开「设置」→「时间和语言」→「语音」,确认已安装英语(美国)语音包
- 测试系统自带语音朗读功能(选中文本后按Win+Ctrl+Enter),验证服务是否可正常工作
内容的提问来源于stack exchange,提问作者Michael Ferrier
相关产品推荐
相关产品推荐

