您可能会注意到,我真的是python和声音处理的新手。我(希望)使用python以及logfbank和mfcc函数从wave文件中提取了FFT数据。 (logfbank似乎提供了最有希望的数据,mfcc的输出对我来说有点奇怪)。
在我的程序中,我想更改logfbank / mfcc数据,然后从中创建wave数据(并将它们写入文件)。我真的没有找到有关从FFT数据创建波形数据的过程的任何信息。你们中有谁知道如何解决这个问题?我会非常感激:)
到目前为止,这是我的代码:
from scipy.io import wavfile
import numpy as np
from python_speech_features import mfcc, logfbank
rate, signal = wavfile.read('orig.wav')
fbank = logfbank(signal, rate, nfilt=100, nfft=1400).T
mfcc = mfcc(signal, rate, numcep=13, nfilt=26, nfft=1103).T
#magic data processing of fbank or mfcc here
#creating wave data and writing it back to a .wav file here
答案 0 :(得分:0)
让您的修改正确地操作频谱图的幅度和相位可能具有挑战性。因此,有时会丢弃相位,并独立控制幅度。为了将其转换回波形,必须在重建(相位重建)期间估计相位信息。这是一个有损耗的过程,通常计算量很大。已建立的方法使用迭代算法,通常是Griffin-Lim的一种变体。但是现在也有new methods使用卷积神经网络。
librosa version 0.7.0包含一个快速的Griffin-Lim实现以及帮助函数,用于反转MFCC的梅尔谱图。
import numpy
import librosa
import soundfile
# parameters
sr = 22050
n_mels = 128
hop_length = 512
n_iter = 32
n_mfcc = None # can try n_mfcc=20
# load audio and create Mel-spectrogram
path = '436951__arnaud-coutancier__old-ladies-pets-and-train-02.flac'
y, _ = librosa.load(path, sr=sr)
S = numpy.abs(librosa.stft(y, hop_length=hop_length, n_fft=hop_length*2))
mel_spec = librosa.feature.melspectrogram(S=S, sr=sr, n_mels=n_mels, hop_length=hop_length)
# optional, compute MFCCs in addition
if n_mfcc is not None:
mfcc = librosa.feature.mfcc(S=librosa.power_to_db(S), sr=sr, n_mfcc=n_mfcc)
mel_spec = librosa.feature.inverse.mfcc_to_mel(mfcc, n_mels=n_mels)
# Invert mel-spectrogram
S_inv = librosa.feature.inverse.mel_to_stft(mel_spec, sr=sr, n_fft=hop_length*4)
y_inv = librosa.griffinlim(S_inv, n_iter=n_iter,
hop_length=hop_length)
soundfile.write('orig.wav', y, samplerate=sr)
soundfile.write('inv.wav', y_inv, samplerate=sr)
重构后的波形会有一些伪像。
上面的示例重复出现了很多噪音,超出了我的预期。使用Audacity中的标准降噪算法可以将其降低很多。