如何使用Python将scipy.signal.spectrogram反转为音频?
我有: 但是,这会产生一个(几乎)空的声音文件。正如@DrSpill所提到的,订单是错误的,而且从导入也不正确。这应该做到:如何使用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
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')