首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AvaudioEngine -以特定采样率记录语音,用于分析的AvaudioEngine

AvaudioEngine -以特定采样率记录语音,用于分析的AvaudioEngine
EN

Stack Overflow用户
提问于 2021-12-22 07:08:03
回答 1查看 218关注 0票数 9

我们正在进行一个从外部麦克风录制声音的项目。为了分析的目的,我们需要一个大约5k赫兹的采样率。

我们正在使用AvAudioEngine录制一个声音。我们知道苹果设备希望能够以特定的速度记录,所以我们使用AVAudioConverter来降低采样率。

但是,正如您所知道的,它类似于压缩,所以我们降低的样本率,文件大小和文件持续时间影响相同。这是目前正在发生的(如果我错了,请纠正我)。

问题

**问题是降低抽样率,缩短档案长度及其对计算和分析的影响。例如,一个小时的录音被降级到45分钟.因此,假设我们在5分钟的周期间隔上进行分析,就会出错。

对此最好的解决方案是什么?**

查询

我们已经在互联网上搜索过了,但我们不知道installTap上的缓冲区大小如何影响?在当前代码中,我们将其设置为2688。

有人能澄清吗?

代码语言:javascript
复制
let bus = 0
let inputNode = engine.inputNode

let equalizer = AVAudioUnitEQ(numberOfBands: 2)

equalizer.bands[0].filterType = .lowPass
equalizer.bands[0].frequency = 3000
equalizer.bands[0].bypass = false

equalizer.bands[1].filterType = .highPass
equalizer.bands[1].frequency = 1000
equalizer.bands[1].bypass = false
engine.attach(equalizer) //Attach equalizer

// Connect nodes
engine.connect(inputNode, to: equalizer, format: inputNode.inputFormat(forBus: 0))
engine.connect(equalizer, to: engine.mainMixerNode, format: inputNode.inputFormat(forBus: 0))

// call before creating converter because this changes the mainMixer's output format
engine.prepare()

let outputFormat = AVAudioFormat(commonFormat: .pcmFormatInt16,
                                 sampleRate: 5000,
                                 channels: 1,
                                 interleaved: false)!

// Downsampling converter
guard let converter: AVAudioConverter = AVAudioConverter(from: engine.mainMixerNode.outputFormat(forBus: 0), to: outputFormat) else {
    print("Can't convert in to this format")
    return
}

engine.mainMixerNode.installTap(onBus: bus, bufferSize: 2688, format: nil) { (buffer, time) in
    var newBufferAvailable = true
    
    let inputCallback: AVAudioConverterInputBlock = { inNumPackets, outStatus in
        if newBufferAvailable {
            outStatus.pointee = .haveData
            newBufferAvailable = false
            return buffer
        } else {
            outStatus.pointee = .noDataNow
            return nil
        }
    }
    
    
    let convertedBuffer = AVAudioPCMBuffer(pcmFormat: outputFormat, frameCapacity: AVAudioFrameCount(outputFormat.sampleRate) * buffer.frameLength / AVAudioFrameCount(buffer.format.sampleRate))!
    
    var error: NSError?
    let status = converter.convert(to: convertedBuffer, error: &error, withInputFrom: inputCallback)
    assert(status != .error)
    
    
    if status == .haveData {
        // Process with converted buffer
    }
}

do {
    try engine.start()
} catch {
    print("Can't start the engine: \(error)")
}

期望结果

我们对缓冲区的压缩很好,但是我们希望在输出文件中有相同的记录时间。如果我们记录10分钟,输出文件应该有10分钟的数据。

EN

回答 1

Stack Overflow用户

发布于 2021-12-24 18:22:46

数字化音频没有一个固有的持续时间,因为它可以被回放任何样本率。

为了使结果文件的持续时间达到您预期的效果,样本速率必须是您在每个阶段所期望的:记录、处理和回放。

我怀疑有两种可能的事情正在发生:

( A)您在安装程序中接收到的缓冲区的采样率不是您所设想的那样.你正在从错误的格式转换。

( B)你的音频回放速度与你所假设的不同。(你怎么知道你的球员打5000小时)?

为了检查这一点,您必须将过程分解成较小的部分,并在每个阶段检查采样率。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70445373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档