使用Windows.Media.Audio.AudioDeviceInputNode时如何启用内置回声消除?
问题描述
我正在使用<Windows.Media.Audio.AudioDeviceInputNode>录制用户语音,应用通过扬声器播放TTS响应。问题在于该响应会被麦克风捕获,并被视为后续用户输入。
以下是我的设置代码:
var pcm16 = AudioEncodingProperties.CreatePcm(16_000, 1, 16); var audioGraphSettings = new AudioGraphSettings(AudioRenderCategory.Speech) { QuantumSizeSelectionMode = QuantumSizeSelectionMode.ClosestToDesired, AudioRenderCategory = AudioRenderCategory.Speech, DesiredSamplesPerQuantum = sampleRate / 100, EncodingProperties = pcm16, }; CreateAudioGraphResult result = await AudioGraph.CreateAsync(audioGraphSettings); if (result.Status != AudioGraphCreationStatus.Success) { throw result.ExtendedError; } graph = result.Graph; var inputProfile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.High); inputProfile.Audio = pcm16; var deviceInputNodeResult = await graph.CreateDeviceInputNodeAsync( MediaCategory.UniformSpeech, // also tried MediaCategory.Speech inputProfile.Audio); if (deviceInputNodeResult.Status != AudioDeviceNodeCreationStatus.Success) { throw deviceInputNodeResult.ExtendedError; } AudioDeviceInputNode deviceInputNode = deviceInputNodeResult.DeviceInputNode; audioNode = graph.CreateFrameOutputNode(pcm16); deviceInputNode.AddOutgoingConnection(audioNode); graph.QuantumStarted += AudioGraph_QuantumStarted; graph.Start(); ... void AudioGraph_QuantumStarted(AudioGraph sender, object args) { // processing frames here }
请问如何启用内置回声消除(如果存在的话)?
解决方案
要启用Windows内置的回声消除,需调整音频输入节点的初始化参数,并确保设备支持相关功能,具体操作如下:
指定音频处理模式
创建AudioDeviceInputNode时,除了将MediaCategory设为Speech,还需显式添加AudioProcessing参数来启用回声消除。修改后的代码如下:var deviceInputNodeResult = await graph.CreateDeviceInputNodeAsync( MediaCategory.Speech, inputProfile.Audio, AudioProcessing.RawWithEchoCancellation); // 关键参数注意:
AudioProcessing.RawWithEchoCancellation仅支持Windows 10 1809及以上版本;低版本可使用AudioProcessing.Default,系统会根据语音类别自动启用包括回声消除在内的优化处理。保留正确的音频图渲染类别
你已将AudioGraphSettings的AudioRenderCategory设为Speech,这一步无需修改——系统会针对语音场景自动匹配最优音频处理策略,包括回声抑制。验证回声消除是否生效
并非所有设备都支持系统级回声消除,可通过以下代码检查当前输入节点是否启用了对应效果:foreach (var effect in deviceInputNode.EffectDefinitions) { if (effect is EchoCancellationEffectDefinition) { // 回声消除已启用 } }额外优化建议
如果系统回声消除效果不理想,可在播放TTS时临时降低麦克风灵敏度,或者通过AudioGraph的节点路由逻辑,对TTS输出和麦克风输入做内部信号抵消(多数场景下系统级处理已足够)。
内容的提问来源于stack exchange,提问作者LOST
相关产品推荐
相关产品推荐

