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

Posted

技术标签:

【中文标题】如何从麦克风实时获取原始音频帧或从 iOS 中保存的音频文件获取原始音频帧?【英文标题】:How can I obtain the raw audio frames from the microphone in real-time or from a saved audio file in iOS? 【发布时间】:2018-05-16 02:18:57 【问题描述】:

我正在尝试从音频信号中提取 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 中实现。

【问题讨论】:

How to capture audio samples in iOS with Swift?的可能重复 我编辑了问题以使其更具体。 嗨@macklinagent,我也在尝试提取mfcc特征,特别是mfcc的二阶导数,你能告诉我你是怎么做到的吗?你用过什么图书馆吗? 嗨@Rocky,我实际上转而使用android,因为我的项目朝着不同的方向发展,所以不幸的是,我从来没有机会在iOS中使用建议的解决方案。对此感到抱歉。 【参考方案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,尽管我手头没有代码。

【讨论】:

谢谢!我没有> 15的声誉,所以我对你的回答的赞成显然不会增加反击。对不起。 @macklinagent 嘿,但我可以支持你的评论。所以这有帮助..也许? 音频低可能与AudioSession类别设置有关

以上是关于如何从麦克风实时获取原始音频帧或从 iOS 中保存的音频文件获取原始音频帧?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 10.2 上的 Swift 3:如何从麦克风订阅单个样本?需要实时处理音频

iOS 如何从歌曲(ipod 库)中获取音频样本?

OpenCV-Python:如何从实时视频流中获取最新帧或跳过旧帧

iOS:如何阅读播放实时音乐?

WebRTC Native M96 SDK接口封装--注册语音观测器对象获取原始音频数据registerAudioFrameObserver

WebRTC Native M96 SDK接口封装--注册语音观测器对象获取原始音频数据registerAudioFrameObserver