音频效果 SDK 编程指南
NVIDIA® 音频效果 SDK 为广播用例提供以下实时音频处理的音频效果
- 噪声消除/降噪:在录音室外录制的语音可能包含大量背景噪声,这会导致语音失真且难以理解。
音频降噪效果可消除音频中的背景噪声。
- 房间回声消除/去混响/房间回声抵消:语音录音可能包含录音环境中的混响,这会影响语音清晰度。
去混响效果有助于消除或抑制音频中的这些混响。
-
噪声消除和房间回声消除/降噪 + 去混响:此效果结合了上述两种效果,可消除/抑制音频中的噪声和混响。
与分别应用这些效果相比,这提供了更好的性能。
- 音频超分辨率:此效果通过向音频流添加更高频率的内容来提高音质。
对于低频音频,此功能可预测输入音频的更高频谱,从而提高音质。
- 声学回声消除 (AEC):此效果可消除音频中的声学回声和反馈,从而提高双向音频质量。
Windows SDK 针对客户端应用程序集成进行了优化,而 Linux SDK 专为服务器端(数据中心/云)部署而设计和优化。
官方不支持在这些用例之外使用这些 SDK 进行测试、实验和生产部署。
1.1. 关于噪声消除/背景噪声抑制效果
在录音室外录制的语音可能包含大量背景噪声。音频降噪器效果可消除音频录音中的各种背景噪声。
此效果保留了语音中的情感基调,例如快乐、悲伤、兴奋和愤怒的基调,这些基调在 SDK 的先前版本中被作为噪声消除。响亮的笑声、尖叫、喊叫和哭泣等极端情感情况可能无法保留。
在本指南中,术语 背景噪声抑制 与 降噪和噪声消除(在 API 中称为 denoiser
)互换使用。
- 交流电噪声
- 人声嘈杂/人群噪声
- 婴儿哭闹
- 鸟鸣
- 身体噪声
- 其他人的闲聊
- 鼓掌
- 建筑工地声音
- 烹饪声音(切割、炊具等)
- 关门声
- 鼓声
- 风扇噪声
- 高斯/白噪声
- 键盘声
- 金属声
- 鼠标点击声
- PC 噪声
- 宠物声音
- 电话铃声
- 雨声
- 警报声
- 火车经过的声音
- 吸尘器的声音
- 家具移动的声音
- 玻璃破碎的声音
- 敲击声
- 交通噪声
- 洗衣机声
- 水龙头/流水声
- 包装纸(塑料/非塑料沙沙声)
要在 Windows 上为此效果运行示例应用程序,请使用以下命令(有关更多信息,请参阅运行示例应用程序)
:: For SDK Developer Package:
:: Format: run_effects_demo.bat <architecture> <effect> <input_sample_rate> <output_sample_rate>
:: 16k effect on turing GPU
run_effects_demo.bat turing denoiser 16k 16k
:: 48k effect on ampere GPU
run_effects_demo.bat ampere denoiser 48k 48k
:: For SDK Redistributable Package:
:: Format: run_effects_demo.bat <effect> <input_sample_rate> <output_sample_rate>
:: 16k effect
run_effects_demo.bat denoiser 16k 16k
:: 48k effect
run_effects_demo.bat denoiser 48k 48k
要在 Linux 上为此效果运行示例应用程序,请使用以下命令(有关更多信息,请参阅使用 Helper 脚本运行示例应用程序)
# Format: ./run_effect.sh -g gpu -s sample_rate -e denoiser
# 16k effect
./run_effect.sh -g t4 -s 16 -e denoiser
# 48k effect
./run_effect.sh -g t4 -s 48 -e denoiser
- 支持的输入/输出音频格式为 32 位浮点音频,采样率为 16kHz/48kHz。
- 在 Linux SDK 中,此效果具有以下最大吞吐量(实时支持的批次数量)
此效果可能会遗漏输入音频前 1-2 秒的某些噪声。语音期间的低音量噪声也可能被遗漏。
1.2. 关于房间回声消除/房间回声抵消效果
在大型房间/大厅中录制的语音包含回声和混响。音频房间回声消除效果可消除/抑制音频录音中的这些回声和混响。
在本指南中,术语 房间回声抵消 与 去混响和房间回声消除(在 API 中称为 dereverb
)互换使用。
要在 Windows 上为此效果运行示例应用程序,请使用以下命令(有关更多信息,请参阅使用 Helper 批处理脚本运行示例应用程序)
:: For SDK Developer Package
:: Format: run_effects_demo.bat <architecture> <effect> <input_sample_rate> <output_sample_rate>
:: 16k effect
run_effects_demo.bat turing dereverb 16k 16k
:: 48k effect
run_effects_demo.bat ampere dereverb 48k 48k
:: For SDK Redistributable Package:
:: Format: run_effects_demo.bat <effect> <input_sample_rate> <output_sample_rate>
:: 16k effect
run_effects_demo.bat dereverb 16k 16k
:: 48k effect
run_effects_demo.bat dereverb 48k 48k
要在 Linux 上为此效果运行示例应用程序,请使用以下命令(有关更多详细信息,请参阅使用 Helper 脚本运行示例应用程序)
# Format: ./run_effect.sh -g gpu -s sample_rate -e dereverb
# 16k effect
./run_effect.sh -g t4 -s 16 -e dereverb
# 48k effect
./run_effect.sh -g t4 -s 48 -e dereverb
- 支持的输入/输出格式为 32 位浮点音频,采样率为 16kHz/48kHz。
- 在 Linux SDK 中,此效果具有以下最大吞吐量(实时支持的批次数量)
1.3. 关于噪声消除和房间回声消除/房间回声抵消 + 背景噪声抑制效果
此效果对输入音频应用降噪和去混响效果。
在本指南中,术语 房间回声抵消 + 背景噪声抑制 与 去混响+降噪器以及噪声消除和房间回声消除(在 API 中称为 dereverb_denoiser
)互换使用。
要在 Windows 上为此效果运行示例应用程序,请使用以下命令(有关更多详细信息,请参阅使用 Helper 批处理脚本运行示例应用程序)
:: For SDK Developer Package:
:: Format: run_effects_demo.bat <architecture> <effect> <input_sample_rate> <output_sample_rate>
:: 16k effect on turing GPU
run_effects_demo.bat turing dereverb_denoiser 16k 16k
:: 48k effect on ampere GPU
run_effects_demo.bat ampere dereverb_denoiser 48k 48k
:: For SDK Redistributable Package:
:: Format: run_effects_demo.bat <effect> <input_sample_rate> <output_sample_rate>
:: 16k effect
run_effects_demo.bat dereverb_denoiser 16k 16k
:: 48k effect
run_effects_demo.bat dereverb_denoiser 48k 48k
要在 Linux 上为此效果运行示例应用程序,请使用以下命令(有关更多详细信息,请参阅使用 Helper 脚本运行示例应用程序)
# Format: ./run_effect.sh -g gpu -s sample_rate -e dereverb_denoniser
# 16k effect
./run_effect.sh -g t4 -s 16 -e dereverb_denoiser
# 48k effect
./run_effect.sh -g t4 -s 48 -e dereverb_denoiser
- 支持的输入/输出格式为 32 位浮点音频,采样率为 16kHz/48kHz。
- 在 Linux SDK 中,此效果具有以下最大吞吐量(实时支持的批次数量)
1.4. 关于音频超分辨率效果
音频超分辨率效果对音频进行上采样。对于低频音频,此功能可预测输入音频的更高频谱,从而提高音质。
在本指南中,术语 超分辨率 与 Superres/superresolution(在 API 中称为 superres
)互换使用。
此效果的主要目的是增强输入音频的采样率。输出音频中看到的增强级别取决于音频类型。
在禁用音频增强设置的 Windows 上捕获的音频比启用此设置时产生更好的超分辨率输出。
要在 Windows 上为此效果运行示例应用程序,请使用以下命令(有关更多信息,请参阅使用 Helper 批处理脚本运行示例应用程序)
:: For SDK Developer Package:
:: Format: run_effects_demo.bat <architecture> <effect> <input_sample_rate> <output_sample_rate>
:: 8k - 16k effect on turing GPU
run_effects_demo.bat turing superres 8k 16k
:: 16k - 48k effect on ampere GPU
run_effects_demo.bat ampere superres 16k 48k
:: 8k - 48k effect on ADA GPU
run_effects_demo.bat ada superres 8k 48k
:: For SDK Redistributable Package:
:: Format: run_effects_demo.bat <effect> <input_sample_rate> <output_sample_rate>
:: 8k - 16k effect
run_effects_demo.bat superres 8k 16k
:: 16k - 48k effect
run_effects_demo.bat superres 16k 48k
:: 8k - 48k effect
run_effects_demo.bat superres 8k 48k
要在 Linux 上为此效果运行示例应用程序,请使用以下命令(有关更多信息,请参阅使用 Helper 脚本运行示例应用程序)
# Format: ./run_effect.sh -g gpu -s sample_rate -e superres
# 8k - 16k effect
./run_effect.sh -g t4 -s 8 -o 16 -e superres
# 8k - 48k effect
./run_effect.sh -g t4 -s 8 -o 48 -e superres
# 16k - 48k effect
./run_effect.sh -g t4 -s 16 -o 48 -e superres
此效果在干净的输入音频上效果最佳。如果输入音频包含噪声或回声/混响,则输出音频可能包含轻微的伪影。
如果输入音频预计包含噪声,请将此效果与噪声消除效果或噪声消除和房间回声消除效果结合使用。有关更多详细信息,请参阅链式效果。
此效果具有以下特点
- 支持的输入/输出格式为 32 位浮点音频。
- 支持将 8kHz 输入音频上采样到 16kHz 输出 (2x)、将 8kHz 输入音频上采样到 48 kHz 输出 (6x) 以及将 16kHz 输入音频上采样到 48kHz 输出 (3x)。
- 在 Linux SDK 中,此效果具有以下最大吞吐量(实时支持的批次数量)
架构 8K 到 16K 效果的最大吞吐量 8K 到 48K 效果的最大吞吐量 16K 到 48K 效果的最大吞吐量 T4 192 64 96 V100 512 200 256 A100 928 400 448 A10 416 128 192
1.5. 关于声学回声消除效果 (BETA)
此效果可消除音频中的声学回声和反馈,从而提高双向音频质量。
在本指南中,术语 声学回声消除 与 AEC(在 API 中称为 aec
)互换使用。
当麦克风(也称为近端麦克风)拾取来自扬声器的音频信号并将其发送回原始接收者时,会发生声学回声。原始接收者会听到自己延迟的声音与目标信号混合在一起,这使得通信难以理解。声学回声消除效果 (AEC) 可消除/抑制音频中的这种延迟声音,也称为声学反馈/回声。此过程可提高录音的整体质量。
声学回声消除仅对近端麦克风回声有用。对于混响引起的回声,请使用房间回声消除效果(有关更多详细信息,请参阅关于房间回声消除/房间回声抵消效果)。
要在 Windows 上为此效果运行示例应用程序,请使用以下命令(有关更多信息,请参阅使用 Helper 批处理脚本运行示例应用程序)
:: For SDK Developer Package:
:: Format: run_effects_demo.bat <architecture> <effect> <input_sample_rate> <output_sample_rate>
:: 16k effect on turing GPU
run_effects_demo.bat turing aec 16k 16k
:: 48k effect on ampere GPU
run_effects_demo.bat ampere aec 48k 48k
:: For SDK Redistributable Package:
:: Format: run_effects_demo.bat <effect> <input_sample_rate> <output_sample_rate>
:: 16k effect
run_effects_demo.bat aec 16k 16k
:: 48k effect
run_effects_demo.bat aec 48k 48k
要在 Linux 上为此效果运行示例应用程序,请使用以下命令(有关更多信息,请参阅使用 Helper 脚本运行示例应用程序)
# Format: ./run_effect.sh -g gpu -s sample_rate -e aec
# 16k effect
./run_effect.sh -g t4 -s 16 -e aec
# 48k effect
./run_effect.sh -g t4 -s 48 -e aec
- 支持的输入/输出格式为 32 位浮点音频,采样率为 16kHz/48kHz。
- 在 Linux SDK 中,此效果具有以下最大吞吐量(实时支持的批次数量)
1.5.1. 使用声学回声消除效果
本节介绍使用 AEC 效果的步骤。
图 1. 基本 AEC 场景

- 近端麦克风信号(用 y 表示)。
- 远端麦克风信号(用 x 表示)。
远端扬声器信号 x 是原始接收者的麦克风信号。近端麦克风信号 (y
) 可以描述为近端语音信号 s 和远端扬声器 e 的回声信号的组合。效果的输出是近端语音信号 s’
,它是输入组合 s + e
,并消除了远端回声信号 e
:s' = (s + e 的混合) - es' = (s + e 的混合) - e
s' = (Mixture of s + e) - e
如果仅存在远端回声信号 e,并且近端信号 s 静音,则此效果的输出将为静音。
当 AEC 效果集成到会议应用程序服务器中时,需要批量运行多个数据流,每个扬声器一个数据流。考虑图 2 中的场景,其中 s(1) 对应于 AEC 批次 1,s(2) 对应于批次 2:AEC 效果采用以下输入:
- 近端麦克风信号(用
y
表示)。 - 远端麦克风信号(用
x
表示)。
远端扬声器信号 x 是原始接收者的麦克风信号。近端麦克风信号 (y) 可以描述为近端语音信号 s 和远端扬声器 e 的回声信号的组合。效果的输出是近端语音信号 s',它是输入组合 s + e,并消除了远端回声信号 e
s' = (Mixture of s + e) - e
如果仅存在远端回声信号 e,并且近端信号 s 静音,则此效果的输出将为静音。
当 AEC 效果集成到会议应用程序服务器中时,需要批量运行多个数据流,每个扬声器一个数据流。考虑图 2 中的场景,其中 s(1)
对应于 AEC 批次 1
,s(2)
对应于批次2
:
图 2. 批量音频处理

- 应用程序服务器接收来自扬声器 A y(1) 的麦克风录音。
- 应用程序服务器将 y(1) 传递给 AEC 批次 (1)。
静音作为远端语音信号 x(1) 传递到效果,因为服务器尚不具有远端语音。
- 效果产生处理后的音频 s'(1),并将其传递给扬声器 B。
- 扬声器 B 将近端音频 y(2) 发送到应用程序服务器。
此数据由语音 (s(1)) 和扬声器上播放的音频 (e(2)) 组成。
- 应用程序服务器使用 y(1) 作为近端音频来处理批次 (2),并将从步骤 3 接收到的 s'(1) 作为远端音频。
这与服务器上播放的音频相同。
- 来自批次 s'(2) 的输出传递给扬声器 A。
有关 AEC 效果所需的设置,请参阅设置音频效果的参数。
本节提供有关安装 Windows SDK 的硬件和软件要求的信息。
2.1. 硬件和软件要求
音频效果 SDK 需要特定的 GPU、特定版本的 Windows 操作系统和其他软件依赖项。
2.1.1. 硬件要求
SDK 在具有 Tensor Core 的 NVIDIA GPU 上受支持。
2.1.2. 软件要求
NVIDIA CUDA® 和 NVIDIA TensorRT™ 依赖项与 SDK 安装程序捆绑在一起(请参阅安装 Windows 版音频效果 SDK)。
音频效果 SDK 专为客户端应用程序集成和本地部署而设计和优化。我们不正式支持在数据中心/云环境中测试、实验、部署此 SDK。
使用 SDK 所需的所有库都在包的 external
下,无需单独安装。
2.2. 安装 Windows 版音频效果 SDK
Windows 版音频效果 SDK 分发为以下部分
- 一个开发者包,其中包含 AI 模型、二进制文件、头文件和示例应用程序。
- 一个可再发行包,其中仅包含 AI 模型和二进制文件。
此包简化了最终用户计算机上 SDK 的安装和使用。
要使用音频效果 SDK 开发应用程序,您必须安装开发者包,并在编译和链接期间提供此包的路径。您的应用程序将使用 SDK 标头公开的 SDK 函数,并动态链接到提供的库。在部署期间,可再发行包安装程序有助于安装必要的运行时组件。为了帮助您的应用程序访问最终用户计算机上的运行时组件,在安装可再发行包后,安装程序将完成以下任务:
- 将 AI 模型和二进制文件复制到安装位置。
- 设置
NVAFX_SDK_DIR
环境变量,该变量指向可再发行包的安装目录,并包含 AI 模型和二进制文件。您的应用程序需要使用此环境变量来查找和加载二进制文件和 AI 模型。
2.3. 音频效果 SDK 示例应用程序
该示例包括可以直接执行的应用程序 effects_demo.exe
,以及可以可选地编译和运行的相应 effects_demo.cpp
源文件。
2.3.1. (可选)构建示例应用程序
要构建示例应用程序
- 启动 CMake GUI 并指定源文件夹和二进制文件的构建文件夹。
- 对于源文件夹,请确保路径以
package
结尾。 - 对于构建文件夹,请确保路径以
package/build
结尾。
- 对于源文件夹,请确保路径以
- 使用 CMake 配置并生成 Visual Studio 解决方案文件。
- 单击配置。
- 当提示您确认 CMake 是否可以创建构建文件夹时,单击确定。
- 为了使 CMake 能够找到 CUDA 编译器,请为生成器选择 Visual Studio,为平台选择 x64。
- 要完成配置 Visual Studio 解决方案文件,请单击完成。
- 要生成 Visual Studio 解决方案文件,请单击生成。单击打开项目以打开项目。
- 使用 Visual Studio 从上一步生成的解决方案文件生成应用程序二进制文件 (
.exe
)。- 在 CMake 中,要打开 Visual Studio,请单击打开项目。
- 在 Visual Studio 中,选择构建 > 构建解决方案。
2.3.2. 运行示例应用程序
要运行应用程序,请在命令提示符窗口中输入以下命令
effects_demo.exe -c config-file
其中 -c <i>config-file</i>
指定效果示例配置文件 的路径,例如,denoise48k_cfg_turing.txt
,该文件随示例应用程序一起提供。
可以使用 run_effects_demo.bat
动态生成其他效果的配置。有关更多信息,请参阅 samples/effects_demo
文件夹中的 readme.txt
。SDK 开发者包还包括以下用于 48k 降噪器模型的示例 Windows 批处理/配置文件
# 48k effect
run_denoiser_48k_ada.bat //for ADA based GPU architecture
run_denoiser_48k_ampere.bat //for Ampere based GPU architecture
run_denoiser_48k_turing.bat //for Turing based GPU architecture
SDK 可再发行包包括以下用于 48k 降噪器模型的示例 Windows 批处理/配置文件
# 48k effect
run_denoiser_48k.bat
以下示例运行 effects_demo.exe
示例应用程序
effects_demo.exe -c denoise48k_cfg_turing.txt
配置文件包含以下参数,每行一对
-
effect <i>effect</i>
- 指定将应用的效果,例如,denoiser。有关支持效果的完整列表,请参阅NVIDIA 音频效果 SDK 简介。
-
model <i>model-file</i>
-
指定将在示例应用程序中使用的模型文件的路径,例如,
denoiser_48k.trtpkg
。注意模型(以前在 SDK 版本的
bin/models
文件夹中)已移动到samples/effects_demo/models
文件夹。
-
input_wav <i>input-audio-file</i>
-
指定要使用的噪声输入音频
.wav
文件的路径,例如,noisy_48k.wav
。该文件应包含单声道音频,格式为带基本 WAV 标头的有符号 16 位或 32 位浮点格式。注意示例输入(以前在 SDK 版本的
samples/effects_demo
文件夹中)已移动到samples/effects_demo/input_files
文件夹。
-
input_farend_wav input-farend-audio-file
- 指定要使用的远端输入音频 .wav 文件的路径,例如,farend_48k.wav。注意
注意示例输入音频文件包含在示例应用程序中。
-
output_wav <i>output-audio-file</i>
- 指定示例应用程序将在其中写入处理后的音频输出的文件路径,例如,
denoised_48k.wav
。注意仅支持
.wav
文件格式。
-
intensity_ratio <i>intensity-ratio</i>
- 指定效果强度比。此参数的值范围为
0.0f
到1.0f
,其中值越高表示噪声/混响抑制越强。0.0f
值等效于输入音频的直通。 -
real_time <i>enable</i>
- 模拟实时音频输入,设置为 1 以启用或 0 以禁用(默认禁用)。启用此选项后,每个音频帧将以 10 毫秒的延迟传递到 SDK,类似于从物理设备或流接收音频的方式。
-
enable_vad <i>enable</i>
-
指定是否启用语音活动检测 (VAD) 算法。
设置为
1
以启用或0
以禁用。(默认情况下,此参数已禁用。)启用此选项后,示例应用程序会将每个音频帧传递给 VAD 算法以检查语音活动,并将没有语音活动的帧归零。
2.3.2.1. 在 Windows 上使用 Helper 批处理脚本运行示例应用程序
run_effects_demo.bat
是一个 Windows 批处理文件,可用于运行各种效果的示例应用程序。此脚本为指定的效果、GPU 和该效果的示例输入生成配置文件,并在示例文件上运行 effect_demo.exe
。
要将效果应用于自定义输入文件,请将输入文件放置在与效果/采样率对应的输入示例文件夹中,然后运行 helper 脚本。这将生成一个配置文件,以将效果应用于这些输入,并使用此文件运行 effect_demo.exe
。处理后的音频输出将放置在与效果/输出采样率对应的输出文件夹中。
例如,要将背景噪声消除(降噪器效果)应用于自定义 48kHz 文件,请将文件复制到 input_files/denoiser/48k
并运行 run_effects_demo.bat
。处理后的输出将在 output_files/denoiser/48k
中生成。
有关更多信息,请参阅 SDK 中 samples/effects_demo
文件夹中的 readme.txt。
对于 SDK 开发者包,可以使用以下命令运行效果
run_effects_demo.bat <architecture> <effect> <input_sample_rate> <output_sample_rate>
其中
-
architecture
:GPU 支持的架构 -
支持的值为
turing
、ampere
和ada
。 -
effect
:要应用的效果 -
支持的值为
denoiser
、dereverb
、ndereverb
、denoiser
、aec
和superres
。 -
input_sample_rate
:效果的输入采样率 -
支持的值为
8k
、16k
和48k
。 -
output_sample_rate
:效果的输出采样率 -
支持的值为
16k
和48k
。
例如,要在 ADA 上运行 16kHz AEC 效果,请运行 run_effects_demo.bat ada aec 16k 16k
。
有关更多信息,请参阅 SDK 中 samples/effects_demo
文件夹中的 readme.txt。
对于 SDK 可再发行包,NVIDIA 为每个 GPU 架构提供单独的安装程序,可以使用以下命令运行效果
run_effects_demo.bat <effect> <input_sample_rate> <output_sample_rate>
其中
-
effect
:要应用的效果 -
支持的值为
denoiser
、dereverb
、dereverb_denoiser
、aec
和superres
。 -
input_sample_rate
:效果的输入采样率 -
支持的值为 8k、16k 和 48k。
-
output_sample_rate
:效果的输出采样率 -
支持的值为 16k 和 48k。
例如,要运行 16kHz AEC 效果,请运行 run_effects_demo.bat ada aec 16k 16k
。
2.3.3. 链式效果
本节介绍如何在链中运行效果。
effects_demo
示例应用程序还提供了配置文件,其中多个效果在链中运行(有关更多信息,请参阅在链中运行多个效果)。例如,以下命令在 turing GPU 上对输入音频运行 16kHz 到 48kHz 超分辨率效果,然后运行 48kHz 降噪器效果
对于 SDK 开发者包
run_effects_demo.bat turing superres 16k 48k denoiser 48k 48k
对于 SDK 可再发行包
run_effects_demo.bat superres 16k 48k denoiser 48k 48k
要在链中运行效果,配置文件使用的语法类似于运行单个效果时使用的语法,但有以下更改
-
effect <i>effect-1,effect-2</i>
- 指定要用于链接的顺序效果。有关可能的链接组合的更多信息,请参阅运行多个音频效果链。注意
链式效果仅支持超分辨率和降噪器/去混响以及组合的降噪器+去混响的组合。不支持其他效果链。如果组合降噪器效果和去混响效果,请使用组合的降噪器+去混响模型(有关更多信息,请参阅关于房间回声抵消 + 背景噪声抑制效果)。
-
model <i>model-file-1,model-file-2</i>
- 指定将在示例应用程序中使用的顺序模型文件的路径,例如,
superres_16kto48k.trtpkg,denoiser_48k.trtpkg
。 -
intensity_ratio <i>intensity-ratio-1,intensity-ratio-2</i>
- 指定特效的强度比率。此参数的值范围为 0.0f 到 1.0f,其中值越高表示对噪声/混响的抑制越强。值为 0.0f 等效于输入音频的直通。
2.3.3.1. 使用辅助脚本运行用于链接的示例应用程序
用户可以根据需要修改 SDK 提供的示例 config/batch 文件,并将它们与 effect_demo.exe
一起使用。
要对自定义输入文件应用特效,请将输入文件放置在与特效/采样率对应的输入示例文件夹中,并运行辅助脚本。处理后的音频输出将放置在与特效/输出采样率对应的输出文件夹中。
例如,要在自定义 48kHz 文件上应用背景噪声消除特效,请将文件复制到 input_files/denoiser/48k
文件夹,然后运行 run_effects_demo.bat
。处理后的输出将生成在 output_files/denoiser/48k
文件夹中。
要对 16k 文件应用背景噪声消除(降噪器特效)+ Superres 特效,请将文件复制到 input_files/chaining/denoiser/16k
文件夹,然后运行 run_effects_demo.bat
。输出将生成在 output_files/chaining/denoiser16k_superres16kto48k
文件夹中。
对于 SDK 开发者包,可以使用以下命令通过辅助脚本运行链接特效
run_effects_demo.bat <architecture> <effect_1> <input_sample_rate_1> <output_sample_rate_1> <effect_2> <input_sample_rate_2> <output_sample_rate_2>
其中
-
architecture
:GPU 支持的架构。 -
支持的值为
turing
、ampere
和ada
。 -
effect_1
:要应用的第一个特效。 -
支持的值为
denoiser
、dereverb
、dereverb_denoiser
和superres
。 -
input_sample_rate_1
:第一个特效的输入采样率。 -
支持的值为
8k
、16k
和48k
。 -
output_sample_rate_1
:第一个特效的输出采样率。 -
支持的值为
16k
和48k
。 -
effect_2
:要应用的第二个特效。 -
支持的值为
denoiser
、dereverb
、dereverb_denoiser
和superres
。 -
input_sample_rate_2
:第二个特效的输入采样率。 -
支持的值为
8k
、16k
和48k
。 -
output_sample_rate_2
:第二个特效的输出采样率。 -
支持的值为
16k
和48k
。
有关更多信息,请参阅 SDK 中 samples/effects_demo
文件夹中的 readme.txt。
对于 SDK 可再发行软件包,由于为每个受支持的 GPU 架构都提供了单独的安装程序,因此可以使用以下命令通过辅助脚本运行链接特效
run_effects_demo.bat <effect_1> <input_sample_rate_1> <output_sample_rate_1> <effect_2> <input_sample_rate_2> <output_sample_rate_2>
其中
-
effect_1
:要应用的第一个特效 -
支持的值为
denoiser
、dereverb
、dereverb_denoiser
和superres
。 -
input_sample_rate_1
:第一个特效的输入采样率 -
支持的值为
8k
、16k
和48k
。 -
output_sample_rate
:第一个特效的输出采样率 -
支持的值为
16k
和48k
。 -
effect_2
:要应用的第二个特效 -
支持的值为
denoiser
、dereverb
、dereverb_denoiser
和superres
。 -
input_sample_rate_2
:第二个特效的输入采样率 -
支持的值为
8k
、16k
和48k
。 -
output_sample_rate_2
:第二个特效的输出采样率 -
支持的值为
16k
和48k
。
本节提供有关硬件和软件要求以及安装 Linux SDK 的信息。
3.1. 硬件和软件要求
音频特效 SDK 需要特定的 GPU、特定版本的 Linux 操作系统以及其他软件依赖项。
3.1.1. 硬件要求
音频特效 SDK 在具有至少 10 GB RAM 和带有 Tensor Core 的 NVIDIA GPU 的系统上受支持。
硬件 | 所需版本 |
---|---|
GPU | 带有 Tensor Core 的 GPU:
注意
NVIDIA® Ada GPU 架构和 NVIDIA® Hopper 架构目前不支持 Linux SDK。
注意
SDK 仅在 NVIDIA Tesla® A30 和 A100 上支持 Multi-Instance GPU (MIG)。 启用 MIG 后,无论 SDK 是在特定的 GPU 实例上还是在整个 GPU 上执行,都必须定义 GPU 实例和相应的计算实例。
|
为了在使用 NVIDIA T4 和其他服务器 GPU 时获得最佳性能,请确保您使用的服务器满足这些类型产品的散热和气流要求。有关合格服务器的最新列表,请参阅合格服务器目录。
3.1.2. 软件要求
SDK 具有以下要求
软件 | 所需版本 |
---|---|
Linux 发行版 | 64 位 Linux 发行版
|
NVIDIA Linux 图形驱动程序 | 520.61.05 或更高版本 450/470 可以与 NVIDIA CUDA® 向前兼容升级一起使用。有关更多信息,请参阅使用旧驱动程序 (450/470) 和 CUDA 向前兼容升级。 |
CUDA/NVIDIA TensorRT™/NVIDIA CUDA 深度神经网络 (cuDNN) 注意
使用 SDK 所需的所有库都在
|
|
Linux SDK 专为服务器端(数据中心/云)部署而设计和优化。
正式不支持在此用例之外使用此 SDK 进行这些 SDK 的测试、实验和生产部署。
3.2. 安装音频特效 SDK for Linux
要使用音频特效 SDK 开发应用程序,请从 SDK 软件包中提取文件,并在编译和链接期间提供提取的库的路径。示例应用程序也与 SDK 捆绑在一起(源代码/预构建的二进制文件)。
要安装 SDK,请将音频特效 SDK 存档的内容提取到计算机上的所需位置,例如,使用以下命令
tar xvf Audio_Effects_SDK.tar.gz
3.2.1. 使用旧驱动程序 (450/470) 和 CUDA 向前兼容升级
应用程序可以通过使用 CUDA 向前兼容升级路径(有关更多信息,请参阅CUDA 向前兼容升级路径)来使用带有旧驱动程序 (450/470) 的 SDK。
要将旧版支持的驱动程序与 SDK 一起使用,请从以下位置之一下载用户模式 CUDA 库 (libcuda.so.*
) 和 PTX 文件的 JIT 编译器库 (libnvidia-ptxjitcompiler.so.*
):
- CUDA 11.8 工具包/数据中心驱动程序。
- CUDA 网络存储库 (
cuda-compat-11.8
)。
在使用 SDK 运行应用程序之前,请确保 LD_LIBRARY_PATH
包含包含这些库的位置。
例如,要在带有旧驱动程序的 Ubuntu 18.04 系统上使用 CUDA 网络存储库
- 要将 CUDA 存储库添加到您的系统,请转到 CUDA Toolkit 11.8 下载:
- 在操作系统下,单击Linux。
- 在发行版下,单击Ubuntu。
- 在安装程序类型下,单击 deb (network)。
- 要将 CUDA 存储库添加到系统,请按照安装说明下的步骤操作。
- 更新
apt
存储库缓存。$ sudo apt-get update
- 安装兼容性软件包。
$ sudo apt-get install -y cuda-compat-11-8
此步骤中的命令会将兼容性软件包库安装到
/usr/local/cuda-11.8/compat
文件夹中。 - 在运行 SDK 应用程序时,将此路径附加到
LD_LIBRARY_PATH
。# Add path to LD_LIBRARY_PATH # Note: This command works only for the current terminal session, please add to ~/.bashrc or similar to make this permanent. For further details, # refer to your distribution's documentation. $ export LD_LIBRARY_PATH=/usr/local/cuda-11.8/compat:$LD_LIBRARY_PATH # Run application $ ./effects_demo -c t4_denoise48k_1_cfg.txt
有关更多信息,请参阅CUDA 向前兼容升级路径。
3.3. 示例应用程序
SDK 提供了以下示例应用程序
effects_demo
effects_delayed_streams_demo
这些应用程序包括源代码 (effects_demo.cpp/effects_delayed_streams_demo.cpp
) 和预构建的二进制文件。
3.3.1. effects_demo 应用程序
此应用程序演示了如何使用 SDK 将特效应用于音频。
3.3.1.1. (可选)构建应用程序
要构建应用程序
- 导航到 samples/effects_demo 目录。
- 可选:要编译应用程序而不是运行预构建的二进制文件,请运行
make
命令。:/Audio Effects SDK/samples/effects_demo$ make
3.3.1.2. 运行应用程序
可以使用 run_effect.sh
辅助脚本或直接使用 effects_demo
可执行文件来运行示例应用程序。
3.3.1.2.1. 使用辅助脚本运行示例应用程序
run_effect.sh
辅助脚本是 effects_demo
应用程序的包装器。
根据传递给 run_effect.sh
的参数,脚本会生成一个临时配置文件,并使用此配置文件运行 effects_demo
应用程序。可以使用以下命令运行辅助脚本
./run_effect.sh -g gpu -e effect -s input_sample_rate -o output_sample_rate -b batch_size
例如,要在 T4 上运行批处理大小为 10 的 16k 降噪器特效的示例应用程序,请运行以下命令
./run_effect.sh -g t4 -s 16 -b 10 -e denoiser
此命令会在 /tmp/tmp_cfg.txt
中生成一个包含上述配置的配置文件。
使用以下脚本之一运行应用程序
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g v100 -s 16 -b 1 -e denoiser
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g v100 -s 48 -b 1 -e dereverb
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g v100 -s 16 -b 400 -e denoiser
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g v100 -s 48 -b 400 -e dereverb_denoiser
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g v100 -s 48 -b 400 -e aec
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g v100 -s 8 -o 16 -b 400 -e superres
或
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g t4 -s 16 -b 1 -e denoiser
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g t4 -s 48 -b 1 -e dereverb
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g t4 -s 16 -b 400 -e denoiser
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g t4 -s 48 -b 400 -e dereverb_denoiser
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g t4 -s 48 -b 400 -e aec
:/Audio Effects SDK/samples/effects_demo$ ./run_effect.sh -g t4 -s 8 -o 16 -b 96 -e superres
确保应用程序使用正确版本的 TensorRT(需要确切版本)/CUDA 库(需要确切版本或更高版本)。有关所需版本,请参阅软件要求。SDK 在 external/cuda/lib
下包含所有必需的库。如果发行版/操作系统从 ~/.bashrc
或类似文件导出 LD_LIBRARY_PATH
,或者外部库被移动到不同的文件夹结构,则 SDK 加载的 TensorRT 和 CUDA 库的路径可能会被覆盖。因此,SDK 可能会加载不兼容的 CUDA/TensorRT 库版本并返回错误。(可以使用 ltrace
/strace
/类似工具验证加载的库 - 某些库是动态加载的,因此 ldd/类似工具可能无法显示完整结果)。为避免此问题,在运行示例程序之前,通过执行以下命令将外部目录附加到 LD_LIBRARY_PATH
:$ export LD_LIBRARY_PATH=external/cuda/lib:$LD_LIBRARY_PATH
示例应用程序可能会达到 Linux 内核默认强制执行的最大打开文件数限制,尤其是在批处理大小较大时。发生这种情况时,示例应用程序将退出并显示以下错误消息:[Error] Unable to read wav file: ../input_files/denoiser/48k/Fan_48k.wav.
打开文件数限制已达到。要增加此限制,请在运行示例应用程序之前,在同一 shell 中使用 ulimit
命令来增加打开文件数。例如,ulimit -n 20000
会将该 shell 的打开文件数限制增加到 20,000。有关更多信息,请参阅您的发行版关于如何增加打开文件描述符限制的文档。
-i/--input-file (default: Not specified)
指定要在其上运行特效的输入文件/文件夹。如果未指定此参数,辅助脚本将使用 SDK 分发的示例文件,这些文件位于
samples/input_files
目录中。如果此参数指定了文件/文件夹,辅助脚本将使用此文件/此文件夹中的文件。支持的值是正确格式的输入文件的路径(有关更多信息,请参阅直接运行示例应用程序),或包含正确格式的多个输入文件的文件夹。如果指定了文件夹,则只会处理位于文件夹顶层的文件。例如,如果输入文件夹是 folder1,则将处理
folder1/a.wav
、folder1/b.wav
等,而不会处理folder1/subfolder/a.wav
。-g / --gpu (default=t4)
指定要在其上运行特效的 GPU。支持的选项有
a2
、v100
、a16
、a100
、a10
、t4
、a30
和a40
。辅助脚本根据此参数的值选择合适的模型。如果未指定模型,则默认值为
t4
。-e / --effect (default=denoiser)
指定是使用denoiser
、dereverb
、dereverb_denoiser
、aec
还是superres
。如果未指定特效,则默认值为 denoiser。
-s / --sample_rate (default=16)
指定输入音频的采样率,单位为 kHz。支持的选项有
48
、16
或8
。如果未指定速率,则默认值为16
。- (仅限超分辨率)
-o / --output_sample_rate (default=16)
指定输出音频的采样率。如果未指定速率,则默认值为
16
。 -b / --batch_size (default=1, max=1024)
指定要使用的批处理大小。脚本会生成一个输入文件列表和相应的输出文件列表,其大小等于批处理大小。输入文件列表取自 SDK 提供的示例输入文件(来自
samples/input_files
)。如果未指定批处理大小,则默认值为
1
。-c / --cfg-file (default=/tmp/tmp_cfg.txt)
指定临时配置文件的写入路径。如果未指定路径,则默认位置为
/tmp/tmp_cfg.txt
。-f / --frame_size (default=10)
指定要使用的帧大小(10 或 20),单位为毫秒。如果未指定帧大小,则默认值为
10
。-h / --help
打印此脚本支持的参数。
3.3.1.2.2. 直接运行示例应用程序
要直接运行示例应用程序,请运行以下命令
./effects_demo -c config-file
其中 -c config-file
指定示例配置文件的路径,例如 t4_denoise48k_1_cfg.txt
。示例配置文件与示例应用程序一起提供。
示例应用程序使用的配置文件可以使用 run_effects.sh
脚本生成,该脚本接受由 -c
或 --cfg-file
标志指定的路径。如果指定了此路径,脚本会将具有指定配置参数的配置文件写入该路径。此配置文件可以由 effects_demo
示例应用程序重复使用。
例如,以下命令会将配置写入 t4_aec.cfg:./run_effect.sh -e aec -s 48 -g t4 -c t4_aec.cfg
文件。
例如,要在 T4 GPU 上以批处理大小为 1 对 48kHz 流进行降噪,请运行
./effects_demo -c t4_denoise48k_1_cfg.txt
配置文件包含参数及其值的对,每行一对。当前,支持以下参数
-
reset <i>list-of-stream-ids</i>
- 指定要重置的流标识符,从 1 开始。多个标识符用空格分隔。
-
effect <i>effect-name</i>
- 指定要应用的特效的名称。支持的特效有
denoiser
、dereverb
、dereverb_denoiser
、aec
和superres
。 -
sample_rate <i>audio-sample-rate</i>
- 指定音频的采样率,单位为 Hz。支持的值为 8000、16000 和 48000。
-
model <i>model-file</i>
- 指定要在示例应用程序中使用的模型文件的路径,例如,
models/sm_70/denoiser_48k_1152.trtpkg
。模型文件应与sample_rate
参数中指定的音频采样率和input_wav_list
参数中指定的输入 wav 文件数量相匹配(有关更多信息,请参阅设置音频特效的参数)。 -
frame_size <i>frame-size-value-in-milliseconds</i>
- 指定要在
NvAFX_Run()
调用中使用的输入帧大小(以毫秒为单位)。支持的值为 10 和 20。 -
input_wav_list <i>input-audio-file-list</i>
-
指定要使用的输入噪声音频
.wav
文件的路径列表。每个文件应包含单声道音频,格式为有符号 16 位或 32 位浮点,并带有基本 WAV 标头。多个文件用空格分隔。输入文件的数量必须与流/批处理大小的数量相匹配。在一个流中,用分号 (;) 分隔的文件在同一流中按顺序处理。此外,如果流 ID 存在于重置列表中,则在文件之间切换时,会在流标识符上调用NvAFX_Reset
。例如,以下配置指定流 1、2 和 4 使用 file1.wav、file2.wav 和 file6.wav 作为流的输入,流 3 使用多个文件 (file3.wav、file4.wav、file5.wav) 作为流的输入
input_wav_list file1.wav file2.wav file3.wav;file4.wav;file5.wav file6.wav
注意示例输入音频文件包含在示例应用程序的
samples/input_files/16k
和samples/input_files/48k
目录中。
-
input_farend_wav_list <i>input-farend-audio-file-list</i>
- (仅限 AEC)指定要用作远端音频的输入噪声音频 .wav 文件的路径列表。此列表中的每个条目都与 input_wav_list 中指定的近端输入相匹配,并且此文件中的音频样本数必须与相应的近端输入文件中的样本数相同。
-
output_wav_list <i>output-audio-file-list</i>
-
指定要将输出音频写入的文件。输出文件包含 32 位浮点格式的单声道音频。多个文件用空格分隔。在一个流中,如果指定了多个输入文件(用分号分隔),则将创建多个输出文件,文件名相同,后跟
_1
、_2
等。例如,在以下配置中,输出将写入
out1.wav
(file1.wav
的输出)、out2.wav
(file2.wav
的输出)、out3.wav
(file3.wav
的输出)、out3_1.wav
(file4.wav
的输出)、out3_2.wav
(file5.wav 的输出)和out4.wav
(file6.wav
的输出)。input_wav_list file1.wav file2.wav file3.wav;file4.wav;file5.wav file6.wav output_wav_list out1.wav out2.wav out3.wav out4.wav
注意在输入/输出
.wav
文件中,仅支持基本 WAV 标头。
-
real_time <i>enable</i>
- 模拟实时音频输入,设置为 1 以启用,设置为 0 以禁用(默认为禁用)。启用此选项后,每个音频帧都会延迟传递到 SDK,就像从物理设备或流接收音频一样。例如,如果帧大小为 10 毫秒,则每 10 毫秒传递一个帧,就像从麦克风接收音频一样(大约每 10 毫秒从麦克风接收 10 毫秒的音频)。
-
intensity_ratio <i>ratio</i>
- 指定降噪强度比率。此参数的值范围为
0.0
到1.0
(含),其中值越高表示对噪声/混响的抑制越强。0.0
的值等效于输出输入音频而不应用噪声消除/去混响。
3.3.1.3. 链接特效
此示例应用程序还支持链接多个特效(有关更多信息,请参阅链接运行多个音频特效)。
要在链接模式下运行应用程序,请使用 run_effect_chained.sh
./run_effect_chained.sh -g gpu -e1 effect1 -s1
input_sample_rate_1 -o1 output_sample_rate_1 -e2 effect2 -s2
input_sample_rate_2 -o2 output_sample_rate_2 [-c
path_to_save_config_file] [-i input_file_or_folder]
此脚本生成一个配置文件,该文件可以与 effects_demo
示例一起使用,以链接运行多个特效,并使用此文件运行应用程序。
例如,要在 A16 上运行批处理大小为 20 的降噪器 16k + 超分辨率 16k->48k 链的应用程序,请使用以下命令
./run_effect_chained.sh -g a16 -e1 denoiser -s1 16 -o1 16 -e2 superres -s2 16 -o2 48 -b 20
有关链接特效的受支持组合列表,请参阅创建链接音频特效。
用于链接的配置文件遵循与 effects_demo
相同的格式和参数,但有以下修改
-
effect <i>effect-name-1 effect-name-2</i>
- 指定要应用于输入音频的特效名称(effect-name-1 将首先应用于输入音频,effect-name-2 将应用于此输出)。有关可能的链接组合的更多信息,请参阅创建链接音频特效。注意
链接特效仅支持超分辨率与降噪器/去混响和组合的降噪器+去混响特效的组合。不支持其他特效链。如果要组合降噪器特效和去混响特效,请使用组合的降噪器+去混响模型(有关更多信息,请参阅关于房间回声消除 + 背景噪声抑制特效)。
-
sample_rate <i>audio-sample-rate-1 audio-sample-rate-2</i>
- 指定特效的音频输入采样率,单位为 Hz。支持的值为 8000、16000 和 48000。
-
model <i>model-file-1 model-file-2</i>
- 指定特效要使用的模型文件的路径,例如 models/sm_70/denoiser_48k_1152.trtpkg。模型文件应与
sample_rate
参数中指定的音频采样率和input_wav_list
参数中指定的输入 wav 文件数量相匹配(有关更多信息,请参阅设置音频特效的参数)。 -
intensity_ratio <i>intensity-ratio-1 intensity-ratio-2</i>
- 指定特效的强度比率。此参数的值范围为 0.0f 到 1.0f,其中值越高表示对噪声/混响的抑制越强。值为 0.0f 等效于输入音频的直通。
-
chained_effect_gpu_list <i>gpu-1 gpu-2</i>
- 在多 GPU 系统中,指定将用于链中第一个和第二个特效的 GPU 设备 ID。
-
-i/--input-file (default: Not specified)
-
指定要在其上运行特效的输入文件/文件夹。
默认情况下,辅助脚本将使用 SDK 分发的示例文件(在
samples/input_files
中)。用户还可以选择提供包含要处理的文件的文件/文件夹,方法是使用此参数。此参数的受支持值是正确格式的输入文件的路径(有关更多信息,请参阅直接运行示例应用程序),或包含正确格式的多个输入文件的文件夹。如果指定了文件夹,则只会处理文件夹顶层存在的文件。例如,如果输入文件夹是
folder1
,则将处理folder1/a.wav
、folder1/b.wav 等,但不会处理folder1/subfolder/a.wav
。
3.3.2. effects_delayed_streams_demo 应用程序
此应用程序演示了处理延迟流的用例(有关延迟流的更多信息,请参阅在延迟流上运行音频特效)。在此示例中,每个输入流都属于以下类别之一
-
one_step_delay_streams
- 这些流具有 1 帧的延迟。例如,如果帧大小为 10 毫秒,则这些流将具有 10 毫秒的延迟。这意味着这些流将在每个交替迭代中处于活动状态,并且当流处于活动状态时,它们将接收两个帧(20 毫秒)的数据。因此,当来自这些流的数据到达时,应调用
NvAFX_Run
两次,一次使用延迟数据,一次使用当前数据。 -
two_step_delay_streams
- 这些流具有 2 帧的延迟。例如,如果帧大小为 10 毫秒,则这些流将具有 20 毫秒的延迟。这意味着这些流将在每两次迭代后处于活动状态,并且当流处于活动状态时,它们将接收三个迭代(30 毫秒)的数据。因此,当来自这些流的数据到达时,应调用
NvAFX_Run
三次,两次使用延迟数据,一次使用当前数据。 -
always_active_streams
-
这些流没有延迟并且始终处于活动状态,每次迭代调用一次
NvAFX_Run
。
NvAFX_Run()
调用基于上述描述进行,以生成处理后的音频输出。配置文件提供了一个参数来指定 one_step_delay_streams
和 two_step_delay_streams
(有关更多信息,请参阅运行应用程序)。这些值和批处理大小用于推断 always_active_streams
列表。
3.3.2.1. (可选)构建应用程序
要构建应用程序
- 导航到 samples/effects_delayed_streams_demo 目录。
- 要编译应用程序,请运行 make 命令。
:/Audio Effects SDK/samples/effects_delayed_streams_demo$ make
3.3.2.2. 运行应用程序
可以使用 run_effect.sh
辅助脚本或直接使用 effects_delayed_streams_demo
可执行文件来运行示例应用程序。
3.3.2.2.1. 使用辅助脚本运行示例应用程序
run_effect.sh
辅助脚本是 effects_delayed_streams_demo
应用程序的包装器,其运行方式与 effects_demo
中的辅助脚本类似(有关更多信息,请参阅使用辅助脚本运行示例应用程序)。
此脚本支持 10 个流,这些流始终预配置为活动流、具有一步延迟的流和具有两步延迟的流。除了指定的 run_effects.sh 中的参数(请参阅使用辅助脚本运行示例应用程序)之外,此脚本还支持 -t / --all_streams_active
参数,该参数指定所有 10 个流始终处于活动状态。如果未指定此参数,则会将多个流配置为一步或两步延迟。
例如,要在 T4 上运行示例应用程序,使用 16k 降噪器特效,批处理大小为 10,并且所有流都处于活动状态,请运行以下命令
./run_effect.sh -g t4 -s 16 -b 10 -e denoiser -a
3.3.2.2.2. 直接运行示例应用程序
要运行示例应用程序,请运行以下命令
./effects_delayed_streams_demo -c config-file
其中 -c config-file
指定配置文件的路径,例如,t4_denoise48k_10_cfg.txt
。 例如
./effects_delayed_streams_demo -c t4_denoise48k_10_cfg.txt
应用程序随附提供了适用于 16kHz 和 48kHz 音频的示例配置文件。
与 effects_demo
类似,配置文件包含参数及其值对,每行一对。 除了 effects_demo
使用的配置参数之外,effects_delayed_streams_demo
还需要以下参数
-
one_step_delay_streams <i>list-of-stream-id</i>
- 指定属于
one_step_delay_streams
类别的流标识符,如上一节所述。 如果没有流属于此类别,则此值应设置为 none。 -
two_step_delay_streams <i>list-of-stream-id</i>
- 指定属于
two_step_delay_streams
类别的流标识符,如上一节所述。 如果没有流属于此类别,则此值应设置为none
。
3.3.2.3. 链式效果
此示例应用程序还支持链接多个效果(有关更多信息,请参阅 创建链式音频效果)。
要在链接模式下运行应用程序,请使用 run_effect_chained.sh
./run_effect_chained.sh -g gpu -e1 effect1 -s1
input_sample_rate_1 -o1 output_sample_rate_1 -e2 effect2 -s2
input_sample_rate_2 -o2 output_sample_rate_2 [-c path_to_save_config_file]
例如,要在 A100 上运行应用程序,使用降噪器 16k + 超分辨率 16k->48k 链,请使用以下命令
./run_effect_chained.sh -g a100 -e1 denoiser -s1 16 -o1 16 -e2 superres -s2 16 -o2 48
有关支持的链式效果组合列表,请参阅 创建链式音频效果。
此脚本使用的配置与用于 effects_demo
的配置相同(有关更多信息,请参阅 链式效果)。 该脚本还使用与 effects_delayed_streams_demo
使用的参数相同的参数(有关更多信息,请参阅 运行应用程序)。
音频效果 API 是一个 C API,但也可以与使用 C++ 构建的应用程序一起使用。
4.1. SDK 应用程序中的工作流程
以下部分介绍在应用程序中使用效果的典型工作流程。
此流程是示例程序(effects_demo
/ effects_delayed_streams_demo
(仅限 Linux))的简化版本。 相同的流程也用于链式效果,API 调用方面存在一些差异。
- 为效果创建效果句柄。
NvAFX_Handle handle; // Single effect NvAFX_Status status = NvAFX_CreateEffect(NVAFX_EFFECT_DENOISER, &handle); // OR, create a chained effect NvAFX_CreateChainedEffect(NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DENOISER_16k, &handle);
- 设置所需参数(模型、批量大小(仅限 Linux)、输入采样率(仅限 Linux))。
// Set model name // Single effect (can also use SetStringList with size 1) NvAFX_SetString(handle, NVAFX_PARAM_MODEL_PATH, "denoiser_48k.trtpgk"); // Chained effect NvAFX_SetStringList(handle, NVAFX_PARAM_MODEL_PATH, model_files, num_model_files); // Linux only: Set input sample rate, number of streams NvAFX_SetU32(handle, NVAFX_PARAM_INPUT_SAMPLE_RATE, 48000); NvAFX_SetU32(handle, NVAFX_PARAM_NUM_STREAMS, 20);
- 使用
NvAFX_SetU32/NvAFX_SetFloat
参数设置可选参数,例如强度比、使用默认 GPU、VAD 启用、Cuda Graph 启用/禁用(仅限 Windows)和延迟流启用/禁用(仅限 Linux)。- (仅限 Linux)可选地,设置每帧输入样本数。 可以使用
NvAFX_GetU32List
查询支持的输入采样率列表(请参阅获取效果的参数)。
有关更多信息,请参阅 在应用程序中使用音频效果 SDK。
- (可选)设置将在其上加载模型的 GPU。 有关更多信息,请参阅 使用多个 GPU。
- 加载模型。
NvAFX_Load(handle);
- 成功加载后,查询效果的输入/输出采样率、通道和每帧样本数。
// Sample rate NvAFX_GetU32(handle, NVAFX_PARAM_INPUT_SAMPLE_RATE, &input_sample_rate_); NvAFX_GetU32(handle, NVAFX_PARAM_OUTPUT_SAMPLE_RATE, &output_sample_rate_); // Channels NvAFX_GetU32(handle, NVAFX_PARAM_NUM_INPUT_CHANNELS, &num_input_channels_); NvAFX_GetU32(handle, NVAFX_PARAM_NUM_OUTPUT_CHANNELS, &num_output_channels_); // Samples per frame // Windows only NvAFX_GetU32(handle, NVAFX_PARAM_NUM_INPUT_SAMPLES_PER_FRAME, &num_input_samples_per_frame_); NvAFX_GetU32(handle, NVAFX_PARAM_NUM_OUTPUT_SAMPLES_PER_FRAME, &num_output_samples_per_frame_); // Linux only NvAFX_GetU32(handle, NVAFX_PARAM_NUM_SAMPLES_PER_INPUT_FRAME, &num_input_samples_per_frame_); NvAFX_GetU32(handle, NVAFX_PARAM_NUM_SAMPLES_PER_OUTPUT_FRAME, &num_output_samples_per_frame_);
- 对于每个输入样本,使用
NvAFX_Run
处理音频。NvAFX_Run(handle, input, output, num_input_samples_per_frame_, num_input_channels_);
- 如果音频处理中断(例如,批次被重用于不同的音频源),请使用
NvAFX_Reset
重置内部效果状态。// Windows only NvAFX_Reset(handle); // Linux only NvAFX_Reset(handle, states_array, input_wav_list.size());
- (仅限 Linux)在批处理期间,要临时暂停流(例如,如果该流的数据尚未就绪,但其他流的数据可用于处理),请根据需要使用
NVAFX_PARAM_ACTIVE_STREAMS
。
有关更多信息,请参阅 在延迟音频流上运行音频效果(仅限 Linux SDK)。 - 音频处理完成后,要释放资源,请使用
NvAFX_Destroy(handle)
。
4.1.1. 使用 SDK 构建应用程序
SDK 在 external/cuda/lib 中包含依赖库,这些库是编译和运行应用程序所必需的,并且不需要单独安装库。 有关使用 SDK 的应用程序的运行时要求,请参阅 Windows 音频效果 SDK 入门 或 硬件和软件要求 (Linux)。
4.1.1.1. 使用 Windows SDK 构建应用程序
要在 Windows 上使用 SDK 构建应用程序,请使用以下方法之一
- 通过使用
lib(NVAudioEffects.lib)
在 Visual Studio 中静态链接库。
有关更多信息,请参阅 构建示例应用程序。 - 通过使用 LoadLibrary/GetProcAddress 在运行时加载 SDK DLL。 例如,可以按以下方式调用 NvAFX_CreateEffect
typedef NvAFX_Status(*NVAFX_CREATEEFFECT)(NvAFX_EffectSelector, NvAFX_Handle*); HINSTANCE h = LoadLibraryW(L"NVAudioEffects.dll"); _NvAFX_CreateEffect = (NVAFX_CREATEEFFECT)GetProcAddress(h, "NvAFX_CreateEffect"); void *nv_handle; _NvAFX_CreateEffect(“denoiser”, &nv_handle); // Similarly for other APIs FreeLibrary(h);
TensorRT 的先前版本可能存在一个 bug,即在您卸载 SDK DLL 后,cuBLAS 不会被卸载,这可能会导致内存泄漏。 要解决此问题,请运行以下解决方法
int maxLoopCount = 5;
while (maxLoopCount--) {
HMODULE cublas_handle = GetModuleHandle(L"cublasLt64_11");
if (!cublas_handle) break;
if (FreeLibrary(cublas_handle) == false) break;
}
4.1.1.2. 使用 Linux SDK 构建应用程序
要在 Linux 上使用 SDK 构建应用程序,请使用以下方法之一
在编译时,链接到
libnv_audiofx.so
。
例如,使用 gccgcc -L"../../nvafx/lib" -l"nv_audiofx" -L"../../external/cuda/lib/" -I"../../nvafx/include" source.c
通过使用
dlopen
/dlsym
和设置正确的库路径(使用LD_LIBRARY_PATH
/类似路径)动态加载libnv_audiofx.so
。
有关更多信息,请参阅dlopen(3)
/dlsym(3)
手册页。注意某些版本的 TensorRT 可能会尝试动态加载
libcublas.so
。 默认情况下,较新版本的 CUDA 不会安装此库(仅安装libcublas.so.11
)。 因此,如果不使用external/cuda/lib
中的库,并且如果安装了先前版本的 CUDA,则 SDK 可能会加载不兼容版本的libcublas.so
,并完全无法加载效果。 可以使用ltrace
/strace
/类似工具来验证这一点,以检查 SDK 加载的库 - 请注意,ldd
/类似工具不会显示这一点,因为该库是动态加载的。要解决此问题,可以使用
external/cuda/lib
下的库(通过设置LD_LIBRARY_PATH
/类似路径),或者更正/创建指向正确libcublas.so
的符号链接(例如,通过执行ln -s /usr/local/cuda-11.8/lib64/libcublas.so.11 libcublas.so
并在LD_LIBRARY_PATH
中导出当前目录,使用export LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH
或等效命令)例如
// Typedefs for functions, similarly define for other functions as required typedef NvAFX_Status (*fnNvAFX_CreateEffect)(NvAFX_EffectSelector code, NvAFX_Handle* effect); // Load library and bind // Note: ensure that external/cuda/lib is in library path, or fix via RPATH/similar void* handle = dlopen("libnv_audiofx.so", RTLD_LAZY); assert(handle); fnNvAFX_CreateEffect f = (fnNvAFX_CreateEffect) dlsym(handle, "NvAFX_CreateEffect"); assert(f); // Call functions NvAFX_Handle effect; auto ret = f(NVAFX_EFFECT_DENOISER, &effect); assert(ret == NVAFX_STATUS_SUCCESS);
4.2. 创建音频效果
使用以下参数调用 NvAFX_CreateEffect()
函数
NvAFX_EffectSelector
类型NVAFX_EFFECT_DENOISER
、NVAFX_EFFECT_DEREVERB
、NVAFX_EFFECT_DEREVERB_DENOISER
、NVAFX_EFFECT_AEC
或NVAFX_EFFECT_SUPERRES
。- 指向存储新创建的音频效果句柄的位置的指针。
NvAFX_CreateEffect()
函数创建一个音频效果实例的句柄,以便在其他 API 调用中使用。
以下示例创建了一个降噪器音频效果
NvAFX_Status err = NvAFX_CreateEffect(NVAFX_EFFECT_DENOISER, &handle);
4.3. 创建链式效果
SDK 支持以链式方式运行多个效果,其中一个效果的输出作为第二个效果的输入传递,而无需执行不必要的预处理和后处理计算。 例如,SDK 可以链接降噪器和超分辨率效果,这将接收 16kHz 输入数据,消除音频中的噪声,并将音频升采样到 48kHz。
此过程比创建两个独立的音频效果对象并将第一个对象的输出传递给第二个对象更有效,并且该过程还避免了创建不必要的设备到主机和主机到设备副本。 SDK 模型支持以下效果链:
- 超分辨率效果(8kHz 到 16kHz)+ 背景噪声消除效果(16kHz)
- 超分辨率效果(8kHz 到 16kHz)+ 房间回声消除效果(16kHz)
- 超分辨率效果(8kHz 到 16kHz)+ 组合背景噪声消除/房间回声消除效果(16kHz)
- 背景噪声消除效果(16kHz)+ 超分辨率效果(16kHz 到 48kHz)
- 房间回声消除效果(16kHz)+ 超分辨率效果(16kHz 到 48kHz)
- 组合背景噪声消除/房间回声消除效果(16kHz)+ 超分辨率效果(16kHz 到 48kHz)
SDK 模型不支持其他效果链。 通过手动链接单个效果使用不支持的链可能会导致音频质量下降。
如果您组合使用降噪器效果和去混响效果,请使用组合的降噪器+去混响模型(有关更多信息,请参阅 关于房间回声消除 + 背景噪声抑制效果)。
要创建链式效果,请使用以下效果选择器之一调用 NvAFX_CreateChainedEffect
:
- 以下效果选择器之一:
NVAFX_CHAINED_EFFECT_DENOISER_16k_SUPERRES_16k_TO_48k
NVAFX_CHAINED_EFFECT_DEREVERB_16k_SUPERRES_16k_TO_48k
NVAFX_CHAINED_EFFECT_DEREVERB_DENOISER_16k_SUPERRES_16k_TO_48k
NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DENOISER_16k
NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DEREVERB_16k
NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DEREVERB_DENOISER_16k
指向存储新创建的音频效果句柄的位置的指针。
以下示例创建了一个链式音频背景噪声消除效果(16kHz)+ 超分辨率效果(16kHz 到 48kHz)效果NvAFX_Status err = NvAFX_CreateChainedEffect(NVAFX_CHAINED_EFFECT_DENOISER_16k_SUPERRES_16k_TO_48k, &handle);
- 在 Linux SDK 中,此效果具有以下最大吞吐量(实时支持的批次数量)
以链式方式运行效果可能会影响音频管道的性能和延迟。
4.4. 设置音频效果的参数
音频效果需要一个模型来转换输入音频。 每个模型都支持特定的音频采样率。 必须在 SDK 中设置模型文件的路径和输入音频采样率(仅限 Linux SDK)。 设置效果的必需参数后,可以使用 NvAFX_Load
加载效果。
Linux SDK 还支持多种帧大小(每帧样本数),可以在 SDK 中查询和设置帧大小(有关更多信息,请参阅 获取效果的参数)。 要设置 U32 值,请使用以下参数调用 NvAFX_SetU32()
函数:
- 先前创建的效果句柄。
- 要设置的参数的选择器字符串:
- (仅限 Linux SDK)要设置采样率,请指定
NVAFX_PARAM_INPUT_SAMPLE_RATE
- 要设置音频流的数量,请指定
NVAFX_PARAM_NUM_STREAMS
- 要设置每个输入帧的样本数,请指定:
- 对于 Linux
NVAFX_PARAM_NUM_SAMPLES_PER_INPUT_FRAME
- 对于 Windows
NVAFX_PARAM_NUM_INPUT_SAMPLES_PER_FRAME
-
在多 GPU 设置中,要让 SDK 自动选择与 SDK 中设置的模型兼容的 GPU,请将以下参数设置为 1
注意默认值为 0。
NVAFX_PARAM_USE_DEFAULT_GPU
链式效果不支持此参数。
-
(仅限 Windows SDK)要允许用户创建和管理自己的 CUDA 上下文,请将以下参数设置为 1
注意默认值为 0。
NVAFX_PARAM_USER_CUDA_CONTEXT
-
(仅限 Windows SDK)要禁用 CUDA 图,请将以下参数设置为 1。
注意默认值为 0。
NVAFX_PARAM_DISABLE_CUDA_GRAPH
-
在多 GPU 设置中,要让 SDK 自动选择与 SDK 中设置的模型兼容的 GPU,请将以下参数设置为 1
NVAFX_PARAM_USE_DEFAULT_GPU
默认值为 0,链式效果不支持此参数。
噪声消除和房间回声消除/房间回声抑制效果支持 VAD,VAD 指示通过
NvAFX_Run
提供给 SDK 的音频数据帧是否包含语音数据。
启用后,此功能还会消除来自NvAFX_Run
输出的低音量噪声和所有非语音数据,而不会降低性能。 要启用此功能,请将以下参数设置为 1NVAFX_PARAM_ENABLE_VAD
注意只能在加载模型之前设置此参数(在
NvAFX_Load
调用之前)。 在加载模型之后设置参数无效。默认值为 0,链式效果不支持此参数。
还可以通过使用
NvAFX_GetBoolList()
函数(仅限 Linux SDK)查询上次NvAFX_Run
调用的 VAD 状态。 当音频输出管道具有备用丢包隐藏算法时,此查询可能很有用。 有关查询列表的更多信息,请参阅 获取效果的参数。- 一个无符号整数值,指定选择器的值。
要设置模型,请使用以下参数调用 NvAFX_SetString()
函数:
- 先前创建的效果句柄。
- 一个以 null 结尾的字符串,指定模型文件的路径。
- 对于 Linux SDK
- 每个模型文件都支持特定的采样率和最大音频流数量。
- 特定 GPU 计算版本的模型文件位于 SDK 中的
models/<compute_version>
目录中。 以下 GPU 计算版本可用于以下 GPU:- Volta (V100):
models/sm_70
- Turing (T4):
models/sm_75
- Ampere:
- A100(基于
ga100
的 GPU):models/sm_80
- A10(
ga102
或更高版本的 GPU):models/sm_86
- 指定的模型应与采样率和指定的音频流数量相匹配。
- 模型文件名使用以下命名约定
<effect>_<samplerate>_<max-streams>.trtpkg
- 对于超分辨率效果,模型文件名遵循以下命名约定
<effect>_<input_rate>_<output_rate>_<max-streams>.trtpkg
- 每个文件夹还包含一个符号链接,该链接指向实际模型,例如
denoise_16k.trtpkg
和denoiser_48k.trtpkg
。 samplerate
可以是 8k、16k 或 48k。- 音频流的数量应在 1 到
max-streams
范围内(包括 1 和max-streams
)。 - 当音频流的数量设置为 64 或 256 的倍数(256、512、768 等)时,模型可提供最佳吞吐量性能。
例如,denoiser_48k_1152.trtpkg
模型可用于 48kHz 和 1 到 1152 个音频流之间,但对于 64、256、512、768 和 1024 个流是最佳的。 使用此模型的代码也可以直接使用同一文件夹中的符号链接denoiser_48k.trtpkg
,这允许在不更改代码的情况下更改底层模型。注意Linux SDK 中包含的某些模型支持的最大批量大小可能小于效果支持的最大吞吐量。
如果您的用例需要具有更大批量大小的模型,请通过 maxinesdk-support@nvidia.com 与我们联系。
- 对于 Windows SDK
- 每个模型文件都支持特定的采样率。
- 特定 GPU 计算版本的模型文件位于 SDK 中的
models
目录中。
- 对于链式效果,请使用以下参数调用
NvAFX_SetStringList
函数: 数组的长度。
例如,以下代码将采样率设置为sample_rate
,并将模型路径设置为model_file.c_str()
指定的路径。NvAFX_Status err; // Set sample rate (Linux only) err = NvAFX_SetU32(handle, NVAFX_PARAM_INPUT_SAMPLE_RATE, sample_rate); // Set model path err = NvAFX_SetString(handle, NVAFX_PARAM_MODEL_PATH, model_file.c_str()); err = NvAFX_SetU32(handle, NVAFX_PARAM_NUM_STREAMS, num_streams);
4.5. 获取效果的参数
输入/输出音频中的通道数对于音频效果是固定的,无法更改。 在运行音频效果之前,必须查询效果支持的通道数。 Linux SDK 还支持多种帧大小(每帧样本数),可以使用 set
API 查询和设置帧大小(有关更多信息,请参阅 设置音频效果的参数)。 应用程序还可以查询和使用 SDK 支持的默认帧大小,如下面的示例所示。
Linux SDK 还支持多种帧大小(每帧样本数),可以使用 set API 查询和设置帧大小(有关更多信息,请参阅 设置音频效果的参数)。 应用程序还可以查询和使用 SDK 支持的默认帧大小,如下面的示例所示。
链式效果当前仅支持 10 毫秒的帧大小。
效果参数(受支持的帧大小列表除外(仅限 Linux))只能在加载效果后查询。 在加载模型之前查询参数可能会返回无效值,并且该函数可能会失败并返回错误代码。
为确保输入音频的采样率与音频效果兼容,应首先查询采样率。
要查询这些参数,请使用以下参数调用 NvAFX_GetU32()
函数:
-
先前创建的效果句柄。
要查询的参数的选择器字符串- 要获取每个输入帧的默认样本数,请指定:
- 对于 Linux
NVAFX_PARAM_NUM_SAMPLES_PER_INPUT_FRAME
- 对于 Windows
NVAFX_PARAM_NUM_INPUT_SAMPLES_PER_FRAME
- 要获取每个通道的每个输出帧的默认样本数,请指定:
对于 LinuxNVAFX_PARAM_NUM_SAMPLES_PER_OUTPUT_FRAME
对于 WindowsNVAFX_PARAM_NUM_OUTPUT_SAMPLES_PER_FRAME
要获取输入/输出音频中的通道数,请指定NVAFX_PARAM_NUM_INPUT_CHANNELS/NVAFX_PARAM_NUM_OUTPUT_CHANNELS
要获取输入/输出采样率,请指定NVAFX_PARAM_INPUT_SAMPLE_RATE/NVAFX_PARAM_OUTPUT_SAMPLE_RATE
-
指向将存储值的位置的指针。
要查询列表,用户必须查询列表大小,为输出分配内存,然后将新分配的内存和大小传递给 NvAFX_GetU32List()
或 NvAFX_GetBoolList
。
要查询列表大小,请使用以下参数调用 NvAFX_GetU32List()
或 NvAFX_GetBoolList()
函数:
- 先前创建的效果句柄。
- 要查询的参数的选择器字符串。
要获取每个帧的受支持样本数列表(仅限 Linux),请指定NVAFX_PARAM_SUPPORTED_NUM_SAMPLES_PER_FRAME
。 - 一个输出指针,设置为 nullptr(或 NULL)以查询大小。
指向将存储列表大小的位置的指针。
大小应初始化为零,并在调用此函数时使用实际大小更新。NvAFX_GetU32List()
调用使用NVAFX_STATUS_OUTPUT_BUFFER_TOO_SMALL
错误状态检索相应参数选择器的列表大小。 要查询列表,请为具有返回大小的列表分配内存,并使用以下参数调用NvAFX_GetU32List()
函数:要查询的参数的选择器字符串。
要获取受支持的每个帧的样本数列表,请指定NVAFX_PARAM_SUPPORTED_NUM_SAMPLES_PER_FRAME.
- 指向 U32 数组的指针,该数组的大小至少为从上述调用检索的列表大小。
列表值将写入此数组。 - 指向存储列表大小值的位置的指针。
以下示例查询效果的受支持的每帧样本数、输入/输出音频中的通道数、采样率和受支持的帧大小。
uunsigned num_samples_per_frame, num_channels, sample_rate;
NvAFX_Status err;
// Linux only
std::unique_ptr<unsigned int[]> supported_list = nullptr;
int list_size = 0;
err = NvAFX_GetU32List(handle, NVAFX_PARAM_SUPPORTED_NUM_SAMPLES_PER_FRAME, supported_list.get(), &list_size);
if (err != NVAFX_STATUS_OUTPUT_BUFFER_TOO_SMALL) {
// This indicates API failure
return;
}
supported_list.reset(new unsigned int[list_size]);
err = NvAFX_GetU32List(handle, NVAFX_PARAM_SUPPORTED_NUM_SAMPLES_PER_FRAME, supported_list.get(), &list_size);
// Load model
err = NvAFX_GetU32(handle, NVAFX_PARAM_NUM_SAMPLES_PER_INPUT_FRAME, &num_samples_per_frame);
err = NvAFX_GetU32(handle, NVAFX_PARAM_NUM_INPUT_CHANNELS, &num_channels);
err = NvAFX_GetU32(handle, NVAFX_PARAM_OUTPUT_SAMPLE_RATE, &sample_rate);
// Querying VAD results
// VAD must be supported and enabled on the handle
NvAFX_Run(...); // Process input first
// Query results for last input (Linux only)
// Note: If no voice is detected, output audio is zeroed by the effect
// However, result is also returned (in case custom packet loss concealment is desired) - returns NVAFX_TRUE if input audio had voice, NVAFX_FALSE otherwise
std::vector<NvAFX_Bool> out(num_streams, 0);
uint32_t s = out.size();
auto status = NvAFX_GetBoolList(handle, NVAFX_PARAM_VAD_RESULT, out.data(), &s);
assert(status == NVAFX_STATUS_SUCCESS);
// Use VAD result
4.6. 获取支持的设备(仅限 Windows SDK)
NvAFX_GetSupportedDevices()
函数可用于确定当前选定模型支持的 GPU。
必须在设置模型路径之后调用此方法。
- 效果句柄。
- 输入数组的大小。
如果调用成功,则此值将由函数设置。 - 大小为 num 的数组。
该函数将使用模型支持的设备的 CUDA 设备索引填充数组,索引按偏好降序排列,其中第一个设备是首选设备。 此示例获取模型支持的 GPU 列表
int numSupportedDevices = 0;
NvAFX_GetSupportedDevices(handle, &numSupportedDevices, nullptr);
std::vector<int> ret(num);
NvAFX_GetSupportedDevices(handle, &numSupportedDevices, ret.data();
4.7. 加载音频效果
加载效果涉及验证为效果设置的参数并将指定的模型加载到 GPU 内存中。
要加载音频效果,请设置上一节中描述的效果参数,并使用效果句柄调用 NvAFX_Load()
。
NvAFX_Status err = NvAFX_Load(handle);
4.8. 运行音频效果
加载效果后,可以使用 NvAFX_Run()
函数将其应用于输入音频。 运行效果后,将读取输入内存缓冲区的内容,应用音频效果,并将输出写入输出内存缓冲区。
输入/输出内存缓冲区位于 CPU 内存中。 复制到/从 GPU 内存由 SDK 在内部处理。
除了具有两个输入通道的声学回声消除效果外,SDK 仅支持单通道处理。 可以通过查询 NVAFX_PARAM_NUM_INPUT_CHANNELS
获取效果支持的通道数。 请参阅 获取效果的参数 以了解更多信息。
要运行音频效果,请使用以下参数调用 NvAFX_Run()
函数:
- 先前创建的效果句柄。
- 输入内存缓冲区。
对于 AEC 效果,请指定两个通道,其中第一个通道是批处理的近端音频,第二个通道是批处理的远端音频。 - 输出内存缓冲区。 对于超分辨率效果,输入和输出内存缓冲区的大小将有所不同,用户应使用以下方式查询大小:
NVAFX_PARAM_NUM_OUTPUT_SAMPLES_PER_FRAME
NVAFX_PARAM_NUM_INPUT_SAMPLES_PER_FRAME
- 每个输入/输出数据流的每帧样本数。
- 输入/输出音频中的通道数。
有关更多信息,请参阅 获取效果的参数。
以下示例运行音频效果
NvAFX_Status err = NvAFX_Run(handle, input, output, num_samples, num_channels);
4.9. 以链式方式运行多个音频效果
以下示例演示了以链式方式运行两个效果
NvAFX_Status err;
err = NvAFX_API NvAFX_CreateChainedEffect(NVAFX_CHAINED_EFFECT_DENOISER_16k_SUPERRES_16k_TO_48k, &effect);
// Set effect parameters & load effect
...
NvAFX_Status err = NvAFX_Run(chained_handle, input_audio, intermediate_output, num_samples, num_channels);
以链式方式运行效果可能会影响音频管道的性能和延迟。
4.10. 在延迟音频流上运行音频效果(仅限 Linux SDK)
Linux SDK 支持某些流未按预期时间到达的情况。 这些流称为延迟流。 为了支持处理这些流,SDK 允许应用程序指定一个列表,指示相应的流当前是处于活动状态还是延迟/非活动状态。
可以通过使用以下函数参数调用 NvAFX_SetBoolList()
来设置列表:
- 先前创建的效果句柄。
NVAFX_PARAM_ACTIVE_STREAMS
选择器字符串。- 类型为
NVAFX_BOOL
的数组,其中每个元素表示相应音频流的状态。
NVAFX_TRUE
表示活动流,NVAFX_FALSE
表示非活动流 - 上述数组的长度,等于音频流的数量。
对于延迟音频流,可以通过将它们设置为激活状态,并将准时音频流设置为非激活状态,来在所有延迟音频流上初始应用效果。之后应调用一次或多次 NvAFX_Run()
来对延迟音频流应用效果。在延迟音频流处理完毕后,将准时音频流设置为激活状态,并执行一次 NvAFX_Run()
以应用效果。
- 考虑一个接受 10 毫秒音频输入的效果。
- 音频流 1 和 3 各延迟 10 毫秒到达,并带有 20 毫秒的数据。
- 音频流 2 和 4 准时到达,并带有 10 毫秒的数据。
- 可以采用以下方式之一处理音频流:
选项 1
仅在延迟音频流中处理额外的 10 毫秒数据,然后处理所有音频流的准时 10 毫秒数据。最初,通过使用NvAFX_SetBoolList
,将音频流 1 和 3 设置为激活状态,并将音频流 2 和 4 设置为非激活状态。- 执行
NvAFX_Run
调用,其中音频流 1 和 3 的 10 毫秒数据填充到输入中,而输入的其余部分设置为 0。
此步骤处理音频流 1 和 3 中额外的 10 毫秒数据。 - 执行第二次
NvAFX_SetBoolList
调用,将所有音频流(1、2、3 和 4)设置为激活状态。 - 执行
NvAFX_Run
调用,使用来自所有四个音频流的实时 10 毫秒数据。
- 选项 2 处理所有音频流的 10 毫秒数据,然后仅在延迟音频流中处理额外的 10 毫秒数据:
- 通过调用
NvAFX_Run
,处理来自所有音频流的 10 毫秒数据(来自音频流 1 和 3 的旧数据以及来自音频流 2 和 4 的新数据)。 - 通过调用
NvAFX_SetBoolList
,将音频流 1 和 3 设置为激活状态,并将音频流 2 和 4 设置为非激活状态。 - 通过调用
NvAFX_Run
,处理来自音频流 1 和 3 的额外 10 毫秒数据。
以下示例演示了在将某些音频流设置为非激活状态后运行音频效果
NvAFX_Status err = NvAFX_SetBoolList(handle, NVAFX_PARAM_ACTIVE_STREAMS, stream_active_list, num_streams);
NvAFX_Status err = NvAFX_Run(handle, input, output, num_samples, num_channels);
仅对于激活的音频流,每次 NvAFX_Run
调用期间都会更新每个音频流的内部状态。将音频流设置为非激活状态将禁用此状态的更新。如果需要,也可以使用 NvAFX_Reset
重置此状态,如 NvAFX_Reset
中所述。
4.11. 销毁音频效果
当不再需要音频效果时,应销毁它以释放效果使用的资源和内存。
要销毁音频效果,请调用 NvAFX_DestroyEffect()
并指定要销毁的效果的效果句柄。
NvAFX_Status err = NvAFX_DestroyEffect(handle);
4.12. 使用多个 GPU
使用音频效果 SDK 开发的应用程序可以与多个 GPU 一起使用。默认情况下,SDK 假定应用程序将设置 GPU。或者,SDK 可以选择最佳 GPU 来运行效果。
4.12.1. 在多 GPU 环境中选择用于音频效果处理的 GPU
在多 GPU 环境中,将用于运行音频效果的 GPU 可以通过使用 cudaSetDevice()
和 cudaGetDevice()
CUDA 函数来控制。设备应在调用 NvAFX_Load()
之前设置,因为仅当当前选择的 GPU 支持 SDK 时,NvAFX_Load()
才会成功。
int chosenGPU = 0; // or whichever GPU you want to use
cudaSetDevice(chosenGPU);
NvAFX_Handle effect;
err = NvAFX_API NvAFX_CreateEffect(code, &effect);
err = NvAFX_Set...; // set parameters
…
err = NvAFX_API NvAFX_Load(effect);
…
err = NvAFX_API NvAFX_Run(effect, ...);
4.12.2. 为链式音频效果选择 GPU(仅限 Linux)
在多 GPU 环境中使用链式效果时,SDK 可以选择在不同的 GPU 上运行链中的效果。例如,在降噪器 16k + 超分辨率 16k 到 48k 链中,降噪器效果可以完全在一个 GPU 上运行,而超分辨率效果可以在另一个 GPU 上运行。
要使用此功能,请创建链式效果并将 NVAFX_PARAM_CHAINED_EFFECT_GPU_LIST
设置为使用 NvAFX_SetU32List
指定 GPU ID 的数组。必须在对效果调用 NvAFX_Load
之前设置此参数。
以下示例演示了此参数的用法
NvAFX_Handle effect;
err = NvAFX_API NvAFX_CreateChainedEffect(code, &effect);
…
// Run first effect on GPU id 3, second on GPU id 4
uint32_t gpus[] = { 3, 4};
err = NvAFX_API SetU32List(effect, NVAFX_PARAM_CHAINED_EFFECT_GPU_LIST, gpus,
sizeof(gpus));
…
err = NvAFX_API NvAFX_Load(effect);
4.12.3. 将 GPU 选择卸载到 SDK 以在多 GPU 环境中进行音频效果处理
在多 GPU 环境中,SDK 可以选择确定运行音频效果的最佳 GPU。要使用此功能,请在加载效果之前使用 NvAFX_SetU32(effect , NVAFX_PARAM_USE_DEFAULT_GPU, 1)
参数调用 NvAFX_SetU32
。如果在加载音频效果后调用 NvAFX_SetU32
,则该函数将不起作用。
如果应用程序将 NVAFX_PARAM_USE_DEFAULT_GPU
设置为 0,或者未设置此参数,则 SDK 将明确不选择运行效果的 GPU。应用程序可以使用 cudaSetDevice
API 设置要在其上执行 SDK 调用的设备。如果未设置此参数或将其设置为 0,则 SDK 将使用默认设备(设备 0)。
如果应用程序将 NVAFX_PARAM_USE_DEFAULT_GPU
设置为 1
,则应用程序不应调用 cudaSetDevice()
,并且其他效果(或效果的多个实例)将使用由 SDK 确定的 GPU。如果应用程序在 NvAFX_Load()
之前显式调用 cudaSetDevice()
,则 SDK 可能会覆盖应用程序的设备首选项。如果客户端在调用 NvAFX_Run()
之前显式调用 cudaSetDevice()
以将 GPU 设置为不同的 GPU,则 NvAFX_Run()
调用将失败。
NvAFX_Handle effect;
err = NvAFX_API NvAFX_CreateEffect(code, &effect);
err = NvAFX_API SetU32(effect, NVAFX_PARAM_USE_DEFAULT_GPU, 1);
…
err = NvAFX_API NvAFX_Load(effect);
…
NVAFX_PARAM_USE_DEFAULT_GPU
和 NVAFX_PARAM_USER_CUDA_CONTEXT
不能 同时使用。
链式效果不支持此参数。
4.12.4. 为不同任务选择不同的 GPU
除了应用音频效果滤波器外,使用 SDK 的应用程序可能被设计为在多 GPU 环境中执行多项任务。在这种情况下,应在调用 NvAFX_Load()
之前选择每个任务的最佳 GPU,并在每次 NvAFX_Run()
调用之前设置它。
应用程序负责在执行 SDK 调用之前切换到相应的 GPU。如果应用程序在调用 NvAFX_Run()
之前未切换到相应的 GPU,则调用将失败并出现错误。
以下步骤演示了如何在不同的 GPU 上完成 CUDA 任务和 SDK 调用。
- 调用
cudaGetDeviceCount()
以确定可用 GPU 的数量。// Get the number of GPUs cuErr = cudaGetDeviceCount(&deviceCount);
- 确定任务的最佳 GPU。
例如,可以通过迭代可用的 GPU 并使用cudaGetDeviceProperties()
选择具有最多 SM 数量的 GPU 来确定这一点。 - 在完成应用程序任务的循环中,在执行任务之前,通过调用
cudaSetDevice()
为每个任务选择最佳 GPU,以选择任务的 GPU。 - 在执行 SDK 调用之前,再次调用
cudaSetDevice()
以将 GPU 切换回音频效果 GPU。// Select the best GPU for each task and perform the task. while (!done) { … cudaSetDevice(gpuOtherTask); PerformOtherTask(); cudaSetDevice(gpuAFX); err = NvAFX_Run(effect, ...)
4.12.5. CUDA 图形支持(仅限 Windows)
Windows SDK 支持使用 CUDA 图形,这可以通过减少短寿命 CUDA 内核中出现的 CPU 开销来提高性能。
默认情况下,图形在 Windows SDK 中启用,但如果 SDK 与其他使用 CUDA 图形的应用程序并行运行,则可能会导致问题。以下示例显示了如何禁用 CUDA 图形
// Call before loading model (NvAFX_Load) Windows only
err = NvAFX_API SetU32(effect, NVAFX_PARAM_DISABLE_CUDA_GRAPH, 1);
...
5.1. 类型定义
音频效果 SDK 类型定义为音频效果和音频效果的参数提供选择器字符串。
5.1.1. NvAFX_EffectSelector
此类型定义为音频效果类型提供选择器字符串。
typedef const char* NvAFX_EffectSelector;
当前支持的选择器为
- NVAFX_EFFECT_DENOISER : "denoiser"
- 降噪器音频效果(请参阅关于背景噪音抑制效果)。
- NVAFX_EFFECT_DEREVERB "dereverb"
- 去混响效果(请参阅关于房间回声消除效果)。
- NVAFX_EFFECT_DEREVERB_DENOISER "dereverb_denoiser"
- 组合的去混响和降噪器效果(请参阅关于噪音消除和房间回声消除/房间回声消除 + 背景噪音抑制效果)。
- NVAFX_EFFECT_AEC "aec"
- AEC 效果(请参阅关于声学回声消除效果)。
- NVAFX_EFFECT_SUPERRES
- 音频超分辨率效果(请参阅关于音频超分辨率效果)。
- NVAFX_CHAINED_EFFECT_DENOISER_16k_SUPERRES_16k_TO_48k
- 链式效果(降噪器 16k + 超分辨率 16k 到 48k)
- NVAFX_CHAINED_EFFECT_DEREVERB_16k_SUPERRES_16k_TO_48k
- 链式效果(去混响 16k + 超分辨率 16k 到 48k)
- NVAFX_CHAINED_EFFECT_DEREVERB_DENOISER_16k_SUPERRES_16k_TO_48k
- 链式效果(去混响+降噪器 16k + 超分辨率 16k 到 48k)
- NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DENOISER_16k
- 链式效果(超分辨率 8k 到 16k + 降噪器 16k)
- NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DEREVERB_16k
- 链式效果(超分辨率 8k 到 16k + 去混响 16k)
- NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DEREVERB_DENOISER_16k
- 链式效果(超分辨率 8k 到 16k + 去混响+降噪器 16k)
5.1.2. NvAFX_ParameterSelector
此类型定义为音频效果参数提供选择器字符串。
typedef const char* NvAFX_ParameterSelector;
当前支持的选择器为
-
NVAFX_PARAM_MODEL_PATH: "model_path"
- 一个字符串,指定音频效果的模型文件的路径。
-
NVAFX_PARAM_INPUT_SAMPLE_RATE: "input_sample_rate"
- 一个无符号整数,指定音频效果的音频输入采样率。
-
NVAFX_PARAM_OUTPUT_SAMPLE_RATE: "output_sample_rate"
- 一个无符号整数,指定音频效果的音频输出采样率。
- (仅限 Linux SDK)
NVAFX_PARAM_NUM_SAMPLES_PER_INPUT_FRAME: "num_samples_per_input_frame"
- 一个无符号整数,指定音频效果的每个音频流的每个输入帧的采样数。
- (仅限 Windows SDK)
NVAFX_PARAM_NUM_INPUT_SAMPLES_PER_FRAME: "num_input_samples_per_frame"
- 一个无符号整数,指定音频效果的每个音频流的每个输入帧的采样数。
- (仅限 Linux SDK)
NVAFX_PARAM_NUM_SAMPLES_PER_OUTPUT_FRAME: "num_samples_per_output_frame"
- 一个无符号整数,指定音频效果的每个音频流的每个输出帧的采样数。
- (仅限 Windows SDK)
NVAFX_PARAM_NUM_OUTPUT_SAMPLES_PER_FRAME: "num_output_samples_per_frame"
- 一个无符号整数,指定音频效果的每个音频流的每个输出帧的采样数。
-
NVAFX_PARAM_NUM_INPUT_CHANNELS: "num_input_channels"
- 一个无符号整数,指定音频效果的音频通道数。
-
NVAFX_PARAM_NUM_OUTPUT_CHANNELS: "num_output_channels"
- 一个无符号整数,指定音频效果的输出音频通道数。
-
NVAFX_PARAM_NUM_STREAMS: "num_streams"
- 一个无符号整数,指定要由音频效果处理的音频流的数量。
-
NVAFX_PARAM_INTENSITY_RATIO: "intensity_ratio"
- 一个浮点值,指定范围从 0.0 到 1.0 的因子。将因子设置为 0.0 与直通相同,而值 1.0 提供效果的最大可能影响。
- (仅限 Linux SDK)
NVAFX_PARAM_ACTIVE_STREAMS: "active_streams"
- 一个
NvAFX_Bool
值的列表,指定相应的音频流是否处于激活状态。 - (仅限 Linux SDK)
NVAFX_PARAM_SUPPORTED_NUM_SAMPLES_PER_FRAME: "supported_num_samples_per_frame"
- 一个 U32 值的列表,指定每帧采样数的支持值。在设置输入采样率后,可以在模型加载之前查询此值。
-
NVAFX_PARAM_CHAINED_EFFECT_GPU_LIST
- 一个 U32 值的列表,指定要在链式效果中使用的 GPU。链中的每个效果将使用列表中相应的 GPU。
- (仅限 Windows SDK)
NVAFX_PARAM_USER_CUDA_CONTEXT: "user_cuda_context"
- 一个无符号整数值,允许 SDK 用户禁用 SDK 内部上下文管理。要禁用内部上下文管理,请将此值设置为 1。对于特定会话,加载模型后无法更改此值。
-
NVAFX_PARAM_DISABLE_CUDA_GRAPH : "disable_cuda_graph"
- 一个无符号整数值,指定是否启用 CUDA 图形(默认启用):
- 要禁用 CUDA 图形,请将此值设置为 1。
- 要启用 CUDA 图形,请将此值设置为零。
有关 CUDA 图形的更多信息,请参阅CUDA 图形入门。
NVAFX_PARAM_USE_DEFAULT_GPU
和 NVAFX_PARAM_USER_CUDA_CONTEXT
不能同时使用。
NVAFX_PARAM_NUM_CHANNELS: "num_channels"
NVAFX_PARAM_SAMPLE_RATE: "sample_rate"
NVAFX_PARAM_NUM_SAMPLES_PER_FRAME: "num_samples_per_frame"
5.1.3. NvAFX_Handle
与音频效果实例关联的不透明句柄。
typedef void* NvAFX_Handle;
5.1.4. NvAFX_Bool(仅限 Linux SDK)
此类型定义设置为 NVAFX_TRUE
表示 true
,设置为 NVAFX_FALSE
表示 false
。
typedef char NvAFX_Bool;
5.1.5. logging_cb_t(仅限 Linux SDK)
在 NvAFX_InitializeLogger
API 中使用的回调函数类型。
typedef void(*logging_cb_t)(LoggingSeverity level, const char* log, void* userdata);
LoggingSeverity(仅限 Linux SDK)
在 NvAFX_InitializeLogger
API 中使用的 LoggingSeverity
级别。
typedef enum LoggingSeverity_t {
LOG_LEVEL_ERROR,
LOG_LEVEL_WARNING,
LOG_LEVEL_INFO,
} LoggingSeverity
5.1.7. LoggingTarget(仅限 Linux SDK)
在 NvAFX_InitializeLogger
API 中使用的日志记录目标。
typedef enum LoggingTarget_t
{
LOG_TARGET_NONE = 0x0,
LOG_TARGET_STDERR = 0x1,
LOG_TARGET_FILE = 0x2,
LOG_TARGET_CALLBACK = 0x4,
} LoggingTarget;
5.2. 函数
本节提供有关音频效果 SDK 中函数的信息。
5.2.1. NvAFX_GetEffectList
此函数检索支持的音频效果列表。
NvAFX_Status NvAFX_GetEffectList(
int* num_effects,
NvAFX_EffectSelector* effects[]
);
参数
- num_effects [out]
类型:int*
指向包含返回效果数量的整数的指针。
- effects [out]
类型:NvAFX_EffectSelector* []
SDK 支持的效果选择字符串列表的地址。此列表由 SDK 静态分配,因此调用者不应为此参数分配内存,也不应在使用后释放内存。有关选择字符串的更多信息,请参阅
NvAFX_EffectSelector
。
返回值
备注
此函数检索 SDK 支持的音频效果列表。音频效果 SDK 的选择字符串填充在 effects
输出参数中。可用效果的数量写入 num_effects
输出参数。
5.2.2. NvAFX_CreateEffect
此函数创建音频效果实例。
NvAFX_Status NvAFX_CreateEffect(
NvAFX_EffectSelector code,
NvAFX_Handle* effect
);
参数
- code [in]
类型:NvAFX_EffectSelector
要创建的音频效果类型的选择字符串。有关允许的选择字符串的更多信息,请参阅
NvAFX_EffectSelector
。- effect [out]
类型:NvAFX_Handle*
指向将存储新创建的音频效果实例的句柄的位置的指针。
返回值
备注
此函数创建指定类型的音频效果的实例,并通过此效果将句柄返回到 effect
输出参数。
5.2.3. NvAFX_CreateChainedEffect
此函数创建链式效果实例。
NvAFX_Status NvAFX_CreateChainedEffect(
NvAFX_EffectSelector code,
NvAFX_Handle* effect
);
参数
- code [in]
类型:NvAFX_EffectSelector
要创建的链式音频效果类型的选择字符串。有关允许的选择字符串的更多信息,请参阅
NvAFX_EffectSelector
。- effect [out]
类型:NvAFX_Handle*
指向将存储新创建的链式音频效果实例的句柄的位置的指针。
返回值
备注
此函数创建指定类型的链式音频效果的实例,并通过使用 effect
输出参数将此效果实例的句柄返回。
5.2.4. NvAFX_DestroyEffect
此函数销毁效果实例。
NvAFX_Status NvAFX_DestroyEffect(
NvAFX_Handle effect
);
参数
- effect [in]
类型:NvAFX_Handle
要销毁的音频效果实例的句柄。
返回值
备注
此函数销毁具有指定句柄的音频效果实例,并释放该实例使用的所有资源和内存。
5.2.5. NvAFX_SetString
此函数设置指定效果的字符串参数。
NvAFX_Status NvAFX_SetString(
NvAFX_Handle effect,
NvAFX_ParameterSelector param_name,
const char* val
);
参数
- effect [in]
类型:NvAFX_Handle
效果句柄。
- param_name [in]
类型:NvAFX_ParameterSelector
有关允许的选项列表,请参阅设置音频效果的参数。
- val [in]
类型:char*
指向要设置的字符串的指针。
返回值
备注
此函数将指定音频效果的指定字符串参数的值设置为 val
参数。
5.2.6. NvAFX_SetStringList
此函数设置指定效果的字符串参数。
NvAFX_Status NvAFX_SetStringList(
NvAFX_Handle effect,
NvAFX_ParameterSelector param_name,
const char** list, unsigned int list_size
);
参数
- effect [in]
类型:NvAFX_Handle
效果句柄。
- param_name [in]
类型:NvAFX_ParameterSelector
有关允许的选项列表,请参阅设置音频效果的参数。
- list[in]
类型:char**
指向字符数组的指针。
- list_size[in]
类型:unsigned int
要设置的字符数组的大小。
返回值
备注
此函数将指定音频效果的指定字符串参数的值设置为 val
参数。
5.2.7. NvAFX_SetU32
此函数设置指定效果的 UInt 参数。
NvAFX_Status NvAFX_SetU32(
NvAFX_Handle effect,
NvAFX_ParameterSelector param_name,
unsigned int val
);
参数
- effect [in]
类型:NvAFX_Handle
音频效果的句柄。
- Param_name [in]
类型:NvAFX_ParameterSelector
有关允许的选项列表,请参阅设置音频效果的参数。
任何其他选择器字符串都会返回错误。
注意对于 Linux SDK,可以使用
NvAFX_GetU32List()
函数和NVAFX_PARAM_SUPPORTED_NUM_SAMPLES_PER_FRAME
作为选择器来查询NVAFX_PARAM_NUM_SAMPLES_PER_INPUT_FRAME
设置的有效值。设置任何其他值将导致错误。
- val [in]
类型:unsigned int
要为参数设置的值。
返回值
备注
此函数将指定音频效果的指定 32 位无符号整数参数的值设置为 val
参数。
5.2.8. NvAFX_GetString
此函数获取指定效果的 set
字符串参数的当前值。
NvAFX_Status NvAFX_GetString(
NvAFX_Handle effect,
NvAFX_ParameterSelector param_name,
char* val,
int max_length
);
参数
- effect [in]
类型:NvAFX_Handle
效果句柄。
- Param_name [in]
类型:NvAFX_ParameterSelector
有关允许的选项列表,请参阅设置音频效果的参数。
- val [out]
类型:char*
将在其中存储请求的字符串的缓冲区的地址。此缓冲区必须由调用者分配和释放。
- max_length [in]
类型:int
由
val
参数指定的缓冲区的长度(以字节为单位)。
返回值
备注
此函数获取指定音频效果的字符串参数的值,并将检索到的字符串写入 val
参数指定的位置的缓冲区中。
5.2.9. NvAFX_GetU32
此函数获取指定效果的 uint 参数的值。
NvAFX_Status NvAFX_GetU32(
NvAFX_Handle effect,
NvAFX_ParameterSelector param_name,
unsigned int* val
);
参数
- effect [in]
类型:NvAFX_Handle
效果句柄。
- param_name [in]
类型:NvAFX_ParameterSelector
有关允许的选项列表,请参阅设置音频效果的参数。
注意效果参数,除了支持的帧大小列表(仅限 Linux),只能在加载效果后查询。在模型加载之前查询参数可能会返回无效值,或者该函数可能会失败并返回错误代码。
对于 Linux SDK,虽然可以使用此 API 查询
NVAFX_PARAM_NUM_SAMPLES_PER_INPUT_FRAME
以获取每帧的默认采样数,但应使用NvAFX_GetU32List()
和NVAFX_PARAM_SUPPORTED_NUM_SAMPLES_PER_FRAME
参数来获取支持的值列表。然后,可以使用
NvAFX_SetU32()
和NVAFX_PARAM_NUM_SAMPLES_PER_FRAME
参数来设置该值。- val [out]
类型:unsigned int*
将在其中写入检索到的 32 位无符号整数参数值的缓冲区的地址。
返回值
备注
此函数获取指定音频效果的指定 32 位无符号整数参数的值,并将检索到的值写入 val
参数指定的缓冲区。
5.2.10. NvAFX_GetU32List(仅限 Linux SDK)
此函数获取指定效果的 uint 列表参数值。
NvAFX_Status NvAFX_GetU32List(
NvAFX_Handle effect,
NvAFX_ParameterSelector param_name,
unsigned int* list[],
int* list_size
);
参数
- effect [in]
类型:NvAFX_Handle
效果句柄。
- param_name [in]
类型:NvAFX_ParameterSelector
以下选择器
NVAFX_PARAM_SUPPORTED_NUM_SAMPLES_PER_FRAME
任何其他选择器字符串都会返回错误。
注意作为选择器返回的
NVAFX_PARAM_SUPPORTED_NUM_SAMPLES_PER_FRAME
的值取决于采样率。您必须确保在调用此函数之前,使用NVAFX_PARAM_SAMPLE_RATE
选择器调用NvAFX_SetU32()
来设置采样率。- list [out]
类型:unsigned int* []
指向包含给定选择器的 32 位无符号值的列表的地址。
注意应用程序需要调用此 API,并将
list_size
初始化为零,并将list
设置为nullptr
,以获取要分配的列表的大小。大小将在list_size
参数中返回。然后,应用程序可以分配至少list_size
的 U32 数组,并再次调用 API,并将 list 指向该数组。有关示例,请参阅创建音频效果。- list_size [out]
类型:int*
指向包含列表中返回值的数量的整数的指针。
返回值
- 成功时返回
NVAFX_STATUS_SUCCESS
。 - 当
list_size
小于列表数组的最小所需大小时,返回NVAFX_STATUS_OUTPUT_BUFFER_TOO_SMALL
。
备注
此函数获取指定音频效果的 32 位无符号整数值列表,将检索到的值写入 list
指定的缓冲区,并将返回列表的大小写入 list_size
指定的缓冲区。
5.2.11. NvAFX_GetBoolList(仅限 Linux SDK)
此函数获取指定效果的 uint 列表参数值。
NvAFX_Status NvAFX_GetBoolList(
NvAFX_Handle effect,
NvAFX_ParameterSelector param_name,
NvAFX_Bool list*[]
int* list_size
);
参数
- effect [in]
类型:NvAFX_Handle
效果句柄。
- param_name [in]
类型:NvAFX_ParameterSelector
以下选择器
NVAFX_PARAM_VAD_RESULT
任何其他选择器字符串都会返回错误。
- list [out]
类型:NvAFX_Bool* []
指向包含给定选择器的布尔值的列表的地址。
注意应用程序需要调用此 API,并将
list_size
初始化为零,并将list
设置为nullptr
,以获取要分配的列表的大小。大小将在list_size
参数中返回。然后,应用程序可以分配至少list_size
的数组,并再次调用 API,并将list
指向该数组。有关示例,请参阅创建音频效果。- list_size [out]
类型:int*
指向包含列表中返回值的数量的整数的指针。
返回值
- 成功时返回
NVAFX_STATUS_SUCCESS
。 - 当
list_size
小于list
数组的最小所需大小时,返回NVAFX_STATUS_OUTPUT_BUFFER_TOO_SMALL
。
备注
此函数获取指定音频效果的布尔值列表,将检索到的值写入 list
指定的缓冲区,并将返回列表的大小写入 list_size
指定的缓冲区。
5.2.12. NvAFX_GetSupportedDevices(仅限 Windows SDK)
此函数获取当前设置的模型文件支持的兼容设备列表。
NvAFX_Status NvAFX_GetSupportedDevices(
NvAFX_Handle effect,
int *num,
int *devices
);
参数
- effect [in]
类型:NvAFX_Handle
要加载的音频效果实例的句柄。
- num [in, out]
类型:int*
输入数组的大小。如果调用成功,此值将由函数设置。
- devices [输入,输出]
类型:int*
大小为
num
的数组。该函数将使用模型支持的 CUDA 设备索引填充数组,并按偏好降序排列,其中第一个设备是首选设备。
返回值
备注
此函数获取模型支持的设备。
5.2.13. NvAFX_Load
此函数验证效果参数并加载指定的效果。
NvAFX_Status NvAFX_Load(
NvAFX_Handle effect
);
参数
- effect [in]
类型:NvAFX_Handle
要加载的音频效果实例的句柄。
返回值
备注
此函数验证为效果设置的参数,并加载指定的音频效果。
5.2.14. NvAFX_Run
此函数运行指定的效果。
NvAFX_Status NvAFX_Run(
NvAFX_Handle effect,
const float** input,
float** output,
unsigned num_samples,
unsigned num_channels
);
参数
- effect [in]
类型:NvAFX_Handle
要运行的音频效果实例的句柄。
- input [输入]
类型:const float**
指向用户分配的缓冲区数组的指针,其中每个缓冲区保存一个通道的音频数据。数组的大小必须等于输入帧中的输入样本数(通过
NVAFX_PARAM_NUM_SAMPLES_PER_INPUT_FRAME
设置)并乘以配置效果的流数(通过NVAFX_PARAM_NUM_STREAMS
设置,对于 Windows SDK 始终为1
)。通道数必须等于通过
NvAFX_GetU32()
函数获得的NVAFX_PARAM_NUM_INPUT_CHANNELS
参数的值。对于声学回声消除效果,此值为 2,对于所有其他效果,此值为 1。音频数据的采样率必须等于为效果预设的采样率。例如,对于音频效果,采样率必须等于通过
NvAFX_GetU32()
函数获得的NVAFX_PARAM_INPUT_SAMPLE_RATE
参数的值。- output [输出]
类型:float**
指向用户分配的缓冲区数组的指针,效果的输出将写入到该数组。
数组的大小必须等于帧中的输出样本数(通过
NVAFX_PARAM_NUM_SAMPLES_PER_OUTPUT_FRAME
设置)乘以效果配置的流数(通过NVAFX_PARAM_NUM_STREAMS
设置)。注意缓冲区必须由调用程序分配,并在以后释放。
在内部,
NvAFX_Run
将输入/输出复制到/从 GPU,因此固定输入/输出缓冲区没有任何效果。- num_samples [输入]
类型:unsigned
输入缓冲区中的样本数。
- num_channels [输入]
类型:unsigned
输入通道数。
返回值
备注
此函数通过读取输入缓冲区的内容、应用音频效果并将输出写入输出缓冲区来运行指定的音频效果。
5.2.15. NvAFX_Reset
此函数重置内部状态并刷新效果中指定批次的内部历史记录。
NNvAFX_Status NvAFX_Reset(
NvAFX_Handle effect
);
Linux SDK
NvAFX_Status NvAFX_Reset(
NvAFX_Handle effect,
NvAFX_Bool* list,
int length
);
参数
- effect [in]
类型:NvAFX_Handle
要运行的音频效果实例的句柄。
- list [输入](仅限 Linux SDK)
类型:NvAFX_Bool *
指向内存位置的指针,该内存位置指示要重置的流。
i
-th 元素在此数组中应设置为NVAFX_TRUE
以重置i
-th 流,否则设置为NVAFX_FALSE
。- length [输入](仅限 Linux SDK)
类型:int
指定数组中的元素数。该值应等于流(批次)的数量。
返回值
备注
允许重置效果的状态。
5.2.16. NvAFX_SetBoolList(仅限 Linux SDK)
此函数设置指定效果的列表参数。
NvAFX_Status NvAFX_SetBoolList(
NvAFX_Handle effect,
NvAFX_ParameterSelector param_name,
const NvAFX_Bool* list,
unsigned int list_size
);
参数
- effect [in]
类型:NvAFX_Handle
音频效果的句柄。
- Param_name [in]
类型:NvAFX_ParameterSelector
以下
NVAFX_PARAM_ACTIVE_STREAMS
任何其他选择器字符串都会返回错误。
- list [输入]
类型:NvAFX_Bool*
要为参数设置的布尔值数组。
- list_size [输入]
类型:unsigned int
作为输入传递的布尔数组的大小。
返回值
备注
此函数将指定音频效果的列表参数的布尔值设置为来自 list
的值。
5.2.17. NvAFX_SetU32List(仅限 Linux SDK)
此函数设置指定效果的列表参数。
NvAFX_Status NvAFX_SetU32List(
NvAFX_Handle effect,
NvAFX_ParameterSelector param_name,
const unsigned int* list,
unsigned int list_size
);
参数
- effect [in]
类型:NvAFX_Handle
音频效果的句柄。
- Param_name [in]
类型:NvAFX_ParameterSelector
以下
NVAFX_PARAM_CHAINED_EFFECT_GPU_LIST
任何其他选择器字符串都会返回错误。
- list [输入]
类型:unsigned int*
要为参数设置的 U32 值数组。
- list_size [输入]
类型:unsigned int
作为输入传递的数组的大小。
返回值
备注
此函数将指定音频效果的列表参数的 U32 值设置为来自 list
的值。
5.2.18. NvAFX_InitializeLogger(仅限 Linux SDK)
此函数初始化 SDK 记录器。
NvAFX_Status NvAFX_InitializeLogger(
LoggingSeverity level,
int target,
const char *filename,
logging_cb_t cb,
void* userdata
);
参数
- level [输入]
类型:LoggingSeverity
要启用的日志记录级别。当您启用一个级别时,它包括当前级别之前的级别。例如,
LOG_LEVEL_INFO
也包括LOG_LEVEL_WARNING
和LOG_LEVEL_ERROR
。LOG_LEVEL_ERROR
LOG_LEVEL_WARNING
LOG_LEVEL_INFO
- Target [输入]
类型:int
日志记录目标,用于将日志写入到
LoggingTarget
可以进行二进制 OR 运算以启用多个目标。LOG_TARGET_NONE = 0x0
LOG_TARGET_STDERR = 0x1
LOG_LEVEL_FILE = 0x2
LOG_LEVEL_CALLBACK = 0x4
- filename [输入]
类型:const char*
要写入日志的文件的路径。仅当启用
LOG_TARGET_FILE
时才使用此参数。注意日志文件所在的目录应存在。例如,如果文件名为
/foo/bar/log.txt
,则/foo/bar
目录必须已存在。如果log.txt
文件存在,它将被覆盖。- cb [输入]
类型:const char *
如果启用
LOG_TARGET_CALLBACK
,则要使用的回调。当不使用回调目标时,可以传递空值。- userdata [输入]
类型:void *
与日志回调一起传递的数据,仅当启用
LOG_TARGET_CALLBACK
时才使用。也可以传递空值。
返回值
备注
此 API 在 SDK 中启用日志记录。根据传递的标志,日志将重定向到 stderr
、文件或回调。可以使用 NvAFX_UninitializeLogger
API 禁用日志记录。
5.2.19. NvAFX_UninitializeLogger(仅限 Linux SDK)
此函数取消初始化 SDK 记录器。
NvAFX_Status NvAFX_UninitializeLogger(void);
参数
NvAFX_UninitializeLogger
不需要任何参数。
返回值
备注
此 API 禁用所有日志记录目标。可以使用 NvAFX_InitializeLogger
API 再次启动日志记录。
5.3. 返回代码
NvAFX_Status
枚举定义了音频效果函数可能返回的以下值,以指示错误或成功
- NVAFX_STATUS_SUCCESS
- 成功执行。
- NVAFX_STATUS_FAILED
- 通用错误代码,指示函数因未指定的原因而执行失败。
- NVAFX_STATUS_INVALID_HANDLE
- 已提供无效的效果句柄。
- NVAFX_STATUS_INVALID_PARAM
- 为此效果和选择器字符串的组合提供了无效的参数值。
- NVAFX_STATUS_IMMUTABLE_PARAM
- 用户尝试修改不可变的参数。
- NVAFX_STATUS_INSUFFICIENT_DATA
- 数据不足以进行处理。
- NVAFX_STATUS_EFFECT_NOT_AVAILABLE
- 不支持指定的效果。
- NVAFX_STATUS_OUTPUT_BUFFER_TOO_SMALL
- 输出缓冲区长度太小,无法容纳请求的数据。
- NVAFX_STATUS_MODEL_LOAD_FAILED
- 无法加载指定的模型文件。
- NVAFX_STATUS_MODEL_NOT_LOADED
- 模型未加载,并且必须加载模型才能进行此操作。
- NVAFX_STATUS_INCOMPATIBLE_MODEL
- 选定的模型不兼容。
- NVAFX_STATUS_GPU_UNSUPPORTED
- 不支持 GPU。音频效果 SDK 需要图灵或更高版本的 GPU,并带有 Tensor 核心。
- NVAFX_STATUS_NO_SUPPORTED_GPU_FOUND
- 系统上未找到受支持的 GPU。
- NVAFX_STATUS_WRONG_GPU
- 当前 GPU 不是选定的 GPU。
- NVAFX_STATUS_CUDA_ERROR
- CUDA 操作失败。
- NVAFX_STATUS_INVALID_OPERATION
- 执行了无效的操作。
声明
本文档仅供参考,不得视为对产品的特定功能、条件或质量的保证。NVIDIA Corporation(“NVIDIA”)对本文档中包含信息的准确性或完整性不作任何明示或暗示的陈述或保证,并且对本文档中包含的任何错误不承担任何责任。NVIDIA 对使用此类信息或因使用此类信息而可能导致的侵犯第三方专利或其他权利的后果或用途不承担任何责任。本文档不构成开发、发布或交付任何材料(如下定义)、代码或功能的承诺。
NVIDIA 保留随时更正、修改、增强、改进和对本文档进行任何其他更改的权利,恕不另行通知。
客户应在下订单前获取最新的相关信息,并应验证此类信息是否为最新且完整。
NVIDIA 产品受 NVIDIA 标准销售条款和条件(在订单确认时提供)的约束,除非 NVIDIA 和客户的授权代表签署的个别销售协议(“销售条款”)另有约定。NVIDIA 特此明确反对将任何客户通用条款和条件应用于购买本文档中引用的 NVIDIA 产品。本文档不直接或间接地构成任何合同义务。
NVIDIA 产品并非设计、授权或保证适用于医疗、军事、航空、航天或生命支持设备,也不适用于 NVIDIA 产品的故障或失灵可能合理预期会导致人身伤害、死亡、财产或环境损害的应用。NVIDIA 对在上述设备或应用中包含和/或使用 NVIDIA 产品不承担任何责任,因此,此类包含和/或使用由客户自行承担风险。
NVIDIA 不保证或声明基于本文档的产品将适用于任何特定用途。NVIDIA 不一定对每个产品的所有参数进行测试。客户全权负责评估和确定本文档中包含的任何信息的适用性,确保产品适合且符合客户计划的应用,并为该应用执行必要的测试,以避免应用或产品的默认设置。客户产品设计的缺陷可能会影响 NVIDIA 产品的质量和可靠性,并可能导致超出本文档中包含的附加或不同条件和/或要求。对于可能基于或归因于以下原因的任何默认、损坏、成本或问题,NVIDIA 不承担任何责任:(i) 以任何违反本文档的方式使用 NVIDIA 产品,或 (ii) 客户产品设计。
本文档未授予 NVIDIA 专利权、版权或其他 NVIDIA 知识产权下的任何明示或暗示的许可。NVIDIA 发布的有关第三方产品或服务的信息不构成 NVIDIA 授予使用此类产品或服务的许可,也不构成对其的保证或认可。使用此类信息可能需要从第三方获得其专利或其他知识产权下的许可,或从 NVIDIA 获得 NVIDIA 专利或其他知识产权下的许可。
只有在事先获得 NVIDIA 书面批准的情况下,才允许复制本文档中的信息,并且复制时不得进行修改,必须完全遵守所有适用的出口法律和法规,并附带所有相关的条件、限制和声明。
本文档以及所有 NVIDIA 设计规范、参考板、文件、图纸、诊断程序、列表和其他文档(统称为“材料”)均“按原样”提供。NVIDIA 对材料不作任何明示、暗示、法定或其他形式的保证,并明确声明不承担所有关于不侵权、适销性和针对特定用途的适用性的暗示保证。在法律未禁止的范围内,在任何情况下,NVIDIA 均不对因使用本文档而引起的任何损害(包括但不限于任何直接、间接、特殊、附带、惩罚性或后果性损害,无论何种原因造成,也无论责任理论如何)承担责任,即使 NVIDIA 已被告知可能发生此类损害。尽管客户可能因任何原因遭受任何损害,但 NVIDIA 对本文所述产品的客户承担的累计总责任应根据产品的销售条款进行限制。
VESA DisplayPort
DisplayPort 和 DisplayPort Compliance Logo、DisplayPort Compliance Logo for Dual-mode Sources 以及 DisplayPort Compliance Logo for Active Cables 是 Video Electronics Standards Association 在美国和其他国家/地区拥有的商标。
HDMI
HDMI、HDMI 徽标和 High-Definition Multimedia Interface 是 HDMI Licensing LLC 的商标或注册商标。
OpenCL
OpenCL 是 Apple Inc. 的商标,已获得 Khronos Group Inc. 的许可使用。
商标
NVIDIA、NVIDIA 徽标以及 cuBLAS、CUDA、CUDA Toolkit、cuDNN、DALI、DIGITS、DGX、DGX-1、DGX-2、DGX Station、DLProf、GPU、JetPack、Jetson、Kepler、Maxwell、NCCL、Nsight Compute、Nsight Systems、NVCaffe、NVIDIA Ampere GPU architecture、NVIDIA Deep Learning SDK、NVIDIA Developer Program、NVIDIA GPU Cloud、NVLink、NVSHMEM、PerfWorks、Pascal、SDK Manager、T4、Tegra、TensorRT、TensorRT Inference Server、Tesla、TF-TRT、Triton Inference Server、Turing 和 Volta 是 NVIDIA Corporation 在美国和其他国家/地区的商标和/或注册商标。其他公司和产品名称可能是与其相关的各自公司的商标。