Funpack第二季第一期 语音控制Syntiant TinyML点亮led灯
使用syntiant tinyml进行语音识别的训练和判断 使用edgeimpulse进行在线的训练 用arduino进行编译
标签
嵌入式系统
测试
数字逻辑
wwwds
更新2022-07-07
西安交通大学
517

使用edge-impulse进行NN模型的训练。受限于非会员的限制,模型无法搭建的很大,不过对于简单的声纹信息处理来说足够。并且在NDP芯片上的网络大小也是受到限制的。

FsZPrmVLKsMULTR8WxKRv9JF3yVw

图1 Edge-impulse网页

收集语音数据:使用火山引擎的语音合成数据进行训练。加入噪声数据。

Fn4DpLD7J5Jhebi2tW6o-y5BZQDH

图2火山引擎网页

数据集构成:总长度为17min,每段语音长度在1s至2s之间,标签为male、female、little和噪声集openset。

FjIafHMjMI28_CcKULQRGb_uoGWq

图3 数据信息

声纹识别理论:傅里叶变换和梅尔尺度变换

我们常说的声音信号,都是由各种不同频率的声波组成而来的,如下图所示,我们能看到的其实只有一个矩形波,但它背后是由许许多多的正弦波叠加而成。这些正弦波按照频率从低到高从前向后排列开来,而每一个波的振幅也都是不同。所以为了能得到这个信号更多维度的信息(即从时域的信息转换成频域的信息),此时就需要傅里叶变换了。

首先考虑一个连续信号 f(x) 的傅里叶变换,如下

Ft-gHhMsJM11wkvuu4ksvRCTJqJt

在实际应用中,计算机只能处理离散信号,我们得到离散傅里叶变换(DFT),如下

Fte73ks4Rz_GgiXf8e2Bj_YQlm7r

而现在,计算机直接采用的是快速傅里叶变换(FFT),结果是与DFT一样的。

傅里叶变换到声谱图spectrogram

声谱图是我们最终处理的目标。不同的人的音色之所以不同,原因在于大家发音的过程中的谐波成分有所区别,人耳以及背后的大脑通过处理这个信息,得到了我们对声音的印象,通过大脑这个神经网络,我们可以区别不同人的声音。对于我们的芯片上的神经网络而言,用声谱图提取信息就十分重要。

短时傅里叶变换定义如下:

FgfhmPkw7_luJPW09gZzqhKGWz95

通过分帧的策略,将连续的声音信号进行分段的捕捉,正好可以利用STFT。

然后我们就要对分帧后的信号进行快速傅里叶变换(FFT),最后把每一帧的结果沿另一个维度堆叠起来,得到类似于一幅图的二维信号形式,然后就可以得到声谱图了。

FrNulLISZU5D6Buu9-B4QROV014s

图4 原理图

需要注意的是,帧与帧之间必须有一定的重叠,这个overlap有利于整体的连贯性。

Fjge5aJvuzlJog37z0T07Uh3OtuP

图5图 帧间隔混叠策略

所以处理的过程是从信号的左端向右滑动。伪代码为

FgbRSZYPrDPYC34t_zbaMVuaQx4I

梅尔尺度,梅尔滤波器和梅尔频谱

梅尔尺度(Mel Scale)是建立从人类的听觉感知的频率——Pitch到声音实际频率直接的映射。频率的单位是赫兹(Hz),人耳能听到的频率范围是20-20000Hz,但人耳对Hz这种标度单位并不是线性感知关系,例如,若把音调频率从1000Hz提高到2000Hz,我们的耳朵只能觉察到频率似乎提高了一些而不是一倍。但是通过把频率转换成美尔尺度,我们的特征就能够更好的匹配人类的听觉感知效果。从频率到梅尔频率的转换公式如下:

Ft2i5j1aXWePXvZnkDpsPq9fhWHM

我们可以观察一下转换后的映射图,可以发现人耳对于低频声音的分辨率要高于高频的声音,因为赫兹到梅尔是log的关系,所以当频率较小时,mel随Hz变化较快;当频率很大时,mel的上升很缓慢,曲线的斜率很小。这说明了人耳对低频音调的感知较灵敏,在高频时人耳是很迟钝的,梅尔标度滤波器组启发于此。

Fg9edq5dXBdVqNzVTy4xQ2zdtwRK

图6 听觉感知灵敏度

为了模拟人耳对声音的感知,人们发明的梅尔滤波器组。一组大约20-40(通常26)个三角滤波器组,它会对上一步得到的周期图的功率谱估计进行滤波。而且区间的频率越高,滤波器就越宽(但是如果把它变换到美尔尺度则是一样宽的)。为了计算方便,我们通常把26个滤波器用一个矩阵来表示,这个矩阵有26行,列数就是傅里叶变换的点数。

FmZ3puKhLWtlFCtsX-PBMJ5145mP

图7 梅尔频谱MFCC特征提取策略

前处理后的噪声信号,有用信号对比

 

(1)福特福特

FilGq9mahW9pvmO5zGk7lWkHh3O3

(2)洗衣机、吸尘器噪声

Fq1oA3SbGTs5ak-v5niyU7tgO_40

图8数据信息对比图

 

模型训练

选择classification,五层全连接网络。查看NDP芯片的内置网络,由于我们的MFCC信号是40*40输入,最后分类结果为4,满足输入输出的需求。

FnrPICvPeGMReGIYTFQAZ6KUpmzX

图9 NDP

全连接神经网络利用反向传播,通过多次训练逐步调整神经元的参数,最终提取出我们预先处理好的信号中利于判断声音类别的特征。

我们将事先提取出的梅尔频谱作为输入传递到网络中,经过每个神经元后,最终产生一个输出值,并通过输出值根据损失函数(loss function)产生一个损失值(loss),常用的损失函数有平方损失函数和对数似然损失函数。

利用上次网络中计算出的损失值,我们采取梯度下降方法来降低每次训练后得到的损失值,最终使网络的输出与我们先前的预期基本一致。梯度下降方法的计算公式如下:

构建好模型之后,利用edge-impulse开始训练

由于训练语音较为简单,分类情况在测试集上验证效果很好。

FoDm09bd0j2tc7Px3FG3ETS8k4VB

生成NDP库的NN包文件,通过bash刷入NDP芯片内。模型训练结束。

 

Arduino工程建立

开发板支持arduino开发,对应的arduino核心板类型为MKZ,安装相关的开发库文件后,可以对示例工程进行编译。

FrU5hx-d4f5l4ajo9e3BIVvA2rtx

图10编译流程图

其中NDP库通过poll命令得到识别结果,通过在arduino主函数中加入我们想要的逻辑就可以完成识别判断。此外将训练结果从debug串口的sercom3发送出去,给到树莓派,树莓派将识别到的声纹信息进行下一步的处理。比如,将车内语音替换为我们预先驾驶员喜欢的声音。

关于噪声

处理噪声的关键在于加入无关集,根据背景噪声的不同,分析噪声的频率。并且将所有容易误触发的噪声打openset标签,retrain之后更新模型就可以大幅提高准确率,减少误触发

实现结果展示:视频最后1min

FoHKjALud7gbr9-xeR2Aooy3_-dk

关键词1 你好福特 绿灯

关键词2 开门 蓝灯

FvjrvZniakVgSKRNnycCHSLideFW

 

附件下载
helloford-syntiant-ndp101-lib-v41.zip
firmware-syntiant-tinyml.zip
使用edge.docx
团队介绍
武德生
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号