我正在尝试使语音识别在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将在您有机会使用它之前将其杀死,因为您没有采取任何行动。
我希望这有帮助。