Распознавание речи

С устройством аудиовхода (таким как микрофон) и NSSpeechRecognizer возражают, что приложение может прислушаться к речевым командам и реагировать на те команды. Распознавание речи является существенным средством для пользователей с физической нетрудоспособностью, ограничивающей их использование клавиатуры и мыши. Это может также быть удобство для всех пользователей, позволив им управлять приложением, не вынуждая их отвлечь внимание от того, что они в настоящее время продолжают работать.

Служба Speech Recognition централизованной системы активируется в системе каждый раз, когда приложение (включая перечисленных в области Speech Recognition Установок системы) начинает слушать посредством любого Распознавания речи API, включая те из NSSpeechRecognizer. Когда распознавание речи активируется, экранный микрофон, и (дополнительно) окно Speech Commands появляется. Окно Speech Commands перечисляет текущие команды, которые могут быть даны, а также подтверждения из приложений, реагировавших на недавние команды. Рисунок 1 показывает то, на что микрофон и окно Speech Commands похожи (в контексте Почтового приложения).

  Экранный микрофон рисунка 1 и окно Speech Commands
Screen microphone and Speech Commands window

Интеграция распознавания речи в приложение Какао проста. Важные шаги включают указание команд для прислушиваний и затем слушание и ответ на те команды. Остаток от этой статьи входит в каждый из этих шагов подробно.

Подготовка объекта NSSpeechRecognizer

Для подготовки NSSpeechRecognizer к использованию Вы должны:

  1. Выделите и инициализируйте экземпляр NSSpeechRecognizer.

  2. Установите команды, что объект должен прислушаться к использованию setCommands: метод.

  3. Установите делегата к объекту NSSpeechRecognizer.

Перечисление 1 показывает, как Вы могли бы инициализировать объект NSSpeechRecognizer.

Перечисление 1  , Подготавливающее объект NSSpeechRecognizer

- (id)init {
    self = [super init];
    if (self) {
        NSArray *cmds = [NSArray arrayWithObjects:@"Sing", @"Jump", @"Roll over", nil];
        recog = [[NSSpeechRecognizer alloc] init]; // recog is an ivar
        [recog setCommands:cmds];
        [recog setDelegate:self];
    }
    return self;
}

Команды являются словами или короткими фразами, инкапсулировавшими как объекты NSString, которые являются определенными для приложения. Рекомендуемая длина фразы является тремя - шестью словами. Если Ваше приложение имеет много команд, можно использовать setDisplayedCommandsTitle: метод для группировки их в окне Speech Commands под подзаголовками.

Прислушивание и ответ на команды

Прежде чем Ваше приложение может обработать речевые команды, необходимо активировать механизм распознавания речи путем отправки a startListening обменивайтесь сообщениями к объекту NSspeechRecognizer. Механизм тогда пытается различить команды в потоке слов и формулирует пользователя, говорит в микрофон. Если это идентифицирует команду, объект NSSpeechRecognizer вызывает speechRecognizer:didRecognizeCommand: метод делегации, передающий в команде во втором параметре. Для приостановки механизма распознавания речи отправьте, NSSpeechRecognizer возражают a stopListening сообщение.

Можно мгновенно обновить список команд, для которых объект NSSpeechRecognizer слушает путем отправки ему a setCommands: сообщение. Обновление команды происходит, даже когда активно слушает объект.

Делегат должен реализовать speechRecognizer:didRecognizeCommand: метод делегации для ответа на каждую речевую команду. Перечисление 2 показывает реализацию в качестве примера этого метода. Это также показывает метод действия, переключающийся между запуском и остановкой механизма распознавания.

Перечисление 2  , Запускающее двигатель распознавания и отвечающее на команды

- (IBAction)listen:(id)sender
{
    if ([sender state] == NSOnState) { // listen
    [recog startListening];
    } else {
    [recog stopListening];
    }
}
 
- (void)speechRecognizer:(NSSpeechRecognizer *)sender didRecognizeCommand:(id)aCmd {
 
    if ([(NSString *)aCmd isEqualToString:@"Sing"]) {
        NSSound *snd = [[NSSound alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"HappyBirthday" ofType:@"aif"] byReference:NO];
        [snd play];
        [snd release];
        return;
    }
 
    if ([(NSString *)aCmd isEqualToString:@"Jump"]) {
        NSRect frm = [[phraseField window] frame];
        [[phraseField window] setFrameOrigin:NSMakePoint(frm.origin.x+20, frm.origin.y+20)];
        return;
    }
 
    if ([(NSString *)aCmd isEqualToString:@"Roll over"]) {
        // .... some response here...
    }
}