【基于语音识别的智能家电控制系统设计12000字(论文)】_第1页
【基于语音识别的智能家电控制系统设计12000字(论文)】_第2页
【基于语音识别的智能家电控制系统设计12000字(论文)】_第3页
【基于语音识别的智能家电控制系统设计12000字(论文)】_第4页
【基于语音识别的智能家电控制系统设计12000字(论文)】_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

基于语音识别的智能家电控制系统设计摘要本毕业设计围绕语音识别技术展开,目的是设计和实现一款可以使用语音作为命令去控制家电的智能家电控制的嵌入式系统。该智能家电控制系统主要包含三部分:语音采集及微处理器(MCU)处理模块,阿里云服务器和小程序上位机。语音采集及MCU处理是最关键的部分。语音识别的过程是咪头(MIC)电路将声音转换为电压的变化,通过ADC采样之后通过DMA将数据搬运到STM32的FLASH中,并没有使用语音解码芯片,而选择了提取Mel倒谱系数,使用特征动态时间规整(DTW)去进行语音解码。相比于之前开题报告中选择机智云作为上位机,为了更贴合实际和方便用户,我采用了微信小程序作为上位机。因为小程序需要加密通信,而加密通信又需要一个带认证,带域名的服务器。其中下位机与上位机通信的代码是移植的ONENET的MQTT例程。用户通过使用小程序可以直接控制窗帘的开关,灯的亮灭。如果传感器检测到数据过于异常,单片机将会报警,用户也会通过小程序获知信息,但因为个人能力有限,所以没有增加摄像头模块,没有办法让用户判断出到底是误触还是真的有异常情况。关键词:语音识别;STM32;微信小程序;智能家居1引言随着人们生活水平的提高,人们开始更加关心自己生活质量。越来越多的家用电器,在便利我们生活的同时也带来了新的问题:复杂的家电有很多的功能,而往往我们需要的只有一些简单的功能,在此前提下,我设计了这款语音识别智能家电控制系统。用户通过语音作为指令来进行简单的操作,同时还配备了微信小程序。通过语音识别来进行操作家电既方便又有科技感,对老年人十分友好。而现在物联网正在蓬勃发展,越来越多的资金和技术人员进行相关技术的研究,全球市场也在不断扩大,自14年之后国外以谷歌,苹果,亚马逊为首;国内也有阿里,百度,腾讯,华为,小米,海尔,美的等紧随其后。整个行业呈现一片欣欣向荣的形式。而现在一款不那么科技,只有简单功能的智能家电控制系统适合对智能手机操作不那么熟悉的老年人群体。该项目通过提取语音的MFCC特征并储存,通过DTW进行匹配,所以对声音采集的要求不是很高,而且可以让用户自己录制命令,在识别方言上也有很好的优势,同样也可以做到只识别特征人的命令。相比于之前采用机智云所提供的上位机方案,我采用了小程序作为上位机,一是使用方便,二是可拓展性强。相比于机智云的APP同时省去了下载的步骤,只要一个简单的二维码就可以了。因为小程序如果需要使用命令下行和数据接收就需要使用加密通信,而加密通信则需要一个有认证的域名,所以我采用了阿里云服务器。用户所有的家电状况和温湿度都可以在小程序上看到并且直接操作。同时为了防止不联网就无法语音识别的情况,数据上传是通过WiFi模块,而语音识别则是在本地进行,即使不联网也可以进行语音操控。2概述2.1系统概述语音识别技术最早开始于上世纪50年代,在70年代出现了出现了音素器,并采用了频谱分析,使正确率大大提高;同时又提出来语音结束点的端点检测。60年代末提出来动态时间规整,有效的解决了不同长度语音间互相匹配的问题,以及隐马尔科夫模型理论。语音识别系统主要是两种类型:一是指令型,提前设置好了指令,用来匹配使用者的意图,匹配成功即执行相关操作,优点是:不需要很高的计算能力,而且识别度好,速度也很快。另一种是,大规模词汇的连接听写识别,适合语音助手这种需要执行很多复杂操作的情况,但识别不够精准,反应较慢。在考虑到MCU计算能力较弱,所以选择最简单的研究领域是特定说话人、小词汇量、孤立词的识别。智能家居有以下几个方面的发展优势:(1)智能家居全球市场正在快速扩张,据MarketsAndMarkets测算,市场规模将在2022年到达1200亿美元。届时美国将有50%以上的家庭会普及智能家居,而韩国,日本将有30%的家庭。而据最新的人口普查结果(第七次),我国人口家庭户数有4.9亿户,按日韩的智能家居普及率来计算,假设每年每户在智能家居上的投入金额为3000元(包含购买新家电),则市场规模将会达到1.5万亿人民币。(2)新基建的进行使外部环境更成熟。5G基站等新基建为智能家居提供更高速度,更低延迟的网络通信保障,这使智能家居间的信息交换更加迅速。计算机视觉,卷积神经网络等人工智能感知技术使智能家居更加智能。云计算将各个独立的家庭里的控制系统拓展至全国大量分布式的计算器,实现了上位机的上位机。而作为众多上位机中的一员,微信小程序则是集普及范围广,开发周期短,可拓展型好,免安装,操作简单等一系列优点的杰出者。本毕业设计中所使用的上位机是基于mpvue工程模板的,通过阿里云服务器来进行数据的传输,和命令的下发。其中命令和数据均采用了json格式,因为使用json之后更加方便我们去解包。为了让界面不是那么单调,我使用了和风天气的API去获取了当天的PM2.5指数,天气情况,穿衣指南等信息。同时为了使编写代码和调试的过程更加方便,我使用了vue-cli脚手架工具,同时使用了四个插件去使Vscode更加方便使用,Chinese-官方汉化包,minapp-小程序格式化,SCSSFormatter-SCSS语法格式化,Vetur-vue语法格式化。2.2本设计方案思路本次研究主要围绕语言识别技术展开,主要目的是设计和实现一款能够通过语音识别控制智能家电的嵌入式系统。此系统主要包括MCU、MIC语音采集模块、ESP8266模块,以及上位机等,能有效识别语音命令并且兼顾便利性与安全性。在语音识别方面主要是自己理解算法的过程并且进行程序的编写,需要保证以单片机的计算能力可以在规定的时间(不让用户感到明显的延迟)完成语音匹配。在数据传输方面,采用了ESP8266模块进行数据通信,上位机和MCU通过阿里云服务器进行数据的交换,只需要给ESP8266模块提供一个网络即可。同时为了使调试的过程更加明确,也是用UART串口进行DEBUG信息的接收。因为STM32并没有提供一个简单的图形库,所以并没有在MCU端进行图形化代码的编写,一个节约成本,已经有小程序进行图形化显示就没有必要再重复开发一个了,二是减少程序量。2.3器件、方案、算法的选择MCU选择STM32F407ZGT6,开发板使用的正点原子的探索者。本毕业设计一共录制了10条语音指令,分别是:A4(这个智能家居的名字,因为之前有三版失败的),开灯,关灯,拉窗帘(拉开窗帘和合上窗帘是一样的),放音乐,1,2,3,4,5,6。以8KHz,16bit的采样率对语音进行采样,所需存储空间为2KB。每条语音指令进行四次录制,做冗余储存。所以最后总共需要的储存空间为80KB.而语音处理过程中所需要的RAM空间不会超过64KB,而STM32F407ZGT6拥有1024KB的FLASH,是绝对不会超过的。因为FLASH总共可以擦写10000次,虽然很少,但是为了方便所以将提取出来的特征向量存储到FLASH中,简化开发难度。其中语音识别过程中最耗时的就是快速傅里叶变化,通过使用STM32固件库所提供的16位的1024位的FFT可以减少这部分的时间。我们都知道声音具有短时连续性,在较短的时间区间中,可以认为声音的波形是稳态的,本毕业设计选择20ms为一帧,加上端点识别,这样一条语音指令最多是100帧,而每一帧的处理时间在2ms,加上其他的程序耗时,每一次语音指令耗时不会超过500ms,时间上是绝对可以的。音频信号采集电路的选择。因为语音识别的代码中增加了噪声提取,所以对采样电路的要求不是很高。所以采用了MIC去进行声电信号的转换,两个三级管组成了两级共射放大器,同时增加了电压负反馈去稳定电压放大倍数。语音信号中有效部分的频率在340Hz到3400Hz之间,根据奈奎斯特采样定理可知,采样频率为8000Hz时足以。为此我选择了定时器作为ADC的触发源,因为STM32F407的时钟频率为84M,所以设置分频系数为500,计数模式选择向上计数,自动重载值设为21既可以保证每秒触发ADC8000次。由芯片手册可知,当采用ADC1去采样时,如果需要启动DMA去搬运数据,则需要使用DMA2的通道0的数据流0。每次采样16000个点,同时定义一个16位的大数组,所以在设置DMA时需要设置外设地址不自增,而内存地址自增。显示及操作界面。相比于按钮,小程序的界面更加明了,可以认为是目前最简单,有直接反馈的人机交互方式。当用户通过点击操作时,命令也会下发。相比于传统的机械按钮,小程序更加方便,也更加直观生动,而且也不会有硬件电路上的问题。同样也为了使毕业设计更加符合现在的智能家居发展趋势,所以选择小程序作为上位机。算法选择与设计思路。语音信号具有短时性,人的声音分为清音段和浊音段,在清音段,波形具有噪声的特性,而在浊音段又有很强的周期性。而声音是由声带振动所产生的,因此在一个短时间范围内,其特性变化很小,可以看做一个稳态。所以需要采用分帧的方法去分析。在该毕业设计中,选取20ms为一帧。为了保证两帧之间过渡平滑,选择帧移为10ms,即前后帧重叠10ms。关于端点识别方法的选择。首先在自然条件下的声音是有叠加噪音的,所以在波形上就是,正常的声音波形再叠加上高斯白噪声。所以引入了三个概念:短时过零率,短时幅度,短时能量。过零率是指信号通过零值的次数。能量就是二分之一乘以幅度的平方。因为高斯白噪声是高频信号,所以他会在一个较短的时间内有很高的过零率,而因为他的幅值都很小所以他的短时幅度不会很大。但是因为短时能量会涉及到幅度的平方,所以肯定会发生数据溢出的情况,而且乘法又会花费不少的时间。为了避免这种情况的发生,引入了短时绝对幅度,通过计算一帧的幅度的绝对值,也可以达到同样的效果。关于如何提取MFCC。MFCC即Mel倒谱系数。语音信号经过声电转换,ADC采样之后得到的时域信号,而时域信号分析起来很不方便,而且数据量很庞大。所以就需要进行傅里叶变换,将时域信号转换为频域信号。而频域信号并不是所有信息都是有用的,我们需要的是频域信号的包络。所以此时的频域信号可以看做是一个低频信号乘以一个高频噪声,那么对这个信号取log,就变成了log(低频信号)+log(高频信号)。这样再进行傅里叶反变换,就可以得到包络的信息了,不过提取出来的不是F-(低频信号),而是F-log(低频信号),所以称为倒谱系数。关于如何进行特征向量的匹配。当我们成功提取出MFCC并进行存储之后,如何将下一次录音提取的MFCC向量进行匹配就成了下一个难题。动态时间弯折(DTW:DynamicTimeWarping)是本毕业设计所采用的方法,语音识别还有两种更高级的方法,分别是隐马尔可夫模型(HMM:HiddenMarkovModel)和人工神经网络(ANN:ArtificialNeuralNetworks)。HMM是一种双重随机模型,有显马尔科夫链和隐马尔科夫链。就用网上最经典的那个例子来进行说明。有三个色子,分别是八面的,六面的,四面的。每个色子被选择的机会是相同的,每次随机抽取一个色子进行投掷,记录下得到的数值。假设得到的数字是2,4,4,5,则这个数字链就是显马尔科夫链,而每次选择的色子队列就是因马尔科夫链,根据两个条件去推断第三个。由此就得到了解决三种问题的方法:求隐马尔科夫链,求显马尔科夫链,求概率。其中语音识别就用到了第一个问题。HMM适合用于大量词汇,非特定人声的识别情况。随着集成电路的发展,更低功耗,更高速度的计算机出现了,隐马尔科夫模型也得到了大量应用。不过既然是统计模型,那么必然要很多的样本,很长的训练时间,而且要更多的系统资源。所以并不是毕业设计所需要的。而DTW的算法很简单,而且不需要大量的语音数据去进行训练,所以是一个非常好的选择。DTW在设计的初衷就是为了解决不同长度向量之间相似度的问题,他并不是简单的缩放向量长度,二是根据向量的波形去进行非线性的变化。3总体设计3.1语音识别的过程语音识别主要有以下几个步骤:1.采集外部声音信号,转换为数字信号并存储。2.在采集到的声音信号中找出有效语音信号的开始和结束点。3.分析检测到的有效语音,得出语音信号特征。4.对每个待识别的语音指令,建立特征模版。5.比较输入语音信号特征与特征模版,识别输入的语音信号3.2命令下行和数据上传的过程本毕业设计一共设置了两个Topic,小程序通过订阅/mysmarthome/pub来获取单片机的数据和状态,单片机通过订阅/mysmarthome/sub来获取小程序下发的命令。其中服务器是购买的阿里云的云服务器,以学生身份购买的服务器是轻量应用服务器,其在用户组设置与普通的服务器不同。4硬件设计4.1单片机电路MCU的选择。MCU选择STM32F407ZGT6,开发板使用的正点原子的探索者。本毕业设计一共录制了10条语音指令,分别是:A4(这个智能家居的名字,因为之前有三版失败的),开灯,关灯,拉窗帘(拉开窗帘和合上窗帘是一样的),放音乐,1,2,3,4,5,6。以8KHz,16bit的采样率对语音进行采样,所需存储空间为2KB。每条语音指令进行四次录制,做冗余储存。所以最后总共需要的储存空间为80KB.而语音处理过程中所需要的RAM空间不会超过64KB,而STM32F407ZGT6拥有1024KB的FLASH,是绝对不会超过的。因为FLASH总共可以擦写10000次,虽然很少,但是为了方便所以将提取出来的特征向量存储到FLASH中,简化开发难度。STM32F407ZGT6简介ST是意法半导体,M是微控制器,32是32位,所以STM32是意法半导体公司研发的32位微控制器。不过在此之前要稍微了解一下ARM架构。指令集就是CPU硬件和软件之间的接口描述函数,是二进制代码。架构就是该处理器所使用的的具体指令集。内核和处理器是芯片内部的核心模块,内核是指令集的实物化。芯片就是内核加上其他模块组成的。所以ARM公司有三级授权,最高一级的为指令集/架构授权,获得该授权之后可以使用指令集去设计芯片,麒麟就是基于armV8指令集开发的。获得授权的合作伙伴可以参与指令集的开发,但是还是没有权限去修改指令集。接着是内核授权,将电路图和芯片测试方法交给第三方公司,这样第三方公司就可以去生产芯片。而最低一级的就是使用授权,获得该授权的公司可以去使用芯片去生产嵌入式产品。所以STM32是意法半导体公司基于Cortex-M3内核开发的微处理器。从学习的角度出发,F1和F4是使用的最多的。F1是基础性,基于Cortex-M3内核。F4是高性能,基于Cortex-M4内核。对于STM32F407ZGT6而言,F是基础型;407表示这个芯片是高性能的且带DSP和FPU;Z是引脚数目,144引脚,同样的这个位置也有其他的字母例如C是48引脚的,R是64引脚的,V是100引脚的,I是176引脚的,B是208引脚的,N是216引脚的。G是芯片FLASH的大小,G为1024KB,C为256KB,E为512KB,I为2048KB。T表示的是封装,T表示的是这个芯片的封装时QFP,这是最常用的封装形式。同样的也有耳熟能详的双列直插式封装。6表示的是温度等级,6代表的是温度等级为A,可以工作在-40度到85度。作为学习工具的话,我建议去选择F103。因为一片F103芯片在淘宝上只卖10块左右,F103最小系统板只要10块。而一块F407芯片就要20块。考虑到美国的科技封锁,价格肯定要上涨。而且晚上的大部分例程都是在F103上跑的,所以你可以下载直接使用。而如果是使用F407的话,就要考虑代码移植的问题。而且F4是基于Cortex-M4内核的。你参加工作之后接触到的芯片大部分都是基于Cortex-M3内核的,甚至还是Cortex-M0(这就是8位的微处理器了)内核的。他们说其实能把52单片机学透就很厉害了,当然学透的标准是可以用汇编去编写程序且不用怎么花时间去思考。这就说明你对寄存器和内存的理解已经出神入化了。当然如果是以做产品的思路的话,那成本和安全性就两个最重要的东西了。芯片引脚越多,那么功能也就越多,那么成本也就越贵。接着就是FLASH的大小,同理FLASH越大的芯片也就越贵。复位电路如下图所示因为STM32是低电平复位的,所以当按键处于悬空状态时,电容充满电,整个电路视为短路,这时RESET引脚为高电平,当按键按下时,电容快速放电,RESET引脚通过按钮接到GND上,这时RESET引脚为低电平。这样由按钮,电阻和电容组成的复位电路就完成了。串口通信电路如下图所示串口、UART口、COM口、USB口是指的物理接口形式(硬件)。而TTL、RS-232、RS-485是指的电平标准(电信号)。USB线通过USB_232接口接入电路,USB的D+D-线通过硬件电路接到CH340芯片上,CH340是RS232转TTL电平转换芯片,经过CH340的电平转换之后D+D-转换成了单片的TXRX。而TX,RX则通过跳线帽接到PA10,PA9。接的单片机的TX接电平转换的RX。因为在F4的芯片手册中规定,PA9,PA10的复用功能是USART的发送和接收功能。复用的意思是:当GPIO不作为IO来使用时就称为IO的复用。UART全称通用异步收发器,没有时钟线,属于异步通信。异步通信具有系统简单的优点,但是因为没有时钟线,所以需要有起始位和停止位,所以这样也造成了异步通信的通信效率不是很高。晶振电路如下图所示左图为高速晶振电路,右图为低速晶振电路。负载电容=杂散电容+(C1*C2)/(C1+C2),这个公式也可以简化为负载电容=杂散电容+C1//C2,杂散电容的值一般为3-5pF。而时间常数=负载电容*电阻。这里就要引入时钟树的概念,时钟就是CLK,而学过数电的我们知道数字电路只会在上升沿或者下降沿才发生变化。而STM32不同的外设需要的时钟频率是不同的,所以时钟树是很有必要的。而我们常听到的CPU超频就是强行提高CLK的频率,让CPU的工作速度更快而已。不过更高的时钟速度就意味着更高的功耗以及更差的抗电磁干扰能力。STM32F4有五个重要的时钟源。LSE为低速外部时钟,需要32.768KHz的晶振频率,该时钟作为RTC的时钟源。HSE为高速外部时钟,可以接4-26MHz的晶振电路,根据接的晶振的频率不同需要更改锁相环的分频系数。根据时钟树我们可以看出(时钟树的图太大了),主PLL可以选择HSE或者HSI作为输入,输入的时钟要先经过一个分频器变为1M的时钟,接着经过PLL倍频168倍,变成168MHz的SYSCLK,所以芯片内部使用的AHB,APB1,APB2总线都是由SYSCLK分频而来,AHB总线是168MHz,APB1总线是84MHz,APB2总线是41MHz。启动模式选择电路BOOT0和BOOT1是用于设置STM32的启动模式的。当BOOT0为0时,单片机可以按复位键去开始跑代码。而当BOOT0为1,BOOT0为0时则可以通过串口下载程序,不过因为我使用ST-LINK的SW模式去下载程序,所以一直设置为BOOT0=0。ESP8366电路我采用的ATK-ESP8266WIFI模块是安信可生产的,这种模块是一款串口转WIFI模块。该模块采用串口和MCU通信,并且内置了TCP/IP协议栈,所以可以实现串口和WIFI之间的转换。该模块同时支持两种电压,分别是3.3V和5V。在该毕业设计中只用到了五个端口:VCC,GND,TX,RX,RST。该模块通过UART2与单片机进行通信,单片机同时也使用UART1与计算机通信,作为DEBUG信息的输出。如果像之前准备的方案一样去使用机智云提供的代码的话,就需要去给ESP8266模块去刷机智云的固件,其中GPIO_0就是固件烧写模式的选择端,当处于低电平时为烧写模式,而处于高电平或者悬空状态时则为运行状态。如果有看到这里的,想要去学习机智云的代码如何去移植的话,可以去哔哩哔哩上搜索机智云,temp_duan这位up主讲的很详细,跟着做是可以做的下来的。同样的正点原子也做了相应的文档去教如何去完成这部分的工作。我这里使用的是ONENET平台提供的代码,只需要基础例程里的就可以了,不过基本网上的代码都是F103的,作为F407的使用者其实有时候还是很头疼的,不过也有好处,在潜移默化下我自己学会了如何去移植代码和例程,虽然只是一个微不足道的技能。电平转换电路DC_IN是外部电源输入,经过U15DC-DC转换芯片之后电压变为5V,D4这个二极管的作用是为了当外部直流电源搞错时,保护开发板不会被烧坏。而AMS117这个芯片属于常见芯片,主要的用途就是将5V的电压转换为3.3V的电压。其实只要有一个AMS117就可以了,这两个芯片的作用是一样的,但是用途不一样,其中一个是用于给模拟电路去供电,数字电路和模拟电路分开可以得到更好的效果。4.1MIC电路下图是本毕业设计声电转换及信号放大电路。该段主要讲两个问题:MIC电路的设计思路,最终的成品电路有什么作用。左图是最典型的MIC应用电路,右图是MIC内部原理图。MIC内部可以理解为一个可变电容,一端是固定的,另一端的可移动。而根据高中物理我们知道,电容值是和正对面积,两极板之间的距离,介质等因素所影响。两极板之间的距离会因为声音的响度,频率而发生改变。所以声音的变化就经过可变电容转换成电容电荷量大小和充电快慢。MIC内部的三极管是主要器件,主要有两个作用:阻抗变换和放大。加电阻是为给MIC内部的三极管提供一个偏置电压,使其工作在饱和区。这个偏置电阻选的太大,会使三极管处于非饱和区。我购买的MIC是上图所显示的。因为他的输出电阻是2.2K,当偏置电阻为1.1K,且电源电压为3.3V时,正好可以提供给MIC2.2V左右的电压,这样是符合MIC工作需要的电压的。当提供MIC电路所需的偏置和工作电压之后,因为得到的信号变化幅度很小,所以需要一个放大电路,所以我选取了两级共射放大电路。这样可以给信号提供一个100倍的放大,满足后期ADC采样的需求。5软件设计5.1语言信号的预处理语音信号的预处理包含:语音信号采样,分帧,加窗,预加重。语音信号经过省电转换之后,通过ADC采样,DMA搬运之后到达STM32的RAM中。分帧是将语音信号分割成长度一致的片段,用于短时分析。本毕业设计中选择每160个点为一帧,即20ms为一帧。分帧并没有占用额外的RAM空间,而是每次按照帧移去读取160个点的数据。一帧的语音信号经过傅里叶变化之后,我们会发现频率越高,幅值越小。语音信号的功率谱会发生6dB/倍频的衰减,这是因为声音从声带振动发出后会经过空气和口腔的衰减,所以语音信号的高频部分需要进行预加重处理。预加重处理的作用是为了滤除低频信号。同时为了保持信号的短时平稳性,需要增加窗函数。不同的窗口适合不同的情况,矩形窗谱更加平滑适合时域分析,而汉明窗可以有效的克服泄露现象,所以适合频域分析。所以为了后续的处理,需要对分帧后的信号进行加窗处理。Y(n)是加窗后的信号,y(n)是原始信号,w(n)为窗函数。5.2端点检测端点检测是在时域上进行的操作,所以并不需要加窗和预加重。在自然条件下的声音是有叠加噪音的,所以在波形上就是,正常的声音波形再叠加上高斯白噪声。所以引入了三个概念:短时过零率,短时幅度,短时能量。过零率是指信号通过零值的次数。能量就是二分之一乘以幅度的平方。因为高斯白噪声是高频信号,所以他会在一个较短的时间内有很高的过零率,而因为他的幅值都很小所以他的短时幅度不会很大。但是因为短时能量会涉及到幅度的平方,所以肯定会发生数据溢出的情况,而且乘法又会花费不少的时间。为了避免这种情况的发生,引入了短时绝对幅度,通过计算一帧的幅度的绝对值,也可以达到同样的效果。从上图可以清晰的看到,在自然条件下,纯净语音加上高频噪声的声音会在语音段开始的时候有明显的改变。当噪声不是那么大的时候,短时绝对值的分辨能力和短时能量的分辨能力的分辨能力是差不多的。但当噪声比较大的时候,短时能量的分辨能力更好。其实我觉得这个结论有些没必要,短时绝对值是线性的,短时能量是二次方的,所以噪声很大的时候,二次方的增速是要高于线性的。毕竟是智能家居,所以噪声不会那么大,综合考虑我选择了短时绝对值和短时过零率。当某一帧的短时绝对值大于一个值,且短时过零率小于一个值,且持续超过五帧的时候,则认为进入到了语音段,标记那一帧为起点。当其中一个条件不满足,且持续5帧,则认为离开了语音段,标记那一帧为结尾。关于门限值如何确定。因为在每次录音前都会先录制300ms的空白声音,用来确定门限值。所以这样的设计也会有更强的抗干扰能力。5.2特征提取在做过FM接收机实验之后,我对人耳的听觉感知特性有了更生动的理解。同样幅度的信号,频率越高,人耳听到的声音越小。人耳对低频信号的分辨能力强于对高频信号的分辨能力。所以当进行完快速傅里叶变换之后,频幅特性曲线应该按照下图去进行Mel频谱转移。MFCC是Mel倒谱分析,相比于倒谱分析,MFCC用到的频幅特性曲线是按照Mel频率进行变化过后的。下图是经过快速傅里叶变化之后得到的曲线,其中幅频曲线的包络中存在着我们需要的信息。在频域:X(n)=H(n)E(n)所以在时域:x(n)=h(n)*e(n)为了获得信号频域的包络对频域两边去取log,log(X(k))=log(H(k))+log(E(k))然后进行反变换,最后得到的时域波形为x`(n)=h`(n)+e`(n)所以只需要将倒谱通过一个低通滤波器即可获得包络部分对应的时域信号h`(t)5.3特征匹配本毕业设计所采用的特征匹配算法是动态时间弯折算法。动态时间弯折算法主要是为了解决不同长度的向量间互相匹配的问题。在进行语音识别之前,需要提前进行特征向量的储存,一共十条指令,每条指令录制四次,每条语音提取MFCC之后存储起来。再得到新语音之后,同样的提取MFCC,使用动态时间规整算法去与之前四十个特征向量进行拼配。匹配距离最短的那一个就是这条语音所代表的意思。从(0,0)开始出发,到最右上角结束,设置往上或者往下都是相加,对角线是两倍。通过这这样的计算就可以得到两个向量的差距。综合比较DTW算法的工作量小,不需要大量的语音数据,而且DTW算法适合孤立词语音识别,且容易实现,节省系统资源,比较方便移植到嵌入式系统中。所以本系统选择DTW算法作为语音识别的核心算法。下面介绍DTW算法及其实现方法。假设参考模板的特征矢量序列为T,输入语音特征矢量序列为R。DTW算法就是要寻找一个最佳的时间规整函数,使待测语音的时间轴R非线性地映射到参考模板的时间轴T上,使总的累积失真量最小。一般时间规整函数满足一下约束:1.单调性,规整函数单调增加。2.起点终点约束,起点对起点,终点对终点。3.连续性,不允许跳过任何一点。4.最大规整量不超过某一极限值。5.4微信小程序本毕业设计中所设计的微信小程序使用的是MPVUE框架。MPVUE提供了一个非常方便的安装方法,使用NPM去安装。使用npminstallvue就可以非常简单或是痛苦的安装成功。同时利用vue-cli脚手架工具,可以实现VScode和微信开发者工具之间的联调。如果想复现本毕业设计中的小程序需要按照如下的步骤进行操作。安装Node.js环境,安装之后记得要在powershell中查看一下node的版本号和npm的版本号。注意:必须要保证node和npm的版本号是配套的。具体这两个版本需要怎么搭配可以看官网的介绍,如果两个之间的版本不搭配,就会发生各种安装错误。做小程序主要使用mpvue的方式去开发,但是一般使用mpvue在小程序上的一个移植工具去开发。所以需要一个vue-cli脚手架工具去初始化Vue的模板。因为在国内不翻墙的话,下载的速度会很慢,所以需要使用淘宝的源。最后的话就是两个开发软件。微信开发者工具和Vscode。使用了四个插件去使Vscode更加方便使用,Chinese-官方汉化包,minapp-小程序格式化,SCSSFormatter-SCSS语法格式化,Vetur-vue语法格式化。在安装Vscode时推荐安装system版,权限更高,可以避免很多不必要的麻烦。这个是最后的界面,所以上下分为两部分,一个是有关天气的相关显示,下面是关于智能家居的传感器信息和状态的。Head有三行,第一行,有两个文本,分别是空气质量和所处的地理信息。第二行大一些,分别PM2.5指数和当天的天气。第三行,是出行建议。body部分有三行,每一行中有两个data每个data有三部分,图标,文字,数字。一行叫做一个one-row一行分为左右两个数据每个数据块有三个部分(图标,文字,数字:温度计,温度,16C)左右布局,右边的分为两层。所以对于body部分的层次是:one-row,有两个data块。每个data块有它自己的data-logo和data-text。每个data-text有data-title和data-value。data-logo和data-text呈左右布局,data-title和data-value呈上下布局。pages文件夹中每一个文件夹都是一个页面,虽然他有两个但是我并没有用到第二个登陆界面。小程序通过订阅/mysmartphone/pub来接收数据,通过在/mysmartphone/sub上来发送命令来控制单片机。为了方便的解析和发送命令,命令和数据均采用json格式。使用json去发送和接收数据可以减小工作量。json格式是指这样格式的数据{“LED_SW”:true}。小程序中获取各类天气数据的方法是使用和风天气,虽然我使用DHT11模块去获取了当前室内的温度,但是室外的温度在不安装额外传感器的情况下很难获得本地数据,况且外面的空气质量等数据的采集不是个人可以做到的。所以我使用了和风天气的API来获取这个户外数据。无他,免费而已。如果是免费用户,每天支持调用API5000次,而我们获得这些数据最多一小时改变一次,或者用户每次打开小程序的时候调用一次,5000次每天是用不完的。根据和风天气的手册我们知道只需要提供经纬度和个人的key都可以通过访问一个网址来获得所需的数据,不过不要注意的是获取地址需要获取权限。获得的数据常常是个大数组,你需要的只是数组中小小的一部分,所以需要通过查看这个大数组才能知道自己需要的数据具体在哪个分支。建议创建一个新的变量去储存你需要的数据,直接调用会出问题。在成功调用和风天气的API之后,我发现调用别人的API是一件非常方便的事情,对于自己去写语音识别代码这件事虽然不后悔,但确实有点心累,做成一件事有两种方法,一是站在巨人的肩膀上,二是成为巨人。通过调用百度的语音识别API去进行语音识别,砍掉单片机的部分,直接让家电去自主联网也许才是符合未来的发展趋势。所有需要的硬件除家电外全部简化为一部手机,用户通过小程序就可以完成所有操作才是未来。6制作与调试6.1硬件电路的布线与焊接如上图所显示的,因为ESP8266需要提供3.3V电压,以及一个串口去用来和单片机通信,还有一个IO口去进行复位操作。同时MIC电路需要3.3V供电,以及PA5作为采样使用。 PA2-->ESP8266_RX PA2-->ESP8266_TX PC5-->ESP8266_RST本毕业设计因为采用开发板,所以需要焊接的也就只剩下了MIC电路。本着挑战自己的想法,自己做了一个STM32最小系统板,因为时间的问题,所以并没有选择去实际焊接,但是经过这件事,我对电路图又有了更深的理解。电路的原理是很简单的,大部分都是模块化的,只需要将他们拼在一起就好。复位电路,晶振电路,下载和供电电路,OLED电路,按键电路,其实都有现成的,我需要做的就是将他们进行合理的布局。同时也了解到

温馨提示

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

评论

0/150

提交评论