基于语音识别实现智能家居的控制-系统整体整合与调参_第1页
基于语音识别实现智能家居的控制-系统整体整合与调参_第2页
基于语音识别实现智能家居的控制-系统整体整合与调参_第3页
基于语音识别实现智能家居的控制-系统整体整合与调参_第4页
基于语音识别实现智能家居的控制-系统整体整合与调参_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE1基于语音识别实现智能家居控制——系统整体整合与调参摘要为配合各种终端设备较高的智能程度和集成程度,舍弃以往使用按键及菜单操作对设备进行控制的方式,让检索信息和操作命令的方式变得更加便捷,语音识别技术逐渐进入人们的视线。智能家居不仅能够为人类生活提供方便快捷的服务,而且能够在需要的时候提供更为人性化的服务,从而使得智能家居在现代化发展领域占据非常重要的地位,因此,将智能家居与语音识别技术结合变成了人们的迫切需求。本文着重从语音识别的模型设计及信号的传输与控制等方面介绍了本次基于语音识别实现智能家居控制的研究。语音识别的过程可分为模式识别和匹配两个模块,本设计语音识别部分运用人工神经元网络模型,对捕获的语音信号进行初步的判断处理,将音频和文字数据进行格式转化,并且将语音信号特征点进行提取,在进行初步判断基础上建立和训练模型,得到相应语音识别的模板,等待下一次捕获语音时,将获取到的语音信号与之前的语音信号比对判断之后,结合建立的相关函数及相关算法模型,获取到匹配率最高的模板,并得到一个较高的识别率。除语音识别模块外,此次设计还有语音录入模块及信号输出控制模块,用以完整实现通过语音识别实现控制智能家居的最终目的。语音输入模块通过调用麦克风录音进行语音录入,信号输出控制模块则是通过网络通信发送信号到另一设备来实现语音控制。关键词:语言识别,神经网络,信息传输,训练模型,智能控制ControlofSmartHomeBasedonSpeechRecognitionAbstractInordertocooperatewiththehigherintelligenceandintegrationofvariousterminalequipment,thewayofusingbuttonsandmenustocontroltheequipmentisabandoned,andthewayofretrievinginformationandoperatingcommandsbecomesmoreconvenient.Speechrecognitiontechnologygraduallyenterspeople'sattention.Smarthomecannotonlyprovideconvenientandfastservicesforhumanlife,butalsoprovidemorehumanizedserviceswhenneeded,whichmakessmarthomeoccupyaveryimportantpositioninthefieldofmoderndevelopment.Therefore,thecombinationofsmarthomeandspeechrecognitiontechnologyhasbecomeanurgentneedofpeople.Thispapermainlyintroducestheresearchofsmarthomecontrolbasedonspeechrecognitionfromtheaspectsofthemodeldesignofspeechrecognition,signaltransmissionandcontrol.Theprocessofspeechrecognitioncanbedividedintotwomodules:patternrecognitionandmatching.Inthespeechrecognitionpartofthisdesign,theartificialneuralnetworkmodelisusedtopreliminarilyjudgeandprocessthecapturedspeechsignal,transformtheformatoftheaudioandtextdata,extractthefeaturepointsofthespeechsignal,establishandtrainthemodelbasedonthepreliminaryjudgment,andgetthecorrespondingspeechrecognitionForothertemplates,whenwaitingforthenextcaptureofspeech,theobtainedspeechsignalwillbecomparedwiththepreviousspeechsignalforjudgment,combinedwiththeestablishedcorrelationfunctionandrelatedalgorithmmodel,thetemplatewiththehighestmatchingratewillbeobtained,andahigherrecognitionratewillbeobtained.Inadditiontothespeechrecognitionmodule,thisdesignalsohasthespeechinputmoduleandthesignaloutputcontrolmodule,inordertoachievetheultimategoalofcontrollingthesmarthomethroughspeechrecognition.Thevoiceinputmoduleusesmicrophonerecordingforvoiceinput,andthesignaloutputcontrolmodulesendssignalstoanotherdevicethroughnetworkcommunicationtorealizevoicecontrol.Keywords:Languagerecognition,neuralnetwork,informationtransmission,trainingmodel,intelligentcontrol目录TOC\o"1-4"\h\z\u1.前言 51.1本设计的目的、意义及应达到的技术要求 51.1.1目的 51.1.2意义 51.1.3技术要求 51.2本设计主要研究内容 62.总体设计框架 62.1.语音识别框架 62.2.网络通信框架 73.模型的选择 73.1.人工神经网络模型 73.2.其他语音识别模型 84.音频的预处理与特征提取 85.构建模型的方案选择 106.重要函数的运用 107.实践过程及结果 118.结论 15参考文献 16谢辞 17附录 18前言语音识别技术在现代化告诉发展中占据非常重要的地位,将其更加融入的人类生活和工作中,不仅是为人类提供高效便捷的服务,而且将语音识别技术运用到智能家居控制中,可以减少人力操作和节约时间,通过语音对家居设备进行控制,在当今时代具有十分有意义的研究REF_Ref31132\w\h[3]。语音识别的方式主要有三种:一是神经网络,二是基于语音学和声学的方式,三是模板匹配。其中,神经网络而是现代的语音识别技术中的主要发展趋势。神经网络技术通过将人活神经元活动放入到一个具有人类独特的自主学习和想象力结合的语音识别系统中,通过不断学习优化,提高语音识别系统的稳定性,这为语音识别的发展开辟了一条新的途径REF_Ref31495\w\h[1]。本次设计则是在语言识别技术的特点和工作原理的基础上,选择并利用人工神经网络模型,通过利用相应训练集进行不断训练与测试,根据丢失数据率与识别准确率不断实验与改进,最终使模型达到稳定状态,同时识别准确率达到理想值,并调用麦克风实现语音的录入,将语音导入训练好的模型进行语言识别,通过模型识别出相应语句转换成文字作为客户端的发送数据,再利用网络通信原理及相关函数传输给服务端,实现语音控制的目的。本设计完整地实现了语音录入、语音识别以及最后的语音控制一整个过程。本设计的目的、意义及应达到的技术要求目的本设计旨在利用人工神经网络模型,通过训练集训练,识别录入的语音,将识别的语音转化成机器能够听懂的语言发送到服务器终端,实现语音控制,从而达到人机交互的目的。意义语音识别的研究,实现了人机的语言交流,研究和学习这一具有竞争性的新兴高技术产业知识,不仅能让我们学习到一些语音识别与控制的基础知识,也是新一代学子跟上科技步伐的一个时代象征,对新时代科技创新有着重要的象征性意义。技术要求熟悉python开发环境,能够熟练使用相关代码设计并实现以下基础功能:(1)能够根据设计要求寻找匹配的模型并建立模型;(2)能够收集并整合适合的训练集,通过模型训练语音训练集,经过反复训练得到一定的语音特征声纹;(3)能够利用代码调用麦克风进行录音,并将语音放入语音测试集进行语音识别;(4)能够正确识别录入的语音,得到语音的识别率,运行过程中能够打印出数据丢失率,进行误差处理等;(5)最后能够发送语音信号实现控制功能。本设计主要研究内容模型的选择:模型是实现语音识别的工具,要实现语音识别,首先要应用和建立相应的模型,在不断训练后,利用训练好的模型对录入的语音进行处理和解码,转化成数字语言给机器识别,得到语句,所以选择适用、易用的模型显得十分重要;函数的运用:本设计主要需要运用激活函数、损失函数及信号发送函数,每种函数中有不一样的函数可选,不同的函数其作用、优缺点及应用场景皆有不同,选择合适的激活函数,损失函数及信号发送函数并灵活应用其中,能够有效提高识别率;音频预处理与特征提取:由于一开始输入的语音信号为模拟信号,为了将语音信号转化为计算机听得懂的语音,我们需要将模拟信号转换为数字信号,这时候就需要对输入的语音进行预处理。语音信号预处理之后,为了让识别效率提高,剔除无关信息,提取有效数据,我们需要对语音信息进行特征提取,我们采用加权线性倒数频谱系数来指导进行语音信号的特征提取;构建模型的方案选择:采用不同的方案构建模型会产生不一样的效果,针对每种方案进行训练和调参,最终选择识别率最高的方案应用;信号的发送与控制:完成语言识别后,需要找到相应的传输手段将相应信号命令发送到服务器,并达到达到控制效果。总体设计框架2.1.语音识别框架语音识别技术过程主要分为三个步骤,首先,需要对捕获的语音信号预判断处理,其次,对整段语音信号进行特征点提取,最后根据系统模式进行匹配和判决REF_Ref31661\w\h[2]。通过麦克风捕获的语音进行转化,形成一个基准原始语音,语音识别系统对指令信号进行预加重、分帧、加窗等预处理REF_Ref31789\w\h[5],使语音信号趋于平稳。接着进行特征提取,本设计以MFCC作为数据处理的特征参数,对获取的语音数据进行有效区分,将数据处理成机器读懂的格式,并提取相应特征参数,以此存储为人工神经网络样本,建立和训练人工神经网络模型。当语音识别时,使用已训练好的人工神经网络,根据语音信号特征识别相应语句,最终得到结果。如图2-1为具体的语音识别框架:预处理样本语言加窗分帧端点检测预处理样本语言加窗分帧端点检测建立人工神经网络输入样特征提取建立人工神经网络输入样特征提取训练人工神经网络使用神经网络识别结果训练人工神经网络使用神经网络识别结果待测语音预处理特征提取待测语音预处理特征提取语音识别框架图2-12.2.网络通信框架本设计通信方式选择Socket,Socket是运用在进程之间进行相互通信的主流手段之一,它能够在相同主机进程之间或者不同主机进程之间进行通信,通过搭建一个Socket连接相同或者不同的主机,建立通信机制,进行实现交互REF_Ref31916\w\h[7]。如图2-2为Socket网络通信框架:SYN客户端服务器端SYNQ0NewSocketQ0NewSocketSYN+ACKSYN+ACKSYNQ1NewSocketSYNQ1NewSocketSocket网络通信框架图2-2模型的选择3.1.人工神经网络模型人工神经网络(ANN)是机器学习与人工智能领域的一种模型REF_Ref32073\w\h[4],分为输入层、隐层和输出层三个模块,神经元为网络基本单元,输入层的神经元为所提取的语音信号特征,构建隐层的神经元方式为样本训练,输出层的神经元为语音识别词汇。对神经网络的结构进行分析,可得出神经网络具有很强的非线性映射能力、泛化能力和容错能力REF_Ref32184\w\h[6]。人工神经网络进行语音识别之前,需要不断地训练优化模型。一开始需要准备拥有大量词汇的语音训练集,按照一定的规则将词汇分段编号,接着把之前已经做过特征提取的语音数据输入模型,参考数据为特征对应的词汇编号,最终把参考数据和模型训练的输出数据相比较,得出相应误差,在此误差数据降低到阈值时则停止训练,保存相应训练数据,以此建立神经网络模型。如图3-1为人工神经网络训练框架。开始开始给定输入量和目标输出给定输入量和目标输出求隐层和输出层单元输出求隐层和输出层单元输出求期望输出和实际输出的误差求期望输出和实际输出的误差权值学习修正误差是否满足权值学习修正误差是否满足YN结束YN结束人工神经网络训练框架图3-13.2.其他语音识别模型目前常用的语音识别模型还有动态时间规整技术(DTW)、矢量量化(VQ)等。动态时间规整算法主要在非特定人语音识别上应用,其原理是在动态规划的思想的基础上,用一定的算法策略比较语音参考模板与语音测试信号,从而得到其中的相像程度,在通过测度和比对得到最好的路径。而矢量量化在比较小的词汇量上的语音识别比较适用,其原理是对语音信号数据进行整体量化,将实际效果与量化数据相对比找出最好的失真测度的公式,从而实现最好效果的矢量量化系统的建立。而3.1.所介绍的人工神经网络,相当于是人类神经活动的一个自适应非线性动力学系统,其原理是模拟一个具有人类独特的自主学习和想象力的工程模型,具有一系列的适合本设计的相关性能,特别是其强大自适应性及学习特性,它所独特具有的分类决策能力和对不确定信息的描述能力得到举世公认。所以综合各模型功能特点,结合实际需求,我们最终选择了具有强大学习能力和分类能力的人工神经网络模型。音频的预处理与特征提取4.1.预处理:语音信号十分不稳定,为了得到一个平稳的处理对象,使得特征参数提取更加容易操作,让语言数据更加有辨识度,我们需要将它进行预处理。首先对语音数字信号进行预加重操作,使频谱相对平坦,也可以使得频带里的信号拥有一样的信噪比。紧接着对语音信号进行分帧以及加窗的操作,短时语音信号的频率特性在加窗后能得到较好的反应。语音信号加窗后需要进行端点检测,也就是设定合适的阈值,将输入的语音序列的起点和终点检测出来。如图4-1为预处理的过程框架。开始开始预加重预加重分帧分帧端点检测,确定起止点端点检测,确定起止点特征参数提取(MFCC特征参数提取(MFCC)结束结束预处理的过程框架图4-14.2.MFCC特征提取:语音识别过程中,MFCC(Mel频标倒谱系数)参数充分地模拟了人类耳朵的听觉感知的特性以及语音信号所产生的机制和原理,普遍应用在了在语言识别研究中。研究者根据心理实验得到了类似于耳蜗作用的一组滤波器组,这就是Mel滤波器组REF_Ref32497\w\h[9],想要得到MFCC的值,首先要把求得的频率特性通过式4.1计算出Mel频率特性,然后将其变换到倒谱空间中REF_Ref32589\w\h[10]。fmel=2595lg⁡(1+f如图5-2为MFCC计算框图:预处理FFT预处理FFT滤波器组滤波器组DCT取对数DCT取对数MFCC计算框图图4-2构建模型的方案选择方案一:未加入Keras模型此方案为最初方案,在该方案中采用激活函数sigmoid对数据进行优化,通过正反向传播不断训练来更新权重减小误差值,用训练集训练一定次数后,取最小误差值最大识别概率。紧接着定义算法以及对应的重要的参数,用来训练成熟的人工神经网络模型识别新的音频,最终返回识别结果。该方案比较简单,工作效率和准确率较低。方案二:加入Keras模型同样用的是人工神经网络模型,但将输入层的激活函数由sigmoid换为效果更好的relu函数,隐藏层也从一层改为了两层,并将softmax函数应用在了输出层,使得向量归一化,并且加入了损失函数交叉熵,使整个模型更加完善,简化了计算过程,训练速度更快,有效减少了误差,识别准确率得到了显著提升。所以经过综和考虑和改进,最终选用方案二。重要函数的运用Relu函数:本设计使用的激活函数Relu函数即线性整流,其表达式为:fx=max⁡(0,x)(式6.1)作为神经元的激活函数,定义了该神经元在线性变换wTx+b之后的非线性输出结果。也就是若进入神经元的输入向量为x,使用线性整流激活函数的神经元会输出max⁡(0,wTx+b)至到下一层神经元,又或是会直接输出(取决现神经元在网络结构中所处位置)。当x≥0时,其导数为1,因此,Resoftmax函数:softmax用在多分类过程中,多个神经元的输出通过它映射到(0,1)的区间,相当于是概率,如此一来就可以进行多分类,若一个数组为V,Vi表示V中的第i个元素,那么这个元素的softmax值就是:Si=eij通过softmax函数作用,输出都被映射成(0,1)之间的值,所有值的和为1,与概率的性质相似,最后在输出结点选取值对应最大的结点作为我们的预测目标。损失函数:本设计我们使用交叉熵作为损失函数,交叉熵损失函数是一个平滑函数,交叉熵训练集的先验信息为语音语句的真实语义,测试集后验信息以机器翻译的语义为准,用两者之间的计算出来的交叉熵并对语音进行歧义的辨识,以达到减少误差的效果,交叉熵函数形式为:Loss=-iyiln其中y代表我们的真实值,a代表我们softmax求出的值。i代表的是输出结点的标号。Socket函数:Socket用于相同或不同主机进程之间的通信通信,在两台计算机各自的系统中创建一个Socket,可以进行两者之间的网络通信。Socket连接建立之前主要进行两项工作,第一项是连接建立前的两个Socket的初始化工作,第二个是两台计算机通信时的“三路握手”,完成两项工作之后,服务器端通过系统调用recv()获取数据,客户端通过调用send()完成数据的发送REF_Ref31916\w\h[7],进而实现使用Socket进行通信。实践过程及结果(1)模型的确定经过搜集各种信息,深入了解了有关语音识别的相关知识,我和组员将多种语音识别模型结合我们所需进行了多方衡量,对比其优缺点后,我们决定采用具有强大自学习功能的人工神经网络模型。(2)训练集的收集与匹配在训练模型之前需要寻找到大量合适的训练集和测试集,作为训练样本和测试样本的素材应用在识别过程中。刚开始进行搜集的时候遇到极大困难,经过百度,博客,GitHub及各种论坛和网站的地毯式搜寻,终于找到能够匹配我们模型的足够的量的训练集数据。我们找到了一共32个训练集,每个训练集里面有1000多个语音文件。在试验的过程中,经过多次选择及综合考虑,不断选择更有代表性的类,通过对比不同的量所产生的效果增减类别,最终主要应用识别了“bed”、“go”、“house”、“off”、“stop”、“yes”六类的语音。(3)模型优化分析模型中激活函数的使用优化:为了增加神经网络模型的非线性,需要在模型中使用激活函数,一开始我们用的是函数,但是其两端饱和,趋向无穷的地方,函数值变化很小,容易缺失梯度,在传播过程中容易丢弃信息,不利于深层神经网络的反馈传输,后来经过探讨,决定改为采用函数,因为其具有分段线性性质,学习优化会更加容易,这便有效解决梯度缺失等的问题,使得误差减小,准确率提高。模型中损失函数的使用优化:损失函数的主要作用是比较衡量神经网络的输出值与实际值之间的差距。若神经网络工作中损失函数有误,就会导致实际值与预测结果相差过大,误差不能有效地得到降低,识别率普遍不高。于是在后来的方案设计中使用了损失函数交叉熵,有效提高了准确率。模型中隐藏层数的使用优化:一开始的方案只使用了一层的隐藏层,所以整个模型工作效率越低,其计算精确度也较低,后来经过优化,在此基础上多加了一层,减少了误差,识别率也相应提升。(4)完善参数过程一开始设计了一个比较简单的神经网络,其隐藏层层数、训练集类别、激活函数的选择和应用等方面都存在一些问题,且未使用损失函数,激活函数采用了传统的sigmoid函数,模型尚不成熟,不能有效减少误差,得出的准确率很低。经过多次训练和改进,识别率有所提高,但仍不理想。最后经过多方调研与调参,针对问题各个击破,引入Keras模型,通过增加隐藏层和损失函数,改用效果较好的relu函数等一系列措施,对模型进行完善,大大降低了误差,准确率显著提高:(5)语音的录入通过调用麦克风录音,定义录入音频的函数,记录人说话的声音。(6)发送信号与控制调用send给服务器发送信号,语音识别出的结果转换成文字作为客户端的发送数据,建立服务端,通过socket网络编程接收客户端所发送的文字控制信息,需要在另一个python代码编译器或命令行中编辑代码运行建立虚拟服务端,以达到接受信号并控制家居的目的。本次实验用Anaconda的Spyder作为语音识别端,Pycharm作为socket服务端,服务器端通过系统调用recv()进行数据的获取,达到“控制家居”的目的。结论至此为止,此次毕业设计《基于语音识别实现智能家居控制》已经圆满完成,本次设计所涉及到的Python基础知识、语音识别以及信号控制等基本原理是我们在大学学习中接触较少的,神经元网络也只是粗略学习了一些基础知识,所以本次课题对于我们来说有一定的难度。回忆起刚定好题目时,和组员以及导师分析讨论相关问题时候一头雾水的情景,突然觉得现在能够如此顺利地完成此次毕业设计有点不可思议,感到十分的欣慰和释然。我们从分析题目,分配任务,设计框架,选择方案,设计模型,测试改善,到最终完成本次设计,经历了几个月的艰难前行,一步一个脚印,突破了重重困难,不断从网上检索信息,查找相关资料,并自主学习相关原理和知识,一起讨论方案设想,搜寻训练集和相关模型,确定和设计模型,不断尝试和改造,在失败中越挫越勇,在这个过程中学到了许多宝贵的知识与经验,进一步了解了Python基本运用,更加熟悉神经元网络以及语音识别原理,并能够加以结合应用,收益颇多。越努力,越幸运,在我们的艰苦钻研下,最终完整地实现了从语音录入、语音识别到信号的发送与控制这一阵个环节,实现了本设计的所有目的,且准确率高达98.8%,这让我更加坚定了只要努力就一定会有收获的信念。通过本次课题的研究设计,我对语音识别领域产生了浓厚的兴趣,这让我更加明确了我今后的发展定位和方向,人工智能领域是当今科技时代主流的产业,研究此项新兴技术在当今科技时代有着非常重要且远大的意义。今后我会更加努力提升自己,不断钻研相关知识,成为更好的自己!参考文献刘豫军,夏聪.深度学习神经网络在语音识别中的应用[J].网络安全技术与应用,NetworkSecurityTechnology&Application,编辑部邮箱,2014年12期.于晓明.语音识别技术的发展及应用[J].计算机时代,2019,(11):28-31.廖锎.浅析语音识别技术的发展及趋势[J].科技传播,2010,(17).戴礼荣,张仕良,黄智颖.基于深度学习的语音识别技术现状与展望[J].数据采集与处理,2017,第32卷(2):221-231.杨磊,刘美枝.语音识别技术在智能家庭照明系统中的应用[J].电子技术与软件工程,2018,(15):64.冀瑞国.神经网络在语音识别中的应用[J].电子技术与软件工程,2019,(3):249.王进文.Socket通信过程原理及相关系统调用[J].中国新技术新产品,2015,(7):25.蒋昂波,王维维.ReLU激活函数优化研究*[J].传感器与微系统,2018,第37卷(2):50-52.何朝霞,潘平.说话人识别中改进的MFCC参数提取方法[J].科学技术与工程,2011,(18):4215-4218,4227.杨海燕,吴雷,周萍.基于压缩感知和MFCC的语音端点检测算法[J].测控技术,2019,第38卷(5):88-93.谢辞毕业设计的结束也就意味着大学四年的学习生涯即将结束,美好的大学生活即将过去,青葱的我们都将脱下学生的身份衣服过渡成一个真正的社会人,心中感慨万千,在这一路的成长以来,我需要感谢的人太多太多。首先,感谢指导我完成此次毕业设计的龚导师,每周一次的会议和指导让我受益匪浅,他既细心又耐心的教导让我倍感温暖,遇到困难时为我们提供了很多学习资料和相关资源,贴心地引导我们往正确的方向研讨,针对出现的问题协助我们耐心地解决和攻破。同时也感谢整个大学期间所有教予我知识的老师,他们传授我宝贵的专业知识,用知识浇灌我,开拓了我的眼界,提升了我的专业能力,感谢他们的辛勤付出和谆谆教导。老师们,你们辛苦了!其次,感谢跟我一起做此次毕业设计的组员们,他们帮助了我很多,在遇到一些困难时,他们不嫌麻烦地一步步教我,协助我解决相关问题,我们一起学习,一起探讨,相互鼓励和进步,相互协同配合,团结一致,最终完整地完成了本次毕业设计。同时也感谢整个大学期间陪我一起度过四年大学生活的同学们,不管是在学习还是生活中,你们都带给我许多帮助和欢乐,自从任职班长以来,我们一起协同配合班级管理相关工作,使我们班级氛围越来越好,感谢你们!最后,感谢整个大学生活里帮助过我的所有人,以及一直陪在我身边的家人朋友,我们一起成长进步,一起哭过笑过。世事变迁,回头还是你们。感恩。附录附录1最终的完整程序源代码import

wave

import

numpy

as

np

import

os

import

socket

import

time

import

pyaudio

import

keras

from

keras.models

import

Sequential

from

keras.models

import

load_model

from

keras.layers

import

Dense

def

get_wav_mfcc(wav_path):

f

=

wave.open(wav_path,'rb')

params

=

f.getparams()

#

print("params:",params)

nchannels,

sampwidth,

framerate,

nframes

=

params[:4]

strData

=

f.readframes(nframes)#读取音频,字符串格式

waveData

=

np.fromstring(strData,dtype=16)#将字符串转化为int

waveData

=

waveData*1.0/(max(abs(waveData)))#wave幅值归一化

waveData

=

np.reshape(waveData,[nframes,nchannels]).T

f.close()

###

对音频数据进行长度大小的切割,保证每一个的长度都是一样的【因为训练文件全部是1秒钟长度,16000帧的,所以这里需要把每个语音文件的长度处理成一样的】

data

=

list(np.array(waveData[0]))

#

print(len(data))

while

len(data)>16000:

del

data[len(waveData[0])-1]

del

data[0]

#

print(len(data))

while

len(data)<16000:

data.append(0)

#

print(len(data))

data=np.array(data)

data

=

np.abs(data)

return

data

#

加载数据集

标签[并返回标签集的处理结果]

def

create_datasets():

cls=["bed",

"go",

"house",

"off",

"stop",

"yes"]

wavs=[]

labels=[]

#

labels

testlabels

这里面存的值都是对应标签的下标,下标对应的名字在labsInd中

testwavs=[]

testlabels=[]

for

i

in

range(6):

path

=

"data_ray\\"+cls[i]+"\\"

files

=

os.listdir(path)

for

j

in

files:

waveData

=

get_wav_mfcc(path+j)

wavs.append(waveData)

labels.append(i)

for

i

in

range(6):

path

=

"test_ray\\"+cls[i]+"\\"

files

=

os.listdir(path)

for

j

in

files:

waveData

=

get_wav_mfcc(path+j)

testwavs.append(waveData)

testlabels.append(i)

wavs=np.array(wavs)

labels=np.array(labels)

testwavs=np.array(testwavs)

testlabels=np.array(testlabels)

return

(wavs,labels),(testwavs,testlabels)

def

build_model():

(wavs,labels),(testwavs,testlabels)

=

create_datasets()

print(wavs.shape,"

",labels.shape)

print(testwavs.shape,"

",testlabels.shape)

#

标签转换为独热码

labels

=

keras.utils.to_categorical(labels,

6)

testlabels

=

keras.utils.to_categorical(testlabels,

6)

print(labels[0])

##

类似

[1.

0.

0]

print(testlabels[0])

##

类似

[0.

0.

0]

print(wavs.shape,"

",labels.shape)

print(testwavs.shape,"

",testlabels.shape)

#

构建sequential顺序模型,由多个网络层线性堆叠的栈。使用其API可以构建任意的神经网络图。

model

=

Sequential()

#可以简单地使用

.add()

来堆叠模型,Dense(768)

是一个具有

768

个隐藏神经元的全连接层。

model.add(Dense(512,

activation='relu',input_shape=(16000,)))

model.add(Dense(256,

activation='relu'))

model.add(Dense(128,

activation='relu'))

model.add(Dense(6,

activation='softmax'))

model.summary()

#

[编译模型]

配置模型,损失函数采用交叉熵,优化采用Adadelta,将识别准确率作为模型评估

#如果需要,你还可以进一步地配置你的优化器。Keras的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)

pile(loss=keras.losses.categorical_crossentropy,

optimizer=keras.optimizers.Adam(),

metrics=['accuracy'])

#

validation_data为验证集

#

批量地在训练数据上进行迭代,以

124

个样本为一个

batch

进行迭代

model.fit(wavs,

labels,

batch_size=128,

epochs=15,

verbose=1,

validation_data=(testwavs,

testlabels))

#

开始评估模型效果

#

verbose=0为不输出日志信息

score

=

model.evaluate(testwavs,

testlabels,

verbose=0)

print('Test

loss:',

score[0])

print('Test

accuracy:',

score[1])

#

准确度

model.save('asr_model_weights_ray.h5')

#

保存训练模型

def

predict(path):

#加载训练好的模型,识别新的音频,返回识别结果

pred_labels

=

["bed",

"go",

"house",

"off",

"stop",

"yes"]

wavs

=

[]

load_labels

=

[]

files

=

os.listdir(path)

for

j

in

files:

waveData

=

get_wav_mfcc(path+j)

wavs.append(waveData)

load_labels.append(j[:-4])

print("所加载的语音指令为:",load_labels)

wavs=np.array(wavs)

model

=

load_model('asr_model_weights_ray.h5')

#加载训练好的模型

preds

=

model.predict(wavs)

preds

=

preds.tolist()

result

=

[]

#创建列表存放识别结果

for

pred

in

preds:

#result.append(labels[pred.index(max(pred))])

result.append(pred_labels[pred.index(max(pred))])

return

result

def

send_sig(sig):

#发送信号

#

1、创建socket通信对象

clientSocket

=

socket.socket()

#

2、使用正确的ip和端口去链接服务器

clientSocket.connect(("",8888))

#

3、客户端与服务器端进行通信

#

给socket服务器发送信息

send_data

=

str(sig)

clientSocket.send(send_data.encode('GB2312'))

#

接收服务器的响应(服务器回复的消息)

recvData

=

clientSocket.recv(1024).decode('GB2312')

print('%s

指令控制结果为:

%s'

%

(send_data,

recvData))

#

4、关闭socket对象

clientSocket.close()

def

get_audio(filepath):

#录入新的音频

aa

=

str(input("是否开始录音?

(是/否)"))

if

aa

==

str("是")

:

CHUNK

=

256

FORMAT

=

pyaudio.paInt16

CHANNELS

=

2

#

声道数

RATE

=

16000

#

采样率

RECORD_SECONDS

=

1

WAVE_OUTPUT_FILENAME

=

filepath

p

=

pyaudio.PyAudio()

stream

=

p.open(format=FORMAT,

channels=CHANNELS,

rate=RATE,

input=True,

frames_per_buffer=CHUNK)

print("*"*10,

"开始录音:请在1秒内输入语音")

frames

=

[]

for

i

in

range(0,

int(RATE

/

CHUNK

*

RECORD_SECONDS)):

data

=

stream.read(CHUNK)

frames.append(data)

print("*"*10,

"录音结束\n")

stream.stop_stream()

stream.close()

p.terminate()

wf

=

wave.open(WAVE_OUTPUT_FILENAME,

'wb')

wf.setnchannels(CHANNELS)

wf.setsampwidth(p.get_sample_size(FORMAT))

wf.setframerate(RATE)

wf.writeframes(b''.join(frames))

wf.close()

elif

aa

==

str("否"):

exit()

else:

print("无效输入,请重新选择")

get_audio(in_path)

def

sending():

#延时进度条

scale

=

20

print("开始发送指令...")

start

=

time.perf_counter()

for

i

in

range(scale

+

1):

a

=

"="

*

i

b

=

"."

*

(scale

-

i)

c

=

(i/scale)*100

dur

=

time.perf_counter()

-

start

print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end

="")

time.sleep(0.1)

#print("\n"+"指令发送成功!")

if

__name__

==

'__main__':

#训练模型

build_model()

#录入语音

is_contin

=

input("是否开始录入音频:

(任意键继续,q键退出)

")

count

=

1

while

is_contin

!=

'q':

input_filename

=

"yes123{}.wav".format(count)

#

麦克风采集的语音输入

input_filepath

=

".\\test_ray\\yes\\"

#

输入文件的path

in_path

=

input_filepath

+

input_filename

get_audio(in_path)

count

+=

1

is_contin

=

input("是否继续录入音频:

(任意键继续,q键退出)

")

#使用模型识别语音

path

=

"test_ray\\house\\"

result

=

predict(path)

print("模型识别出的指令为:",

result,

'\n')

time.sleep(2)

#发送信号

for

re

in

result:

print("向机器发送

{}

指令".format(re))

sending()

send_sig(re)

time.sleep(0.5)

print("\n"+"指令发送成功!")

print("指令发送完毕!")

电脑无法识别U盘该怎么办HYPERLINK电脑无法识别U盘怎么办?打开我的电脑上单击右键,在快捷菜单里,选择“管理”,打开“计算机管理”窗口。在计算机管理窗口里,选择“存储”下面的“磁盘管理”,如果看得到没有盘符的U盘,那么在这个U盘上按鼠标右键,选择“更改驱动器名称和路径”选项,就打开了“更改……的驱动器号和路径”对话框。再点击“更改”按钮,打开“更改驱动器号和路径”的对话框,在“指定以下驱动器号”的右边下拉列表里,选择你希望分配给U盘的驱动器号,尽可能靠后选择,比如X、Y、Z,选择好后,单击确定按钮,回到上一次“更改……的驱动器号和路径”对话框窗口,再一次单击确定,就回到“计算机管理”窗口。至此,如果一切正常,就给U盘单独设置了一个长久使用的驱动器号,并却,不受虚拟驱动器的影响了。建议将U盘插到电脑上,看任务栏中是否显示图标,如果显示,在我的电脑点右键查看属性——高级——硬件——设备管理器——查看里面是否有问号的设备,在问号设备上点右键——更新驱动程序然后下一步——否暂时不连接到网络——下一步自动安装软件(推荐)就可以了另外:系统不认U盘的几种处理方法1.禁用主板usb设备。管理员在CMOS设置里将USB设备禁用,并且设置BIOS密码,这样U盘插到电脑上以后,电脑也不会识别。这种方法有它的局限性,就是不仅禁用了U盘,同时也禁用了其他的usb设备,比如usb鼠标,usb光驱等。所以这种方法管理员一般不会用,除非这台电脑非常重要,值得他舍弃掉整个usb总线的功能。但是这种屏蔽也可以破解,即便设置了密码。整个BIOS设置都存放在CMOS芯片里,而COMS的记忆作用是靠主板上的一个电容供电的。电容的电来源于主板电池,所以,只要把主板电池卸下来,用一根导线将原来装电池的地方正负极短接,瞬间就能清空整个CMOS设置,包括BIOS的密码。随后只需安回电池,自己重新设置一下CMOS,就可以使用usb设备了。(当然,这需要打开机箱,一般众目睽睽之下不大适用~~)2.修改注册表项,禁用usb移动存储设备。打开注册表文件,依次展开"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbehci”双击右面的“Start”键,把编辑窗口中的“数值数据”改为“4”,把基数选择为“十六进制”就可以了。改好后注销一下就可以看见效果了。为了防止别人用相同的方法来破解,我们可以删除或者改名注册表编辑器程序。提示:“Start”这个键是USB设备的工作开关,默认设置为“3”表示手动,“2”是表示自动,“4”是表示停用。3.在computermanagement里将removablestorage的使用权限禁止。computermanagement是一个windows管理组件,可以在控制面板——管理工具——计算机管理打开。在该工具窗口中storage——removablestorage——property中,general项,可以控制系统托盘是否显示security则可以管理移动存储设备的使用权限。在security中将普通用户的使用权限降低,就可以达到禁用u盘的目的。破解的方法也很简单,管理员降低普通用户移动存储设备的使用权限,但未必禁用computermanagement的使用权限。普通用户可以通过这个工具解除usb移动存储设备的使用权限限制。另外,值得一提的是,如果u盘插到电脑上后可以驱动,但是我的电脑里却没有盘符,很有可能是管理员改动了u盘的默认盘符,使得我的电脑不能识别。这种情况,可以在movablestorage中看到u盘驱动器。可以在u盘驱动器属性设置里为u盘重新分配一个盘符,再重新插拔一次u盘,就可以在我的电脑里看到u盘的盘符了。一、首先可以将该U盘换到别的机器上,看使用是否正常。如果排除了硬件损坏的可能,一般就是软件方面有问题。在WindowsXP+SP1操作系统下,有些USB2.0设备的确常常出现工作不稳定的问题,可以试试安装设备自带的USB2.0驱动程序。另外最好不要使用USB延长线,防止因为供电不足而造成不稳定现象。如果仍无效,可以在主板BIOS设定中,将USB接口强行设置为USB1.1传输速率。二、(适用于WIN98)启动计算机,进入主板BIOS设置,检查BIOS中USB的相关选项是否已经打开:OnChipUSB设定为Enabled;USBController设定为Enabled;PNPOSInstalled设定为Yes;AssignIRQForUSB设成Enabled。要正常使用USB设备首先要开启USB接口,在主板BIOS里可以进行此项工作,一般来说只需在BIOS中进入ChipsetFeatures设置,并将USBKeyborad/MouseLegacy选项设定为Enable,就能够保证在操作系统下使用USB键盘了。这些选项的作用是打开主板芯片组对USB设备的完全支持,为系统识别USB设备做准备工作。三、USB口接触不好处理办法:拔下,等十秒钟再插上USB口,使接触完好;五、闪存盘驱动程序没有安装完成(WIN98系统下)处理办法:鼠标点“我的电脑”,选择属性找到“通用串行总线”,删除其中的USBMASSSTORAGE项,再点击“刷新”,然后按照提示重新安装一次驱动程序。六、接其它USB设备(如扫描仪、打印机、数码相机)时可以正常使用,接优盘时闪指示灯不亮,不能够使用。1、检查优盘与电脑的联接是否正常,并换用其它USB接口测试。2、检查设备管理器,看是否出现”通用总线设备控制器”条目,如果没有,请将电脑主板BIOS中USB接口条目*激活(ENABLE)。3、如果电脑安装过其它类型USB设备,卸载该设备驱动程序,并首先安装优盘驱动程序。4、到其它电脑试用此优盘,确认是否优盘不良。七、启动型优盘在的电脑上无法实现启动,可能是主板型号不支持。如何判断一块主板是否支持闪存盘启动系统启动型优盘是采用模拟USB软驱和USB硬盘的方式启动电脑的。只要电脑主板支持USB设备启动,即BIOS的启动选项中有USB-FDD、USB-HDD或是其它类似的选项,就可以使用启动型优盘启动电脑。八、第一次在电脑上使用优盘,未出现提示发现新硬件的窗口,驱动程序无法安装的原因可能是:1、主板usbcontroller未启用解决办法:在电脑主板BIOS中启用此功能。2、usbcontroller已经启用但运行不正常解决办法:在设备管理器中删除”通用串行控制器”下的相关设备并刷新。3、优盘被电脑识别异常,在设备管理器中表现为带有黄色?或!的”其它设备”或“未知设备”。解决办法:删除此设备并刷新。九、大容量的U盘(例如兼具MP3播放器或录音功能的U盘)或移动硬盘在电脑上无法正常使用,虽然系统提示找到了未知的USB设备,但无法正确识别U盘或移动硬盘。原因可能是:1.USB接口供电不足:系统为每个USB接口分配了500mA的最大输出电流,一般的U盘只需要100mA的工作电流,因此在使用过程中不会出现什么问题。大多数移动硬盘所使用的是普通的2.5英寸硬盘,其工作电流介于500mA~1000mA之间,此时假如仅仅通过USB接口供电,当系统中并无其他USB设备时,那么还是可以勉强使用的,但如果电压不稳的话,就随时可能出现供电不足的问题。特别是使用支持USB2.0的移动硬盘时,情况最为严重。另外,如果你的笔记本电脑使用电池供电,那么USB接口所分配的电量就更小了。2.使用了外接的USB扩展卡:在笔记本电脑中使用USB2.0的U盘或移动硬盘时,如果笔记本电脑不支持USB2.0技术,一般必须通过PCMCIA卡转USB2.0的扩展卡来间接实现支持,这些扩展卡基本上都采用NEC公司的D720100AGMUSB控制芯片,少则提供两个USB2.0接口,多则提供五个USB2.0接口,对一般用户而言足够使用了。由于PCMICA接口提供的电源功率比板载USB接口要小,这样就会由于供电不足而导致移动硬盘工作的出现问题。解决方案:1.它从USB连接线上接移动硬盘的一端引出一根转接线,可以插入电脑背后的PS/2接口取电,这里可以比USB接口提供更大的电流输出。2.利用电源补偿线(也称“键盘取电线”),如果U盘或移动硬盘的包装盒中提供了选配的电源适配器,你就可以直接使用外接电源,这样就可以从根本上避免供电不足的情况发生了前置USB线接错。当主板上的USB线和机箱上的前置USB接口对应相接时把正负接反就会发生这类故障,这也是相当危险的,因为正负接反很可能会使得USB设备烧毁。所以尽量采用机箱后置的USB接口,也少用延长线.也可能是断口有问题,换个USB端口看下.USB接口电压不足。当把<ahref="mobileharddisk">移动硬盘</a>接在前置USB口上时就有可能发生系统无法识别出设备的故障。原因是<ahref="">移动硬盘</a>功率比较大要求电压相对比较严格,前置接口可能无法提供足够的电压,当然劣质的电源也可能会造成这个问题。解决方法是<ahref="">移动硬盘</a>不要接在前置USB接口上,更换劣质低功率的电源或尽量使用外接电源的硬盘盒,假如有条件的话。主板和系统的兼容性问题。呵呵这类故障中最著名的就是NF2主板与USB的兼容性问题。假如你是在NF2的主板上碰到这个问题的话,则可以先安装最新的nForce2专用USB2.0驱动和补丁、最新的主板补丁和操作系统补丁,还是不行的话尝试着刷新一下主板的BIOS一般都能解决。系统或BIOS问题。当你在BIOS或操作系统中禁用了USB时就会发生USB设备无法在系统中识别。解决方法是开启与USB设备相关的选项。就是开机按F2或DEL键,进入BIOS,把enableusbdevice选择enable。拔插要小心,读写时千万不可拔出,不然有可能烧毁芯片。XP中任务栏中多出USB设备的图标,打开该图标就会在列表中显示U盘设备,选择将该设备停用,然后你再拔出设备,这样会比较安全。

其实判断软件硬件问题很简单,在别的机器或换个系统试试就可以了.有些小的问题不妨先用专门软件格式化下.还有提醒大家WINDOWS下格式化时要选择FAT,不要选FAT32。

提示无法识别的USB设备维修

故障提示如图:

无法识别的USB设备:UnknownUSBDevice.很多人都遇到过的一个问题,所谓“无法识别”对于操作系统来说,或者是驱动程度有问题,或者是USB设备出现了问题,或者是计算机与USB设备连接出现了故障,解决问题的方法也是从这几处着手。

对于不同的设备会有不同的处理方法,了解USB设备正常工作需要的条件以及一些可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论