基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(二)

目录

  • 前言
  • 引言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
  • 模块实现
    • 1. 数据预处理
      • 1)数据介绍
      • 2)数据测试
      • 3)数据处理
  • 相关其它博客
  • 工程源代码下载
  • 其它资料下载


在这里插入图片描述

前言

博主前段时间发布了一篇有关方言识别和分类模型训练的博客,在读者的反馈中发现许多小伙伴对方言的辨识和分类表现出浓厚兴趣。鉴于此,博主决定专门撰写一篇关于方言分类的博客,以满足读者对这一主题的进一步了解和探索的需求。上篇博客可参考:

《基于Python+WaveNet+CTC+Tensorflow智能语音识别与方言分类—深度学习算法应用(含全部工程源码)》

引言

本项目以科大讯飞提供的数据集为基础,通过特征筛选和提取的过程,选用WaveNet模型进行训练。旨在通过语音的梅尔频率倒谱系数(MFCC)特征,建立方言和相应类别之间的映射关系,解决方言分类问题。

首先,项目从科大讯飞提供的数据集中进行了特征筛选和提取。包括对语音信号的分析,提取出最能代表语音特征的MFCC,为模型训练提供有力支持。

其次,选择了WaveNet模型进行训练。WaveNet模型是一种序列生成器,用于语音建模,在语音合成的声学建模中,可以直接学习采样值序列的映射,通过先前的信号序列预测下一个时刻点值的深度神经网络模型,具有自回归的特点。

在训练过程中,利用语音的MFCC特征,建立了方言和相应类别之间的映射关系。这样,模型能够识别和分类输入语音的方言,并将其划分到相应的类别中。

最终,通过这个项目,实现了方言分类问题的解决方案。这对于语音识别、语音助手等领域具有实际应用的潜力,也有助于保护和传承各地区的语言文化。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述

运行环境

本部分包括Python环境、TensorFlow环境、JupyterNotebook环境、PyCharm环境。

详见博客。

模块实现

本项目包括4个模块:数据预处理、模型构建、模型训练及保存、模型生成。下面分别给出各模块的功能介绍及相关代码。

1. 数据预处理

本部分包括数据介绍、数据测试和数据处理。

1)数据介绍

数据集网址为:challenge.xfyun.cn,向用户免费提供了3种方言(长沙话、南昌话、上海话),每种方言包括30人,每人200条数据,共计18000条训练数据,以及10人、每人50条,共计1500条验证数据。数据以pcm格式提供,可以理解为.wav文件去掉多余信息之后仅保留语音数据的格式。

2)数据测试

使用Audition进行语音测试,导出mp3格式进行检测,如图所示。

在这里插入图片描述

使用MATLAB得到该语音片段的波形和MFCC特征,相关代码如下:

[x, fs]=audioread('test.mp3');
bank=melbankm(24,256,fs,0,0.4,'m');
%Mel滤波器的阶数为24
%fft变换的长度为256,采样频率为8000Hz
%归一化mel滤波器组系数
bank=full(bank);
bank=bank/max(bank(:));
for k=1:12	%归一化mel滤波器组系数
n=0:23;
dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));
end
w=1+6*sin(pi*[1:12]./12);%归一化倒谱提升窗口
w=w/max(w);%预加重滤波器
xx=double(x);
xx=filter([1-0.9375],1,xx);%语音信号分帧
xx=enframe(xx,256,80);%对*256点分为一帧
%计算每帧的MFCC参数
for i=1:size(xx,1)
y=xx(i,:);
s=y'.*hamming(256);
t=abs(fft(s));%fft快速傅立叶变换
t=t.^2;
c1=dctcoef*log(bank*t(1:129));
c2=c1.*w';
m(i,:)=c2';
end
%求取差分系数
dtm=zeros(size(m));
for i=3:size(m,1)-2
dtm(i,:)=-2*m(i-2,:)-m(i-1,:)+m(i+1,:)+2*m(i+2,:);
end
dtm=dtm/3;
%合并mfcc参数和一阶差分mfcc参数
ccc=[m dtm];
%去除首尾两帧,因为这两帧的一阶差分参数为0
ccc=ccc(3:size(m,1)-2,:);
subplot(2,1,1) 
ccc_1=ccc(:,1);
plot(ccc_1);title('MFCC');ylabel('幅值');
[h,w]=size(ccc);
A=size(ccc);
subplot(212) ;
plot([1,w],A);
xlabel('维数');
ylabel('幅值');
title('维数与幅值的关系')

运行代码,成功得到一段语音的波形片段和MFCC特征,如图1和图2所示。

在这里插入图片描述

图1 语音片段波形图

在这里插入图片描述

图2 Matlab提取MFCC特征图

3)数据处理

本部分包括数据处理过程中的相关代码。

(1)加载库。在实验过程中,通过查找发现Matplotlib包内没有中文字体,加载库之后添加参数设定或者更改Matplotlib默认字体可以解决。相关代码如下:

#-*- coding:utf-8 -*-
import numpy as np
import os
from matplotlib import pyplot as plt
#在实验过程中使用pyplot参数设置,使得图像可打印中文,且中文内容格式应该为u“内容”
plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文标签
plt.rcParams['axes.unicode_minus']=False 
from mpl_toolkits.axes_grid1 import make_axes_locatable
%matplotlib inline
from sklearn.utils import shuffle   #导入各种模块
import glob
import pickle
from tqdm import tqdm
from keras.models import Model
from keras.preprocessing.sequence import pad_sequences
from keras.layers import Input, Activation, Conv1D, Add, Multiply, BatchNormalization, GlobalMaxPooling1D, Dropout
from keras.optimizers import Adam
from keras.callbacks import ModelCheckpoint, ReduceLROnPlateau
from python_speech_features import mfcc
import librosa
from IPython.display import Audio
import wave

(2)加载pcm文件,共18000条训练数据,1500条验证数据,相关代码如下:

train_files = glob.glob('data/*/train/*/*.pcm')
dev_files = glob.glob('data/*/dev/*/*/*.pcm')
#glob.glob()用于查找符合特定规则的文件路径名,并返回所有匹配的文件路径列表
#其中“*”为匹配符,匹配多个字符
print(len(train_files), len(dev_files), train_files[0])
#读取代码成功,打印结果

(3)整理每条语音数据对应的分类标签,相关代码如下:

labels = {'train': [], 'dev': []}
#使用dict与list类型嵌套存储分类标签
#tqdm打印进度条,用于观察读取情况
for i in tqdm(range(len(train_files))):
    path = train_files[i]
    label = path.split('/')[1]
		#使用split将path以“/”分隔的字符串进行切片,并选取第1个分片
    labels['train'].append(label)   
for i in tqdm(range(len(dev_files))):
    path = dev_files[i]
    label = path.split('/')[1]
    labels['dev'].append(label)
print(len(labels['train']), len(labels['dev']))
#读取代码成功,打印结果

(4)定义处理语音、pcm转wav、可视化语音的三个函数,由于语音片段长短不一,所以去除少于1s的短片段,对于长片段则切分为不超过3s的片段。相关代码如下:

mfcc_dim = 13
sr = 16000
min_length = 1 * sr
slice_length = 3 * sr
#语音处理函数
def load_and_trim(path, sr=16000):
    audio = np.memmap(path, dtype='h', mode='r')
		#使用numpy内的memmap函数读写大文件,返回对象可使用ndarray算法操作
    audio = audio[2000:-2000]
    audio = audio.astype(np.float32)
		#astype实现dataframe类型转换
    energy = librosa.feature.rmse(audio)
		#librosa为音频处理包,使用feature.rmse求均方根误差
    frames = np.nonzero(energy >= np.max(energy) / 5)
		#nonzero()函数将布尔数组转为整数数组,用于进行下标运算
		#nonzero()返回参数数组中值不为0的元素下标,返回类型是元组
		#元组的每个元素均为一个整数数组,值为非零元素下标在对应帧的值
    indices = librosa.core.frames_to_samples(frames)[1]
		#将样本索引采样转换为帧
    audio = audio[indices[0]:indices[-1]] if indices.size else audio[0:0]
    slices = []
    for i in range(0, audio.shape[0], slice_length):
        s = audio[i: i + slice_length]
        if s.shape[0] >= min_length:
            slices.append(s)
		#长度>3s进行切片,<1s过滤
        return audio, slices
#文件格式处理,pcm转为wav函数
def pcm2wav(pcm_path, wav_path, channels=1, bits=16, sample_rate=sr):
    data = open(pcm_path, 'rb').read()
    fw = wave.open(wav_path, 'wb')
		#设置转化为.wav格式时相同的参数(通道数、采样率等)
    fw.setnchannels(channels)	#通道
    fw.setsampwidth(bits // 8)
    fw.setframerate(sample_rate)	#采样率
    fw.writeframes(data)	#写入
    fw.close()
#语音可视化
def visualize(index, source='train'):
	#可视化语音,默认可视化训练集内的语音,也可以选择参数“dev”可视化测试集
    if source == 'train':
        path = train_files[index]
    else:
        path = dev_files[index]
    print(path)
        audio, slices = load_and_trim(path)
		#读取语音信号
    print('Duration: %.2f s' % (audio.shape[0] / sr))
		#使用matplotlob库内的pyplot进行绘图
    plt.figure(figsize=(12, 3))
    plt.plot(np.arange(len(audio)), audio)
    plt.title(u'未处理信号')
    plt.xlabel(u'时间')
    plt.ylabel(u'信号幅度值')
    plt.show()#展示未处理的音频信号
    feature = mfcc(audio, sr, numcep=mfcc_dim)
		#提取MFCC特征
    print('Shape of MFCC:',feature.shape)
		#进行画图
    fig = plt.figure(figsize=(12, 5))
		#figsize指定figure的宽和高,单位为英寸
    ax = fig.add_subplot(111)#subplot()为图像分区,参数111表示只有一张图
    im = ax.imshow(feature,cmap=plt.cm.jet, aspect='auto')
		#imshow热图绘制,通过色差、亮度展示数据的差异
    plt.title(u'归一化MFCC')
    plt.ylabel('时间')
    plt.xlabel('MFCC参数')
    plt.colorbar(im,cax=make_axes_locatable(ax).append_axes('right', size='5%', pad=0.05))		
#给图配渐变色时,在图旁边把色标(colorbar)标注出来
	   #其中cax参数表示将要绘制颜色条的轴
    ax.set_xticks(np.arange(0,13,2),minor=False);#设置横坐标刻度
    plt.show()
    wav_path = 'example.wav'
    pcm2wav(path,wav_path)
    return wav_path
Audio(visualize(2))	#调用函数选取其中一条语音信号进行可视化

读取代码成功可以得到一句长沙话对应的波形和MFCC特征,如图所示。

在这里插入图片描述

(5)整理数据,查看语音片段的长度分布,最后得到18890个训练片段,1632个验证片段。相关代码如下:

X_train = []  #参数设置
X_dev = []
Y_train = []
Y_dev = []
lengths = []
for i in tqdm(range(len(train_files))):
    path = train_files[i]
    audio, slices = load_and_trim(path)	#取语音信号
    lengths.append(audio.shape[0] / sr)	#除以sr(=16000)换算成时间长度
    for s in slices:  #按照片段进行训练
        X_train.append(mfcc(s, sr, numcep=mfcc_dim))
        Y_train.append(labels['train'][i])
for i in tqdm(range(len(dev_files))):  #输出参数
    path = dev_files[i]
    audio, slices = load_and_trim(path)
    lengths.append(audio.shape[0] / sr)
    for s in slices:
        X_dev.append(mfcc(s, sr, numcep=mfcc_dim))
        Y_dev.append(labels['dev'][i])
print(len(X_train), len(X_dev))
plt.hist(lengths, bins=100)
	#matplotlib中的hist()函数,用于可视化生成直方图
plt.show()

读取代码成功,如图所示。

在这里插入图片描述

(6)将MFCC特征进行归一化处理,相关代码如下:

#矩阵堆叠,沿竖直方向矩阵堆叠
samples = np.vstack(X_train) 
#计算每一列的平均值(axis=0)
mfcc_mean = np.mean(samples, axis=0)
#计算每一列的标准差(axis=0)
mfcc_std = np.std(samples, axis=0)
print(mfcc_mean)
print(mfcc_std)
#归一化处理
X_train = [(x - mfcc_mean) / (mfcc_std + 1e-14) for x in X_train]
X_dev = [(x - mfcc_mean) / (mfcc_std + 1e-14) for x in X_dev]
maxlen = np.max([x.shape[0] for x in X_train + X_dev])
X_train = pad_sequences(X_train, maxlen, 'float32', padding='post', value=0.0) 
#pad_sequences对序列进行预处理
#maxlen参数为序列的最大长度,返回类型dtype为float32,“post”表示需要补0时在末尾补
X_dev = pad_sequences(X_dev, maxlen, 'float32', padding='post', value=0.0)
print(X_train.shape, X_dev.shape)

(7)对分类标签进行处理,相关代码如下:

from sklearn.preprocessing import LabelEncoder
from keras.utils import to_categorical
#将标签标准化
le = LabelEncoder()
#为非监督学习
Y_train = le.fit_transform(Y_train) #fit_transform()
Y_dev = le.transform(Y_dev)
print(le.classes_)
class2id = {c: i for i, c in enumerate(le.classes_)}
#enumerate将可遍历数据对象组合为索引序列
id2class = {i: c for i, c in enumerate(le.classes_)}
num_class = len(le.classes_)
Y_train = to_categorical(Y_train, num_class)
#keras内的to_categorical将类别向量转换为二进制矩阵类型表示
Y_dev = to_categorical(Y_dev, num_class)
print(Y_train.shape, Y_dev.shape)
#代码运行,获得分类标签的处理图

(8)定义产生批数据的迭代器,相关代码如下:

batch_size = 16
def batch_generator(x, y, batch_size=batch_size):   #批次处理
    offset = 0
    while True:
        offset += batch_size
        if offset == batch_size or offset >= len(x):
            #将序列的所有元素随机排序
x, y = shuffle(x, y)	
         offset = batch_size
        X_batch = x[offset - batch_size: offset]    
        Y_batch = y[offset - batch_size: offset]
         #yield返回生成器
yield (X_batch, Y_batch) 

相关其它博客

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(一)

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(三)

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(四)

工程源代码下载

详见本人博客资源下载页


其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

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

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

相关文章

ooTD I 这么精致优雅的套装也太好看了吧

精致到每一个细节的国风套装 领口袖口拼接环保毛条 精美的绣花增添浓重的高级感 外套90白鸭绒填充 敲暖和裙子的门襟处 也是做了定制盘扣&#xff0c;外套和裙子单独来穿也很精致

章鱼网络进展月报 | 2023.11.1-11.30

章鱼网络大事摘要 1、2023年12月&#xff0c;Octopus 2.0 将会正式启动。 2、隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态。 3、Louis 受邀作为嘉宾&#xff0c;在 NEARCON2023 的多链网络主题沙龙中发言&#xff1a;我们依然处于区…

主存储器与CPU的连接

目录 一. 单块存储芯片与CPU的连接二. 多块存储芯片与CPU的连接2.1 位扩展2.2 字扩展2.3 字位扩展 三. 译码器知识点的补充 \quad 一. 单块存储芯片与CPU的连接 \quad \quad \quad 暴露出的引脚都是与CPU连接的 上面这个是88位的存储芯片 我们可以看到有8个字, 每个字的字长是8…

Git提交代码时出现: ‘LF will be replaced by CRLF the next time Git touches it‘

遇到的问题 windows平台进行 git add 时&#xff0c;控制台打印警告 问题分析 1. Dos/Windows平台默认换行符&#xff1a;回车&#xff08;CR&#xff09;换行&#xff08;LF&#xff09;&#xff0c;即’\r\n’ 2. Mac/Linux平台默认换行符&#xff1a;换行&#xff08;LF&…

imazing正在查找最新的apple mobile device组件

​ Apple Mobile Device是macOS的一个组件&#xff0c;它允许您在Mac上与iOS设备进行无缝连接和通信。因此&#xff0c;无法直接在苹果设备上下载和安装Apple Mobile Device&#xff0c;需要借助管理工具进行下载安装后启动。 如果您需要与iOS设备进行通信和同步&#xff0c;…

javascript实现Stack(栈)数据结构

上一篇文章我们理解了List这种数据结构&#xff0c;知道了它的特点和一些使用场景&#xff0c;这篇文章我们就来看一下栈这种数据结构&#xff0c;这里的栈可不是客栈哦&#xff0c;哈哈 栈其实和List非常像&#xff0c;使用javascript实现都是基于数组来实现 尝试理解Stack …

10 大 Android 手机系统修复软件深度评测

您的新 Android 手机可能因其令人兴奋的性能而印象深刻。然而&#xff0c;随着时间的推移&#xff0c;您可能会发现系统有些地方与以前不太一样。您可能会遇到屏幕无响应、 Android应用程序崩溃、连接问题、电池耗尽等现象。 10 大 Android 手机系统修复软件 好吧&#xff0c;…

【51单片机系列】74HC595实现对LED点阵的控制

本文是关于LED点阵的使用&#xff0c;使用74HC595模块实现对LED点阵的控制。 文章目录 一、8x8LED点阵的原理1.1 LED点阵显示原理1.2 LED点阵内部结构图1.3 开发板上的LED点阵原理图1.4 74HC595芯片 二、使用74HC595模块实现流水灯效果三、 使用74HC595模块控制LED点阵对角线亮…

【数据结构和算法】--- 栈

目录 栈的概念及结构栈的实现初始化栈入栈出栈其他一些栈函数 小结栈相关的题目 栈的概念及结构 栈是一种特殊的线性表。相比于链表和顺序表&#xff0c;栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的…

LeetCode力扣每日一题(Java):26、删除有序数组中的重复项

一、题目 二、解题思路 1、我的思路 我一开始的思路是创建一个ArrayList对象&#xff0c;然后将数组中的元素追加到ArrayList中&#xff0c;再通过ArrayList提供的API去解题&#xff0c;但是发现题目中提到了原地删除重复的元素&#xff0c;所以这种方法是行不通的 那就只能…

智能优化算法应用:基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.袋獾算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

使用LangSmith来快速学习LangChain

好风凭借力&#xff0c;送我上青云&#xff01; 什么是LangSmith LangSmith is a platform for building production-grade LLM applications. It lets you debug, test, evaluate, and monitor chains and intelligent agents built on any LLM framework and seamlessly int…

【数据结构】——队列实现二叉树的功能

前言&#xff1a;二叉树的实现方式多种多样&#xff0c;有数组实现满二叉树&#xff0c;有链表实现完全二叉树&#xff0c;今天我们就用队列来实现二叉树。 创建二叉树&#xff1a; typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTre…

人工智能,不止于模型:四步实现完整工作流

工程师越来越多地致力于将人工智能 (AI) 集成到自己的项目和应用中&#xff0c;同时不断着力提升自己的 AI 技能。 面对 AI 问题&#xff0c;工程师首先要了解什么是 AI&#xff0c;以及如何将它纳入当前工作流&#xff0c;这看似简单&#xff0c;实则未必容易。在 Google 中搜…

TechSmith Camtasia 2023 v23.2.0.47710 中文激活授权版(附安装教程+激活补丁)

Camtasia2023破解版是一款非常专业的屏幕录像软件。该软件集屏幕录制和视频剪辑功能于一体的软件&#xff0c;提供屏幕录制、区域录制、摄像头录制等多种录制方式&#xff0c;Camtasia2023版本带来了新的动态背景库、霓虹光标图像、录制语音旁白等多种新功能&#xff0c;适用于…

管理类联考——英语二——真题篇——按题型分类——小作文

文章目录 2023-建议信2022-邀请信2021-邀请信2020-建议信2019-建议信2018-道歉信2017-接受邀请信2016-建议信2015-通知2014-介绍信2013-邀请信 2023-建议信 Part A 47. Directions:   An art exhibition and a robot show are to be held on Sunday, and your friend David …

QT之常用按钮组件

QT之常用按钮组件 导入图标 布局 显示选中 实验结果 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_push…

Shell变量的奇妙用法,让你的Shell脚本更简洁高效

当涉及到命令行工具和脚本编写时&#xff0c;Shell变量是一个非常重要的概念。利用Shell变量的一些奇妙用法&#xff0c;我们可以用一个简单的表达式实现复杂操作&#xff0c;使我们的命令更加简洁高效。 本文将介绍一些常用的Shell变量操作符&#xff0c;包括字符串操作、数组…

LeedCode刷题---滑动窗口问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、长度最小的子数组 题目链接&#xff1a;长度最小的子数组 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。…

mybatis 的快速入门以及基于spring boot整合mybatis(一)

MyBatis基础 MyBatis是一款非常优秀的持久层框架&#xff0c;用于简化JDBC的开发 准备工作&#xff1a; 1&#xff0c;创建sprong boot工程&#xff0c;引入mybatis相关依赖2&#xff0c;准备数据库表User&#xff0c;实体类User3&#xff0c; 配置MyBatis&#xff08;在applic…