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?
Hast du die Antwort? –