2

我正在使用 Dragonfly for Python 为 Windows 的辅助功能应用程序制作原型。令人沮丧的是,Windows 语音识别 (WSR) 可以识别来自计算机的音频,这对我来说是个大问题,因为它可以识别由自己的引擎生成的语音。例如,使用speak

e = dragonfly.get_engine()
e.speak("Welcome. What can I do for you today? Please say a command.")

WSR 以其无限的智慧"Please say"从计算机扬声器中听到并将其解释为"Yes". 我已经改变了提示的措辞,但这是原型的许多部分的一致问题。我也不想将提示更改为"Affirmative"并忘记"Yes",因为这似乎与可访问性相反。

这就是我的简单响应类的样子:

class SingleWordResponse(CompoundRule):
    spec = "<word>"
    extras = [Choice("word", {"no":0, "yes":1, "ready":1, "okay":1,"repeat":2})]
    mode = 0
    def _process_recognition(self, node, extras):
        #here I use self.mode to keep track of what the user is doing and respond based on the context

我对禁用或规避这种不需要的“功能”的各种方法持开放态度。我尝试过使用不同的上下文,但context文档对它的使用不是很清楚。我也尝试设置一个speaking属性来防止这种情况,但它似乎不起作用。这是对speaking属性的测试:

class SingleWordResponse(CompoundRule):
    spec = "<word>"
    extras = [Choice("word", {"no":0, "yes":1, "ready":1, "okay":1,"repeat":2})]
    speaking = False
    def _process_recognition(self, node, extras):
        if self.speaking == False:
            print "command recognized"
            #process command
        #otherwise do nothing

我在通话前立即将其设置为SingleWordResponse.speakingTrue然后在e.speak()通话后False立即将其设置为但无济于事。

4

1 回答 1

1

一种可能的解决方案是使用 Rule.disable() 和 Rule.enable() 发挥创意。当您不希望它被识别时,这至少会阻止您的规则被识别。

但是,它不处理 WSR 从 speak() 函数中识别自己的语音。这意味着,当您使用 speak() 函数时,您仍然会得到随机文本插入。我认为您可能遇到了麦克风质量问题,因此我在扬声器音量调高和关闭的情况下测试了您的代码。尽管将其称为 WSR 问题,但您似乎是正确的:即使扬声器关闭,我仍然遇到问题。

顺便说一句,出于各种原因,我讨厌建议“多花点钱”的解决方案,但是 Dragon NaturallySpeaking with Natlink +Dragonfly 没有这个反馈问题(至少在 Windows XP/7 上的 DNS 版本 11/12,没有在别处测试)。WSR 还不够聪明。

于 2014-12-02T20:30:42.317 回答