Hi3861使用NNOM实现人工智能神经网络之KWS 原创 精华

再见南丫岛
发布于 2022-5-10 20:31
浏览
0收藏

1、前提

之前整理的关于NNOM的帖子,已经写了两篇。
Hi3861使用NNOM实现AI神经网络的功能
Hi3861使用NNOM实现人工智能神经网络之MNIST
感兴趣的可以看看。

2、什么是KWS

语音唤醒(keyword spotting)在连续语流中实时检测出说话人特定片段。

3、KWS移植

在nnom\examples\keyword_spotting中有KWS部分的测试代码,我们将该代码移植到我们的系统之中。移植完成之后的验证工作需要语音文件,语音文件可以提前烧录到flash中,或者通过网络下载,或者通过麦克风录制。如果将音频的采样率等参数设置的一致,几种方案都是可行的。
本文的思路如下:开辟200K的Flash区域,进行语音文件的存储。通过I2S采集音频,存储在该Flash空间。然后从该地址读取数据,进行KWS识别。

3.1 音频采集

音频的采集,可以借鉴Hi3861官方提供的I2S的代码。如果没有I2S设备,可以讲音频下载到该Flash区域。这里不过多介绍。

3.2 音频格式

音频格式为单声道,16000hz采样率。

3.3 代码修改

int dma_audio_buffer[AUDIO_FRAME_LEN]; //512
unsigned char dma_audio_buffer_temp[AUDIO_FRAME_LEN*2];

先定义dma_audio_buffer_temp,用于存储从Flash中读取的音频数据。然后将数据进行处理,删除一个声道,只使用有用的声道。

for(int i = 0; i < AUDIO_FRAME_LEN; i++)
{
   audio_buffer_16bit[AUDIO_FRAME_LEN/2+i] = p_raw_audio[i];
}

然后按原作者提供的代码,就可以执行了。移植的代码见附件。

4、测试

默认已经训练的词汇有这些,可以直接通过麦克风说出下面的英文词语,便可以正确的识别。

const char label_name[][10] =  {"backward", "bed", "bird", "cat", "dog", "down", "eight","five", "follow", "forward",
                      "four", "go", "happy", "house", "learn", "left", "marvin", "nine", "no", "off", "on", "one", "right",
                      "seven", "sheila", "six", "stop", "three", "tree", "two", "up", "visual", "yes", "zero", "unknow"};

5、问题和后续

1)自己对单声道多声道的理解还不够深入。所以,在测试的时候,走了很多弯路。以及代码在单双声道的处理上,应该也有优化的空间。
2)处理的时间太长,需要3.5秒的时间。就使用来说,还是难以接受的,代码上可能还有优化的空间。希望大神可以持续优化。
3)当前的做法是先录音再分析,可以修改成边实时的录音和运算。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
kws.zip 71.59K 47次下载
已于2022-5-10 20:31:57修改
收藏
回复
举报
回复
    相关推荐