这是一个基于云端语音识别的智能音箱,你可以理解为类似于亚马逊Echo或者小爱同学、天猫精灵的设备,与之不同的是它并非基于嵌入式Linux,而是仅仅基于单片机和FreeRTOS实现。 该设备的核心芯片为stm32f407vet6,wm8978,esp8266,这三者分别扮演主控,音频DA/ADC以及网络通信的角色。另外还需要SD卡来提供存储录音和音乐的功能。 该项目目前的瓶颈在于由于esp8266是一款物联网wifi芯片,其网络带宽有限,导致识别的速度偏低, PS:其实也还说的过去,毕竟录音的文件也不是很大:),并且导致在线播放音乐的功能无法实现(这是最伤的)。 但这应该也是目前基于单片机的最好的实现方案了,运行效果。
- Audio目录下主要存放音频相关的代码,比如wm8978的驱动,解码,播放以及录制音频的功能。其中包含了一个第三方的mp3解码库“HelixMP3Decoder"。
- Fatfs目录下主要存放Fatfs文件系统的代码,它需要基于SD卡实现。
- File目录下存放系统的原理图,同时还是有一个“SmartSpeaker”目录,需要将这个目录拷贝到SD卡根目录下,这个目录里都是些用来提示的wav文件。
- FreeRTOS目录下存放的是FreeRTOS的代码。
- Led目录下存放的是一个根据识别的结果操作Led的实例,在播放音乐的时候,还会对音乐进行频谱分析,从而改变Led的颜色。
- Libraries目录下存放是是stm32f4系列的一些库文件。
- MDK为工程文件的目录。
- Network目录下存放的是与网络操作相关的代码,比如esp8266的串口驱动的封装,编解码,网络通信等等。
- Peripherals目录下存放的是stm32f4相关的外设的驱动代码,其中一些与FreeRTOS结合相当紧密,例如串口的驱动。
- Public目录下存放的是一些基础的功能函数,比如日志功能等。
- Shell目录下存放的是一个简单的人机交互的实现,正因为有了这些代码,我们可以借助Xshell等通过串口登陆stm32,并且可以实现一些简单的命令操作,就像操作Linux系统一样。而且,移植这个Shell非常简单,你只需要底层提供getchar,putchar以及puts这三个功能函数。
为了连接WiFi,你需要在"network.c"文件中配置你的WIFI网络。 为了接入百度云的语音识别服务,你需要去注册百度语音的开发者账号,并且得到他的token,你需要在"netvoc.c"中配置这个token。
在硬件初始化完毕,FreeRTOS启动完毕后,wm8978开始收集环境中的音频信号。这里采用了一个基于短时过零率和声波能量的简易的VAD算法,用于实现自动录音。录音完毕后,将录制的语音文件发送至百度云的语音识别服务器进行识别,并接收识别的结果,然后根据结果执行相应的操作,比如播放一首音乐等,高度可拓展。