2

我试图让语音识别在 MacBook(OS 10.8.2)上工作,但我从来没有在委托方法上得到任何回调。将 XCode 4.6 与 ARC 一起使用,这是我的简单测试代码。我确实在控制台中得到了“监听”输出。“麦克风”出现在屏幕上,如果我按 ESC 键,那么我可以在麦克风的显示屏上看到我的讲话模式,但仍然没有代表回调。必须有一些基本的东西,但我还没有找到。

我看过很多 SO 问题,但没有一个能解决这个问题。有些人谈论控制面板中的校准,但我没有找到任何校准(也许那是以前的操作系统?)。

github中提供了完整的项目源代码。

#import "RBListener.h"

@interface RBListener() <NSSpeechRecognizerDelegate>

@property (nonatomic, strong, readonly) NSSpeechRecognizer* recognizer;
@property (nonatomic, strong)           NSArray*            commands;

@end

@implementation RBListener

@synthesize recognizer = _recognizer;

- (id)init
{
    self = [super init];
    if (self) {
        // initialize
        _commands = @[@"hi", @"yes", @"no", @"hello", @"good", @"time"];

        _recognizer = [[NSSpeechRecognizer alloc] init];
        _recognizer.delegate = self;
        _recognizer.commands = _commands;
        _recognizer.listensInForegroundOnly = NO;
        _recognizer.blocksOtherRecognizers  = YES;
        [_recognizer startListening];
        DLog(@"listening");
    }
    return self;
}


#pragma mark -
#pragma mark NSSpeechRecognizerDelegate methods
- (void)speechRecognizer:(NSSpeechRecognizer*)sender didRecognizeCommand:(id)command
{
    DLog(@"command: %@", command);
}

@end

口述时的屏幕截图

4

1 回答 1

1

很可能您的 RBListener 实例没有留下来(或者甚至从未创建),所以在一切都设置好之后,没有 RBListener 实例来接收委托消息。

最简单的做法是在您的 XIB 中创建一个插座并将其连接到一个 RBListener 实例。也就是说,将一个基本的“NSObject”(普通立方体)从库中拖到您的 xib 中,并将其类更改为“RBListener”。然后可以通过您的插座引用此实例(一旦您在 IB 中连接它)并且应该保留在内存中。

如果您以编程方式分配/初始化 RBListener 实例,请确保将其存储在某处(例如作为其他一些对象上的实例变量 - 您的应用程序委托或您的 NSDocument 子类 - 以适合您的设计为准)。如果您不将其存储到属性中或使其成为单例(另一种可能的方法),ARC 会在您有机会使用它之前将其杀死,因为您没有采取任何措施来保留它。

我希望这有帮助。

于 2013-02-19T20:22:55.140 回答