Сочетание голоса за кадром и распознавания речи в iOS - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу совместить голос за кадром и функции распознавания речи. У меня есть опрос и вопросы, и чтобы помочь пользователю выбрать опцию, я добавил UIAccessibilityCustomAction, поэтому, когда пользователь готов выбрать, он выбирает это действие, которое, в свою очередь, активирует распознавание речи, он произносит выбранную опцию и после обновления пользовательского интерфейса.

- (void)startRecognizingProcess {
     __weak typeof(self) weakSelf = self;
     self.audioEngine = [[AVAudioEngine alloc] init];

     if (self.recognitionTask) {
         [self.recognitionTask cancel];
         self.recognitionTask = nil;
     }

     NSError *error;
     AVAudioSession *audioSession = [AVAudioSession sharedInstance];
     [audioSession setCategory:AVAudioSessionCategoryRecord error:&error];
     [audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];

     self.recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init];
     AVAudioInputNode *inputNode = self.audioEngine.inputNode;
     self.recognitionRequest.shouldReportPartialResults = YES;
    if (@available(iOS 13, *)) {
        if ([self.speechRecognizer supportsOnDeviceRecognition]) {
            self.recognitionRequest.requiresOnDeviceRecognition = true;
        }
    }
     self.recognitionTask = [self.speechRecognizer recognitionTaskWithRequest:self.recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
         __strong typeof(self) strongSelf = weakSelf;
         BOOL isFinal = NO;
         if (result) {
             NSString *selectedOption = result.bestTranscription.formattedString;
             NSLog(@"RESULT:%@",result.bestTranscription.formattedString);
             isFinal = !result.isFinal;
             if (isFinal) {
                 [strongSelf activateSelectedOption:selectedOption];
                 [strongSelf.recognitionTask cancel];
                 [strongSelf.audioEngine stop];
                 [inputNode removeTapOnBus:0];
                 [strongSelf.recognitionRequest endAudio];
                 strongSelf.recognitionRequest = nil;
                 strongSelf.recognitionTask = nil;
             }
         }
         if (error) {
             [strongSelf.audioEngine stop];
             [inputNode removeTapOnBus:0];
             strongSelf.recognitionRequest = nil;
             strongSelf.recognitionTask = nil;
         }
     }];

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

     [self.audioEngine prepare];
     [self.audioEngine startAndReturnError:&error];
}

все работает, кроме Voice Over потерял свой звук. Когда я нажимаю кнопку «Домой», а затем снова открываю приложение, оно снова имеет голос и работает как требуется. Итак, у меня есть вопрос: Может быть, необходимы какие-то дополнительные шаги, чтобы снова сделать Голос? Или я скучаю по чему-то.

Заранее спасибо.

1 Ответ

0 голосов
/ 20 февраля 2020

Мне удалось выяснить, в чем дело.

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryRecord error:&error];
[audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];

Во время реализации в начале я добавил эти строки кода, которые жили в памяти, и когда приложение отправлялось в фоновый режим - audioSession - перераспределена. Таким образом, удаление этих строк решило проблему.

...