如何实时或从iOS中保存的音频文件中获取麦克风的原始音频帧?

mac*_*ent 3 audio audio-processing ios mfcc swift4

我试图从音频信号中提取MFCC矢量作为输入到递归神经网络.但是,我无法弄清楚如何使用Core Audio在Swift中获取原始音频帧.据推测,我必须进入低级才能获得该数据,但我找不到这方面的有用资源.

如何使用Swift获取所需的音频信号信息?

编辑:这个问题被标记为如何使用Swift在iOS中捕获音频样本的可能重复.但是,那个特定的问题没有我想要的答案.也就是说,该问题的解决方案是创建一个AVAudioRecorder,它是我的问题解决方案的一个组件,而不是最终结果.

这个问题如何将WAV/CAF文件的样本数据转换为字节数组?更像是我前进的方向.解决方案是用Objective-C编写的,我想知道是否有办法在Swift中完成它.

Jas*_*ell 10

将一个水龙头连接到AVAudioEngine上的默认输入节点非常简单,可以通过Float32阵列从麦克风获得实时~100ms的音频块.您甚至不必连接任何其他音频设备.如果您的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)")
    }
}
Run Code Online (Sandbox Code Playgroud)

您还需要申请并获得麦克风许可.

我发现幅度相当低,因此您可能需要根据网络的需要应用一些增益或标准化.

要处理你的WAV文件,我会尝试AVAssetReader,虽然我没有手头的代码.