利用CNN识别英文语音数字

news2024/7/4 5:29:16

问题总述

任何一个数字,都是由10个基数构成的,本任务目的是借助于机器来实现英文语音数字的识别。下面,利用语音特征提取技术和卷积神经网络模型,对英文语音数字进行识别以解决上述问题。

步骤一:提取音频文件的语音特征数据

总代码

#7.3task1
'''
任务1——提取音频的语音特征数据
'''
import scipy.io.wavfile as wav
import webrtcvad
import numpy as np
from python_speech_features import mfcc,delta
class VioceFeature():
    #音频切分
    def vad(self,file_path,mode=3):
        print('tttt=',file_path)
        samp_rate, signal_data = wav.read(file_path)
        vad = webrtcvad.Vad(mode=mode)
        signal= np.pad(signal_data,(0,160-(signal_data.shape[0]%int(samp_rate*0.02))),'constant')
        lens = signal.shape[0]
        signals = np.split(signal, lens//int(samp_rate*0.02))
        audio = [];audios = []
        for signal_item in signals:
            if vad.is_speech(signal_item,samp_rate):
                audio.append(signal_item)
            elif len(audio)>0 and (not vad.is_speech(signal_item,samp_rate)):
                audios.append(np.concatenate(audio, 0))
                audio= []
        return audios,samp_rate
    #特征提取
    def get_mfcc(self,data, samp_rate):
        wav_feature = mfcc(data, samp_rate)
        # 对mfcc特征进行一阶差分
        d_mfcc_feat = delta(wav_feature, 1)
        # 对mfcc特征进行二阶差分
        d_mfcc_feat2 = delta(wav_feature, 2)
        # 特征拼接
        feature = np.concatenate([wav_feature.reshape(1, -1, 13), d_mfcc_feat.reshape(1, -1, 13), d_mfcc_feat2.reshape(1, -1, 13)], 0)
        # 对数据进行截取或者填充
        if feature.shape[1]>64:
            feature = feature[:, :64, :]
        else:
            feature = np.pad(feature, ((0, 0), (0, 64-feature.shape[1]), (0, 0)), 'constant')
        # 通道转置(HWC->CHW)
        feature = feature.transpose((2, 0, 1))
        # 新建空维度(CHW->NCHW)
        feature = feature[np.newaxis, :]
        return feature    
    

from VioceFeature import *
voicefeature=VioceFeature() 
audios,samp_rate=voicefeature.vad('D:/Python/chapter7/data1/audio.wav')
features = []
for audio in audios:
    feature = voicefeature.get_mfcc(audio, samp_rate)
    features.append(feature)
features = np.concatenate(features, 0).astype('float32')
print("features",features)
features.shape
print(features.shape)







1、设计特征数据提取类 VoiceFeature

定义类 VoiceFeature,主要包含两个成员方法 vad 和 get mfcc,分别实现语音切分和特征数据提取功能

#7.3task1
'''
任务1——提取音频的语音特征数据
'''
import scipy.io.wavfile as wav
import webrtcvad
import numpy as np
from python_speech_features import mfcc,delta
class VioceFeature():
    #音频切分
    def vad(self,file_path,mode=3):
        print('tttt=',file_path)
        samp_rate, signal_data = wav.read(file_path)
        vad = webrtcvad.Vad(mode=mode)
        signal= np.pad(signal_data,(0,160-(signal_data.shape[0]%int(samp_rate*0.02))),'constant')
        lens = signal.shape[0]
        signals = np.split(signal, lens//int(samp_rate*0.02))
        audio = [];audios = []
        for signal_item in signals:
            if vad.is_speech(signal_item,samp_rate):
                audio.append(signal_item)
            elif len(audio)>0 and (not vad.is_speech(signal_item,samp_rate)):
                audios.append(np.concatenate(audio, 0))
                audio= []
        return audios,samp_rate
    #特征提取
    def get_mfcc(self,data, samp_rate):
        wav_feature = mfcc(data, samp_rate)
        # 对mfcc特征进行一阶差分
        d_mfcc_feat = delta(wav_feature, 1)
        # 对mfcc特征进行二阶差分
        d_mfcc_feat2 = delta(wav_feature, 2)
        # 特征拼接
        feature = np.concatenate([wav_feature.reshape(1, -1, 13), d_mfcc_feat.reshape(1, -1, 13), d_mfcc_feat2.reshape(1, -1, 13)], 0)
        # 对数据进行截取或者填充
        if feature.shape[1]>64:
            feature = feature[:, :64, :]
        else:
            feature = np.pad(feature, ((0, 0), (0, 64-feature.shape[1]), (0, 0)), 'constant')
        # 通道转置(HWC->CHW)
        feature = feature.transpose((2, 0, 1))
        # 新建空维度(CHW->NCHW)
        feature = feature[np.newaxis, :]
        return feature    







2.提取语音特征数据

在文件 7-3 task1.ipynb 中调用模块 VoiceFeature,编写以下代码,得到满足神经网络模型输入格式的特征数据。

代码行1导人 VoiceFeature 模块中的所有类,代码行2创建对象 voicefeature,代码行3调用对象 voicefeature 的方法 vad 完成语音切分。代码行 4~8对切分出的语音数据集 audios采用MFCC算法进行特征数据提取,提取后的结果保存在矩阵变量catures中。执行如下命令查看 features 的矩阵形状。

from VioceFeature import *
voicefeature=VioceFeature() 
audios,samp_rate=voicefeature.vad('D:/Python/chapter7/data1/audio.wav')
features = []
for audio in audios:
    feature = voicefeature.get_mfcc(audio, samp_rate)
    features.append(feature)
features = np.concatenate(features, 0).astype('float32')
print("features",features)
features.shape
print(features.shape)

image.png

如图所示,特征矩阵features含4个语音数字,其特征数据分别保存在13通道3x64的矩阵中。为识别出是哪4个语音数字,还需要构建语音数字识别神经网络模型,利用模型对其做进一步处理。

步骤二:构建语音数字识别神经网络模型

定义语音数字识别神经网络模型

该模型就是一个分类器,它的输入就是nx13x3x64的四维语音矩阵,它的输出是十维向量,第i维是语音片段被分类为第i个数字的概率,如Y=(0,1…,0)则表示该语音片段对应的数字是1。每两层卷积层为一个块,前一层负责提取特征数据,后一层负责下采样经过6层卷积操作后,形成1x8x64单通道特征输出,经过两层的全连接层进行分类,最终得到识别结果。模型的实现代码如下。

#7.3task2
'''
任务2——构建语音数字识别神经网络模型
'''
import paddle.fluid as fluid
from paddle.fluid.dygraph import Linear, Conv2D, BatchNorm
from paddle.fluid.layers import softmax_with_cross_entropy,accuracy,reshape
#定义语音识别网络模型
class AudioCNN(fluid.dygraph.Layer):
    def __init__(self):
        super().__init__()
        self.conv1 = Conv2D(num_channels=13,num_filters=16,filter_size=3,stride=1,padding=1)
        self.conv2 = Conv2D(16,16,(3,2),(1,2),(1,0))
        self.conv3 = Conv2D(16,32,3,1,1)
        self.conv4 = Conv2D(32,32,(3,2),(1,2),(1,0))
        self.conv5 = Conv2D(32,64,3,1,1)
        self.conv6 = Conv2D(64,64,(3,2),2)
        self.fc1 = Linear(input_dim=1*8*64,output_dim=128,act='relu')
        self.fc2 = Linear(128,10,act='softmax')

    # 定义前向网络
    def forward(self, inputs, labels=None):
        out = self.conv1(inputs)
        out = self.conv2(out)
        out = self.conv3(out)
        out = self.conv4(out) 
        out = self.conv5(out)
        out = self.conv6(out)
        out = reshape(out,[-1,8*64])
        out = self.fc1(out)
        out = self.fc2(out)
        if labels is not None:
            loss = softmax_with_cross_entropy(out, labels)
            acc = accuracy(out, labels)
            return loss, acc
        else:
            return out

将该python文件保存为final_model.py

代码行 12定义的二维卷积层的输人通道数与输人数据的通道格式一致(为 13),采用16个卷积核,卷积核大小即滤波器尺寸为 3x3,步长为1、填充尺寸为1,进行特征数据提取。在代码行5中,紧接着利用尺寸为3x2的滤波器,按水平、垂直方向设置步长分别为1和2、无填充来实现下采样。代码行13~17又完成两组特征数据提取和下采样操作,代码行19主要对卷积后的特征数据进行降维,形成一个1x128的向量,最后在代码行11完成分类操作。 代码行 22~31 定义前向网络,其中采用初始化方法init 中定义好的网络层依次对输人数据 inputs 进行前向处理,再返回处理后的结果,如果样本带有标签,则计算分类误差1oss和分类精度acc,否则直接返回分类结果 out。

步骤三:利用训练好的模型来识别语音

通步骤1已经获取了英文数字的语音特征,并在步骤2中对构建的神经网络模型进行了训练。下面就利用保存的模型对语音特征数据进行分类工作,将分类结果合并,从而最终完成对语音的识别任务。根据任务目标按照以下步骤完成步骤3。

总代码

#7.3task3
'''
任务3——利用训练好的模型来识别语音
'''
#获得模型的语音特征输入数据
from VioceFeature import *
voicefeature=VioceFeature() 
audios,samp_rate=voicefeature.vad('D:/Python/chapter7/data1/audio.wav')
features = []
for audio in audios:
    feature = voicefeature.get_mfcc(audio, samp_rate)
    features.append(feature)
features = np.concatenate(features, 0).astype('float32')

import numpy as np
import paddle.fluid as fluid
from paddle.fluid.dygraph import to_variable, load_dygraph
from AudioCNN import AudioCNN
with fluid.dygraph.guard(place=fluid.CPUPlace()):
    model = AudioCNN()
    params_dict, _ = load_dygraph('D:/Python/chapter7/data/final_model')
    model.set_dict(params_dict)
    model.eval()
    features =to_variable(features)
    out = model(features)
    result = ' '.join([str(num) for num in np.argmax(out.numpy(),1).tolist()])
    print('语音数字的识别结果是:',result)

1.配置模型识别的机器资源

前文的模型定义和训练来看,训练好最后的模型所花的时间相对还是很少的,主要是所使用的 AudioCNN卷积神经网络比较简单。但现实生活中,可能会遇到更复杂的机器学习、深度学习任务,需要运算速度更高的硬件(GPU、TPU),甚至同时使用多个机器其同执行一个任务(多卡训练和多机训练)。但本案例是在普通的计算机上进行训练和预测,所以通过以下语句配置模型识别的机器资源。

with fluid.dygraph.guard(place=fluid.CPUPlace()):

2.加载模型参数给模型实例

首先要构造一个模型实例 model,然后将前文训练好的模型 fnal model 参数加载到模型实例中。加载完毕后,还需将模型的状态调整为校验状态eval,这是因为模型在训练过程中要同时支持正向计算和反向传导梯度,此时的模型比较臃肿,而校验状态eval的模型只需支持正向计算,此时模型的实现简单且性能较高。对应的代码如下。

model = AudioCNN()
    params_dict, _ = load_dygraph('D:/Python/chapter7/data/final_model')
    model.set_dict(params_dict)
    model.eval()

3.将提取的特征数据输入模型,得到识别结果

在步骤1中提取出英文语音数字的语音特征features,下面就基于该特征数据,利用训练好的模型进行语音识别,实现的代码如下。

features =to_variable(features)
    out = model(features)
    result = ' '.join([str(num) for num in np.argmax(out.numpy(),1).tolist()])
    print('语音数字的识别结果是:',result)

代码行1将多维矩阵转换成飞桨支持的张量类型,代码行2将特征数据features作为模型的输人来预测识别结果。由于模型的输出out 仍是一个张量类型,因此在代码行3中对其进行 numpy转换,将其转换成一个二维数组,然后按行求各行中的最大值的索引,因为索引值与预测的数字值是一一对应的,故最后的拼接结果result 实际就是识别的数字。

如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.2.1 什么是Prompt
    • L2.2.2 Prompt框架应用现状
    • L2.2.3 基于GPTAS的Prompt框架
    • L2.2.4 Prompt框架与Thought
    • L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
    • L2.3.1 流水线工程的概念
    • L2.3.2 流水线工程的优点
    • L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
    • L3.1.1 Agent模型框架的设计理念
    • L3.1.2 Agent模型框架的核心组件
    • L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
    • L3.2.1 MetaGPT的基本概念
    • L3.2.2 MetaGPT的工作原理
    • L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
    • L3.3.1 ChatGLM的特点
    • L3.3.2 ChatGLM的开发环境
    • L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
    • L3.4.1 LLAMA的特点
    • L3.4.2 LLAMA的开发环境
    • L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

总结之Docker(四)——镜像修改非ROOT用户权限后生成新镜像并发布

Docker拉去目标镜像 docker pull redis:6.2.5如果出现拉去过程超时,或者连接失败。 添加镜像加速器,以阿里云为例,阿里云目前推广提供镜像加速器,需要登录。 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 生成…

有没有和ai聊天的软件?介绍这三款聊天软件

有没有和ai聊天的软件?在科技飞速发展的今天,人工智能(AI)已经渗透到我们生活的方方面面,其中AI聊天软件以其独特的魅力,赢得了越来越多用户的青睐。今天,我们就来一起探索三款智能聊天软件的功…

【Java】已解决:java.lang.NoSuchMethodError异常

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例 已解决java.lang.NoSuchMethodError异常 一、问题背景 java.lang.NoSuchMethodError异常是Java运行时环境中一个常见的错误,它通常发生在尝试调用一个不存在的方法时。这个异常通常不是…

Unity制作背包的格子

1.新建一个面板 2.点击面板并添加这个组件 3.点击UI创建一个原始图像,这样我们就会发现图像出现在了面板的左上角。 4.多复制几个并改变 Grid Layout Group的参数就可以实现下面的效果了

战略网络优化:网络可观测性的综合方法

在网络成为运营支柱的时代,了解和优化网络性能至关重要。网络可观测性是了解网络性能的关键,它以一种全面、主动的方式超越了传统监控。本文说明了网络可观测性的变革力量,详细介绍了其优势、差异化因素及其在现代网络管理中的关键作用。 什…

2024年下一个风口是什么?萤领优选 轻资产创业项目全国诚招合伙人

2024年,全球经济与科技发展的步伐不断加快,各行各业都在探寻新的增长点与风口。在这样的时代背景下,萤领优选作为一个轻资产创业项目,正以其独特的商业模式和前瞻的市场洞察力,吸引着众多创业者的目光。(领取&#xff…

专业酒窖的布局与设计:为红酒提供理想保存条件

对于云仓酒庄雷盛红酒的爱好者而言,拥有一个专业的酒窖是保存和欣赏这些珍贵佳酿的方式。一个布局合理、设计精良的专业酒窖不仅能提供稳定的保存条件,还能确保红酒在理想状态下陈年,释放其深邃的香气和口感。 首先,酒窖的位置选择…

40、基于深度学习的线性预测设计(matlab)

1、原理及流程 深度学习的线性预测是一种利用深度神经网络模型进行线性回归预测的方法。其设计原理主要基于神经网络的层次化特性,利用多层感知器(MLP)等模型进行特征学习和非线性变换,从而提高线性预测的准确性。 设计流程如下…

HTTP/2 协议学习

HTTP/2 协议介绍 ​ HTTP/2 (原名HTTP/2.0)即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。…

第04章:IDEA的安装与使用

第04章:随堂复习与企业真题(IDEA安装与使用) 一、随堂复习 1. IDEA的认识 IDEA(集成功能强大、符合人体工程学(设置人性化))Eclipse 2. IDEA的下载、安装、卸载 卸载:使用控制面板进行卸载,…

Vue 使用setInterval定时器导致前端页面卡死(解决方法)

Vue 使用setInterval定时器导致前端页面卡死 原因 setinterval不会清除定时器队列,每重复执行1次都会导致定时器叠加,最终卡死你的网页。 其原因与JS引擎线程有关(需深入研究JS引擎线程) ,但是setTimeout是自带清除定…

深度学习网络结构之---Inception

目录 一、Inception名称的由来 二、Inception结构 三、Inception v2 四、Inception v3 1、深度网络的通用设计原则 2.卷积分解(Factorizing Convolutions) 3.对称卷积分解 3.非对称卷积分解 五、Inception v4 一、Inception名称的由来 Inception网…

Python MongoDB 基本操作

本文内容主要为使用Python 对Mongodb数据库的一些基本操作整理。 目录 安装类库 操作实例 引用类库 连接服务器 连接数据库 添加文档 添加单条 批量添加 查询文档 查询所有文档 查询部分文档 使用id查询 统计查询 排序 分页查询 更新文档 update_one方法 upd…

Spring IoC【控制反转】DI【依赖注入】

文章目录 控制反转(IoC)依赖注入(DI)IoC原理及解耦IoC 容器的两种实现BeanFactoryApplicationContext IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想&…

碉堡了!云原生大佬撰写的K8s学习指南,有点炸裂,建议运维都收藏!

在这个数字化转型的时代,容器化和云原生技术已成为软件开发的重要趋势。【Kubernetes】作为云原生领域的旗舰项目,不仅是一种容器编排工具,更是构建现代、弹性和可扩展应用程序的基础平台。 因此,对于运维人员来说,学…

裁剪图片的最简单方法?这四种裁剪方法真的超级简单!

裁剪图片的最简单方法?在丰富多彩的现代生活中,图片成为了我们表达、沟通甚至展示身份的重要媒介,然而,无论是出于个人审美还是专业需求,图片的格式和尺寸往往成为了我们不得不面对的问题,特别是那些未经雕…

Spring IOC 控制反转(注解版)

Spring IOC 控制反转 文章目录 Spring IOC 控制反转一、前言什么是控制反转(IOC)什么是依赖注入(DI) 二、介绍 IOC2.1 传统思想代码2.2 解决方案2.3 IOC思想代码2.4 IOC 使用(Autowired依赖注入)2.5 IOC 优…

一五三、MAC 安装MongoDB可视化工具连接

若没有安装brew包管理工具,在命令行输入安装命令 /bin/bash -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)”上面步骤安装完成后,开始安装MongoDB,输入安装命令: brew tap mongodb/brewbrew u…

LogicFlow 学习笔记——8. LogicFlow 基础 事件 Event

事件 Event 当我们使用鼠标或其他方式与画布交互时,会触发对应的事件。通过监听这些事件,可以获取其在触发时所产生的数据,根据这些数据来实现需要的功能。详细可监听事件见事件API。 监听事件 lf实例上提供on方法支持监听事件。 lf.on(&…

本地数据如何正确的导入SOLIDWORKS PDM系统

SOLIDWORKS 产品数据管理 (PDM) 解决方案可帮助您控制设计数据,并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional,您的团队能够:1. 安全地存储和索引设计数据以实现快速检索;2. 打消关…