谱减法 语音去噪
程序员文章站
2024-03-18 13:00:28
...
废话不多说 直接上代码,python版的
import numpy as np
import librosa
import scipy
from scipy import io
class SpecSub(object):
def __init__(self, input_wav):
self.data, self.fs = librosa.load(input_wav, sr=None, mono=True)
self.noise_frame = 3 # 使用前三帧作为噪声估计
self.frame_duration = 200/1000 # 200ms 帧长
self.frame_length = np.int(self.fs * self.frame_duration)
self.fft = 2048 # 2048点fft
def main(self):
noise_data = self.get_noise_data()
oris = librosa.stft(self.data, n_fft=self.fft) # Short-time Fourier transform,
mag = np.abs(oris) # get magnitude
angle = np.angle(oris) # get phase
ns = librosa.stft(noise_data, n_fft=self.fft)
mag_noise = np.abs(ns)
mns = np.mean(mag_noise, axis=1) # get mean
sa = mag - mns.reshape((mns.shape[0], 1)) # reshape for broadcast to subtract
sa0 = sa * np.exp(1.0j * angle) # apply phase information
y = librosa.istft(sa0) # back to time domain signal
scipy.io.wavfile.write('./output.wav', self.fs, (y * 32768).astype(np.int16)) # save signed 16-bit WAV format
def get_noise_data(self):
noise_data = self.data[0:self.frame_length]
for i in range(1, self.noise_frame):
noise_data = noise_data + self.data[i*self.frame_length:(i+1)*self.frame_length]
noise_data = noise_data / self.noise_frame
return noise_data
if __name__ == '__main__':
ss = SpecSub('./1A001.wav')
ss.main()
抄完记得点赞!!!
上一篇: 我的emacs配置文件
推荐阅读