Цель c - использование распознавания речи приводит к сбою воспроизведения видео на iPhone - PullRequest
0 голосов
/ 01 мая 2018

В моем приложении у меня есть воспроизведение видео, а также распознавание речи. Воспроизведение видео воспроизводится нормально, если я не использую распознавание речи. Я также могу получить опции Air play как «iPhone» и «Apple TV» (у меня Apple TV в сети).

Но когда я использую распознавание речи и выхожу из него, видео не воспроизводится. Он просто сидит с черным экраном на 00.00s. Меню Airplay больше не отображает «iPhone» и «Apple TV». На самом деле он не показывает никаких вариантов и говорит, что ищет «Apple TV». Заглавная часть экрана Airplay показывает «iPhone -> IPHONE MICROPHONE» «Музыка».

В консоли я получаю следующее сообщение, когда видео не играть: "<<< AVOutputDeviceDiscoverySession (FigRouteDiscoverer) >>>> - [AVFigRouteDiscovererOutputDeviceDiscoverySessionImpl outputDeviceDiscoverySessionDidChangeDiscoveryMode]: Установка режима обнаружения устройств в DiscoveryMode_Presence (клиент: VideoPlayer)"

В моем коде я не запускаю обнаружение Airplay или чего-то в этом роде, но это как-то мешает после использования распознавателя речи.

Вот код для запуска и остановки распознавания речи:

- (void)startListening {

    // Initialize the AVAudioEngine
    _audioEngine = [[AVAudioEngine alloc] init];

    // Make sure there's not a recognition task already running
    if (_recognitionTask) {
        [_recognitionTask cancel];
        _recognitionTask = nil;
    }

    // Starts an AVAudio Session
    NSError *error;
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryRecord error:&error];
    [audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];

    // Starts a recognition process, in the block it logs the input or stops the audio
    // process if there's an error.
    _recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init];
    AVAudioInputNode *inputNode = _audioEngine.inputNode;
    _recognitionRequest.shouldReportPartialResults = YES;
    _recognitionTask = [_speechRecognizer recognitionTaskWithRequest:_recognitionRequest
                                                       resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
        BOOL isFinal = NO;
        if (result) {
            // Whatever you say in the microphone after pressing the button should be being logged
            // in the console.
            NSLog(@"RESULT:%@",result.bestTranscription.formattedString);
            isFinal = !result.isFinal;

            NSDictionary *dic = [ [NSDictionary alloc] initWithObjectsAndKeys:
                                 result.bestTranscription.formattedString, @"bestTranscription",
                                 result.transcriptions, @"transcriptions",
                                 nil];

            [[NSNotificationCenter defaultCenter] postNotificationName:@"monitorSpeech" object:nil userInfo:dic];

        }
        if (error) {
            NSLog(@"%s - Stopping Audio Engine and resetting recoginitionRequest/Task. Error holds:%@", __PRETTY_FUNCTION__, error);
            [_audioEngine stop];
            [inputNode removeTapOnBus:0];
            _recognitionRequest = nil;
            _recognitionTask = nil;
        }
    }];

    // Sets the recording format
    AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0];
    [inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
        [_recognitionRequest appendAudioPCMBuffer:buffer];
    }];

    // Starts the audio engine, i.e. it starts listening.
    [_audioEngine prepare];
    [_audioEngine startAndReturnError:&error];
    NSLog(@"Say Something, I'm listening");
}


-(void) stopListening {

    [_audioEngine stop];
    //[_audioEngine.inputNode removeTapOnBus:0];
    [_audioEngine reset];
    [_recognitionRequest endAudio];
    [_recognitionTask cancel];
    //[_recognitionTask finish];
    _recognitionTask = nil;
    _recognitionRequest = nil;

}

Для воспроизведения видео я использую AVPlayerViewController.

Пожалуйста, совет, как решить эту проблему. Спасибо!

...