Я новичок в Swift и пытаюсь реализовать audioEngine для микрофона для записи.
В какой-то момент я объявляю inputNode (микрофон) с помощью оператора:
print("before input node")
guard let inputNode = audioEngine.inputNode else {
fatalError("Audio engine has no input node")
}
print("after check of input node")
При пошаговом выполнении кода в отладчике во время выполнения возникает исключение во время оператора guard let inputNode
.Код печатает "before inputNode
", но никогда не печатает строки fatalError
или "after check
"
У меня было впечатление, что оператор защиты в Swift обнаруживает нулевое значение, таким образом избегая сбоя, но этов этом случае не происходит.
Буду признателен за любые предположения о том, что может пойти не так.
Для справки, до этого момента в методе следующий код выполняется без проблем:
public fund startRecording()
if recognitionTask != nil {
recognitionTask?.cancel()
recognitionTask = nil
}
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSessionCategoryRecord)
try audioSession.setMode(AVAudioSessionModeMeasurement)
try audioSession.setActive(true, with: .notifyOthersOnDeactivation)
} catch {
print("audioSession properties weren't set because of an error.")
}
recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
Редактировать:
Вот дополнительный код, относящийся к движку:
объявление в viewdidload
private let audioEngine = AVAudioEngine()
И попытаться запустить его позже в методе startRecordingссылка выше:
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in
self.recognitionRequest?.append(buffer)
}
audioEngine.prepare()
do {
try audioEngine.start()
} catch {
print("audioEngine couldn't start because of an error.")
}