取消iOS 麦克风回音消除和噪声抑制

Cancel iOS microphone echo cancellation and noise suppression

有没有办法在iOS中取消录音机中的回声消除和噪声抑制等预处理?

我使用 AVAudioRecordermeteringEnabled=true,我使用 averagePowerForChannel (docs) 获得平均分贝水平。

我正在尝试测量 phone 附近的环境噪音,如果我开始说话,iPhone 8 似乎会放大低噪音或将其抵消。例如,如果背景音乐的绝对分贝级别为 30 - iOS 似乎会放大它。当我开始小声说话时 - dB 水平显着下降。

但是因为我想测量环境噪声 - 我不需要这种预处理。

我试过 setInputGain (docs) 但 isInputGainSettable 总是错误的 - 因此,我不能采用这种方法。

有没有办法取消任何放大或预处理,如回声消除和噪声抑制?

您可以启用和禁用 AEC、AGC - 使用 AudioUnitSetProperty

https://developer.apple.com/documentation/audiotoolbox/1440371-audiounitsetproperty

这是相同的一些代码片段。

lResult = AudioUnitSetProperty(lAUAudioUnit,
                               kAUVoiceIOProperty_BypassVoiceProcessing,
                               kAudioUnitScope_Global,
                               lInputBus,
                               &lFalse,
                               sizeof(lFalse));

lResult = AudioUnitSetProperty(lAUAudioUnit,
                               kAUVoiceIOProperty_VoiceProcessingEnableAGC,
                               kAudioUnitScope_Global,
                               lInputBus,
                               &lFalse,
                               sizeof(lFalse));

我尝试了上面的解决方案,但它对我不起作用。

下面是我的代码:

   var componentDesc:  AudioComponentDescription
                       = AudioComponentDescription(
                           componentType:          OSType(kAudioUnitType_Output),
                           componentSubType:       OSType(kAudioUnitSubType_RemoteIO),
                           componentManufacturer:  OSType(kAudioUnitManufacturer_Apple),
                           componentFlags:         UInt32(0),
                           componentFlagsMask:     UInt32(0) )

                   var osErr: OSStatus = noErr

                   let component: AudioComponent! = AudioComponentFindNext(nil, &componentDesc)

                   var tempAudioUnit: AudioUnit?
                   osErr = AudioComponentInstanceNew(component, &tempAudioUnit)
                   var outUnit = tempAudioUnit!

            var lFalse = UInt32(1)


           let lInputBus  = AudioUnitElement(1)
            let outputBus = AudioUnitElement(0)

            let lResult = AudioUnitSetProperty(outUnit,
                                               kAUVoiceIOProperty_BypassVoiceProcessing,
                                                                              kAudioUnitScope_Global,
                                                                              lInputBus,
                                                                              &lFalse,
                                                                              0);

            var flag =  Int32(1)
            let Result = AudioUnitSetProperty(outUnit,
                                              kAUVoiceIOProperty_VoiceProcessingEnableAGC,
                                                                            kAudioUnitScope_Global,
                                                                            outputBus,
                                                                            &flag,
                                                                            0);
            

应用程序需要在音频通道上禁用 AGC(自动增益控制)过滤器后访问未处理的音频。要访问原始和未处理的音频,请在 iOS 中打开 测量模式

如 iOS 文档 here 中所述,“测量”模式是一种指示您的应用正在执行音频输入或输出测量的模式。

This mode is intended for apps that need to minimize the amount of system-supplied signal processing to input and output signals. If recording on devices with more than one built-in microphone, the primary microphone is used.

我在录制前修改的javascript代码(使用nativescript)是这样的:

// Disable AGC
const avSession = AVAudioSession.sharedInstance();
avSession.setCategoryModeOptionsError(AVAudioSessionCategoryRecord, AVAudioSessionModeMeasurement, null);