2013-02-19 1 views
2

Я пытаюсь получить распознавание речи, работая на MacBook (OS 10.8.2), но я не получаю никаких обратных вызовов по методу делегата. Используя XCode 4.6 с ARC, вот мой простой тестовый код. Я получаю «прослушивание» вывода в консоли. На экране появляется «микрофон», и если я нажимаю клавишу ESC, то я могу видеть свою речевую структуру на дисплее микрофона, но все равно никаких обратных вызовов делегатов никогда. Должно быть что-то основное отсутствует, но я его не нашел.NSSpeechRecognizer делегат никогда не звонил

Я рассмотрел многочисленные вопросы, но никто не решил это. Некоторые говорят о калибровке на панели управления, но я ничего не нашел для калибровки (возможно, это была предыдущая ОС?).

Полный источник проекта доступен в 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

Я не уверен, имеет ли это отношение к вашему вопросу в целом, но Calibrate все еще присутствует. В «Системные настройки» выберите «Доступность», выберите «Говорящие элементы» слева и вкладку «Настройки». – NJones

+0

@NJones aha, это объясняет, почему я не мог найти калибровку, я смотрел в разделе «Дикция и речь» в настройках. Я попробую калибровать, но я не уверен, что это поможет. – progrmr

+0

Калибровка * был * проблема. Поскольку я откалиброван, он теперь работает. – progrmr

ответ

1

Это, скорее всего, ваш экземпляр RBListener не торчит вокруг (или никогда даже не создан), так сразу же после того, как все настроено, нет RBListener экземпляра получить делегата сообщения.

Проще всего сделать, это создать розетку в вашем XIB и подключить ее к экземпляру RBListener. То есть перетащите базовый «NSObject» (обычный куб) в ваш xib из библиотеки и измените его класс на «RBListener». Затем этот экземпляр может быть указан через вашу розетку (после подключения к нему в IB) и должен оставаться в памяти.

Если вы выделяете/инициализируете экземпляр RBListener программным способом, убедитесь, что вы его где-то храните (например, как переменная экземпляра на каком-либо другом объекте, который находится вокруг - ваш делегат приложения или ваш подкласс NSDocument - в зависимости от того, что подходит для ваш дизайн). Если вы не вложите его в свойство или не сделаете его синглом (другой возможный подход), ARC убьет его, прежде чем вы сможете использовать его, так как вы ничего не сделали для этого.

Надеюсь, это поможет.

+0

Я получаю «прослушивание» на консоли, поэтому я знаю, что он создан. Obj ref хранится в сильном свойстве, но я дважды проверю это, когда вернусь домой. – progrmr

+0

Итак, вы создаете объект, но он не торчит, или вы не задали его как делегата речевой системы. Добавьте свойство к тому, что делает (например, ваш делегат приложения) и назначьте его этому свойству при создании, если у вас его нет, или убедитесь, что вы устанавливаете этот экземпляр в качестве делегата после его создания. –

+0

Я установил делегат, как вы можете видеть выше, сразу после alloc. Кроме того, он не освобождается, я только что подтвердил, что он находится в собственности с сильной ссылкой. – progrmr