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];
}