Сбой SFSpeechRecognizer, если в Mac osx не подключен микрофонный вход

#swift #macos #speech-to-text #avaudioengine

#swift #macos #преобразование речи в текст #avaudioengine

Вопрос:

Я реализовал преобразование речи в текст в своем приложении для Mac. Он работает отлично. Но если в Mac mini не подключено устройство ввода (микрофон), происходит сбой. Ниже приведен код, который у меня есть

     let node = audioEngine.inputNode
        
    let recordingFormat = node.outputFormat(forBus: 0)
    node.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in
      self.request.append(buffer)
    }

    audioEngine.prepare()
    do {
        try audioEngine.start()
    } catch {
        print("There has been an audio engine error.")
        return print(error)
    }
    guard let myRecognizer = SFSpeechRecognizer() else {
        print("Speech recognition is not supported for your current locale.")
        return
    }
    if !myRecognizer.isAvailable {
        print("Speech recognition is not currently available. Check back at a later time.")
        // Recognizer is not available right now
        self.delegate?.speechToTextFailed("Speech recognition is not currently available. Check back at a later time.")
        return
    }
    self.onCheckSupportedSpeechToTextLanguage(kUserDefaults?.value(forKey: kChoosedLang) as! String)
    sttTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { (timer) in
        
    })
    recognitionTask = speechRecognizer?.recognitionTask(with: request, resultHandler: { result, error in
        if let result = result {
            
            let bestString = result.bestTranscription.formattedString
            var lastString: String = ""
            for segment in result.bestTranscription.segments {
                let indexTo = bestString.index(bestString.startIndex, offsetBy: segment.substringRange.location)
                lastString = String(bestString[indexTo...])
            }
            print(" bestString : (bestString)")
            self.delegate?.speechToTextConvertedText(self.previousString, bestString)
            self.previousString = bestString
            
        } else if let error = error {
            print("There has been a speech recognition error.")
            print(error)
            self.delegate?.speechToTextFailed("There has been a speech recognition error.")
        }
    })
  

если в macmini не подключены наушники, приложение завершает работу в node.installTap (onBus… в приведенном выше коде.

Итак, мой вопрос в том, как я могу определить, не подключен ли у пользователя микрофон или у него какая-либо проблема, и остановить сбой приложения.

Ответ №1:

Вы можете проверить количество каналов устройства ввода.

 if 0 < AVAudioSession.sharedInstance().inputNumberOfChannels {
  // DO Somthing..
}
  

Если нет доступных устройств ввода, этот API возвращает 0.

Комментарии:

1. да, я сделал нечто подобное для Mac osx, audioEngine.inputNode.InputFormat (forBus: 0).channelCount, что дало мне подсчет.