> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 高级音频功能

> 启用高级音频功能,包括回声消除、噪声抑制、VoIP 和多设备播放。

## **最小化回声和噪声**

回声和噪声问题在 VoIP 系统中很常见。语音来自远端扬声器,并带有时间延迟地回传,造成感知问题。回声消除可减少通信过程中来自远端扬声器的回声。噪声抑制可减少来自麦克风通道的噪声。SMECNS 回声消除和噪声抑制(ECNS)算法提供平稳和非平稳噪声抑制以及回声消除。

声学回声是指由于设备扬声器与麦克风之间的声学路径(声学耦合)而产生的回声。这对免提和电话会议应用非常重要。

下图展示了声学回声路径,以及声学回声如何在扬声器和麦克风之间产生。

<div className="flex flex-col items-center gap-2">
  <img src="https://mintcdn.com/qualcomm-prod/PyJ823JBh-_RDtS4/Technologies/Audio/media/qualcomm-linux-iot-audio-voice/ecns_overview.svg?fit=max&auto=format&n=PyJ823JBh-_RDtS4&q=85&s=290d397cd29b4522837f534e94019af8" alt="噪声和声学回声" width="793" height="408" data-path="Technologies/Audio/media/qualcomm-linux-iot-audio-voice/ecns_overview.svg" />

  <p className="text-sm text-gray-700">
    噪声和声学回声
  </p>
</div>

近端语音信号远端语音信号近端讲话者环境噪声声学回声路径声学回声近端语音远端语音

噪声和声学回声

* **回声消除器** – 一种自适应滤波器,可自行调整系数以消除回声。每个回声都有一条回声路径,并由脉冲响应表征。回声消除器会适应网络回声路径,从而消除回声。
* **噪声抑制** – 单麦克风回声消除和噪声抑制器(SMECNS)有助于在嘈杂环境中使用设备时抑制周围的平稳噪声。

### **为录音启用 SMECNS**

录音时,SMECNS 通过抑制麦克风捕获的背景噪声来保持录音路径中的语音质量。

对于单麦克风录音,只能进行平稳噪声抑制。平稳噪声是指频率不随时间变化的噪声,例如道路噪声或白噪声。

下图展示了如何使用增益、SMECNS 和后处理模块去除外部噪声和回声,以输出清晰的语音。

<div className="flex flex-col items-center gap-2">
  <img src="https://mintcdn.com/qualcomm-prod/PyJ823JBh-_RDtS4/Technologies/Audio/media/qualcomm-linux-iot-audio-voice/fluence_recording.svg?fit=max&auto=format&n=PyJ823JBh-_RDtS4&q=85&s=36a91f7f980e34a600bc86ab17276055" alt="用于录音的 SMECNS 软件模块" width="1213" height="379" data-path="Technologies/Audio/media/qualcomm-linux-iot-audio-voice/fluence_recording.svg" />

  <p className="text-sm text-gray-700">
    用于录音的 SMECNS 软件模块
  </p>
</div>

用于录音的 SMECNS 软件模块

要在录音路径中启用 SMECNS:

1. 使用 `wpctl status` 命令列出可用节点。
   ```text theme={null}
   systemctl stop pipewire wireplumber pipewire.socket pipewire-manager.socket
   ```
   ```text theme={null}
   chmod 777 /dev/dma_heap/system
   ```
   ```text theme={null}
   systemctl start pipewire wireplumber
   ```
   ```text theme={null}
   wpctl status
   ```
2. 运行 `wpctl set-default`,将源节点设置为手持设备麦克风。
   ```text theme={null}
   wpctl set-default <sink/source node ID>
   ```
3. 运行 `pw-record` 开始录音。以下示例以详细模式运行,并将录音保存到 `/opt/test.wav`。
   ```text theme={null}
   pw-record /opt/test.wav -v
   ```

### **模拟 VoIP**

要使用 PipeWire 模拟 VoIP:

| **设置录音源** |    |
| :-------- | :- |

```text theme={null}
pw-record /opt/record_voip.wav -v --target=voip-tx0
```

| **设置播放接收端** |    |
| :---------- | :- |

```text theme={null}
pw-play /opt/test.wav -v --target=voip-rx0
```

<Note>
  请务必将 PCM 文件(`<FileName>.wav`)推送到 `/opt/` 文件夹。
</Note>

### **启用单流多设备播放**

配置平台,使单个音频流同时在多个输出设备(例如内置扬声器和有线耳机)上渲染。在此模式下,音频会被复制,同一解码后的音频流会同时路由到多个活动的输出设备,确保所有选定端点的同步播放。

1. 列出可用的音频节点。

   ```text theme={null}
   wpctl status
   ```

<div className="flex flex-col items-center gap-2">
  <img src="https://mintcdn.com/qualcomm-prod/eEpyRw0El1UsdcSx/Technologies/Audio/media/qualcomm-linux-iot-audio-voice/wpctl_status.png?fit=max&auto=format&n=eEpyRw0El1UsdcSx&q=85&s=e3c757c58d67a326ca423376bb90c077" alt="wpctl status 输出,显示可用的 PAL sink 和 source 节点" width="803" height="672" data-path="Technologies/Audio/media/qualcomm-linux-iot-audio-voice/wpctl_status.png" />

  <p className="text-sm text-gray-700">
    wpctl status 输出,显示可用的 PAL sink 和 source 节点
  </p>
</div>

2. 设置默认节点。

   ```text theme={null}
   wpctl set-default <NUMBER for low-latency>
   ```

   * 对于低延迟(Low Latency),选择带有 `pal sink combined speaker and headset ll` 的节点。
   * 对于深缓冲(Deep buffer),选择带有 `pal sink combined speaker and headset db` 的节点。

3. 开始播放。

   ```text theme={null}
   pw-play /tmp/yesterday_48KHz.wav -v
   ```

### **启用多流多设备播放**

配置平台,使多个独立音频流同时在不同的输出设备(例如内置扬声器和有线耳机)上渲染。在此模式下,每个音频流均独立管理和路由,允许不同的流同时传送到各自的输出设备而互不干扰。这可实现诸如并行媒体播放以及跨多个端点的通知路由等用例。

1. 列出可用的音频节点。

   ```text theme={null}
   pw-cli ls Node
   ```

2. 选择您希望多个流播放到的音频节点,并使用 `--target` 命令行选项指定这些节点名称。

3. 开始低延迟播放。

   ```text theme={null}
   pw-play --target=pal_sink_speaker_ll /opt/clip1.wav -v
   ```

   ```text theme={null}
   pw-play --target=pal_sink_headset_ll /opt/clip2.wav -v
   ```

### **使用 PipeWire 进行动态设备切换**

在音频处于活动状态时,使用 `wpctl` 触发动态设备切换。

1. 列出所有可用的音频节点。

   ```text theme={null}
   wpctl status
   ```

2. 在默认设备(例如扬声器)上开始播放。

   ```text theme={null}
   pw-play /opt/test.wav -v
   ```

3. 在播放处于活动状态时,通过设置新的默认 sink 切换到其他输出设备(例如耳机)。

   ```text theme={null}
   wpctl set-default <headset sink node ID>
   ```

   WirePlumber 会重新路由该流,PAL 会无缝执行设备切换。

## **启用 DP 和 HDMI 音频**

本节适用于 QCS6490(Kodiak)和 IQ-9075(Lemans)平台(config1)。

### **设置 QCS6490(rb3-gen2-core-kit)**

1. 将拓扑二进制文件复制到固件路径。

   ```text theme={null}
   cp \\sphere\CasaBuilds\QLI\Topology\QCS6490\QCS6490-RB3Gen2-tplg.bin /lib/firmware/qcom/qcs6490/
   ```

2. 复制 HiFi 配置文件。

   ```text theme={null}
   cp \\sphere\CasaBuilds\QLI\Topology\QCS6490\HiFi.conf.kodiak /usr/share/alsa/ucm2/Qualcomm/qcs6490/QCS6490-RB3Gen2/HiFi.conf
   ```

3. 复制 HDMI 格式配置文件。

   ```text theme={null}
   cp \\sphere\CasaBuilds\QLI\Topology\QCS6490\51-hdmi-format.conf /usr/share/wireplumber.conf.d/51-hdmi-format.conf
   ```

4. 重启设备。启动时,确保 DP 已连接(typeC 转 HDMI 母头 + HDMI 转 HDMI 线缆)。

   ```text theme={null}
   reboot
   ```

**HDMI 和 DP 音频播放(QCS6490)**

| HDMI 音频播放                                                                         | DP 音频播放                                                                           |
| :-------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------- |
| `amixer -c 0 cset iface=MIXER,name='SECONDARY_MI2S_RX Audio Mixer MultiMedia3' 1` | `amixer -c 0 cset iface=MIXER,name='DISPLAY_PORT_RX_0 Audio Mixer MultiMedia4' 1` |
| `aplay -D plughw:0,2 /home/test.wav`                                              | `aplay -D plughw:0,3 /home/test.wav`                                              |
| `wpctl set-default <node>`                                                        | `wpctl set-default <node>`                                                        |
| `pw-play -v /home/test.wav`                                                       | `pw-play -v /home/test.wav`                                                       |

### **设置 IQ-9075(iq-9075-evk)**

1. 将拓扑二进制文件复制到固件路径。

   ```text theme={null}
   cp \\sphere\CasaBuilds\QLI\Topology\IQ-9075\LEMANS-EVK-tplg.bin /lib/firmware/qcom/sa8775p/
   ```

2. 复制 HiFi 配置文件。

   ```text theme={null}
   cp \\sphere\CasaBuilds\QLI\Topology\IQ-9075\HiFi.conf.lemans /usr/share/alsa/ucm2/Qualcomm/sa8775p/lemans-evk/HiFi.conf
   ```

3. 重启设备。启动时,确保 DP 已连接(eDP 转 DP 线缆)。

   ```text theme={null}
   reboot
   ```

**DP 音频播放(IQ-9075)**

| DP 音频播放                                                                           |
| :-------------------------------------------------------------------------------- |
| `amixer -c 0 cset iface=MIXER,name='DISPLAY_PORT_RX_0 Audio Mixer MultiMedia3' 1` |
| `aplay -D plughw:0,2 /home/test.wav`                                              |
| `wpctl set-default <node>`                                                        |
| `pw-play -v /home/test.wav`                                                       |

## **后续步骤**

* [音频补充文档](../audio-addendum-overview) — 使用 QACT 和 QXDM 进行校准和诊断
* [排查音频问题](troubleshoot-audio) — 捕获并分析音频日志以解决问题
* [自定义音频图](customize-audio-graph) — 修改音频图和 PAL 配置
