我试图通过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:**我不知道在第二个参数命令中放入什么,因为我觉得它是从识别器收到的信息而不是我应该放入的信息。
就是这样。你可以看到我现在真的很困惑。我非常感谢您的回答,谢谢。
另外,除了这个可可类之外你还有其他语音识别解决方案,请告诉我。
链接:
答案 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()
请注意,此示例不会停止,您必须强行杀死它。