You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:07:20