在PyObjC中使用NSSpeechRecognizer类

2024-10-01 13:43:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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方法中初始化实例识别器?在

^{pr2}$

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

recognizer.startListening()

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

speechRecognizer_didRecognizeCommand_(sender, command)

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

就这样。如你所见,我现在真的很困惑。非常感谢您的回答,谢谢。在

另外,如果你有任何其他的解决方案,除了这个可可课程,请告诉我。在

链接:

NSSpeechRecognizer

Example


Tags: 引擎self脚本initdef语音pyobjc内置
1条回答
网友
1楼 · 发布于 2024-10-01 13:43:02

你的例子有很多问题:

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

  • 我不会子类NSSpeechRecognizer,但会使用一个单独的委托类,这更符合普通的Cocoa样式。

  • 不能像您尝试的那样使用赋值来设置属性,请改用对setter的显式调用。即self.setBlocksOtherRecognizers(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()

请注意,这个例子不会停止,您将不得不强制终止它。在

相关问题 更多 >