2016-10-05 2 views
0

텍스트에 대한 siri의 연설을 다루고 있습니다. 그러나 나는 audioEngine의 응답이 없습니다.텍스트에 대한 Siri의 연설은 작동하지 않습니다.

audioEngine은 음성의 첫 번째 텍스트를 인식 한 후 한 번 시작되고 일정 시간 동안 음성을 인식하기를 원하기 때문에 중지됩니다. 모든 제안을 부탁드립니다. 여기

는 지금까지 코드 짓을한다 :

NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"en-US"]; 
speechRecognizer = [[SFSpeechRecognizer alloc]initWithLocale: locale]; 

audioEngine = [[AVAudioEngine alloc]init]; 

if (speechRecognitionTask != nil) { 
    [audioEngine stop]; 
    [speechRecognitionTask cancel]; 
    speechRecognitionTask = nil; 
} 


AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 

NSError *error = nil; 

if(error == nil) { 
    [audioSession setCategory:AVAudioSessionCategoryRecord error:&error]; 
    [audioSession setMode:AVAudioSessionModeMeasurement error:&error]; 
    [audioSession setActive:true error:&error]; 

} else 
    NSLog(@"audioSession properties weren't set because of an error."); 

recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init]; 

AVAudioInputNode *inputNode = audioEngine.inputNode; 

if (inputNode == nil) { 
    NSLog(@"AudioEngine has no input node"); 
    return; 
} 
recognitionRequest.shouldReportPartialResults = true; 
error = nil; 


speechRecognitionTask = [speechRecognizer recognitionTaskWithRequest:recognitionRequest resultHandler:^(SFSpeechRecognitionResult * result, NSError * error1) { 

    BOOL isFinal = false; 

    if (result != nil) { 
     self.textView.text = result.bestTranscription.formattedString; 
     isFinal = ![result isFinal]; 
     [audioEngine stop]; 
     [inputNode removeTapOnBus: 0]; 

     recognitionRequest = nil; 
     speechRecognitionTask = nil; 

AVAudioFormat *recodringFormat = [inputNode outputFormatForBus:0]; 

[inputNode installTapOnBus:0 bufferSize:1024 format:recodringFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) { 
    [recognitionRequest appendAudioPCMBuffer:buffer]; 
}]; 

NSError *error1; 
[audioEngine prepare]; 

[audioEngine startAndReturnError:&error1]; 
if (error1 != nil) { 
    NSLog(@"Error discription: %@", error1.description); 
} 
+0

당신은 대리인을 지정 했습니까? @Vin – KAR

+0

예. 권한 부여 및 위임자 지정은 마이크로폰 버튼 탭 동작으로 작성됩니다. @KAR – Vin

+0

@Vin, 문제를 해결 했습니까? 나는 너와 같은 문제에 직면 해있다. 이 문제를 어떻게 해결했는지 알려 주시면 감사하겠습니다. 고맙습니다. – gstream79

답변

0
-(void)startRecording 
{ 
audioEngine = [[AVAudioEngine alloc]init]; 

if (speechRecognitionTask != nil) { 
    speechRecognitionTask = nil; 
    [speechRecognitionTask cancel]; 
} 

[self showActivityIndicator]; 
self.textView.text = @"Please speak the business"; 
audioSession = [AVAudioSession sharedInstance]; 

NSError *error = nil; 

if(error == nil) { 
    [audioSession setCategory:AVAudioSessionCategoryRecord error:&error]; 
    [audioSession setMode:AVAudioSessionModeMeasurement error:&error]; 
    [audioSession setActive:true withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error]; 

} else{ 
    NSLog(@"audioSession properties weren't set because of an error."); 
} 
recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init]; 

inputNode = audioEngine.inputNode; 

if (inputNode == nil) { 
    NSLog(@"AudioEngine has no input node"); 
} 

if (recognitionRequest == nil) { 
    NSLog(@"Unable to create and SFSpeechAudioBufferRecognitionRequest object"); 

} 
recognitionRequest.shouldReportPartialResults = YES; 
error = nil; 


speechRecognitionTask = [speechRecognizer recognitionTaskWithRequest:recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable errorl) { 

    BOOL isFinal; 
    if (result != nil) { 
     NSLog(@"Formatted String: %@ ",result.bestTranscription.formattedString); 
     userFeedback.text = result.bestTranscription.formattedString; 


     [NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(endRecordingAudio) userInfo:nil repeats:NO]; 

     isFinal = [result isFinal]; 
     if (isFinal) { 
      [audioEngine stop]; 
      [inputNode removeTapOnBus: 0]; 
      recognitionRequest = nil; 
      speechRecognitionTask = nil; 
     } 

     [self.microphoneButton setEnabled: true]; 
    } 

    if (errorl) { 
     NSLog(@"Error Description: %@", errorl); 

    } 
}]; 


AVAudioFormat *recodringFormat = [inputNode outputFormatForBus:0]; 

[inputNode installTapOnBus:0 bufferSize:1024 format:recodringFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) { 
    [recognitionRequest appendAudioPCMBuffer:buffer]; 
}]; 

NSError *error1; 

    [audioEngine prepare]; 

    [audioEngine startAndReturnError:&error1]; 

if (error1 != nil) { 
    NSLog(@"Error discription: %@", error1.description); 
    [self hideActivityIndicator]; 
} 
userFeedback.text = @"Say something, I am listening!"; 
NSLog(@"Say something, I am listening!"); 

} 


-(void)endRecordingAudio 
{ 
    NSLog(@"AudioEngine stopped"); 
    [audioEngine stop]; 
    [inputNode removeTapOnBus: 0]; 
    recognitionRequest = nil; 
    speechRecognitionTask = nil; 
} 
+0

대신 오디오 엔진을 멈추게하는 타이머를 추가했습니다. 이걸로 나는 최소한의 시간 동안 말하도록 사용자를 제한 할 수있다. 그렇지 않으면 사용자가 오디오 엔진을 시작하고 중지하는 버튼을 추가 할 수 있습니다. – Vin