You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:07:08