gpt4 book ai didi

objective-c - NSSpeechRecognizer 和 .delegate=self;问题

转载 作者:搜寻专家 更新时间:2023-10-30 20:24:36 25 4
gpt4 key购买 nike

我遇到了这个 little Objective-C project 的问题我正在做,事实证明这是一个障碍。我在 El Capitan 上玩苹果的 NSSpeechRecognizer 软件,我试图让这个人正常运行,这样当我给它的谜语向用户提出时,用户可以响应一个词“做一些很酷的事情”。就目前而言,委托(delegate)方法:

-(void) speechRecognizer:(NSSpeechRecognizer *)sender didRecognizeCommand:(NSString *)command { ... }`

甚至从来没有被调用过,即使看起来识别图标正在正确检测到谜语的答案。

最佳答案

问题是您的 main 函数有一个循环,不断检查语音是否已被识别。您没有给 NSSpeechRecognizer 机会实际向您传递任何消息。

您的应用需要让主“运行循环”运行,以便它可以传递消息。通常,在 OS X 应用程序中,您的 main 只会调用 NSApplicationMain,它会为您执行此操作。

您的代码实际上是这样的:

@interface RecognizerDelegate : NSObject <NSSpeechRecognizerDelegate>

@property (nonatomic) NSSpeechRecognizer *recognizer;
@property (nonatomic) BOOL didRecognize;

@end

@implementation RecognizerDelegate

- (id)init
{
if ((self = [super init])) {
self.didRecognize = NO;

self.recognizer = [[NSSpeechRecognizer alloc] init];
self.recognizer.listensInForegroundOnly = NO;
self.recognizer.blocksOtherRecognizers = YES;
self.recognizer.delegate = self;
self.recognizer.commands = @[ @"hello" ];
[self.recognizer startListening];
}

return self;
}

- (void)speechRecognizer:(NSSpeechRecognizer *)sender didRecognizeCommand:(NSString *)command
{
self.didRecognize = YES;
}

@end

int main(int argc, const char * argv[])
{
@autoreleasepool
{
RecognizerDelegate *recognizerDelegate = [[RecognizerDelegate alloc] init];

while (recognizerDelegate.didRecognize == NO) {
// do nothing
}

NSLog(@"Recognized!");
}

return 0;
}

那个 while 循环没有做任何有用的事情,只是在循环中运行你的 CPU,浪费时间和精力。您不会让 NSSpeechSynthesizer 中的任何其他代码或任何系统框架(如 Foundation 或 AppKit)有机会执行任何操作。所以,什么也没有发生。

要在短期内解决此问题:您可以让主运行循环在每次通过循环时运行一小会儿。这段代码会让系统运行一秒钟,然后返回到你的代码,所以你可以再次检查:

while (recognizerDelegate.didRecognize == NO) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
}

长期的解决方法是将您的代码从 main 中移出,并将其结构化为真正的 OS X 应用程序。您无需使用循环来轮询条件,例如 recognizerDelegate.didRecognize,您只需直接从委托(delegate)方法(例如 -speechRecognizer:didRecognizeCommand:)触发“下一步”,或者您会使用 NSTimer 之类的东西来定期运行代码。

有关更多详细信息,请参阅 Apple 文档 Cocoa Application Competencies for OS X ,特别是“主事件循环”部分。

关于objective-c - NSSpeechRecognizer 和 .delegate=self;问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com