2024/09/19 14:52:02
设置人声效果
在社交娱乐场景中,为增添场景的趣味性并提升互动体验,通常需要设置人声效果,如语聊美声、歌唱美声、音色变换等。例如,在 KTV 场景中,主播可以使用立体声音效增添自己声音的立体感,快速吸引大量听众。
本文介绍如何在你的项目中实现人声效果。
功能介绍
声网提供封装在枚举中的预设人声效果参数,帮助你实现以下人声效果:
- 美声
- 语聊美声:在不改变原声辨识度的前提下,根据男女声各自的特点美化说话声。
- 歌唱美声:在保留歌声原有特点的前提下,根据男女声各自的特点美化歌声。
- 音色变换:将人声的音色朝特定的方向微调。
- 音效
- 曲风音效:在演唱特定风格的歌曲时,使歌声与伴奏更加契合。
- 空间塑造:通过空间混响效果营造一定的空间氛围,让人声彷佛从特定的场地中传出。
- 电音音效:通过调整人声的音调使其与伴奏的调式和主音音高完全匹配,从而实现电音效果。
- 变声
- 基础变声:保留一定的人声辨识度,使其更加中性、甜美或稳重。
- 进阶变声:大幅改变人声,实现大叔音、少女音、猪八戒、绿巨人等声音。
- 自定义人声效果:如果预设效果无法满足你的需求,你可以手动调整人声的音调、均衡和混响效果以自定义人声效果。
前提条件
项目已经实现了实现音视频互动。
设置音频场景和编码属性
为了获得更好的人声效果,声网推荐你在实现人声效果前先调用以下方法:
setAudioScenario
:将音频场景设置为高音质场景AUDIO_SCENARIO_GAME_STREAMING
(3)。setAudioProfile
[2/2]:将音频编码属性设置为高音质编码:- 使用单声道传输:设为
AUDIO_PROFILE_MUSIC_HIGH_QUALITY
- 使用立体声传输:设为
AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO
- 使用单声道传输:设为
Java
// 创建 RtcEngine 对象
mRtcEngine = RtcEngine.create(config);
// 设置音频场景音频场景设置
mRtcEngine.setAudioScenario(Constants.AudioScenario.getValue(Constants.AudioScenario.GAME_STREAMING));
// 设置音频编码属性
mRtcEngine.setAudioProfile(Constants.AudioProfile.getValue(Constants.AudioProfile.MUSIC_HIGH_QUALITY_STEREO));
实现人声效果
本节介绍如何在你的项目中实现各种人声效果。
美声
调用 setVoiceBeautifierPreset
方法,设置曲风音效、空间塑造、电音音效等效果。
-
语聊美声
Java// 将人声效果设置为磁性(男)
mRtcEngine.setVoiceBeautifierPreset(Constants.CHAT_BEAUTIFIER_MAGNETIC);
// 关闭人声效果
mRtcEngine.setVoiceBeautifierPreset(Constants.VOICE_BEAUTIFIER_OFF); -
歌唱美声
Java// 示例 1:设置男声音效
// 设置为歌唱美声预设,可美化男声并添加小房间混响效果
mRtcEngine.setVoiceBeautifierPreset(Constants.SINGING_BEAUTIFIER);
// 关闭人声效果
mRtcEngine.setVoiceBeautifierPreset(Constants.VOICE_BEAUTIFIER_OFF);
// 示例 2:设置女声音效
// 调用 setVoiceBeautifierParameters 方法,实现美化女声,并添加大厅混响效果
mRtcEngine.setVoiceBeautifierParameters(Constants.SINGING_BEAUTIFIER, 2, 3);
// 关闭人声效果
mRtcEngine.setVoiceBeautifierPreset(Constants.VOICE_BEAUTIFIER_OFF); -
音色变换
Java// 设置音色为浑厚
mRtcEngine.setVoiceBeautifierPreset(Constants.TIMBRE_TRANSFORMATION_VIGOROUS);
// 关闭人声效果
mRtcEngine.setVoiceBeautifierPreset(Constants.VOICE_BEAUTIFIER_OFF);
音效
调用 setAudioEffectPreset
方法,设置曲风音效、空间塑造、电音音效等效果。
-
曲风音效
Java// 设置曲风为流行
mRtcEngine.setAudioEffectPreset(Constants.STYLE_TRANSFORMATION_POPULAR);
// 关闭人声效果
mRtcEngine.setAudioEffectPreset(Constants.AUDIO_EFFECT_OFF); -
空间塑造
Java// 设置空间塑造效果为 KTV 中的效果
mRtcEngine.setAudioEffectPreset(Constants.ROOM_ACOUSTICS_KTV);
// 关闭人声效果
mRtcEngine.setAudioEffectPreset(Constants.AUDIO_EFFECT_OFF); -
电音音效
Java// 示例 1:采用预设的音调调整方式实现电音音效
// 预设以主音音高为 C 的自然大调为基础,修正音频的实际音高
mRtcEngine.setAudioEffectPreset(Constants.PITCH_CORRECTION);
// 关闭人声效果
mRtcEngine.setAudioEffectPreset(Constants.AUDIO_EFFECT_OFF);
// 示例 2:自行调整基础调式和主音音高实现电音音效
// 调用 setAudioEffectParameters 调整修音的基础调式为自然小调,主音音高为 D
mRtcEngine.setAudioEffectParameters(Constants.PITCH_CORRECTION, 2, 6);
// 关闭人声效果
mRtcEngine.setAudioEffectPreset(Constants.AUDIO_EFFECT_OFF);
变声
调用 setAudioEffectPreset
和 setVoiceConversionPreset
方法,分别实现基础变声和进阶变声效果。
-
基础变声
Java// 设置变声效果为更中性化的声音
mRtcEngine.setVoiceConversionPreset(Constants.VOICE_CHANGER_NEUTRAL);
// 关闭人声效果
mRtcEngine.setVoiceConversionPreset(Constants.VOICE_CONVERSION_OFF); -
进阶变声
Java// 设置变声效果为绿巨人的声音
mRtcEngine.setAudioEffectPreset(Constants.VOICE_CHANGER_EFFECT_HULK);
// 关闭人声效果
mRtcEngine.setAudioEffectPreset(Constants.AUDIO_EFFECT_OFF);
自定义人声效果
调用 setLocalVoicePitch
、setLocalVoiceEqualization
和 setLocalVoiceReverb
以调整音调、均衡和混响效果自定义人声效果。
以下示例代码展示如何通过手动设置参数值把原始人声变成绿巨人的声音:
Java
double pitch = 0.5;
mRtcEngine.setLocalVoicePitch(pitch);
// 设置本地人声均衡波段的中心频率
// 第 1 个参数为频谱子带索引,取值范围 [0,9],分别代表 10 个频带,对应的中心频率视 [31,62,125,250,500,1000,2000,4000,8000,16000] Hz
// 第 2 个参数为每个频率区间的增益值,取值范围 [-15,15],单位 dB, 默认值为 0
mRtcEngine.setLocalVoiceEqualization(Constants.AUDIO_EQUALIZATION_BAND_FREQUENCY.fromInt(0), -15);
mRtcEngine.setLocalVoiceEqualization(Constants.AUDIO_EQUALIZATION_BAND_FREQUENCY.fromInt(1), 3);
mRtcEngine.setLocalVoiceEqualization(Constants.AUDIO_EQUALIZATION_BAND_FREQUENCY.fromInt(2), -9);
mRtcEngine.setLocalVoiceEqualization(Constants.AUDIO_EQUALIZATION_BAND_FREQUENCY.fromInt(3), -8);
mRtcEngine.setLocalVoiceEqualization(Constants.AUDIO_EQUALIZATION_BAND_FREQUENCY.fromInt(4), -6);
mRtcEngine.setLocalVoiceEqualization(Constants.AUDIO_EQUALIZATION_BAND_FREQUENCY.fromInt(5), -4);
mRtcEngine.setLocalVoiceEqualization(Constants.AUDIO_EQUALIZATION_BAND_FREQUENCY.fromInt(6), -3);
mRtcEngine.setLocalVoiceEqualization(Constants.AUDIO_EQUALIZATION_BAND_FREQUENCY.fromInt(7), -2);
mRtcEngine.setLocalVoiceEqualization(Constants.AUDIO_EQUALIZATION_BAND_FREQUENCY.fromInt(8), -1);
mRtcEngine.setLocalVoiceEqualization(Constants.AUDIO_EQUALIZATION_BAND_FREQUENCY.fromInt(9), 1);
// 原始人声强度,即 dry signal,取值范围 [-20,10],单位为 dB
mRtcEngine.setLocalVoiceReverb(Constants.AUDIO_REVERB_TYPE.fromInt(0), 10);
// 早期反射信号强度,即 wet signal,取值范围 [-20,10],单位为 dB
mRtcEngine.setLocalVoiceReverb(Constants.AUDIO_REVERB_TYPE.fromInt(1), 7);
// 所需混响效果的房间尺寸,一般房间越大,混响效果越强。 取值范围 [0,100]
mRtcEngine.setLocalVoiceReverb(Constants.AUDIO_REVERB_TYPE.fromInt(2), 6);
// Wet signal 的初始延迟长度,取值范围 [0,200],单位为 ms
mRtcEngine.setLocalVoiceReverb(Constants.AUDIO_REVERB_TYPE.fromInt(3), 124);
// 混响效果持续的强度,取值范围为 [0,100],值越大,混响效果越强
mRtcEngine.setLocalVoiceReverb(Constants.AUDIO_REVERB_TYPE.fromInt(4), 78);
开发注意事项
- 同一时间只能设置一种人声效果,否则先设置的人声音效会被后设置的覆盖。
setVoiceBeautifierPreset
、setAudioEffectPreset
、setVoiceConversionPreset
中的部分枚举适用于不同性别,需要加以区分。如果用于不适用的性别人声,会导致失真。
参考信息
示例项目
声网在 Gitee、GitHub 上提供开源的实现人声效果示例项目 VoiceEffects 供你参考,你可以前往下载或查看其中的源代码。
API 参考
设置音频场景和编码属性
预设人声效果
-
setVoiceBeautifierPreset
-
setAudioEffectPreset
-
setVoiceConversionPreset
-
setAudioEffectParameters
-
setVoiceBeautifierParameters