Я хочу совместить голос за кадром и функции распознавания речи. У меня есть опрос и вопросы, и чтобы помочь пользователю выбрать опцию, я добавил 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 потерял свой звук. Когда я нажимаю кнопку «Домой», а затем снова открываю приложение, оно снова имеет голос и работает как требуется. Итак, у меня есть вопрос: Может быть, необходимы какие-то дополнительные шаги, чтобы снова сделать Голос? Или я скучаю по чему-то.
Заранее спасибо.