#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, что дало мне подсчет.