我正在尝试使语音识别在MacBook(OS 10.8.2)上运行,但是我从未在委托方法上收到任何回调。结合使用XCode 4.6和ARC,这是我的简单测试代码。我的确在控制台中获得了“监听”输出。屏幕上出现“麦克风”,如果我按ESC键,则可以在麦克风的显示屏上看到我的语音模式,但从未有委托回调。必须缺少一些基本的东西,但是我还没有找到。

我看过无数个SO问题,但没有一个能解决这个问题。有人在控制面板中谈论过校准,但是在校准中我什么都没找到(也许是以前的OS?)。

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

最佳答案

可能您的RBListener实例并没有存在(甚至从未创建过),因此在完成所有设置之后,没有RBListener实例可以接收委托消息。

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

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

我希望这有帮助。

10-04 22:47