如何用Librosa从频谱提取音频?含分离后前景人声提取方法
嘿,我来帮你搞定这两个Librosa相关的问题!
从频谱中提取音频的通用方法
首先得明确:我们通常说的“频谱”一般分两种——复数频谱(包含幅度和相位信息)和幅度频谱(只有幅度,丢失了相位),这两种转音频的方法不一样:
如果是复数频谱(比如用
librosa.stft()直接得到的结果D),那直接用逆短时傅里叶变换(ISTFT)就能转回去:import librosa # 先加载原始音频 y, sr = librosa.load("your_audio_file.wav", sr=None) # 计算STFT得到复数频谱 D = librosa.stft(y) # 逆STFT重建音频 reconstructed_audio = librosa.istft(D) # 保存重建后的音频 librosa.output.write_wav("reconstructed_audio.wav", reconstructed_audio, sr)如果只有幅度频谱(比如你用
np.abs(D)提取的S),那得先用Griffin-Lim算法估计相位,再重建音频——因为没有相位的话,直接转出来的音频会非常失真:import librosa import numpy as np # 假设S是你的幅度频谱 S = np.abs(librosa.stft(y)) # 用Griffin-Lim迭代估计相位并重建音频,n_iter是迭代次数,越多音质越好但越慢 reconstructed_audio = librosa.griffinlim(S, n_iter=32) # 保存 librosa.output.write_wav("reconstructed_from_magnitude.wav", reconstructed_audio, sr)
从S_foreground提取人声音频
你已经拿到了人声的频谱S_foreground,这里核心要注意:这个变量是幅度谱还是复数谱?
情况1:S_foreground是幅度谱(最常见的情况)
用人声分离(比如NMF或者频谱掩码)得到的通常是幅度谱,这时候必须结合原始音频的相位信息才能重建出自然的人声:
- 先保留原始音频的STFT相位:
# 加载原始音频时就计算好STFT的复数谱 y, sr = librosa.load("original_audio.wav", sr=None) D_original = librosa.stft(y) # 提取原始相位 original_phase = np.angle(D_original) - 把人声幅度谱和原始相位组合成复数频谱:
# 组合幅度和相位,得到人声的复数频谱 D_foreground = S_foreground * np.exp(1j * original_phase) - 用ISTFT转成音频:
# 重建人声音频 vocal_audio = librosa.istft(D_foreground) # 保存人声文件 librosa.output.write_wav("vocal_only.wav", vocal_audio, sr)
情况2:S_foreground是复数谱
如果你的分离方法直接得到了包含相位的复数人声频谱,那更简单,直接用ISTFT转换就行:
vocal_audio = librosa.istft(S_foreground) librosa.output.write_wav("vocal_only.wav", vocal_audio, sr)
小提醒
一定要确保S_foreground的形状和原始STFT的D_original完全一致,不然会出现维度不匹配的错误哦!
内容的提问来源于stack exchange,提问作者Saha Reno
相关产品推荐
相关产品推荐

