Как я могу получить необработанные аудио кадры с микрофона в режиме реального времени или из сохраненного аудиофайла в iOS?

Я пытаюсь извлечь векторы MFCC из аудиосигнала в качестве входных данных в рекуррентную нейронную сеть. Однако у меня возникли проблемы с выяснением того, как получить необработанные аудио кадры в Swift с использованием Core Audio. Предположительно, мне нужно перейти на низкий уровень, чтобы получить эти данные, но я не могу найти полезных ресурсов в этой области.

Как я могу получить информацию об аудиосигнале, которая мне нужна, с помощью Swift?

Изменить: Этот вопрос был помечен как возможный дубликат Как захватить аудио образцы в iOS с Swift?, Тем не менее, этот конкретный вопрос не имеет ответа, который я ищу. А именно, решением этого вопроса является создание AVAudioRecorder, который является компонентом, а не конечным результатом решения моего вопроса.

Этот вопрос Как преобразовать пример данных WAV/CAF файла в байтовый массив? больше в направлении того, куда я направляюсь. Решения для этого написаны в Objective-C, и мне интересно, есть ли способ сделать это в Swift.

1 ответ

Решение

Прикрепить сигнал к входному узлу по умолчанию на AVAudioEngine довольно просто, и вы получите ~100 мс аудио в режиме реального времени с микрофона в виде массивов Float32. Вам даже не нужно подключать какие-либо другие аудиоустройства. Если ваш экстрактор и сеть MFCC достаточно отзывчивы, это может быть самый простой способ.

let audioEngine = AVAudioEngine()
if let inputNode = audioEngine.inputNode {
    inputNode.installTap( onBus: 0,         // mono input
                          bufferSize: 1000, // a request, not a guarantee
                          format: nil,      // no format translation
                          block: { buffer, when in 

        // This block will be called over and over for successive buffers 
        // of microphone data until you stop() AVAudioEngine
        let actualSampleCount = Int(buffer.frameLength)

        // buffer.floatChannelData?.pointee[n] has the data for point n
        var i=0
        while (i < actualSampleCount) {
            let val = buffer.floatChannelData?.pointee[i]
            // do something to each sample here...
            i += 1
        }
    })

    do {
        try audioEngine.start()
    } catch let error as NSError {
        print("Got an error starting audioEngine: \(error.domain), \(error)")
    }
}

Вам также нужно будет запросить и получить разрешение микрофона.

Я нахожу амплитуды довольно низкими, поэтому вам может потребоваться применить некоторое усиление или нормализацию в зависимости от потребностей вашей сети.

Чтобы обработать ваши WAV-файлы, я бы попробовал AVAssetReader, хотя у меня нет кода для этого.

Другие вопросы по тегам