8

J'applique la reconnaissance vocale dans mon application. Lorsque je présente pour la première fois le contrôleur de vue avec la logique de reconnaissance vocale, tout fonctionne bien. Cependant, lorsque je tente de présenter à nouveau le contrôleur de vue, je reçois l'accident suivant:AVAudioEngine inputNode installTap se bloque lors du redémarrage de l'enregistrement

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)' 

Voici le code utilisé pour le démarrage et l'arrêt de l'enregistrement:

@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() est appelé à viewDidLoad une fois que nous avons demande d'autorisation. stopRecording() est appelée lorsque le contrôleur de vue est fermé.

Veuillez nous aider. Je me bats pour trouver une solution à cet accident

+0

Avez-vous trouvé une solution à ce problème? Je rencontre un crash similaire, mais seulement lors de l'exécution sur iOS 8.1 ?? –

Répondre

1

Vous pouvez remplacer ce code:

let recordingFormat = node.outputFormat(forBus: 0) 

ce qui suit:

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

Ce code a résolu le problème.

+0

merci pour cette correction. Mais quelle est la raison pour laquelle outputFormat (forBus: 0) ne fonctionne pas? –

0

D'abord, un petit problème. Lorsque vous touchez le microphone de l'appareil, vous aurez envie d'utiliser le format de l'entrée bus:

let recordingFormat = node.inputFormat(forBus: 0) 

En second lieu, après quelques recherches, il semble que ce krach provient le plus souvent de partage des paramètres de catégorie AVAudioSession de votre application. Assurez-vous que votre session audio est configurée comme si vous deviez effectuer un traitement audio de microphone en direct:

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