AI 降噪插件使用 Agora 人工智能噪声消除算法,可以与 Web SDK(v4.10.0 或以上)搭配使用,降低上百种噪声,减少多人同时说话时的人声失真。对于在线会议、语聊房、远程问诊、游戏语音等场景,AI 降噪插件能够让远程交流和面对面交谈一样实时。
AI 降噪插件可以有效压制以下类型的噪声:
AI 降噪插件支持如下降噪策略:
AI 降噪插件目前有以下限制:
Agora Web SDK 的媒体传输管道包含采集、前处理、编码、传输、解码、后处理和播放等环节。 在前处理阶段,插件可以对管道中的音视频数据进行处理,从而实现虚拟背景、降噪等功能。
使用 AI 降噪插件需要满足以下前提条件:
按照以下步骤集成 AI 降噪插件并实现 AI 降噪功能:
参考快速开始文档,将 Web SDK(v4.10.0 或以上)集成到你的项目中并实现基本的实时音视频功能。
通过 npm 将 AI 降噪插件(agora-extension-ai-denoiser)集成到你的项目中。
npm install agora-extension-ai-denoiser
.js
文件中加入以下代码导入 AI 降噪模块:import {AIDenoiserExtension} from "agora-extension-ai-denoiser";
动态加载 Wasm 和 JS 文件依赖:AI 降噪插件依赖一些 Wasm 和 JS 文件。为保证浏览器可以正常加载和运行这些文件,你需要完成以下步骤:
node_modules/agora-extension-ai-denoiser/external
目录下的 Wasm 和 JS 文件发布至 CDN 或者静态资源服务器中,并且处于同一个公共路径下。后续创建 AIDenoiserExtension
对象时,需要传入上述公共路径的 URL,插件会动态加载这些依赖文件。script-src
选项中添加 'wasm-unsafe-eval'
。 例如:<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'wasm-unsafe-eval'">
script-src
选项中添加 'unsafe-eval'
。注册 AI 降噪插件:调用 AgoraRTC.registerExtensions
方法并传入创建的 AIDenoiserExtension
实例。 你还可以监听 Wasm 和 JS 文件加载失败的事件。
AIDenoiserExtension
实例。// 创建 AIDenoiserExtension 实例,传入 Wasm 和 JS 文件所在的公共路径
const denoiser = new AIDenoiserExtension({assetsPath:'./external'});
// 注册插件
AgoraRTC.registerExtensions([denoiser]);
// (可选)监听 Wasm 和 JS 文件加载失败的事件
denoiser.onloaderror = (e) => {
// 如果 Wasm 和 JS 文件加载失败,你可以关闭插件,例如:
// openDenoiserButton.enabled = false;
console.log(e);
}
创建 IAIDenoiserProcessor
实例:调用 createProcessor
方法创建一个 processor
,并设置插件为默认开启或关闭。你还可以监听降噪处理耗时过长的事件。
// 创建 processor
const processor = denoiser.createProcessor();
// 设置插件为默认开启
processor.enable();
// 设置插件为默认关闭
// processor.disable();
// (可选) 监听降噪处理耗时过长的事件
processor.onoverload = async () => {
console.log("overload!!!");
// 如果降噪处理耗时过长,适时关闭 AI 降噪
await processor.disable();
}
将插件注入音频处理管道:调用 pipe
方法并指定 processorDestination
属性。
// 创建音频轨道
const audioTrack = await AgoraRTC.createMicrophoneAudioTrack();
// 将插件注入音频处理管道
audioTrack.pipe(processor).pipe(audioTrack.processorDestination);
await processor.enable();
控制插件的开启或关闭:调用 enable
方法和 disable
方法。
() => {
if (processor.enabled) {
await processor.disable();
} else {
await processor.enable();
}
}
转储降噪处理过程中的音频数据:调用 dump
方法,并监听 ondump
和 ondumpend
回调。
processor.ondump = (blob, name) => {
// 将降噪处理过程中的音频数据文件以 .wav 格式转储到本地
const objectURL = URL.createObjectURL(blob);
const tag = document.createElement("a");
tag.download = name + ".wav";
tag.href = objectURL;
tag.click();
}
processor.ondumpend = () => {
console.log("dump ended!!");
}
processor.dump();
createProcessor(): IAIDenoiserProcessor;
创建 IAIDenoiserProcessor
实例。
onloaderror?: () => void;
Wasm 和 JS 依赖文件加载失败回调。
get kind(): 'video' | 'audio';
Processor 的类型,分为视频和音频两种。
get enabled(): boolean;
插件是否启用:
enable(): void | Promise<void>;
开启 AI 降噪功能。
disable(): void | Promise<void>;
关闭 AI 降噪功能。
dump(): void;
转储降噪处理过程中的音频数据,方便定位和分析降噪处理的问题。
调用该方法会触发 9 次 ondump
回调,返回插件在该方法调用前 30 秒和后 60 秒处理的音频数据,一共 9 个 WAV 文件(详见音频文件说明)。然后触发 ondumpend
回调,表示已结束音频数据的转储。
音频文件说明
注意
ondump
回调触发不到 9 次时关闭了 AI 降噪,转储过程会立即终止,并触发ondumpend
回调,此时返回的音频数据文件不足 9 个。ondump?: (blob: Blob, name: string) => void;
转储音频数据回调。
该回调返回以下参数:
blob
:音频数据文件。name
:音频数据文件的名称。ondumpend?: () => void;
转储音频数据已结束回调。
onoverload?: () => void;
降噪处理耗时过长回调。 该回调仅作参考,当前版本可能会有误触发的情况。
export interface AIDenoiserExtensionOptions {
assetsPath: string
}
AI 降噪插件初始化参数:
assetsPath
: AI 降噪插件依赖的 Wasm 和 JS 文件的 URL 路径。