• 利用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扫描下方二维码免费领取🆓

    在这里插入图片描述

  • 相关阅读:
    chatgpt赋能python:Python中如何实现内循环到外循环
    SQL书写顺序与执行顺序
    【c++】向webrtc学习容器操作
    STC 51单片机56——摇摇棒
    吃透分享的这份 Java 面试神技,3 个月斩获 8 家 offer
    java计算机毕业设计ssm社区养老服务管理系统iq0w7(附源码、数据库)
    lvresize与lvextend扩容逻辑卷的区别
    Linux安装Zookeeper详细步骤(下载,安装,配置,启动,停止)
    二维码智慧门牌管理系统:让城市管理更高效、更便捷
    软件工程毕业设计课题(20)基于JAVA毕业设计在线选座购票电影院网站系统毕设作品项目
  • 原文地址:https://blog.csdn.net/2401_84495872/article/details/139742422