取消iOS 麦克风回音消除和噪声抑制
Cancel iOS microphone echo cancellation and noise suppression
有没有办法在iOS中取消录音机中的回声消除和噪声抑制等预处理?
我使用 AVAudioRecorder
和 meteringEnabled=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);
有没有办法在iOS中取消录音机中的回声消除和噪声抑制等预处理?
我使用 AVAudioRecorder
和 meteringEnabled=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);