8

Я внедряю распознавание речи в своем приложении. Когда я впервые представляю контроллер представления с логикой распознавания речи, все работает нормально. Однако, когда я пытаюсь представить контроллер представления снова, я получаю следующее сообщение аварии:AVAudioEngine inputNode installTap crash при перезапуске записи

ERROR: [0x190bf000] >avae> AVAudioNode.mm:568: CreateRecordingTap: required condition is false: IsFormatSampleRateAndChannelCountValid(format) 
*** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: IsFormatSampleRateAndChannelCountValid(format)' 

Вот код, который используется для запуска и остановки записи:

@available(iOS 10.0, *) 
extension DictationViewController { 

fileprivate func startRecording() throws { 
    guard let recognizer = speechRecognizer else { 
     debugLog(className, message: "Not supported for the device's locale") 
     return 
    } 

    guard recognizer.isAvailable else { 
     debugLog(className, message: "Recognizer is not available right now") 
     return 
    } 

    mostRecentlyProcessedSegmentDuration = 0 
    guard let node = audioEngine.inputNode else { 
     debugLog(className, message: "Could not get an input node") 
     return 
    } 

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

    audioEngine.prepare() 
    try audioEngine.start() 

    recognitionTask = recognizer.recognitionTask(with: request, resultHandler: {/***/}) 
} 

fileprivate func stopRecording() { 
    audioEngine.stop() 
    audioEngine.inputNode?.removeTap(onBus: 0) 
    request.endAudio() 
    recognitionTask?.cancel() 
} 

} 

startRecording() называется в viewDidLoad когда мы имеем запросил разрешение. stopRecording() вызывается, когда контроллер вида отклонен.

Пожалуйста, помогите. Я изо всех сил, чтобы найти решение этой аварии

+0

Вы нашли решение на этом? Я испытываю подобный сбой, но только при работе на iOS 8.1 ?? –

ответ

1

Вы можете заменить этот код:

let recordingFormat = node.outputFormat(forBus: 0) 

со следующим:

let recordingFormat = AVAudioFormat(standardFormatWithSampleRate: 44100, channels: 1) 

Этот код исправили проблему.

+0

спасибо за это исправление. Но в чем причина, почему outputFormat (forBus: 0) не работает? –

0

Во-первых, небольшая проблема. При нажатии микрофона устройства, вы хотите использовать формат входных шины:

let recordingFormat = node.inputFormat(forBus: 0) 

Во-вторых, после того, как некоторые рытья кажется, что это крах чаще всего происходит от настроек AVAudioSession категории общих вашего приложения. Убедитесь, что у вас настроена аудиозапись, если вы собираетесь выполнять звуковую обработку в реальном времени микрофона:

private func configureAudioSession() { 
    do { 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, with: .mixWithOthers) 
     try AVAudioSession.sharedInstance().setActive(true) 
    } catch { } 
}