AVAudioEngine在iOS 13上导致AUGraphParser :: InitializeActiveNodesInInputChain错误

问题描述 投票:1回答:1

我正在使用SFSpeechRecognizer,并注意到在iOS> = 13上显示此错误。

这是我开始识别过程的代码:

- (void)startRecording:(BOOL)collectPartialResults {    
    NSError *error;
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
    [audioSession setMode:AVAudioSessionModeMeasurement error:&error];
    [audioSession setActive:YES error:&error];

    AVAudioInputNode *inputNode = _audioEngine.inputNode;

    _recognitionRequest = [SFSpeechAudioBufferRecognitionRequest new];
    _recognitionRequest.shouldReportPartialResults = collectPartialResults;

    _recognitionTask = [_internalRecognizer recognitionTaskWithRequest:_recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
       // ...
    }];

    AVAudioFormat *format = [inputNode outputFormatForBus:0];

    @try {
        [inputNode installTapOnBus:0 bufferSize:1024 format:format block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
            [_recognitionRequest appendAudioPCMBuffer:buffer];
        }];
    }
    @catch (NSException *exception) {
        NSLog(@"%@", exception.userInfo);
        [self sendStartRecordingErrorMessage:[NSString stringWithFormat:@"%@", exception.userInfo]];
        return;
    }

    NSError *startError;
    [_audioEngine startAndReturnError:&startError];

    if (startError != nil) {
        [self sendStartRecordingErrorMessage:[NSString stringWithFormat:@"%@", startError.userInfo]];
    }
}

这可以工作一到两次,但最终会导致此错误:

AVAEInternal.h:109   [AVAudioEngineGraph.mm:1397:Initialize: (err = AUGraphParser::InitializeActiveNodesInInputChain(ThisGraph, *GetInputNode())): error -10851

由此行引起:[_audioEngine startAndReturnError:&startError];

我不知道这个错误是什么意思。我的代码与official example几乎相同。

我已经尝试了几件事,例如:

  • 使用outputFormatForBus代替inputFormatForBusinstallTapOnBus
  • 使用不同的audioSession模式(AVAudioSessionModeVoicePrompt),
  • 开始记录过程之前呼叫[audioEngine reset]
ios objective-c audiokit
1个回答
1
投票
我有同样的问题。对我来说,解决方案是为每个记录使用一个新的AVAudioEngine。

在您的示例中:

- (void)startRecording:(BOOL)collectPartialResults { _audioEngine = [[AVAudioEngine alloc] init]; // ... }

© www.soinside.com 2019 - 2024. All rights reserved.