如何在 python 中从声音到频谱然后回到声音?

Posted

技术标签:

【中文标题】如何在 python 中从声音到频谱然后回到声音?【英文标题】:How do I go from sound to spectrum then back to sound in python? 【发布时间】:2016-01-10 19:45:50 【问题描述】:

我如何获取一个 wav 文件,将其转换为每几毫秒频率强度的数组,对该数组执行一些操作,然后将该新数组转换回 wav 文件。

有没有类似这样的库

wav_data = library.read_wav('aoeu.wav') # [0, 3, 201, ... etc]

spectrum = library.get_spectrum(wav_data)  
# [[0, 0, 0, .2, 0, .7, ... etc], 
#  [0, 0, 0, .3, 0, .8, ... etc],
#  ... etc] 

spectrum[:, 0] = 0 # kill the lowest frequency (assuming spectrum is a numpy array)

library.spectrum_to_wav(spectrum) # [0, 3, 201, ... etc]

【问题讨论】:

【参考方案1】:

使用librosa.stftlibrosa.istft 并使用librosa.load 读取音频文件

import librosa

audio, sample_rate = librosa.load('song.wav')

spectrum = librosa.stft(audio)
reconstructed_audio = librosa.istft(spectrum)

sum(audio[:len(reconstructed_audio)] - reconstructed_audio)  # very close to 0

我正在使用audio[:len(reconstructed_audio)],因为信息在转换中丢失了。 istft(stft(foo)) 可以返回比 foo 略短且值略有不同的数组。

【讨论】:

以上是关于如何在 python 中从声音到频谱然后回到声音?的主要内容,如果未能解决你的问题,请参考以下文章

matlab 如何得到声音信号的频率-时间图,而不是频谱图???

你能告诉我如何从声音中检测事件,无论其波或频谱的一部分是不是超过特定数量的阈值? [复制]

如何在 VB6 中从麦克风录制声音?

如何在 ActionScript 3 中从缓冲区 (ByteArray/Stream) 播放 MP3 声音?

音频基础学习三——声音的时频谱

在 Swift 3 中从数组中播放随机声音