在互动娱乐场景中,为增添场景的趣味性并提升互动体验,通常需要设置美声和音效,如变声特效、混响和降噪等,例如,在 KTV 场景中,主播可以使用立体声音效增添自己声音的立体感,快速吸引大量听众。

前提条件

你已经集成 RTC SDK,实现了基本的音视频通话。
支持本功能的 SDK 详见API 参考。
使用预设的变声特效时,需要集成音频技术插件,参见按需集成插件以缩小应用体积。

名词解释

降噪包含传统降噪和 AI 降噪两部分,其中 AI 降噪主要是抑制非平稳噪声,比如键盘敲击声、桌椅碰撞声等。而传统降噪主要是抑制平稳噪声,比如空调声、风扇声等。

功能实现

以下时序图以 Android SDK 中的 API 名称为例。不同端的 SDK 中 API 或回调名称可能略有不同,以 API 参考为准。

alt

1. 创建引擎

创建和初始化一个音视频引擎类。

如果你需要获取远端的音频数据,还需要加入房间并发布音频流,参考 构建 RTC 应用 获取详细步骤。

rtcVideo = RTCVideo.createRTCVideo(this, Constants.APP_ID, rtcVideoEventHandler, null, null);
java
self.rtcVideo = ByteRTCVideo.createRTCVideo(kAppID, delegate: self, parameters: [:])
swift
bytertc::IRTCVideo *video = bytertc::createRTCVideo("app_id", handler, nullptr);
cpp
2. 开启音频采集
rtcVideo.startAudioCapture();
java
self.rtcVideo?.startAudioCapture()
swift
video->startAudioCapture();
cpp
3. 设置变声特效

通过 setVoiceChangerType 和 setVoiceReverbType 选择 RTC SDK 提供的变声和混响效果。

// 设置变声特效
rtcVideo.setVoiceChangerType(type);
// 设置混响特效
rtcVideo.setVoiceReverbType(type);
java
// 设置变声特效
self.rtcVideo?.setVoiceChangerType(ByteRTCVoiceChangerType(type)
// 设置混响特效
self.rtcVideo?.setVoiceReverbType(ByteRTCVoiceReverbType(type)
swift
int ret = 0;
//设置变声特效:原声、巨人、黄粟鼠、小黄人、颤音、机器人
ret = video->setVoiceChangerType(type);
//设置混响特效:原声、回声、演唱会、空灵、KTV、录音棚、虚拟立体声、空旷、3D人声 
ret = video->setVoiceReverbType(type);
cpp

其中,PC 端使用变声特效 setVoiceChangerType 需要传入音频技术 SDK 的 Token。

#ifdef  Q_OS_WINDOWS
    QJsonObject obj;
    QString sami_path = QApplication::applicationDirPath() + "/Resources/sami_effect";
    obj.insert("rtc.sami_app_key", QString::fromStdString(g_sami_key));
    obj.insert("rtc.sami_resource_path", sami_path);
    obj.insert("rtc.sami_token", QString::fromStdString(g_sami_token));

    QJsonDocument doc(obj);
    QString str = QJsonDocument(obj).toJson(QJsonDocument::Compact);
    std::string str_sami = str.toStdString();
    int ret = m_video->setRuntimeParameters(str_sami.c_str());
#endif //  Q_OS_WINDOWS
cpp
4. 自定义升调和混响效果

如果预设效果无法满足你的业务需求,你还可以通过 enableLocalVoiceReverb和 setLocalVoiceReverbParam 自定义人声效果。

// 设置变调,范围 [-12,12]
rtcVideo.setLocalVoicePitch(value);

// 开启本地音效混响效果
rtcVideo.enableLocalVoiceReverb(true);
// 设置本地采集音频的混响效果
rtcVideo.setLocalVoiceReverbParam(config);
java
// 设置变调,范围 [-12,12]
self.rtcVideo?.setLocalVoicePitch(value)

// 开启本地音效混响效果
self.rtcVideo?.enableLocalVoiceReverb(true)
// 设置本地采集音频的混响效果
self.rtcVideo?.setLocalVoiceReverbParam(config)
swift
// 设置变调,范围 [-12,12]
ret = video->setLocalVoicePitch(value); 

// 开启本地音效混响效果
ret = video->enableLocalVoiceReverb(true); 
// 设置本地采集音频的混响效果
ret = video->setLocalVoiceReverbParam(config);
cpp
5. 设置降噪类型

降噪包含传统降噪和 AI 降噪两部分,其中 AI 降噪主要是抑制非平稳噪声,比如键盘敲击声、桌椅碰撞声等;而传统降噪主要是抑制平稳噪声,比如空调声、风扇声等。

rtcVideo.setAnsMode(mode);
java
self.rtcVideo?.setAnsMode(mode)
swift
ret = video->setAnsMode(mode);
cpp
示例项目

参考以下项目获取完整代码。

API 参考

说明:表格中的 macOS API 接口为 Objective-C,而示例项目中的 macOS 项目使用的是 Windows SDK 中的 API 接口。

平台AndroidiOSmacOSWindowsLinuxElectronFlutterUnity
变声setVoiceChangerTypesetVoiceChangerType:setVoiceChangerType:setVoiceChangerType无setVoiceChangerTypesetVoiceChangerType无
预设混响特效setVoiceReverbTypesetVoiceReverbType:setVoiceReverbType:setVoiceReverbType无setVoiceReverbTypesetVoiceReverbTypeSetVoiceReverbType
变调setLocalVoicePitchsetLocalVoicePitch:setLocalVoicePitch:setLocalVoicePitchsetLocalVoicePitchsetLocalVoicePitchsetLocalVoicePitch无
开启自定义混响效果enableLocalVoiceReverbenableLocalVoiceReverb:enableLocalVoiceReverb:enableLocalVoiceReverb无enableLocalVoiceReverbenableLocalVoiceReverb无
设置自定义混响效果setLocalVoiceReverbParamsetLocalVoiceReverbParam:setLocalVoiceReverbParam:setLocalVoiceReverbParam无setLocalVoiceReverbParamsetLocalVoiceReverbParam无
降噪setAnsModesetAnsMode:setAnsMode:setAnsModesetAnsModesetAnsModesetAnsMode无
常见问题
Q:调用 setAnsMode 开启降噪后,降噪不生效,或降噪效果不明显

A:如果你使用的 SDK 版本是 V3.57.1 之前的版本,确保客户端选择的房间模式为以下模式时,AI 降噪功能才能正常开启。建议升级到最新版本,可以在任意房间模式下开启 AI 降噪。

功能变更日志

在 V3.57.1 之前的版本,只有以下场景时,调用 setAnsMode 可以开启 AI 降噪。其余场景的 AI 降噪不会生效。