2017-08-30 6 views
0

Ich versuche eine App zu erstellen, die die Stimme des Benutzers aufzeichnet und gleichzeitig transkribiert. Ich benutze AVFoundation und Speech Framework, um diese Arbeit zu erledigen. Das Problem ist, dass Apple die Transkriptionszeit auf eine Minute begrenzt. Nach dieser Zeit sollte ich mich an die Spracherkennungsanforderung erinnern. Das Problem ist, dass ich gleichzeitig die Stimme aufnehmen möchte.Kontinuierliche Spracherkennung ohne Neustart nach 1 Minute

Weiß jemand, wie ich dieses Problem beheben kann?

Dies ist der Code, den ich verwende:

private func startRecording() throws { 

    // Cancel the previous task if it's running. 
    if let recognitionTask = recognitionTask { 
     recognitionTask.cancel() 
     self.recognitionTask = nil 
    } 

    try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .allowBluetoothA2DP) 
    try audioSession.setMode(AVAudioSessionModeMeasurement) 
    try audioSession.setActive(true, with: .notifyOthersOnDeactivation) 

    recognitionRequest = SFSpeechAudioBufferRecognitionRequest() 

    guard let inputNode = audioEngine.inputNode else { fatalError("Audio engine has no input node") } 
    guard let recognitionRequest = recognitionRequest else { fatalError("Unable to created a SFSpeechAudioBufferRecognitionRequest object") } 

    // Configure request so that results are returned before audio recording is finished 
    recognitionRequest.shouldReportPartialResults = true 

    // A recognition task represents a speech recognition session. 
    // We keep a reference to the task so that it can be cancelled. 
    recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error in 
     var isFinal = false 

     if result != nil { 

      if let result = result { 
       self.textView.text = result.bestTranscription.formattedString 
      } 

      isFinal = (result?.isFinal)! 
      if isFinal == true{ 
       self.textView.text.append((result?.bestTranscription.formattedString)!) 
      } 
     } 

     if error != nil || isFinal { 

      print("Error: \(error)") 
      print("ifFinal: \(isFinal)") 
      self.audioEngine.stop() 
      inputNode.removeTap(onBus: 0) 

      self.recognitionRequest = nil 
      self.recognitionTask = nil 

      try! self.startRecording() 
      self.recordButton.isEnabled = true 
      self.recordButton.setTitle("Start Recording", for: []) 
     } 
    } 


    let recordingFormat = inputNode.outputFormat(forBus: 0) 

    inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in 

     DispatchQueue.main.async { 
     self.recognitionRequest?.append(buffer) 
     self.writeBuffer(buffer) 
     } 
    } 

    if !audioEngine.isRunning { 
     audioEngine.prepare() 
     try audioEngine.start() 
    } 

} 

Wie Sie aus dem Code sehen können, ich den Antrag stellen und ich schreibe die Audiodatei in der installTap Methode. Also muss ich jedes Mal, wenn ich die Transkription neu starten muss, auch den Wasserhahn am Bus entfernen. Auf diese Weise kann ich die Audiodatei nicht weiter aufnehmen.

Gibt es etwas, was ich tun könnte? Irgendwelche Lösungen? Alternativen?

+0

Hast du die Antwort? –

Antwort

0

Sie können einen Tap auf den mainMixerNode der audioEngine installieren, um die Aufnahme durchzuführen. Dies sollte Ihnen ermöglichen, den Abgriff am InputNode zu entfernen, ohne die Aufnahme zu unterbrechen.

Alternativ ändern Sie einfach self.recognitionRequest, ohne den Tap zu entfernen. Der ursprüngliche Abgriff sollte die Puffer automatisch an die neue Anforderung anhängen.

Als ich das gleiche versuchte, konnte ich eine neue Erkennungsanforderung starten, ohne die Aufzeichnung zu unterbrechen. Allerdings konnte ich Lücken in der Transkription nicht verhindern. Es scheint, als ob die erste Erkennungsanforderung beendet werden muss, bevor eine Sekunde gestartet werden kann und einige Puffer in der Mitte verloren gehen. Es kann möglich sein, diese Puffer im Speicher zu halten, bis der zweite beginnt ...

Verwandte Themen