如何基于 ZEGO SDK 实现 iOS 变声/混响/立体声
1 功能简介
在直播、语聊房、K 歌房场景中,为增加趣味性和互动性,玩家可以通过变声来搞怪,通过混响烘托气氛,通过立体声使声音更具立体感。ZegoExpress SDK 提供了多种预设的变声、混响、混响回声、立体声效果,开发者可以灵活设置自己想要的声音,如果需要试听,可以启用耳返进行测试。
- 变声:通过改变用户的音调,使输出的声音在感官上与原始声音不同,实现男声变女生等多种效果。
- 混响:通过对声音的特殊处理,制造不同环境的混响效果,让声音如同在音乐厅、大教堂等场景中发出一般。
- 混响回声:通过对声音的特殊处理,可搭配变声、混响以实现自定义各式各样的声音效果,例如空灵,机器人的声音。
- 虚拟立体声:通过深度使用双声道技术,虚拟出发音源的各个位置角度,实现立体声、3D 环绕音、听声辩位等效果。
您可通过 ZEGO 提供的 音效体验 DEMO 体验 SDK 预设的人声效果。
该功能只针对 SDK 采集的声音有效,开发者可以在通话或直播过程中动态调整变声、混响、混响回声、虚拟立体声。
2 示例源码下载
请参考 下载示例源码 获取源码。
相关源码请查看 “/ZegoExpressExample/Examples/AdvancedAudioProcessing/VoiceChangeReverbStereo” 目录下的文件。
3 前提条件
在使用变声/混响/立体声之前,请确保:
- 已在项目中集成 ZEGO Express SDK,实现基本的实时音视频功能,详情请参考 快速开始 - 集成 和 快速开始 - 实现流程。
- 已在 ZEGO 控制台 创建项目,并申请有效的 AppID,详情请参考 控制台 - 项目管理 中的“项目信息”。
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开发者帐号,快速开始。
如何基于 ZEGO SDK 实现 iOS 变声/混响/立体声的更多相关文章
- 如何基于 ZEGO SDK 实现 Windows 一对一音视频聊天应用
互联网发展至今,实时视频和语音通话越来越被大众所依赖. 今天,我们将会继续介绍如何基于ZEGO SDK实现音视频通话功能,前两篇文章分别介绍了Android,Flutter平台的实现方式,感兴趣的小伙 ...
- 如何基于ZEGO SDK 实现通话质量监测
如何基于ZEGO SDK 实现通话质量监测 1 功能简介 在进行视频通话过程中,用户有时候会出现网络不好的情况,比如在进行多人视频通话或者多人唱歌时,我们需要实时显示用户的网络质量. 示例源码 请参考 ...
- 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?
之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...
- 如何基于 ZEGO SDK 实现 Android 一对一音视频聊天应用
疫情期间,很多线下活动转为线上举行,实时音视频的需求剧增,在视频会议,在线教育,电商购物等众多场景成了"生活新常态". 本文将教你如何通过即构ZEGO sdk在Android端搭建 ...
- 基于 Agora SDK 实现 iOS 端的多人视频互动
视频互动直播是当前比较热门的玩法,我们经常见到有PK 连麦.直播答题.一起 KTV.电商直播.互动大班课.视频相亲等. 本文将教你如何通过声网Agora 视频 SDK 在iOS端实现一个视频直播应用. ...
- 基于 Web SDK 实现视频通话场景 | 声网 SDK 教程
声网视频 SDK 被广泛应用于多种实时互动场景中,例如视频会议.视频通话.音视频社交.在线教育等.为了让刚刚接触声网 SDK 的开发者,可以更顺畅地实现基础的视频通话功能,我们基于声网 Web SDK ...
- 如何基于 ZEGO SDK 实现 Android 通话质量监测
功能简介 在进行视频通话过程中,用户有时候会出现网络不好的情况,比如在进行多人视频通话或者多人唱歌时,我们需要实时显示用户的网络质量. 示例源码 参考 下载示例源码 获取源码. 相关源码请查看 &qu ...
- Any to Any 实时变声的实现与落地丨RTC Dev Meetup
前言 「语音处理」是实时互动领域中非常重要的一个场景,在「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自声网.微软和数美的技术专家,围绕该话题进行了相关分享. 本文 ...
- 音频算法之小黄人变声 附完整C代码
前面提及到<大话音频变声原理 附简单示例代码>与<声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码> 都稍微讲过变声的原理和具体实现. 大家都知道,算法 ...
- 如何基于App SDK快速地开发一个IoT App?
一.背景及大纲介绍 在如今物联网DCM(Device.Connect.Manage)的大框架下,有一个应用层来分析和处理数据,是必备技能.但是,对于一个公司来说,因为研发能力或者研发时间的原因,可能很 ...
随机推荐
- C#交换方法指针
被引用的dll是testDllFr.dll,其代码为: namespace testDLLFr { public class TestA { public static void TestAM() { ...
- 那些年的鸡汤&&毒鸡汤
既然一定有人会赢,那凭什么不能是我? 既然我想赢得更漂亮,为什么不竭尽全力? 既然是竭尽全力,为什么还要找任何借口来拖延,为什么不在此刻就开始? 一时兴起的踌躇满志没什么了不起,每天都在坚持着进步才是 ...
- SharpIco:用纯C#打造零依赖的.ico图标生成器,支持.NET9与AOT编译
前言 最近一直在完善我今年的两款桌面软件:视频剪辑工具 Clipify 和 AI 文章创作工具 StarBlogPublisher 虽然界面是基本完善了,但图标还是默认的,显得很不专业 于是我打算给这 ...
- 二叉排序树BST及CRUD操作
摘要 构造一颗二叉排序树(也叫二叉搜索树,BST,Binary Search Tree)十分简单.一般来讲,大于根节点的放在根节点的右子树上,小于根节点的放在根节点的左子树上(如果等于根节点,则可视情 ...
- joomla4/5设置媒体管理可以上传word/pdf/zip/excel文档
在默认情况下,如果需要在joomla媒体管理上传word,excel,zip文档会提示不支持的文件类型如图: 解决方案 我们需要进行设置.点击媒体组件右上角的选项按钮,进入到设置页面. 在设置页面里设 ...
- C# WinForms 实现打印监听组件
一.组件简介 打印监听组件是一款集成于 Windows 桌面环境的打印任务管理与监控工具,适用于企业级应用场景.它不仅支持多打印机任务的实时监控,还能通过 WebSocket 与外部系统集成,实现自动 ...
- [书籍精读]《JavaScript设计模式与开发实践》精读笔记分享
写在前面 书籍介绍:本书在尊重<设计模式>原意的同时,针对JavaScript语言特性全面介绍了更适合JavaScript程序员的了16个常用的设计模式,讲解了JavaScript面向对象 ...
- [推荐收藏]JavaScript书籍精读笔记系列导航
写在前面 去年我整理了一份「前端工程师必备书籍清单.md」,得到很多人的关注.这份清单里面的书籍大部分我都看过了,但有些知识点难免看后就忘.之前看这些书对一些重点都进行了记录,最近一段时间计划把这些重 ...
- [书籍精读]《基于MVC的JavaScript Web富应用开发》精读笔记分享
写在前面 书籍介绍:<JavaScript异步编程>讲述基本的异步处理技巧,包括PubSub.事件模式.Promises等,通过这些技巧,可以更好的应对大型Web应用程序的复杂性,交互快速 ...
- HyperWorks二维网格划分与单元连续性
自动网格划分 HyperWorks中为零件定义几何曲面是创建零件壳单元网格的最佳方式.HyperMesh 创建二维网格最有效的方法是使用 Automesh 面板直接在零件的表面创建网格. Autome ...