2017-08-30 13 views
0

私はユーザーの声を録音すると同時にそれを転記するアプリケーションを作成しようとしています。私はこの作業を行うためにAVFoundationとSpeechフレームワークを使用しています。問題はAppleが1分に転写時間を制限していることです。だから、この期間の後、私は音声認識要求を思い出してください。問題は、同時に声を録音したいということです。1分後に再開しない連続音声認識

この問題を解決する方法を知っている人はいますか?

これは私が使用しているコードです:

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() 
    } 

} 

を使用すると、コードから見ることができるように、私は要求を行うと、私はinstallTap方法でオーディオファイルを書き込みます。ですから、私は転写を再開する必要があるたびに、バス上のタップを取り除く必要があります。このようにして、オーディオファイルを録音し続けることはできません。

私にできることはありますか?どんな解決策ですか?代替案?

+0

答えはありますか? –

答えて

0

audioEngineのmainMixerNodeにタップをインストールして、録音を行うことができます。これにより、録音を中断することなくinputNodeのタップを削除することができます。

また、タップを削除せずにself.recognitionRequestを変更するだけです。元のタップは新しい要求に自動的にバッファを追加するはずです。

同じことをやろうとしたところ、録音を中断することなく新しい認識要求を開始できました。 しかし、私は転写の間隙を防ぐことができませんでした。 1秒前に最初の認識要求が完了してから、途中で一部のバッファが失われるようです。 2つ目のバッファが起動するまで、これらのバッファをメモリに保持することが可能です...