语音增强——DNN(深度神经网络)频谱映射_音频映射 神经网络-程序员宅基地

技术标签: dnn  人工智能  神经网络  

内容来自B站视频:https://www.bilibili.com/video/BV1Vo4y1D7jJ/?spm_id_from=333.788&vd_source=77c874a500ef21df351103560dada737

输出层得到的是干净语音的频谱

 M开头的是男性说话人,F开头的是女性说话人

 

 

get_scp.py程序如下:

import os
import numpy as np

base_path="TIMIT/TEST/"
with open("test.scp","wt",encoding='utf-8') as f:

# base_path="TIMIT/TRAIN/"
# with open("train.scp","wt",encoding='utf-8') as f:
    for root,dirs,files in os.walk(base_path):
        for file in files:
            file_name = os.path.join(root,file)

            if file_name.endswith(".WAV"):
                print(file_name)
                f.write("%s\n"%file_name)

Psignal和Pnoise是能量,Asignal和Anoise是幅值 

 

 librosa读取数据会把语音归一化到[-1,1]之间,因此我们不用librosa,我们使用soundfile,直接读取原始数据

程序如下:

import os
import numpy as np
import random
import scipy.io.wavfile as wav
import librosa
import soundfile as sf
from numpy.linalg import norm
def signal_by_db(speech,noise,snr):
    speech = speech.astype(np.int16)
    noise = noise.astype(np.int16)
    len_speech = speech.shape[0]  # 得到语音的长度
    len_noise = noise.shape[0]    # 得到噪声的长度,噪声的长度要远大于语音的长度
    start = random.randint(0,len_noise-len_speech)  # 返回0~len_noise-len_speech之间的任意整数
    end = start+len_speech
    add_noise = noise[start:end]  # 从噪声信号截取一段与语言信号长度一样的噪声段出来
    add_noise = add_noise / norm(add_noise) * norm(speech) / (10.0 ** (0.05 * snr))
    mix = speech + add_noise
    return mix


if __name__=="__main__":

    noise_path = "D:\\深度学习数据集\\NOISEX"
    noises = ['babble', 'buccaneer1', 'destroyerengine', 'factory2', 'volvo', 'white']
    clean_wavs = np.loadtxt('scp/train.scp', dtype='str').tolist()
    clean_path = "D:\\TIMIT"
    path_noisy = "D:\\深度学习数据集\\DNN-Mapping\\nosiy"
    snrs = [-5, 0, 5, 10, 15, 20]

    with open('scp/train_DNN_enh.scp', 'wt') as f:
        for noise in noises:
            print(noise)
            noise_file = os.path.join(noise_path, noise + '.wav')
            noise_data, fs = sf.read(noise_file, dtype='int16')

            for clean_wav in clean_wavs:
                clean_file = os.path.join(clean_path, clean_wav)
                clean_data, fs = sf.read(clean_file, dtype='int16')

                for snr in snrs:
                    noisy_file = os.path.join(path_noisy, noise, str(snr), clean_wav)
                    noisy_path, _ = os.path.split(noisy_file)
                    os.makedirs(noisy_path, exist_ok=True) # 文件路径不存在则创建路径
                    mix = signal_by_db(clean_data, noise_data, snr)
                    noisy_data = np.asarray(mix, dtype=np.int16)
                    sf.write(noisy_file, noisy_data, fs)  # 把噪声数据写入该路径(noisy_file)下
                    f.write('%s %s \n' %(noisy_file, clean_file))

 

 

 拼帧操作:

假设语音信号有14帧,用5帧预测一帧(中间帧),最终因此只能预测10帧【2~11】

expend=左边扩展帧=右边扩展帧=3,因此本程序用3+3+1=7帧预测一帧

tensor.unfold的dimension表示,沿着哪一个维度进行取帧的,本程序令dimension=0,表示沿着时间的维度取帧,size表示取几帧,step表示移动步长

 

为什么不直接把结果进行MSE,而要进行 BatchNorm1d后在MSE?

原因如下:若不进行BatchNorm1d,数值取值范围很大,用神经网络映射一个取值范围很大的数时,收敛很慢,所以为了提高收敛速度,必须加入BatchNorm1d

测试阶段:

 

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42233059/article/details/126780515

智能推荐

详解深度学习三维重建网络:MVSNet、PatchMatchNet、JDACS-MS-程序员宅基地

文章浏览阅读9.6k次,点赞2次,收藏70次。详解深度学习三维重建网络:MVSNet、PatchMatchNet、JDACS-MS_三维重建网络

一文搞懂各种架构(业务架构、应用架构、数据架构...-程序员宅基地

文章浏览阅读7.8k次,点赞9次,收藏67次。01 什么是架构和架构本质02 架构分层和分类03 架构的级别04应用架构的演进05衡量架构的合理性06 常见架构误区07 架构知识体系01 什么是架构和架构本质在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这个世界的基础,并用来沟通的手段,如果对架构概念理解不一样,那沟..._业务架构 应用架构

apfs扩容_小米2020pro增强版 黑苹果 最新教程-程序员宅基地

文章浏览阅读1.3k次。小米笔记本2020增强版黑苹果,经由本人萃心研究,并整合各位大佬的驱动及设置后,完美运行!相信你找到这篇文章的时候已经踩过很多坑了!毕竟我也是从小白过来的!本教程友好对待一切小白!但弱智问题请查询别的教程!本篇教程,全由个人实操总结而成,并已经成功驱动白卡蓝牙Wi-Fi,以及测试过intel板载蓝牙Wi-Fi,可完美运行,若是解锁,则可以进行睡眠,真正的睡眠!并非伪睡眠!本文章基于各位已经理解并能..._ru.efi 解锁cfg

SpringBoot集成MyBatis-Plus-Join_spring boot +mybatis-plus-join-程序员宅基地

文章浏览阅读425次,点赞4次,收藏5次。MyBatis-Plus-Join (简称 MPJ)是一个 MyBatis-Plus的增强工具,在 MyBatis-Plus 的基础上只做增强不做改变,为简化开发、提高效率而生。_spring boot +mybatis-plus-join

开关电源电路图及原理12v分析-详细版_12v开关电源电路图及原理-程序员宅基地

文章浏览阅读1.5w次,点赞12次,收藏131次。开关电源电路图及原理12v(开关电源电路图及原理详解)开关电源电路图及原理进行讲解,仅供参考!1、开关电源的电路组成开关电源的主要电路是由输入电磁干扰滤波器(EMI)、整流滤波电路、功率变换电路、PWM控制器电路、输出整流滤波电路组成。辅助电路有输入过欠压保护电路、输出过欠压保护电路、输出过流保护电路、输出短路保护电路等。开关电源的电路组成方框图如下:2、输入电路的原理及常见电路(1)AC输入整流滤波电路原理:① 防雷电路:当有雷击,产生高压经电网导入电源时,由MOV1、MOV2、MOV3:F1、F2、F_12v开关电源电路图及原理

Java学习笔记(八):缓冲流、转换流和序列化流_转换流和序列化流的-程序员宅基地

文章浏览阅读237次。foochane :https://foochane.cn/article/2020010201.html文章目录1 缓冲流1.1 概述1.2 字节缓冲输出流成员方法构造方法使用步骤代码示例1.3 字节缓冲输入流成员方法构造方法使用步骤代码示例1.4 基本字节流和缓冲字节流效率测试基本流缓冲流缓冲流使用数据1.5 字符缓冲输出流成员方法构造方法使用步骤代码示例1.6 字符缓冲输入流成员方法构..._转换流和序列化流的

随便推点

制作 linux .deb 安装包_构建deb软件升级包-程序员宅基地

文章浏览阅读371次。ubuntu 制作安装包_构建deb软件升级包

(转载)循序渐进学习嵌入式Linux开发技术-程序员宅基地

文章浏览阅读39次。再次申明,本文是转载,为以后查找留个记号。嵌入式时代已经来临,你还在等什么? ---循序渐进学习嵌入式开发技术最近经常有用人单位给我打来电话,问我这有没有嵌入式Linux方面的开发人员,他们说他们单位急需要懂得在嵌入式linux环境下的软件开发人员,我回答说,现在每年毕业的大学生那么多,还招不到合适的软件开发人员吗?他跟我说,毕业大学生虽然多,但大部分都能力不够,不能达到他们的工作的要...

如何成功在M1 macbook上运行Ubuntu20.04_ubuntu20.04 for m1-程序员宅基地

文章浏览阅读8.3k次,点赞5次,收藏19次。如何在搭载M1芯片的苹果电脑上跑UbuntuParallels官方发布了针对搭载apple silcon M1芯片的Mac的测试版虚拟机,笔者已经成功运行,具体步骤总结如下:第一步 安装测试版 Parallels Desktop需要去官网注册账户然后下载专门的测试软件参考地址:官网地址步骤如下:Meet the new Parallels Desktop (官网页面To run a virtual machine on a new Mac computer with the Apple M1 _ubuntu20.04 for m1

STM32单片机智能手环心率计步器体温-程序员宅基地

文章浏览阅读654次,点赞9次,收藏15次。STM32F103C8T6单片机核心板电路、ADXL345传感器电路、心率传感器电路、温度传感器和lcd1602电路组成。通过重力加速度传感器ADXL345检测人的状态,计算出走路步数、走路距离和平均速度。过心率传感器实时检测心率,通过温度传感器检测温度。通过LCD1602实时显示步数、距离和平均速度、心率以及温度值。主要学习ADXL345,心率传感器等等。

Pandas 修改index_pandas修改df index-程序员宅基地

文章浏览阅读190次。Pandas 修改index。_pandas修改df index

Sharding-JDBC主子表(绑定表)关联_shardingjdbc 对2张表分表,那么联表查询-程序员宅基地

文章浏览阅读2.7k次。主子表关联在我们的开发业务中是及其常见的,本文我们就来看下如何在分库分表的情况下,使用来完成主子关联。官方文档指分片规则一致的主表和子表。例如:t_order 表和 t_order_item 表,均按照 order_id 分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。其中 t_order 在 FROM 的最左侧,ShardingSphere 将会以它作为整个绑定表的主表。_shardingjdbc 对2张表分表,那么联表查询