利用CNN识别英文语音数字

问题总述

任何一个数字,都是由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.mfbz.cn/a/716399.html

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

相关文章

【递归、搜索与回溯】综合练习二

综合练习二 1.组合2.目标和3.组合总和4.字母大小写全排列 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.组合 题目链接:77. 组…

海康充电桩报文校验TCP校验和

1 TCP校验文档校验文档要求: 校验码描述 校验码计算范围包含包头标识、消息头和消息体,校验算法采用 TCP 和校验,具体规则如下。 将待校验的所有数据分为 16 位的字(大端序),如果总长度为奇数个字节&#…

hadoop未授权访问命令执行漏洞复现-vulfocus

1 介绍 Hadoop YARN(Yet Another Resource Negotiator)的ResourceManager是集群资源管理的核心组件,负责分配和管理集群资源以及调度作业。如果ResourceManager出现未授权访问漏洞,可能允许未经认证的用户访问或操作集群资源&…

Linux DNS域名解析

DNS系统的作用及类型 整个 Internet 大家庭中连接了数以亿计的服务器、个人主机,其中大部分的网站、邮件等服务器都使用了域名形式的地址,如www.google.com、mail.163.com 等。很显然这种地址形式要比使用 64.233.189.147、202.108.33.74的IP地址形式更…

Windows NT 3.5程序员讲述微软标志性“3D管道”屏幕保护程序的起源故事

人们使用屏保程序来防止 CRT 显示器"烧毁",因为静态图像会永久损坏屏幕。像 3D Pipes 这样的屏保程序能在显示器处于非活动状态时为其提供动画效果,从而保护屏幕并延长其使用寿命。此外,它们还能在用户不使用电脑时为其提供可定制的…

计算机组成原理之存储器(一)

文章目录 存储器概述存储器的分类情况按照存储器在系统中的作用分类按存储介质分类按存取方式分类 主存储器的技术指标 存储器概述 程序的局部性原理(构成多级存储系统的依据):在某一个时间段你频繁访问某一局部的存储器地址空间,…

git 配置私人令牌

这里写自定义目录标题 获取私人令牌配置个人令牌 获取私人令牌 在个人设置里点击私人令牌选型,之后生成令牌即可。注意:令牌只会出现一次,务必保存好。 配置个人令牌 个人令牌:3c15c866fa61066212a83c66fd8133ba # 进入项目文…

私有化、源码开放、无限制技术支持,一站式解决企业文档管理痛点

之前有个用户,当时他们需要查找一份两年前某个产品的设计图纸。在公司的文档库,一份份地翻阅,他花费了整整两天时间才找到所需的设计图纸。这种低效的文档查找方式严重影响了工作效率。 这种就是企业内部文档管理的问题,除了这个…

Python私教张大鹏 Vue3整合AntDesignVue之Steps 步骤条

引导用户按照流程完成任务的导航条。 何时使用 当任务复杂或者存在先后关系时&#xff0c;将其分解成一系列步骤&#xff0c;从而简化任务。 案例&#xff1a;步骤条组件 核心代码&#xff1a; <template><a-steps:current"1":items"[{title: Fin…

LogicFlow 学习笔记——10. LogicFlow 进阶 边

我们可以基于 Vue 组件自定义边&#xff0c;可以在边上添加任何想要的 Vue 组件&#xff0c;甚至将原有的边通过样式隐藏&#xff0c;重新绘制。 如 Example3 中所示&#xff1a; 锚点 默认情况下&#xff0c;LogicFlow 只记录节点与节点的信息。但是在一些业务场景下&#…

Transformer模型探索:Hugging Face库实战篇二——模型与分词器解析

注&#xff1a;本系列教程仅供学习使用, 由原作者授权, 均转载自小昇的 博客 。 文章目录 前言模型 加载模型 保存模型 分词器 分词策略 加载与保存分词器编码与解码文本 处理多段文本 Padding 操作 Attention masks直接使用分词器编码句子对 前言 在上一篇文章 《开箱即…

QT(超详细从0开始)

目录 1.2 Qt的优点 2.安装Qt 3.创建项目 4.解读Qt自动生成的代码 ​编辑 5.Qt Designer 6.Qt对象数 7.Qt乱码问题 8.Qt坐标系的认识 9.信号和槽 9.1 connect 9.2 自定义槽函数 9.3 自定义信号 9.4 断开信号链接&#xff08;disconnect&#xff09; 9.5.lambda表…

【尚庭公寓SpringBoot + Vue 项目实战】租约管理(十四)

【尚庭公寓SpringBoot Vue 项目实战】租约管理&#xff08;十四&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】租约管理&#xff08;十四&#xff09;1、业务介绍2、逻辑介绍3、接口开发3.1、保存或更新租约信息3.2、根据条件分页查询租约列表3.3、根据ID查询租…

STM32的通用定时器中断编程

如果遇到需要单片机产生严格时序的场景&#xff08;比如DAC输出特定模拟信号&#xff0c;GPIO口控制模拟开关&#xff09;&#xff0c;延时函数可能就无法胜任了。最近在工作时公司上级教会了我使用“令牌”思维&#xff08;中断标志位)编写单片机裸机程序&#xff0c;今天写一…

c++初始化列表(特点),隐式类型转换(示例,explicit关键字)

目录 初始化列表 定义 特点 必须使用初始化列表的成员变量 初始化顺序 隐式类型转换 示例 explicit关键字 初始化列表 Date::Date(const Date& d) {_year d._year;_month d._month;_day d._day; }Date::Date(const Date& d) :_year(d._year),_month(d._mon…

66aix AI生成系统-中文版安装

66aix是一款多功能的AI助手工具&#xff0c;可以帮助您生成独特的内容&#xff0c;美化和修改您的文章内容或&#xff0c;以及生成图像&#xff0c;去除图像背景。同时&#xff0c;它还包括完整功能的语音转换文本系统。 系统要求 PHP PHP 8 Extensions cURL, OpenSSL, mbstrin…

简易版 | 代码生成器(包含插件)

一、代码生成器 先导入依赖 <!-- Mybatis-Plus --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.6</version> </dependency><!-- 代码生成器 --…

css之浮动float

float 设计初衷 仅仅是为了实现文字环绕 图文混排效果 特性 包裹 收缩 坚挺 隔绝 也就是BFC(Block Formating content) - “块级格式化上下文” 破坏 高度塌陷&#xff08;浮动使高度塌陷不是bug &#xff0c;而是标准&#xff0c;特性使然&#xff09; 清除浮动 clear 作…

MySQL----事务的隔离级别(附带每一级别实例截图)

先来回顾一下事务并发可能存在的三大问题&#xff1a; 脏读&#xff08;Dirty Read&#xff09;–不能接受 一个事务读取了另一个事务未提交的数据。例如当事务A和事务B并发执行时&#xff0c;当事务A更新后&#xff0c;事务B查询读取到A尚未提交的数据&#xff0c;此时事务A…

矩阵乘法的直觉

矩阵乘法是什么意思&#xff1f; 一种常见的观点是矩阵乘法缩放/旋转/倾斜几何平面&#xff1a; NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜…