2.不同语音ai任务dataset类写法

主流语音任务

在这里插入图片描述

  • 语音数据读取基本原则
    直接保存语音会将该对象保存在内存中(Dataset类调用__getitem__方法)
    所以一般保存这些数据的存储路径文档(表单)而不是数据的直接copy(不然占用内存太大了)
    通常用numpy将数据保存为.npy格式(比如保存mel谱)

提取表单(获取文本文档)

  1. 从语音文件提取出特征数据文件夹
  2. 以数据文件夹目录作为输入,提取出表单的同时做出一定的筛选按
  3. 以表单作为参数,写出符合任务要求的torch.utils.DataSet类
def generate_scp_dataset(dataset_dir):
    with open('Train_Scp.txt','a',encoding='utf-8' ) as txtf :
        for dirname,subdirs,files in os.walk(dataset_dir):
            for f in files:
                if f.split('.')[-1] == 'npy':
                    txtf.write(os.path.join(dirname,f) + "\n")
    print("写入表单")

如果需要筛选语音,建议把筛选代码写到这个函数中,这也可以保证特征数据集是不会发生变化的

  • 比较常见的筛选:
    • 去掉比较短的语音
    • 去掉比较长的语音
    • 筛选某个人的语音或者某几类需要的语音

特征提取

  1. 函数将语音文件夹提取特征到另一个文件夹的同文件目录结构下。由“XXX.wav”命名为"XXX.npy"
  2. 提取时,对语音做出一定的预处理,比如静音消除等
# 这里用from pathlib import Path # 代替os库 处理路径问题
wavpaths = [x for x in src_wavp.rglob('*.wav') if x.is_file() ] 
# 如果要写os版本的代码,文件一定要以.wav结尾,否则会报错

ttsum = len(wavpaths) # 总语音数量
mel_frames = []
k=0
for wp in wavpaths:
	k+=1
	the_wavpath = str(wp.reslove())
	the_wavpath = str(wp.reslove().replace(hp.wav_datadir_name, hp.feature_dir_name).replace('wav','npy')
	wavform,_ = librosa.load(the_wavpath)
	wavform,_ = librosa.effects.trim(wavform, top_db=20) # 静音消除
	wavform = torch.FloatTensor(wavform).unsequeeze(0)
	mel = stftfunc.mel_spectrogram(wavform)
	mel = mel.sequeeze().detach().cpu().numpy()
	np.save(the_melpath, mel)

构建DataSet类

pytorch提供了DataSet类,可以当成列表

  • 基础知识

    • AI分类任务中,pytorch的神经网络模型通常接受一个[B,D,T]的张量,输出语音每个类别的概率[B, Num_class]
      (B:几条语音,D:多少维,T:多少帧)
    • 以mel谱为例,每条语音提取成melspec特征后,变成一个[80, 帧数]的矩阵
  • 矛盾:不同的语音,长度不同,那不同帧数的矩阵,如何拼接成一个三维矩阵呢?
    希望的数据集和神经网络希望的输入有矛盾,无法打包成[B,D,T]张量
    还有如何从数据集中读取矩阵

一个不会出bug的DataLoader数据读取过程

在这里插入图片描述
但是实际数不是整齐的{[80,100],[80,100],[80,100],[80,100]},而是如{[80,335],[80,317]}这种,是不能被DataLoader直接打包的,会报错

需要进行处理,不同任务有不同处理

说话人识别任务的DataSet.getitem

数据处理与两点有关
  • 数据处理与任务的机器学习目的有关
    m a x   P ( C ∣ x 1 , x 2 , . . . , x T ) max \ P(C|{x_1,x_2,...,x_T}) max P(Cx1,x2,...,xT) 最大化一段序列的类别条件概率
    花括号中是mel谱,这里表示T帧的mel谱
    在mel谱给定的条件下,判别为C的概率
  • 与数据本身的性质有关
    1. 时长分布
    2. 静音
    3. 信噪比
    4. 远场?近场?
    5. 是否人类语音分类?还是动物语音分类或者其他?
得到的结论
  1. 该条件概率与T无关
    无论一个人发出多长、多短、什么内容的声音,模型都应该能够正确判别该语音的类别
  2. 训练的时候,根据不同的模型,可以有不同的getitem方式
    有的模型可以接受不同长度的矩阵,给出相同维度的分类概率输出(GSTmodel)
    有的模型则不能,如经典的卷积结构的神经网络,Resnet系列,以及一切基于卷积神经网络的模型
    有的模型则是输入多少长度,就输出多少长度的隐矩阵,如RNN模型以及一切基于自回归的模型(如transform,不过tf不是子回归模型,但是他推理的时候是自回归的推理)
  • eg.
    考虑最简单的情况(如卷积神经网络):接受一个固定输入维度,输出分类概率的模型
    则原语音维度不管长短,都要变成[80,L]的维度。L在每个batch的训练中是一个固定的数字,也就是一个超参数
    如何确定超参数->看数据集的时长分布图
    在这里插入图片描述
    256:从图上看,256可以包含大部分数据

确定数据长度后如何写getitem——两种padding方法

1. 固定长度的padding

  • Padding(将补零和随机截断,称为Padding)
    1. 遇到比较短的语音,将长度补0到256(接上面的例子) ->补零
    2. 遇到比较长的语音,随机截取片段,作为256帧的代表片段 ->随即截断
      在这里插入图片描述

这样可以保证在训练过程中可以覆盖95%+的数据
Padding的代码很大程度上决定模型训练的效果

## 下面两个函数 ,实现,将一个二维矩阵 补零到 指定长度。 (补一列一列的零). 如果超过指定的seglen,则切掉多余的。
def pad(x, seglen, mode='wrap'):
    pad_len = seglen - x.shape[1] # seglen:目标长度;pad_len:要补的长度
    y = np.pad(x, ((0,0), (0,pad_len)), mode=mode)
    return y

def segment(x, seglen=128):
    '''
    :param x: npy形式的mel [80,L]
    :param seglen: padding长度
    :return: padding mel
    '''
    ## 该函数将melspec [80,len] ,padding到固定长度 seglen
    if x.shape[1] < seglen:	# 语音小
        y = pad(x, seglen)
    elif x.shape[1] == seglen:# 语音等
        y = x
    else:
        r = np.random.randint(x.shape[1] - seglen) ## r : [0-  (L-128 )],原长-seglen后随机取一个数
        y = x[:,r:r+seglen]
    return y

tacotron2式的padding:对每个batch进行最大序列长度padding

项目地址
在这里插入图片描述
相关代码在TextMelCollate类中,核心代码在__call__中

其他任务的padding方式

在这里插入图片描述

代码

import torch
import numpy as np
import os
from torch.utils.data import  Dataset,DataLoader

# 提取表单
def generate_scp_dataset(dataset_dir):
    with open('Train_Scp.txt','a',encoding='utf-8' ) as txtf :
        for dirname,subdirs,files in os.walk(dataset_dir):
            for f in files:
                if f.split('.')[-1] == 'npy':
                    txtf.write(os.path.join(dirname,f) + "\n")
    print("写入表单")

## 下面两个函数 ,实现,将一个二维矩阵 补零到 指定长度。 (补一列一列的零). 如果超过 指定的seglen,则切掉多余的。
def pad(x, seglen, mode='wrap'):
    pad_len = seglen - x.shape[1]
    y = np.pad(x, ((0,0), (0,pad_len)), mode=mode)
    return y

def segment(x, seglen=256):
    '''
    :param x: npy形式的mel [80,L]
    :param seglen: padding长度
    :return: padding mel
    '''
    ## 该函数将melspec [80,len] ,padding到固定长度 seglen
    if x.shape[1] < seglen:
        y = pad(x, seglen)
    elif x.shape[1] == seglen:
        y = x
    else:
        r = np.random.randint(x.shape[1] - seglen) ## r : [0-  (L-128 )]
        y = x[:,r:r+seglen]
    return y

class MeldataSet_1(Dataset):    # 继承pytorch的DataSet
    def __init__(self,scp_dir,seglen):  # scp_dir文本文档
        self.scripts = []
        self.seglen = seglen
        with open(scp_dir,encoding='utf-8') as f :
            for l in f.readlines():
                self.scripts.append(l.strip('\n'))
        self.L = len((self.scripts))
        pass
    def __getitem__(self,index):        # 根据用户给定的索引取数据

        src_path = self.scripts[index]
        src_mel = np.load(src_path)## 从硬盘将数据 读入内存的一个io过程。.npy
        src_mel = segment(np.load(src_path), seglen=self.seglen) # 加上padding操作
        return torch.FloatTensor(src_mel) ## 【80,256】 padding后出来的数据维度统一,这样后续就可以dataloader了

    def __len__(self):
        return self.L
        pass
    
def my_collection_way(batch): ## batch : tuple
    print("Dataloder 中的 collection func 调用:")
    print([  x.shape for x in batch])   # 此时帧数不一样
    output = torch.stack([ torch.FloatTensor(segment(x,seglen=256)) for x in batch  ],dim=0)# dim:对第0个维度stack
    return output



    pass
if __name__ == '__main__':

    #generate_scp_dataset("meldata_22k_trimed")
    ''''
    # ############################################################
    # ####   padding与不padding的 dataloader  演示。
    Mdata = MeldataSet_1("./Audio/Train_Scp.txt",seglen=256)
    print(Mdata[0].shape) ##  进行索引操作的时候,就是在调用 getitem (index)
    print(Mdata[1].shape)
    print("-----------")
        # 输出torch.size([80,335])  torch.size([80,317])
        # 如何打包成为三维矩阵
            # pytorch提供打包接口:DataLoader(帮助打包的类)
    #
    # ## 包装这个dataset,成为datalodaer
    Mdataloader = DataLoader(Mdata, batch_size=3)
    for batch in Mdataloader:
        print(batch.shape)  ## [3,80,256]
        print("-----")
    #     ## 为什么要读取一批数据呢 ?-> 显卡 处理一批数据 ,速度比较cpu快的~
    # exit()
    ############################################################

    ############################################################
    '''
    
    
    ###  演示collection——fn
    Mdata = MeldataSet_1("Train_Scp.txt",seglen=256)

    Mdataloader = DataLoader(Mdata, batch_size=3,collate_fn=my_collection_way) # batch规定一次3个数据,去除数据过程中就要调用collate_function(收集数据的函数)
    for batch in Mdataloader:
        print(batch.shape)
        exit()
    ############################################################

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K8S + Jenkins 做CICD

前言 这里会做整体CICD的思路和流程的介绍&#xff0c;会给出核心的Jenkins pipeline脚本&#xff0c;最后会演示一下 实验/实操 结果 由于整体内容较多&#xff0c;所以不打算在这里做每一步的详细演示 - 本文仅作自己的实操记录和日后回顾用 要看保姆式教学的可以划走了&…

力扣 LeetCode 701. 二叉搜索树中的插入操作(Day10:二叉树)

解题思路&#xff1a; 全部插入到叶子节点即可 class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {if (root null) {TreeNode node new TreeNode(val);return node;}if (root.val < val) {root.right insertIntoBST(root.right, val);}if (root…

2024年11月22日Github流行趋势

项目名称&#xff1a;twenty 项目维护者&#xff1a;charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael 项目介绍&#xff1a;正在构建一个由社区驱动的现代Salesforce替代方案。 项目star数&#xff1a;22,938 项目fork数&#xff1a;2,413 项目名称&#xff1…

Qt之QMainWidget相关

QMainWindow 继承于QWidget的子类 自带一个菜单栏,一个工具栏,可以设置状态栏与铆钉部件 菜单栏:QMenuBar 注意:一个窗口最多一个菜单栏 API: 创建 QMenuBar(parent) 获取QMainWindow自带的菜单栏 QMenuBar* menuBar() 添加菜单:QMenu addMenu(QMenu *menu); 菜单添加活动:QAct…

【深度学习之一】2024最新pytorch+cuda+cudnn下载安装搭建开发环境

兵马未动&#xff0c;粮草先行。作为深度学习的初学者&#xff0c;快速搭建一个属于自己的开发环境就是头等大事&#xff0c;可以让我们节省许多的时间。这一期我们主要讲一讲2024年最新pytorchcudacudnn下载安装搭建开发环境&#xff0c;以及安装过程中可能遇到的一些问题以及…

SQL 复杂查询

目录 复杂查询 一、目的和要求 二、实验内容 &#xff08;1&#xff09;查询出所有水果产品的类别及详情。 查询出编号为“00000001”的消费者用户的姓名及其所下订单。&#xff08;分别采用子查询和连接方式实现&#xff09; 查询出每个订单的消费者姓名及联系方式。 在…

如何在 UniApp 中实现 iOS 版本更新检测

随着移动应用的不断发展&#xff0c;保持应用程序的更新是必不可少的&#xff0c;这样用户才能获得更好的体验。本文将帮助你在 UniApp 中实现 iOS 版的版本更新检测和提示&#xff0c;适合刚入行的小白。我们将分步骤进行说明&#xff0c;每一步所需的代码及其解释都会一一列出…

ssm面向品牌会员的在线商城小程序

摘要 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和电子化。它将是直接管理面向品牌会员的在线商城小程序的最新形式。本小程序是以面向品牌会员的在线商城管理为目标&#xff0c;使用 java技术制…

《OpenCV 图像缩放、翻转与变换全攻略:从基础操作到高级应用实战》

简介&#xff1a;本文详细阐述了 OpenCV 在图像操作中的关键技术&#xff0c;包括缩放&#xff08;确定尺寸缩放与按比例缩放&#xff09;、翻转&#xff08;沿不同轴的翻转方式&#xff09;以及变换&#xff08;平移、旋转、三点确定变换和四点确定变换即透视变换&#xff09;…

sql注入报错分享(mssql+mysql)

mysql mysql的报错内容比较多 网上也有比较多的 这里重复的就不多介绍了。一笔带过 溢出类 bigint 当超过mysql的整形的时候&#xff0c;就会导致溢出&#xff0c;mysql可能会将错误信息带出。这里user()是字母默认为0 取反以后1可能就会导致异常。 报错特征 BIGINT UNSIG…

FastAPI重载不生效?解决PyCharm中Uvicorn无法重载/重载缓慢的终极方法!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 重载缓慢 📒📝 问题概述🚨 相关原因📝 解决方案一📝 解决方案二📝 解决方案三📝 解决方案四⚓️ 相关链接 ⚓️📖 介绍 📖 在使用FastAPI开发时,reload=True 本应让你在修改代码后自动重启服务,提升开发效率…

AI智能稿件排版系统订单管理系统

在现代制造业和服务行业中&#xff0c;高效的生产流程和精确的订单管理是企业保持竞争优势的核心要素。AI智能稿件排版系统和订单管理系统作为一体化解决方案&#xff0c;以其强大的自动化能力和智能化技术&#xff0c;帮助企业实现排版效率提升、数据格式兼容性增强和生产流程…

jetson orin系列开发版安装cuda的gpu版本的opencv

opencv安装包下载地址&#xff1a; https://github.com/opencv/opencv/扩展库下载地址&#xff1a; https://github.com/opencv/opencv_contrib1. 删除jetpack包中的opencv版本 原先的opencv库安装在目录/usr/lib/aarch64-linux-gnu/下&#xff08;一般其他的第三方库也都安…

24小时自动监控,自动录制直播蓝光视频!支持抖音等热门直播软件

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 工具特点📒📝 使用🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 对于许多直播爱好者和内容创作者而言,错过心爱的直播或难以搜集视频素材始终是一个难题。今天,给大家分享的这款工具可以轻松解决这个问题,它拥有…

dockerfile构建Nginx镜像练习二(5-2)

环境准备&#xff1a; (1)保证拥有centos基础镜像 docker images | grep centos (2)服务器保证可以连接外网 1.创建工作目录 mkdir nginx cd nginx 2.在工作目录中创建并编写Dockerfile文件 vim dockerfile #定义基础镜像 FROM centos:7#维护者信息(可缺省) MAINTAINER d…

Etcd 框架

基本了解 客户端、长连接与租约的关系 客户端对象 etcd的客户端对象是用户与etcd服务进行交互的主要接口&#xff0c;主要功能就是存储、通知和事务等功能访问 键值存储&#xff1a;客户端通过put 和 get操作存储数据&#xff1b;数据存储在etcd的层级化键值数据库中监听器&a…

滑动窗口篇——如行云流水般的高效解法与智能之道(1)

前言&#xff1a; 上篇我们介绍了双指针算法&#xff0c;并结合具体题目进行了详细的运用讲解。本篇我们将会了解滑动窗口。滑动窗口是一种常用的算法技巧&#xff0c;主要用于处理子数组、子串等具有“窗口”特性的题目。柳暗花明&#xff0c;乃巧解复杂问题的高效之道。 一. …

数据结构-树状数组专题(2)

一、前言 接上回树状数组专题&#xff08;1&#xff09;&#xff0c;这次主要介绍差分跟树状数组联动实现区间更新 二、我的模板 重新放了一遍&#xff0c;还是提一嘴&#xff0c;注意下标从0开始&#xff0c;区间左闭右开 template <typename T> struct Fenwick {in…

QA|使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R)

使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R) 纸张、薄膜、塑料、金属箔、新能源电池和卷料生产设备 (converting equipment) 的制造商正在转向建模和仿真&#xff0c;以提升卷料处理的设备性能和产品质量。MapleSim 卷料处理库提供了专业的建模元件以及功能&a…

2024ARM网络验证 支持一键云注入引流弹窗注册机 一键脱壳APP加固搭建程序源码及教程

此套源码功能强大&#xff0c;支持APK脱壳、注入、网络验证、注册机、引流弹窗、更新弹窗和公告等功能&#xff0c;并具有强大的系统应用管理端&#xff0c;可轻松管理用户数量和卡密状态等数据统计。armpro脱壳软件可在线修改手机文件和游戏数据&#xff0c;并可添加会员功能、…