0

I am trying to run two SFSpeechRecognizer simultaneously with different languages.

I'm aware of these links, but they want something different or the answer doesn't work:

So I tried the following:

var audioEngine = AVAudioEngine()
var speechRecognizer1: SFSpeechRecognizer? = SFSpeechRecognizer(locale: Locale(identifier: "en-GB"))
var speechRecognizer2: SFSpeechRecognizer? = SFSpeechRecognizer(locale: Locale(identifier: "it-IT"))

var speechAudioBufferRecognitionRequest = SFSpeechAudioBufferRecognitionRequest()

var speechRecognitionTask1: SFSpeechRecognitionTask!
var speechRecognitionTask2: SFSpeechRecognitionTask!

...

let node = self.audioEngine.inputNode
let recordingFormat = node.outputFormat(forBus: 0)

node.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat, block: { (buffer, time) in
    self.speechAudioBufferRecognitionRequest.append(buffer)
})
    
self.audioEngine.prepare()
do {
    try audioEngine.start()
} catch {
    print("Error")
    return
}
    
guard let myRecognition = SFSpeechRecognizer() else {
    print("Error")
    return
}
    
if(!myRecognition.isAvailable) {
    print("Error")
    return
}
    
self.speechRecognitionTask1 = self.speechRecognizer1?.recognitionTask(with: self.speechAudioBufferRecognitionRequest, resultHandler: { (response, error) in
    if(response != nil) {
        guard let response = response else {
            if let error = error {
                print("Error")
                return
            } else {
                print("Error")
                return
            }
        }
            
        var message = response.bestTranscription.formattedString
})

self.speechRecognitionTask2 = self.speechRecognizer2?.recognitionTask(with: self.speechAudioBufferRecognitionRequest, resultHandler: { (response, error) in
    if(response != nil) {
        guard let response = response else {
            if let error = error {
                print("Error")
                return
            } else {
                print("Error")
                return
            }
        }
            
        var message = response.bestTranscription.formattedString
})

This gave me the error: SFSpeechAudioBufferRecognitionRequest cannot be re-used

So I tried to create two instances and initialized them by:

node.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat, block: { (buffer, time) in
    self.speechAudioBufferRecognitionRequest1.append(buffer)
    self.speechAudioBufferRecognitionRequest2.append(buffer)
})

But this also didn't work. There was no error, but one speechRecognition just overwrote the other...

I tried some other stuff like changing the bus etc. but was not successful...

Aurora1510
  • 446
  • 4
  • 10

0 Answers0