NSSpeechRecognizer委托从未调用过

时间:2013-02-19 16:26:37

标签: macos cocoa speech-recognition speech

我正在尝试在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

screen shot while dictating

1 个答案:

答案 0 :(得分:1)

很可能你的RBListener实例没有粘贴(或者甚至从未创建过),因此在设置好所有内容之后,没有RBListener实例来接收委托消息。

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

如果您以编程方式分配/启动RBListener实例,请确保将其存储在某个位置(例如,作为其他对象上的实例变量) - 您的应用程序委托或NSDocument子类 - 以适合您的方式为准设计)。如果你没有把它存放到一个属性中或者把它变成一个单独的(另一种可能的方法),ARC会在你有机会使用它之前杀死它,因为你没有做任何事情来保持它。

我希望这会有所帮助。