在PyObjC中使用NSSpeechRecognizer类

时间:2016-04-04 03:03:10

标签: python objective-c macos cocoa pyobjc

我试图通过PyObjC在python中使用OS X内置语音识别引擎。

class Recognizer(NSSpeechRecognizer):

    def __init__(self):

        cmds = ['computer', 'keyboard']
        self.setCommands_(cmds)
        self.setDelegate_(self)

        self.blocksOtherRecognizers = True
        self.listensInForegroundOnly = False

        return self

recognizer = Recognizer.alloc().init()

问题1:我是否需要将委托分配给另一个班级?

问题2:我是否需要在 init 类中初始化实例识别器?

def speechRecognizer_didRecognizeCommand_(sender, command):

    if command == 'computer':
        print('computer')

问题3:我应该在识别器类中定义它吗?

recognizer.startListening()

问题4:当我运行脚本时,没有迹象表明识别器正在侦听,脚本立即完成。

speechRecognizer_didRecognizeCommand_(sender, command)

**问题5:**我不知道在第二个参数命令中放入什么,因为我觉得它是从识别器收到的信息而不是我应该放入的信息。

就是这样。你可以看到我现在真的很困惑。我非常感谢您的回答,谢谢。

另外,除了这个可可类之外你还有其他语音识别解决方案,请告诉我。

链接:

NSSpeechRecognizer

Example

1 个答案:

答案 0 :(得分:2)

您的示例存在许多问题:

  • 请勿使用__init__作为初始化,而是使用init。这是必要的,因为PyObjC遵循Cocoa的约定而不是普通的Python约定。

  • 我不会将NSSpeechRecognizer作为子类,但会使用一个单独的委托类,它更符合普通的Cocoa风格。

  • 您不能使用赋值来设置您尝试执行的属性,而是使用显式调用setter。这是self.setBlocksOtherRecognizers(True)而不是self.blocksOtherRecognizers = True

    原因在于Objective-C方法和属性存在于两个不同的命名空间中,而它们存在于Python中的同一命名空间中,并且您不能拥有一个具有相同名称的属性(self.blocksOtherRecognizers是属性的getter方法)。

  • 最后,您需要启动一个runloop来实际使用识别器:

    loop = NSRunLoop.currentRunLoop() loop.run()

一个完整的例子:

from Cocoa import NSObject, NSSpeechRecognizer, NSRunLoop

class Controller (NSObject):
    def init(self):
        commands = [ "up", "down" ]

        self.recognizer = NSSpeechRecognizer.alloc().init()
        self.recognizer.setCommands_(commands)
        self.recognizer.startListening()
        self.recognizer.setDelegate_(self)

    def speechRecognizer_didRecognizeCommand_(self, recognizer, command):
        print(command)

controller = Controller.alloc().init()
loop = NSRunLoop.currentRunLoop()
loop.run()

请注意,此示例不会停止,您必须强行杀死它。