2016-11-04 2 views
3

У меня есть SFSpeechRecognizer создать из примера приложения от Apple https://developer.apple.com/library/content/samplecode/SpeakToMe/Introduction/Intro.htmlSFSpeechRecognizer, который распознает несколько командных слов вместо целой фразы?

мне было интересно, если это было возможно, чтобы распознаватель распознавать отдельные слова, которые не связаны с другими ранее распознанных слов.

Например, распознаватель прямо сейчас попытается сформировать предложение, когда произнесет «Прокрутка», а затем найдет лучшую транскрипцию для слова, которая имеет смысл, поэтому, когда произносится «Стоп», это изменит ее на что-то вроде «Вниз», что имеет больше смысла в контексте предыдущего слова.

Но это не то, что я хочу, поскольку я хочу, чтобы мое приложение слушало отдельные слова как команды, вызывающие функции во время прослушивания.

Есть ли способ реализовать структуру таким образом, чтобы она непрерывно слушала слова и фиксировала только отдельные слова?

+0

Возможная Дубликат [распознавания местных языков команды на мобильных устройствах] (http://stackoverflow.com/questions/15633270/local-spoken-command-recognition-on-mobile-devices) –

ответ

2

Да. Вы можете сканировать входящие слова на частичные результаты, установив recognitionRequest.shouldReportPartialResults = YES, а затем обратный вызов результатов вызывается несколько раз.

Затем вы можете обработать результаты по мере прохождения, сканируя ключевое слово/ключевую фразу, прежде чем перейти к окончательному результату (т.е. игнорировать result.isFinal). Когда вы найдете ключевое слово/ключевую фразу, которую вы ищете, просто отмените распознавание.

Я успешно реализовал голосовые команды, используя этот подход в Speaking Email в качестве модифицированного плагина Cordova (источник here).

Пример:

- (void) recordAndRecognizeWithLang:(NSString *) lang 
{ 
     NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:lang]; 
     self.sfSpeechRecognizer = [[SFSpeechRecognizer alloc] initWithLocale:locale]; 
     if (!self.sfSpeechRecognizer) { 
       [self sendErrorWithMessage:@"The language is not supported" andCode:7]; 
     } else { 

       // Cancel the previous task if it's running. 
       if (self.recognitionTask) { 
         [self.recognitionTask cancel]; 
         self.recognitionTask = nil; 
       } 

       [self initAudioSession]; 

       self.recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init]; 
       self.recognitionRequest.shouldReportPartialResults = [[self.command argumentAtIndex:1] boolValue]; 

       self.recognitionTask = [self.sfSpeechRecognizer recognitionTaskWithRequest:self.recognitionRequest resultHandler:^(SFSpeechRecognitionResult *result, NSError *error) { 

         if (error) { 
           NSLog(@"error"); 
           [self stopAndRelease]; 
           [self sendErrorWithMessage:error.localizedFailureReason andCode:error.code]; 
         } 

         if (result) { 
           NSMutableArray * alternatives = [[NSMutableArray alloc] init]; 
           int maxAlternatives = [[self.command argumentAtIndex:2] intValue]; 
           for (SFTranscription *transcription in result.transcriptions) { 
             if (alternatives.count < maxAlternatives) { 
               float confMed = 0; 
               for (SFTranscriptionSegment *transcriptionSegment in transcription.segments) { 
                 NSLog(@"transcriptionSegment.confidence %f", transcriptionSegment.confidence); 
                 confMed +=transcriptionSegment.confidence; 
               } 
               NSMutableDictionary * resultDict = [[NSMutableDictionary alloc]init]; 
               [resultDict setValue:transcription.formattedString forKey:@"transcript"]; 
               [resultDict setValue:[NSNumber numberWithBool:result.isFinal] forKey:@"final"]; 
               [resultDict setValue:[NSNumber numberWithFloat:confMed/transcription.segments.count]forKey:@"confidence"]; 
               [alternatives addObject:resultDict]; 
             } 
           } 
           [self sendResults:@[alternatives]]; 
           if (result.isFinal) { 
             [self stopAndRelease]; 
           } 
         } 
       }]; 

       AVAudioFormat *recordingFormat = [self.audioEngine.inputNode outputFormatForBus:0]; 

       [self.audioEngine.inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) { 
         [self.recognitionRequest appendAudioPCMBuffer:buffer]; 
       }], 

       [self.audioEngine prepare]; 
       [self.audioEngine startAndReturnError:nil]; 
     } 
} 
+0

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

Смежные вопросы