1. 对语音信号做分帧处理,对分帧后的音频合成原始的信号
import numpy as np
'''分帧合成函数'''
def Filpframe_OverlapA(x, win, inc):
"""
基于重叠相加法的信号还原函数
:param x: 分帧数据
:param win: 窗
:param inc: 帧移
:return:
"""
nf, slen = x.shape
nx = (nf - 1) * inc + slen
frameout = np.zeros(nx)
x = x / win
for i in range(nf):
start = i * inc
frameout[start:start + slen]= x[i, :]
return frameout
def cut_signal(sig, nw=256, inc=128):
signal_length = len(sig) # 信号总长度
if signal_length <= nw: # 如果信号长度小于一帧的长度,则帧数定义为1
nf = 1 # nf表示帧数量
else:
nf = int(np.ceil((1.0 * signal_length - nw + inc) / inc)) # 处理后,所有帧的数量,不要最后一帧
pad_length = int((nf - 1) * inc + nw) # 所有帧加起来总的平铺后的长度
pad_signal = np.pad(sig, (0, pad_length - signal_length), 'constant') # 0填充最后一帧
# print(pad_length - signal_length)
indices = np.tile(np.arange(0, nw), (nf, 1)) \
+ np.tile(np.arange(0, nf * inc, inc), (nw, 1)).T # 相当于对所有帧的时间点进行抽取,得到nf*nw长度的矩阵
indices = np.array(indices, dtype=np.int32) # 将indices转化为矩阵
frames = pad_signal[indices] # 得到帧信号
win = np.tile(np.hamming(nw), (nf, 1))
return frames*win
"测试代码"
import numpy as np
import librosa
import soundfile
from funcation import Filpframe_OverlapA,cut_signal
x,sr = librosa.load('E:\Pytorch\音频数据\mix.wav',sr=None)
print("原始音频长度:",x.shape)
"分帧"
fn=cut_signal(x,256,128)
print("分帧后的音频:",fn.shape)
"重叠相加合成音频"
y=Filpframe_OverlapA(fn,np.hamming(256),128)
print("合成后的音频长度:",y.shape)
soundfile.write('E:\Pytorch\音频数据\enhance.wav', y,8000)
2.测试效果展示,最终完整合成原始音频。