【问题标题】:Make windows 10 narrator to speak some text让 Windows 10 讲述人说出一些文字
【发布时间】:2019-09-13 11:33:59
【问题描述】:

我正在用 C++ 制作一个 GUI 应用程序。 有没有一种简单的方法可以让 Windows 10 的叙述者说出一些文字? 当然,它目前处于活动状态。

有时有效的技巧是在文本字段中选择一些文本,然后短暂聚焦。但是

  • 它并不总是有效
  • 焦点被移出和移回。即使是很短的时间,它也是侵入性的,并且可能会干扰用户当前正在做的任何事情
  • 文本字段必须出现在屏幕上的某个位置,这并不总是需要的

如果可能的话,我想要一个没有这三个问题的解决方案。

其他屏幕阅读器,尤其是 Jaws 和 NVDA,提供了 API 来执行此操作。 我什至是一个库UniversalSpeech 的作者,它允许当前运行的屏幕阅读器(如果有)朗读文本,从而抽象出检测自己正在运行的屏幕阅读器的需要。 鉴于在 Windows 10 的最后 3 或 4 个版本中,旁白有了很大的改进,支持它可能会很有趣,不仅在我自己的程序和我的特定用例中,而且对于我库中的每个人。

但是,我找不到任何文档或任何东西告诉我叙述者是否具有类似于 Jaws 或 NVDA 的 API。 事实上,如果目前没有这样的讲述人 API,建议微软添加一个可能会很有趣。

注意这个问题不同于this one 答案建议直接使用语音API。直接使用屏幕阅读器 API 而不是语音 API 有很大的好处:

  • 屏幕阅读器用户习惯于特定的语音设置(语音、速率、音高、语言和地区口音等)。控制面板中设置的默认设置可能完全不同。这意味着
    • 用户是否必须在控制面板中配置语音设置,所有应用程序的全局设置;不太好
    • 和/或在业务应用程序中管理特定于应用程序的语音设置,这些设置根本不专门用于语音内容;例如,在金融应用中找到语音设置会很奇怪。
  • 同时使用屏幕阅读器和独立语音引擎意味着两者可以同时说话,这当然是非常烦人的。事实上,在实践中它经常发生,我已经测试过了。

那么,有没有一种简单的方法可以让叙述者说出一些文字?

我的程序是 C++,库是 C,所以理论上我可以访问整个 winapi,如果需要,可以通过 LoadLibrary/GetProcAddress。 请不要提供任何依赖 C# 或 VisualStudio 的解决方案。

谢谢。

【问题讨论】:

  • @VTT:语音合成!= 屏幕阅读器。
  • 您不需要与屏幕阅读器的 API 对话,而是实现操作系统的辅助功能 API。请参阅 UI Automation and Active AccessibilityDeveloping apps for accessibility。然后屏幕阅读器应该“从那里获取”。
  • 嗯,好的,当然。但是,我怎样才能做相当于网络应用程序的实时区域?我有一个多行文本字段,当它们出现时应该说出它们。
  • @QuentinC 首先,您需要评估 UI 自动化是否可以满足您的要求。对于快速测试,您可以使用Inspect.exe tool 来查看它是否可以读取 Web 应用程序的实时区域的文本?然后你可能需要学习 UI 自动化技术来实现你自己的应用程序。

标签: c++ c winapi accessibility screen-readers


【解决方案1】:

据我所知,Microsoft Narrator 并未向开发人员公开 API,您可以在 Windows 10 上使用 Feedback App 为其建议一项功能。

我想实现与在活动区域​​中相同的行为,即让 SR 读取一些文本,因为它显示在多行富文本字段的底部,但在本机 GUI 应用程序中。有关信息,我正在使用 WXWidgets。

您可以使用 UI 自动化事件订阅富文本字段的属性更改,以便在文本更新时收到通知。而且由于您使用的是第三方控件,因此您还需要为任何不包含提供者的第三方控件实现提供者。以下是有关 UI 自动化提供的链接和 供您参考的 UI 自动化事件:

UI Automation Events Overview

UI Automation Providers Overview

【讨论】:

  • 您可以使用UI自动化事件订阅富文本字段的属性更改,以便在文本更新时收到通知=> 看来您已经反过来理解了问题:我知道当文本更新时,因为我自己在我的应用程序中更新它。我希望通知屏幕阅读器我的更改。也许 SR 应该订阅我而不是相反。
  • @QuentinC 你是对的。正如我提到的,Microsoft Narrator 不支持您描述的场景。您需要自己实现屏幕阅读器(讲述人)并将 API 公开给其他应用(您的 UI 应用)以允许订阅 UI 元素,或者您可以为讲述人提交反馈。
  • 那么 aria-live 区域如何工作?什么通知屏幕阅读器?如果叙述者支持网络浏览器中的实时区域,那么我不应该以同样的方式通知屏幕阅读器我的 GUI 应用程序中的更改吗?如果实际上什么都没有,你可能是真的,我需要向微软推荐它。在这种情况下,我可以/应该做些什么来最大化完成某事的机会?是否有更具体的叙述者或无障碍团队可以联系?
  • 感谢您的建议,您可以直接从this link 提交对 Microsoft 讲述人的任何反馈
【解决方案2】:

过了一会儿,我回答了我自己的问题!

事实上,让叙述者说话的最简单方法可能是:

  1. 将某个标签定义为活动区域
  2. 当叙述者必须说出某些内容时,更改标签中的文本,然后发送更新通知

将标签变为活动区域并在文本更改时发送通知如下所述: https://docs.microsoft.com/en-us/accessibility-tools-docs/items/win32/text_livesetting

实时设置可以设置为 0=关闭、1=礼貌和 2=自信。礼貌和自信的含义与 WAI ARIA 相同。 尽管目前(2021 年 4 月)存在,但叙述者总是在更换标签文本时立即打断讲话,即使在礼貌模式下也是如此。 自信模式的变化在于,文本甚至优先考虑由于正常的键盘导航而导致的中断,即当您按下 Tab、箭头键等时,您可能听不到您所在的位置。 因此,我根本不推荐它。

还请注意,实时设置仅适用于静态文本控件(win32 STATIC 窗口类)。 当应用于文本字段和文本区域(win32 EDIT 窗口类)时,它会被完全忽略。

带有实时设置的标签在放置在屏幕外甚至隐藏时仍然有效。

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    相关资源
    最近更新 更多