【问题标题】:NSSpeechRecognizer delegate never calledNSSpeechRecognizer 委托从未被调用
【发布时间】:2013-02-19 16:26:37
【问题描述】:

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

【问题讨论】:

  • 我不确定它是否与您的整个问题有很大关系,但 Calibrate 仍然存在。在“系统偏好设置”中选择“辅助功能”,选择左侧的“Speakable Items”,然后选择“Settings”选项卡。
  • @NJones 啊哈,这解释了为什么我找不到校准,我在“首选项”中的“听写和语音”下查看。我会尝试校准,但我不确定它是否会有所帮助。
  • 校准的问题。由于我已经校准它现在可以工作了。

标签: macos cocoa speech-recognition speech


【解决方案1】:

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

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

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

我希望这会有所帮助。

【讨论】:

  • 我确实在控制台上得到了“监听”,所以我知道它是创建的。 obj ref 存储在一个强属性中,但我回家后会仔细检查。
  • 好的,所以您正在创建对象,但它没有留下来,或者您没有将其设置为语音系统的代表。将属性添加到执行的操作(例如您的应用程序委托)并在创建时将其分配给该属性,如果您没有保留它或确保在创建该实例后将该实例设置为委托。
  • 我确实设置了委托,如上所示,就在分配之后。此外,它并没有被释放,我只是确认它在一个具有强引用的属性中。
  • 你没有说你在哪里创建这个对象。例如,无论您是在某处(什么?在哪里?)以某种方法创建它,还是从 xib 中唤醒它。
  • 它是RBMain中的一个属性,由App Delegate的一个属性持有。这是一个非常小的测试应用程序,所以如果您想查看其他课程,我将其推送到 github here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
相关资源
最近更新 更多