Как я могу получить необработанные аудио кадры с микрофона в режиме реального времени или из сохраненного аудиофайла в 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, хотя у меня нет кода для этого.