语音信号的分帧与合成

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.测试效果展示,最终完整合成原始音频。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值