You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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或者频谱掩码)得到的通常是幅度谱,这时候必须结合原始音频的相位信息才能重建出自然的人声:

  1. 先保留原始音频的STFT相位:
    # 加载原始音频时就计算好STFT的复数谱
    y, sr = librosa.load("original_audio.wav", sr=None)
    D_original = librosa.stft(y)
    # 提取原始相位
    original_phase = np.angle(D_original)
    
  2. 把人声幅度谱和原始相位组合成复数频谱:
    # 组合幅度和相位,得到人声的复数频谱
    D_foreground = S_foreground * np.exp(1j * original_phase)
    
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:43:28