required condition is false: _recordingTap == nil (null)

2526 ワード

アップルの音声認識を使用して、主なコードは以下の通りです.
// !!!:  

- (void)startRecordVoice
{
  [selfstartRecording];
  [_recordViewstartRecordVoice];
}

- (void)endRecordVoice
{
  [self.audioEnginestop];
  if(_recognitionRequest) {
    [_recognitionRequestendAudio];
  }
  [_recordViewendRecordVoice];

}

- (void)startRecording{
   if(_recognitionTask) {
  [_recognitionTaskcancel];
  _recognitionTask=nil;
}

AVAudioSession*audioSession = [AVAudioSessionsharedInstance];
NSError*error;
[audioSessionsetCategory:AVAudioSessionCategoryRecorderror:&error];
NSParameterAssert(!error);
[audioSessionsetMode:AVAudioSessionModeMeasurementerror:&error];
NSParameterAssert(!error);
[audioSessionsetActive:YESwithOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivationerror:&error];
NSParameterAssert(!error);
_recognitionRequest= [[SFSpeechAudioBufferRecognitionRequestalloc]init];
AVAudioInputNode*inputNode =self.audioEngine.inputNode;
//             ,   yes
_recognitionRequest.shouldReportPartialResults=NO;
__weaktypeof(self) weakSelf =self;
_recognitionTask= [self.speechRecognizerrecognitionTaskWithRequest:_recognitionRequestresultHandler:^(SFSpeechRecognitionResult*_Nullableresult,NSError*_Nullableerror) {
__strongtypeof(weakSelf) strongSelf = weakSelf;
OOLisFinal =NO;
if(result) {
NSLog(@"formattedString++++++++++++%@", result.bestTranscription.formattedString);
//strongSelf.resultStringLable.text = result.bestTranscription.formattedString;
isFinal = result.isFinal;
[selfgetDataWithMessage:result.bestTranscription.formattedStringmessageOwner:MessageOwnerCustomer];
}

if(error || isFinal) {
  [self.audioEnginestop];
  [self.audioEngine.inputNode removeTapOnBus:0];
  strongSelf.recognitionTask=nil;
  strongSelf.recognitionRequest=nil;

}

}

}];

AVAudioFormat*recordingFormat = [inputNodeoutputFormatForBus:0];
[inputNodeinstallTapOnBus:0bufferSize:1024format:recordingFormatblock:^(AVAudioPCMBuffer*_Nonnullbuffer,AVAudioTime*_Nonnullwhen) {
__strongtypeof(weakSelf) strongSelf = weakSelf;
if(strongSelf.recognitionRequest) {
  [strongSelf.recognitionRequestappendAudioPCMBuffer:buffer];
}
}];
[self.audioEngineprepare];
[self.audioEnginestartAndReturnError:&error];
NSParameterAssert(!error);

}


その結果、音声入力ではいつもこのエラーを報告します.なぜなら、録音を終了する方法にこのコードが付いていないからです.

- (void)endRecordVoice
{
[self.audioEnginestop];
[self.audioEngine.inputNode removeTapOnBus:0]; //**c
if(_recognitionRequest) {
[_recognitionRequestendAudio];
}
[_recordViewendRecordVoice];
}