如何基于 ZEGO SDK 实现 Android 变声/混响/立体声
1 前言
在直播、语聊房、K 歌房场景中,为增加趣味性和互动性,玩家可以通过变声来搞怪,通过混响烘托气氛,通过立体声使声音更具立体感。ZegoExpress SDK 提供了多种预设的变声、混响、混响回声、立体声效果,开发者可以灵活设置自己想要的声音,在通话或直播过程中动态调整变声、混响、混响回声、虚拟立体声,如果需要试听,可以启用耳返进行测试。
- 变声:通过改变用户的音调,使输出的声音在感官上与原始声音不同,实现男声变女生等多种效果。
- 混响:通过对声音的特殊处理,制造不同环境的混响效果,让声音如同在音乐厅、大教堂等场景中发出一般。
- 混响回声:通过对声音的特殊处理,可搭配变声、混响以实现自定义各式各样的声音效果,例如空灵,机器人的声音。
- 虚拟立体声:通过深度使用双声道技术,虚拟出发音源的各个位置角度,实现立体声、3D 环绕音、听声辩位等效果。
您可通过 ZEGO 提供的 音效体验 DEMO 体验 SDK 预设的人声效果。
本文将教你如何通过即构ZEGO sdk在Android端实现变声、混响、立体声。
2 示例源码下载
请参考 下载示例源码 获取源码。
相关源码请查看 “/ZegoExpressExample/AdvancedAudioProcessing/src/main/java/im/zego/advancedaudioprocessing/voicechange” 目录下的文件。
3 项目准备
在进行变声/混响/立体声之前,请确保:
- 已在项目中集成 ZEGO Express SDK,实现基本的实时音视频功能,详情请参考 快速开始 - 集成 和 快速开始 - 实现流程。
- 已在 ZEGO 控制台 创建项目,并申请有效的 AppID,详情请参考 控制台 - 项目管理 中的“项目信息”。
** 接下来我们看看完整的实现流程。**
4 实现流程
4.1 变声
4.1.1 设置预设变声
调用 setVoiceChangerPreset 方法使用 SDK 预置的变声效果。
ZegoVoiceChangerPreset 预置的变声效果如下,开发者可以根据需要选择:
| 类型名 | 描述 | 变声类型 |
|---|---|---|
| NONE | 无变声 | - |
| MEN_TO_CHILD | 男声变童声 | 变声 |
| MEN_TO_WOMEN | 男声变女声 | 变声 |
| WOMEN_TO_CHILD | 女声变童声 | 变声 |
| WOMEN_TO_MEN | 女声变男声 | 变声 |
| FOREIGNER | 外国人声效 | 变声 |
| OPTIMUS_PRIME | 擎天柱声效 | 变声 |
| ANDROID | 机器人声效 | 变声 |
| ETHEREAL | 空灵声效 | 音色变换 |
| MALE_MAGNETIC | 磁性男 | 房间美声 |
| FEMALE_FRESH | 清新女 | 房间美声 |
| MAJOR_C | C大调电音 | 电音音效 |
| MINOR_A | A小调电音 | 电音音效 |
| HARMONIC_MINOR | 和声小调电音 | 电音音效 |
以下示例代码以“男声变童声”为例:
ZegoExpressEngine.getEngine().setVoiceChangerPreset(ZegoVoiceChangerPreset.MEN_TO_CHILD);
4.1.2 设置自定义变声
若 SDK 预置的变声效果无法满足需求,开发者可以调用 ZegoVoiceChangerParam 方法,通过音高参数 “pitch” 设置自定义变声,该参数取值范围为 [-8.0, 8.0],值越大声音越尖锐,默认值为 “0.0”(即无变声)。
ZegoVoiceChangerParam voiceChangerParam = new ZegoVoiceChangerParam();
param.pitch = 2.0f;
ZegoExpressEngine.getEngine().setVoiceChangerParam(param);
4.2 混响
4.2.1 设置预设混响
调用 setReverbPreset 通过预设枚举设置混响。
ZegoReverbPreset 预置的混响效果如下,开发者可以根据需要选择:
| 类型名 | 描述 | 混响类型 |
|---|---|---|
| NONE | 无 | - |
| SOFT_ROOM | 小房间 | 空间塑造 |
| LARGE_ROOM | 大房间 | 空间塑造 |
| CONCERT_HALL | 音乐厅 | 空间塑造 |
| VALLEY | 山谷 | 空间塑造 |
| RECORDING_STUDIO | 录音室 | 空间塑造 |
| BASEMENT | 地下室 | 空间塑造 |
| KTV | KTV | 空间塑造 |
| POPULAR | 流行 | 曲风 |
| ROCK | 摇滚 | 曲风 |
| VOCAL_CONCERT | 演唱会 | 空间塑造 |
| GRAMO_PHONE | 留声机 | 空间塑造 |
以下示例代码以“大房间”模式为例:
ZegoExpressEngine.getEngine().setReverbPreset(ZegoReverbPreset.LARGE_ROOM);
4.2.2 设置自定义混响
若 SDK 预设的混响类型无法满足需求,开发者可以调用 ZegoReverbAdvancedParam 方法,通过相关参数搭配设置,实现开发者需要的混响效果(详细参数说明请参考 API 文档)。
ZegoReverbAdvancedParam reverbParam = new ZegoReverbAdvancedParam();
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.getEngine().setReverbAdvancedParam(reverbParam);
当设置自定义混响参数后,启用混响时设置的预设混响效果则会失效。如果想再次使用 SDK 预设参数,可以使用 setReverbPreset 预设枚举方法进行设置。
4.3 混响回声
调用 setReverbEchoParam 方法,通过相关参数搭配设置,实现开发者需要的混响回声效果(详细参数说明请参考 API 文档)。
以下示例代码以实现“空灵声效”为例:
ZegoReverbEchoParam echoParam = new ZegoReverbEchoParam();
echoParam.inGain= 0.8f;
echoParam.outGain =1.0f;
echoParam.numDelays = 7;
int[] delay ={230,460,690,920,1150,1380,1610};
echoParam.delay=delay;
float[] decay={0.41f,0.18f,0.08f,0.03f,0.009f,0.003f,0.001f};
echoParam.decay=decay;
zegoReverbEchoParamDatas.add(echoParam);
ZegoExpressEngine.getEngine().setReverbEchoParam(echoParam);
4.4 虚拟立体声
4.4.1 设置推流音频声道数
如果需要开启虚拟立体声功能,必须在推流前先调用 setAudioConfig 方法设置音频编码声道为 Stereo 双声道 (默认为 Mono 单声道)。
此处示例通过预设枚举构造 ZegoAudioConfig 设置为双声道。
ZegoAudioConfig audioConfig = new ZegoAudioConfig(STANDARD_QUALITY_STEREO);
ZegoExpressEngine.getEngine().setAudioConfig(audioConfig);
4.4.2 设置虚拟立体声参数
设置音频编码声道为双声道后,调用 enableVirtualStereo 方法,通过 “enable” 参数开启虚拟立体声,并通过 “angle” 参数设置虚拟立体声的声源角度后才有立体声效果,角度范围为 0 ~ 360,一般可设为 90 度(即正前方)。
自从 2.15.0 版本开始,SDK 新增支持全方位虚拟立体声效果,使用方式为将 “angle” 角度参数设置为 “-1”。
此处示例为开启虚拟立体声并将角度设置为 90 度:
ZegoExpressEngine.getEngine().enableVirtualStereo(true, 90);
此处示例为开启全方位虚拟立体声:
ZegoExpressEngine.getEngine().enableVirtualStereo(true, -1);
5 API参考列表
| 方 | 描述 |
|---|---|
| setVoiceChangerPreset | 通过预设枚举设置变声 |
| ZegoVoiceChangerParam | 变声器参数 |
| setReverbPreset | 通过预设枚举设置混响 |
| ZegoReverbAdvancedParam | 音频混响高级参数 |
| setReverbEchoParam | 设置混响回声效果 |
| ZegoReverbParam | 设置自定义混响 |
| setAudioConfig | 设置音频配置 |
| enableVirtualStereo | 设置虚拟立体声 |
6 小结
使用 ZEGO sdk,仅一两行代码即可实现生动有趣的变声/混响/立体声等音效,快来试试吧!
7 获取更多文档、Demo、技术帮助
获取 SDK 开发文档、demo,可访问 即构文档中心.
获取更多商务活动热门产品,可提交 信息联系商务.
注册即构ZEGO开发者帐号,快速开始。
如何基于 ZEGO SDK 实现 Android 变声/混响/立体声的更多相关文章
- 如何基于 ZEGO SDK 实现 Android 一对一音视频聊天应用
疫情期间,很多线下活动转为线上举行,实时音视频的需求剧增,在视频会议,在线教育,电商购物等众多场景成了"生活新常态". 本文将教你如何通过即构ZEGO sdk在Android端搭建 ...
- 如何基于 ZEGO SDK 实现 Android 通话质量监测
功能简介 在进行视频通话过程中,用户有时候会出现网络不好的情况,比如在进行多人视频通话或者多人唱歌时,我们需要实时显示用户的网络质量. 示例源码 参考 下载示例源码 获取源码. 相关源码请查看 &qu ...
- 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?
之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...
- 如何基于 ZEGO SDK 实现 Windows 一对一音视频聊天应用
互联网发展至今,实时视频和语音通话越来越被大众所依赖. 今天,我们将会继续介绍如何基于ZEGO SDK实现音视频通话功能,前两篇文章分别介绍了Android,Flutter平台的实现方式,感兴趣的小伙 ...
- 如何基于ZEGO SDK 实现通话质量监测
如何基于ZEGO SDK 实现通话质量监测 1 功能简介 在进行视频通话过程中,用户有时候会出现网络不好的情况,比如在进行多人视频通话或者多人唱歌时,我们需要实时显示用户的网络质量. 示例源码 请参考 ...
- 基于 Web SDK 实现视频通话场景 | 声网 SDK 教程
声网视频 SDK 被广泛应用于多种实时互动场景中,例如视频会议.视频通话.音视频社交.在线教育等.为了让刚刚接触声网 SDK 的开发者,可以更顺畅地实现基础的视频通话功能,我们基于声网 Web SDK ...
- Any to Any 实时变声的实现与落地丨RTC Dev Meetup
前言 「语音处理」是实时互动领域中非常重要的一个场景,在「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自声网.微软和数美的技术专家,围绕该话题进行了相关分享. 本文 ...
- 点聚合功能---基于ARCGIS RUNTIME SDK FOR ANDROID
一直不更新博客的原因,如果一定要找一个,那就是忙,或者说懒癌犯了. 基于ArcGIS RunTime SDK for Android的点聚合功能,本来是我之前做过的一个系统里面的一个小部分,今天抽出一 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境
1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)
1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...
随机推荐
- FastAPI与MongoDB Change Stream的实时数据交响曲
title: FastAPI与MongoDB Change Stream的实时数据交响曲 date: 2025/05/25 13:04:40 updated: 2025/05/25 13:04:40 ...
- C#实现SSE通信方式的MCP Server
前面的课程,我们使用MCP Server,用的是网络上魔搭提供的. 下面我们一起来实现,用C#实现自己的MCP Server. MCP Server通信方式支持SSE.Stdio. 下面我们先实现SS ...
- 为Feign客户端自定义ErrorDecoder
摘要:重写Feign的错误解码器ErrorDecoder,以自定义业务逻辑. ErrorDecoder,顾名思义,它是发生错误或者异常情况时使用的一种解码器,允许我们对异常进行特殊处理. 在配 ...
- java springboot项目启动脚本,指定jdk、指定yml配置文件
start.bat @echo off rem 设置Java路径,根据你的实际情况修改 set JAVA_PATH="./jdk-17.0.6/bin/java.exe" rem ...
- 【语义分割专栏】:U-net实战篇(附上完整可运行的代码pytorch)
目录 前言 U-net全流程代码 模型搭建(model) 数据处理(dataloader) 评价指标(metric) 训练流程(train) 模型测试(test) 效果图 结语 前言 U-net原理篇 ...
- IntelliJ IDEA FIX协议报文解析插件
Fix协议报文手动对照对手方的API查看十分繁琐,尤其是在开发的过程中. 于是我写了一个Fix协议报文解析插件,在idea插件应用市场搜索"Fix Protocol Parser" ...
- AWS学习笔记之Lambda执行权限
最近在网上看到一道关于AWS Lambda的题,十分有意思: A developer has an application that uses an AWS Lambda function to up ...
- .net入行第4年(续集)
.net入行第4年 - 园友2288976 - 博客园 .NET入行第4年 | 第二集的开始:账号封禁后的思考与转型 园友2288976 - 博客园 很多朋友希望我写得更详细一点,特别是"怎 ...
- HyperWorks飞机复合材料结构分析(OptiStruct)
本练习对一个复合材料结构使用 PCOMPG 卡片进行铺层定义的过程,展示使用全局铺层编号对结果后处理的优越性.这里首先介绍了传统的定义方法即使用 PCOMP,通过对比可以显示出使用 PCOMPG 的对 ...
- Java源码分析系列笔记-10.CopyOnWriteArrayList
目录 1. 是什么 2. 如何使用 3. 原理 3.1. 构造方法 3.2. add方法 3.2.1. 先加锁 3.2.2. 复制数组并在这份数组上操作 3.2.3. 将复制的数组set回属性 3.3 ...