如何基于 ZEGO SDK 实现 iOS 变声/混响/立体声


1 功能简介

在直播、语聊房、K 歌房场景中,为增加趣味性和互动性,玩家可以通过变声来搞怪,通过混响烘托气氛,通过立体声使声音更具立体感。ZegoExpress SDK 提供了多种预设的变声、混响、混响回声、立体声效果,开发者可以灵活设置自己想要的声音,如果需要试听,可以启用耳返进行测试。

  • 变声:通过改变用户的音调,使输出的声音在感官上与原始声音不同,实现男声变女生等多种效果。
  • 混响:通过对声音的特殊处理,制造不同环境的混响效果,让声音如同在音乐厅、大教堂等场景中发出一般。
  • 混响回声:通过对声音的特殊处理,可搭配变声、混响以实现自定义各式各样的声音效果,例如空灵,机器人的声音。
  • 虚拟立体声:通过深度使用双声道技术,虚拟出发音源的各个位置角度,实现立体声、3D 环绕音、听声辩位等效果。

您可通过 ZEGO 提供的 音效体验 DEMO 体验 SDK 预设的人声效果。

该功能只针对 SDK 采集的声音有效,开发者可以在通话或直播过程中动态调整变声、混响、混响回声、虚拟立体声。

2 示例源码下载

请参考 下载示例源码 获取源码。

相关源码请查看 “/ZegoExpressExample/Examples/AdvancedAudioProcessing/VoiceChangeReverbStereo” 目录下的文件。

3 前提条件

在使用变声/混响/立体声之前,请确保:

4 使用步骤

4.1 变声

4.1.1 设置预设变声

调用 setVoiceChangerPreset 方法使用 SDK 预置的变声效果。

ZegoVoiceChangerPreset 预置的变声效果如下,开发者可以根据需要选择:

类型名 描述 变声类型
None 无变声 -
MenToChild 男声变童声 变声
MenToWomen 男声变女声 变声
WomenToChild 女声变童声 变声
WomenToMen 女声变男声 变声
Foreigner 外国人音效 变声
OptimusPrime 擎天柱音效 变声
Android 机器人音效 变声
Ethereal 空灵音效 音色变换
MaleMagnetic 磁性男 房间美声
FemaleFresh 清新女 房间美声
MajorC C大调电音 电音音效
MinorA A小调电音 电音音效
HarmonicMinor 和声小调电音 电音音效

以下示例代码以“男声变童声”为例:

 [[ZegoExpressEngine sharedEngine] setVoiceChangerPreset:ZegoVoiceChangerPresetMenToChild];

4.1.2 设置自定义变声

若 SDK 预置的变声效果无法满足需求,开发者可以调用 ZegoVoiceChangerParam 方法,通过音高参数 “pitch” 设置自定义变声,该参数取值范围为 [-8.0, 8.0],值越大声音越尖锐,默认值为 “0.0”(即无变声)。

ZegoVoiceChangerParam *param = [[ZegoVoiceChangerParam alloc] init];
param.pitch = 2.0;
[[ZegoExpressEngine sharedEngine] setVoiceChangerParam:param];

4.2 混响

4.2.1 设置预设混响

调用 setReverbPreset 通过预设枚举设置混响。

ZegoReverbPreset 预置的混响效果如下,开发者可以根据需要选择:

类型名 描述 混响类型
None -
SoftRoom 小房间 空间塑造
LargeRoom 大房间 空间塑造
ConcerHall 音乐厅 空间塑造
Valley 山谷 空间塑造
RecordingStudio 录音室 空间塑造
Basement 地下室 空间塑造
KTV KTV 空间塑造
Popular 流行 曲风
Rock 摇滚 曲风
VocalConcert 演唱会 空间塑造
GramoPhone 留声机 空间塑造

以下示例代码以“大房间”模式为例:

[[ZegoExpressEngine sharedEngine] setReverbPreset:ZegoReverbPresetLargeRoom];

4.2.2 设置自定义混响

若 SDK 预设的混响类型无法满足需求,开发者可以调用 ZegoReverbAdvancedParam 方法,通过相关参数搭配设置,实现开发者需要的混响效果(详细参数说明请参考 API 文档)。

ZegoReverbAdvancedParam *reverbParam = [[ZegoReverbAdvancedParam alloc] init];
reverbParam.damping = 50.0; // 混响阻尼
reverbParam.reverberance = 50.0; // 余响
reverbParam.roomSize = 50.0; // 房间大小
reverbParam.wetOnly = false;
reverbParam.wetGain = 5.0;
reverbParam.dryGain = 5.0;
reverbParam.toneLow = 80.0;
reverbParam.toneHigh = 80.0;
reverbParam.preDelay = 20.0;
reverbParam.stereoWidth = 0.0;

[[ZegoExpressEngine sharedEngine] setReverbAdvancedParam:reverbParam];

当设置自定义混响参数后,启用混响时设置的预设混响效果则会失效。如果想再次使用 SDK 预设参数,可以使用 setReverbPreset 预设枚举方法进行设置。

4.3 混响回声

调用 setReverbEchoParam 方法,通过相关参数搭配设置,实现开发者需要的混响回声效果(详细参数说明请参考 API 文档)。

以下示例代码以实现“空灵音效”为例:

ZegoReverbEchoParam *echoParamEthereal = [[ZegoReverbEchoParam alloc] init];
echoParamEthereal.inGain = 0.8;
echoParamEthereal.outGain = 1.0;
echoParamEthereal.numDelays = 7;
echoParamEthereal.delay = @[@230, @460, @690, @920, @1150, @1380, @1610];
echoParamEthereal.decay = @[@0.41f, @0.18f, @0.08f, @0.03f, @0.009f, @0.003f, @0.001f];
[[ZegoExpressEngine sharedEngine] setReverbEchoParam:echoParamEthereal];

4.4 虚拟立体声

4.4.1 设置推流音频声道数

如果需要开启虚拟立体声功能,必须在推流前先调用 setAudioConfig 方法设置音频编码声道为 Stereo 双声道(默认为 Mono 单声道)。

此处示例通过预设枚举构造 ZegoAudioConfig 设置为双声道。

ZegoAudioConfig *config = [ZegoAudioConfig configWithPreset:ZegoAudioConfigPresetStandardQualityStereo];
[[ZegoExpressEngine sharedEngine] setAudioConfig:config];

4.4.2 设置虚拟立体声参数

设置音频编码声道为双声道后,调用 enableVirtualStereo 方法,通过 “enable” 参数开启虚拟立体声,并通过 “angle” 参数设置虚拟立体声的声源角度后才有立体声效果,角度范围为 0 ~ 360,一般可设为 90 度(即正前方)。

自从 2.15.0 版本开始,SDK 新增支持全方位虚拟立体声效果,使用方式为将 “angle” 角度参数设置为 “-1”。

此处示例为开启虚拟立体声并将角度设置为 90 度:

[[ZegoExpressEngine sharedEngine] enableVirtualStereo:YES angle:90];

此处示例为开启全方位虚拟立体声:

[[ZegoExpressEngine sharedEngine] enableVirtualStereo:YES angle:-1];

5 API参考列表

方法 描述
setVoiceChangerPreset 通过预设枚举设置变声
ZegoVoiceChangerParam 变声器参数
setReverbPreset 通过预设枚举设置混响
ZegoReverbAdvancedParam 音频混响高级参数
setReverbEchoParam 设置混响回声效果
setAudioConfig 设置音频配置
enableVirtualStereo 设置虚拟立体声

获取Demo

获取本文的Demo、开发文档、技术支持。
获取SDK的商务活动、热门产品。
注册即构ZEGO开发者帐号,快速开始。

posted @ 2022-05-10 14:15  ZEGO即构开发者  阅读(529)  评论(0编辑  收藏  举报