如何使用Python将scipy.signal.spectrogram反转为音频?

如何使用Python将scipy.signal.spectrogram反转为音频?,python,scipy,spectrogram,librosa,Python,Scipy,Spectrogram,Librosa,我有: 但是,这会产生一个(几乎)空的声音文件。正如@DrSpill所提到的,订单是错误的,而且从导入也不正确。这应该做到: import librosa from scipy import signal import scipy.io.wavfile as sf samples, sample_rate = sf.read(args.file) nperseg = int(sample_rate * 0.001 * 20) frequencies, times, spectrogr

我有:

但是,这会产生一个(几乎)空的声音文件。

正如@DrSpill所提到的,订单是错误的,而且从导入也不正确。这应该做到:

import librosa
from scipy import signal 
import scipy.io.wavfile as sf    

samples, sample_rate = sf.read(args.file)
nperseg = int(sample_rate * 0.001 * 20)
frequencies, times, spectrogram = signal.spectrogram(samples, 
                                                     sample_rate, 
                                                     nperseg=nperseg, 
                                                     window=signal.hann(nperseg))

audio_signal = librosa.griffinlim(spectrogram)
print(audio_signal, audio_signal.shape)

sf.write('test.wav', audio_signal, sample_rate)
备注: 当我听到结果文件时,它的速度加快了,我认为这是由于您的处理,但经过一些调整,它应该可以工作

一个很好的替代方法是仅使用,如下所示:

import librosa
import numpy as np
import scipy.signal
import scipy.io.wavfile

# read file
file    = "temp/processed_file.wav"
fs, sig = scipy.io.wavfile.read(file)
nperseg = int(fs * 0.001 * 20)

# process
frequencies, times, spectrogram = scipy.signal.spectrogram(sig, 
                                                           fs, 
                                                           nperseg=nperseg, 
                                                           window=scipy.signal.hann(nperseg))
audio_signal = librosa.core.spectrum.griffinlim(spectrogram)
print(audio_signal, audio_signal.shape)

# write output
scipy.io.wavfile.write('test.wav', fs, np.array(audio_signal, dtype=np.int16))
librosa.output是。它不再提供不推荐使用的输出模块。相反,请尝试:


要使用Griffin Lim,您需要一个幅值谱图。我会尝试在
signal.spectrogram(…mode='magnity')
调用中指定模式。没有测试过,没有。同样的结果我不能评论librosa图书馆。假设这不是问题所在,您是否尝试了scipy.io库来读取和写入音频文件?scipy.io.wavfile.read和scipy.io.wavfile.write。请注意,顺序从signal,signal_rate更改为signal_rate,signal。()我使用的是
soundfile
重建的文件是否具有相同数量的样本?很抱歉回答得太晚,我刚刚进一步测试了这一点,在第二个解决方案中,应该指定输入采样率(我相应地编辑了代码)。我用它验证了输入和输出信号具有相同的采样率。但是,在使用第二种解决方案时,应注意比特率和编码。有关更多信息,请参阅。
import librosa
import numpy as np

# read file
file    = "temp/processed_file.wav"
sig, fs = librosa.core.load(file, sr=8000)

# process
abs_spectrogram = np.abs(librosa.core.spectrum.stft(sig))
audio_signal = librosa.core.spectrum.griffinlim(abs_spectrogram)

print(audio_signal, audio_signal.shape)

# write output
librosa.output.write_wav('test2.wav', audio_signal, fs)
 
import numpy as np
import soundfile as sf
sf.write('stereo_file.wav', np.random.randn(10, 2), 44100, 'PCM_24')

#Per your code you could try:
sf.write('test.wav', audio_signal, sample_rate, 'PCM_24')