使用蘋果語音識(shí)別悟泵,主要代碼如下
// !!!:錄音
- (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;
//這個(gè)屬性是是否實(shí)時(shí)返回結(jié)果材彪,默認(rèn)為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);
}
結(jié)果在語音輸入是總是報(bào)這個(gè)錯(cuò)誤趾访。原因是在結(jié)束錄音的方法里面沒有加上這行代碼:
- (void)endRecordVoice
{
[self.audioEnginestop];
[self.audioEngine.inputNode removeTapOnBus:0]; //**c
if(_recognitionRequest) {
[_recognitionRequestendAudio];
}
[_recordViewendRecordVoice];
}