如何使用librosa等工具从带有对应背景音的歌曲中提取人声
从带伴奏歌曲中提取人声的实现方案
前提要求
- 你手里的
SongName.mp3和SongName_bgm.mp3需要满足三个条件:采样率完全一致、时间轴完全对齐、bgm文件和原曲中的伴奏部分无任何二次修改(包括音量调整、重混、剪辑),否则会出现伴奏残留、杂音等问题。
方法1:使用librosa实现(Python环境)
先安装依赖:pip install librosa soundfile numpy
运行以下代码即可完成提取:
import librosa import soundfile as sf import numpy as np # 统一采样率,可根据你的源文件采样率调整 target_sr = 44100 # 读取两个音频,保留多声道信息 full_audio, _ = librosa.load("SongName.mp3", sr=target_sr, mono=False) bgm_audio, _ = librosa.load("SongName_bgm.mp3", sr=target_sr, mono=False) # 统一两个音频的长度,取较短的长度截断 min_length = min(full_audio.shape[1], bgm_audio.shape[1]) full_audio = full_audio[:, :min_length] bgm_audio = bgm_audio[:, :min_length] # 对bgm做反相处理 reversed_bgm = -bgm_audio # 原曲和反相bgm叠加,伴奏抵消得到人声 extracted_vocals = full_audio + reversed_bgm # 归一化处理避免爆音 extracted_vocals = librosa.util.normalize(extracted_vocals) # 导出提取好的人声,soundfile要求维度为(采样点数, 声道数),因此需要转置 sf.write("extracted_vocals.wav", extracted_vocals.T, target_sr)
如果运行后发现伴奏残留较多,大概率是两个音频存在时间偏移,可以自行添加互相关计算偏移量的逻辑修正对齐后再处理。
方法2:使用FFmpeg快速实现(无需写代码)
如果不想配置Python环境,直接用FFmpeg命令即可完成相同的相位抵消操作,前提同样是两个音频已经对齐:ffmpeg -i SongName.mp3 -i SongName_bgm.mp3 -filter_complex "[1:a]aeval='-val(0)':c=same[bgm_rev];[0:a][bgm_rev]amix=inputs=2:duration=shortest,volume=2[aout]" -map "[aout]" extracted_vocals.wav
命令中的volume=2是为了抵消amix混合时自动降低的音量,避免输出的人声音量过小。
效果优化提示
- 若两个音频的伴奏音量不匹配,可以先将bgm的音量调整到和原曲中伴奏的音量完全一致后再做抵消,效果会明显提升
- 若存在轻微残留杂音,可以后续加基础降噪处理,无需使用machine learning相关模型也能得到可用的人声素材
内容的提问来源于stack exchange,提问作者Q.Z. Lin
相关产品推荐
相关产品推荐

