2017-09-21 2 views
1
sprechen Benutzer

ich auf Bot App arbeite und ich habe hier zwei FunktionenWie Stopp Spracherkennung auf Auto, wenn Stopp

  • Speech
  • Text to Speech to Text

Beide arbeiten als erwartet, aber ich möchte erkennen, dass, wenn Benutzer zu dieser Zeit aufhören zu sprechen ich die Erkennung stoppen und diese Daten an den Server senden möchte.

Gibt es eine Möglichkeit, dass der Benutzer nicht spricht?

ich unten Code verwenden für die Spracherkennung:

// Starts an AVAudio Session 
    NSError *error; 
    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error]; 
    [audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error]; 

    // Starts a recognition process, in the block it logs the input or stops the audio 
    // process if there's an error. 
    recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init]; 
    AVAudioInputNode *inputNode = audioEngine.inputNode; 
    recognitionRequest.shouldReportPartialResults = YES; 
    recognitionTask = [speechRecognizer recognitionTaskWithRequest:recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) { 
     BOOL isFinal = NO; 
     if (result) { 
      // Whatever you say in the microphone after pressing the button should be being logged 
      // in the console. 
      NSLog(@"RESULT:%@",result.bestTranscription.formattedString); 
      self.inputToolbar.contentView.textView.text = result.bestTranscription.formattedString; 
      self.inputToolbar.contentView.rightBarButtonItem.enabled = YES; 
      isFinal = !result.isFinal; 
     } 
     if (error) { 
      if (audioEngine != NULL) { 
       [audioEngine stop]; 
       [inputNode removeTapOnBus:0]; 
       recognitionRequest = nil; 
       recognitionTask = nil; 
      } 
     } 
    }]; 

    // Sets the recording format 
    AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0]; //[[AVAudioFormat alloc] initStandardFormatWithSampleRate:44100 channels:1]; 
    [inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) { 
     [recognitionRequest appendAudioPCMBuffer:buffer]; 
    }]; 

    // Starts the audio engine, i.e. it starts listening. 
    [audioEngine prepare]; 
    [audioEngine startAndReturnError:&error]; 
    NSLog(@"Say Something, I'm listening"); 

Lassen Sie mich wissen, wenn jemand auf diesem Detail erforderlich.

Vielen Dank im Voraus.

Antwort

2

versuchen Sie es mit dieser:

AVAudioRecorder *recorder; 
NSTimer *levelTimer; 
double lowPassResults; 

-(void)configureRecorder{ 
    // AVAudioSession already set in your code, so no need for these 2 lines. 
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 
    [[AVAudioSession sharedInstance] setActive:YES error:nil]; 

    NSURL *url = [NSURL fileURLWithPath:@"/dev/null"]; 

    NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithFloat: 44100.0],     AVSampleRateKey, 
          [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey, 
          [NSNumber numberWithInt: 1],       AVNumberOfChannelsKey, 
          [NSNumber numberWithInt: AVAudioQualityMax],   AVEncoderAudioQualityKey, 
          nil]; 

    NSError *error; 

    lowPassResults = 0; 

    recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error]; 

    if (recorder) { 
     [recorder prepareToRecord]; 
     recorder.meteringEnabled = YES; 
     [recorder record]; 
     levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.05 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES]; 
    } else 
     NSLog(@"%@", [error description]); 
    } 
} 


- (void)levelTimerCallback:(NSTimer *)timer { 
    [recorder updateMeters]; 

    const double ALPHA = 0.05; 
    double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0])); 
    lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults; 

    NSLog(@"lowPassResults: %f",lowPassResults); 

    // Use here a threshold value to stablish if there is silence or speech 
    if (lowPassResults < 0.1) { 
     NSLog(@"Silence"); 
    } else if(lowPassResults > 0.5){ 
     NSLog(@"Speech"); 
    } 
} 

Referenz: http://codedrago.com/q/200783/ios-objective-c-speech-recognition-how-to-detect-speech-start-on-ios-speech-api

+0

Seine Arbeit als erwartet, aber ich habe eine Frage, die es auf die Speicherverwaltung beeinflussen, wie wir Sprache verwenden API, um Text so seine bereits mehr Speicher und CPU für Netzwerkanruf und Aufzeichnung verbrauchen, so geben Sie wertvolle Kommentare zu diesem wenn möglich, übrigens Danke für den Code. – CodeChanger

+0

Ich verwende diesen Code und es funktioniert gut in meiner Anwendung. Sie verwenden den Recorder nur zum Erkennen von Stille, ich denke also nicht, dass mehr Speicher verbraucht wird. nur eine Sache müssen Sie Timer und Recorder verwalten. Deaktivieren Sie den Timer und stoppen Sie den Recorder, wenn Ihre Aufgabe erledigt ist. – Pushpendra

+0

Ja, lassen Sie mich einen Versuch zu diesem Code geben und live gehen lassen, was passieren, aber nach ur exp denke ich nicht, so wird es mehr Speicher verbrauchen. Danke für deine Antwort. – CodeChanger