如何实时从麦克风或 iOS 中保存的音频文件中获取原始音频帧?
How can I obtain the raw audio frames from the microphone in real-time or from a saved audio file in iOS?
我正在尝试从音频信号中提取 MFCC 向量作为递归神经网络的输入。但是,我无法弄清楚如何使用 Core Audio 在 Swift 中获取原始音频帧。据推测,我必须进入低级别才能获取该数据,但我找不到这方面的有用资源。
如何使用Swift获取我需要的音频信号信息?
编辑:这个问题被标记为可能与 How to capture audio samples in iOS with Swift? 重复。但是,那个特定问题没有我正在寻找的答案。也就是说,该问题的解决方案是创建一个 AVAudioRecorder,它是解决我的问题的一个组件,而不是最终结果。
这个问题How to convert WAV/CAF file's sample data to byte array?更符合我的方向。解决方案写在 Objective-C 中,我想知道是否有办法在 Swift 中做到这一点。
将水龙头附加到 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,但我手头没有相关代码。
我正在尝试从音频信号中提取 MFCC 向量作为递归神经网络的输入。但是,我无法弄清楚如何使用 Core Audio 在 Swift 中获取原始音频帧。据推测,我必须进入低级别才能获取该数据,但我找不到这方面的有用资源。
如何使用Swift获取我需要的音频信号信息?
编辑:这个问题被标记为可能与 How to capture audio samples in iOS with Swift? 重复。但是,那个特定问题没有我正在寻找的答案。也就是说,该问题的解决方案是创建一个 AVAudioRecorder,它是解决我的问题的一个组件,而不是最终结果。
这个问题How to convert WAV/CAF file's sample data to byte array?更符合我的方向。解决方案写在 Objective-C 中,我想知道是否有办法在 Swift 中做到这一点。
将水龙头附加到 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,但我手头没有相关代码。