本期分享来自RT-Thread的社区小伙伴霹雳大乌龙,如果你也有文章愿意分享/希望获得官方的写作指导,可以发送文章/联系方式邮件至邮箱:xuqianqian@rt-thread.com
回顾往期:
软件包应用分享|基于RT-Thread的百度语音识别(一)
软件包应用分享|基于RT-Thread的百度语音识别(二)
一、前言
项目地址:https://github.com/lxzzzzzxl/Baidu_Speech_base_on_RT-Thread
(请复制至外部浏览器打开)
在前面的2篇连载中我们已经讲解了百度语音识别的流程,如何使用webclient软件包进行语音识别,如何使用CJson软件包进行数据解析,如何在LCD上显示识别结果,如何通过语音识别控制外设。这一切的一切的首要前提,就是语音,那我们前面使用的是事先录制好的音频,而本次连载,我们终于要来实现录音功能了,有了录音,你想怎么识别就可以怎么识别,是不是很棒。
我将采用RT-Thread的Audio设备框架,下面我会简单介绍该框架。但在那之前,我建议你先去看看正点原子教程的 “音乐播放器” 及 “录音机” 两个例程,确保你对WAVE文件,音频编解码芯片,SAI等知识点有一定的了解。
二、 Audio设备框架
Audio(音频)设备是嵌入式系统中非常重要的一个组成部分,负责音频数据的采样和输出。如下图所示:
RT-Thread的Audio设备驱动框架为我们提供了标准 device 接口(open/close/read/control),只要我们对接好设备框架,就可以在我们的应用代码里直接使用这些标准接口,对设备进行操作。(RT-Thread其他设备框架实现原理都是如此)详细介绍见RT-Thread文档中心:https://www.rt-thread.org/document/site/
本篇我们不具体讲解Audio设备框架的对接,因为我使用的潘多拉开发板是官方支持的板子,所以底层驱动,框架对接这部分已经有相应的支持了。这里只简单提一下设备框架的对接方法,RT-Thread所有的设备框架的对接,基本上都是两大步骤:
准备好相应的设备驱动,实现对应框架的ops函数
进行设备注册
想要弄懂这两步,RT-Thread的文档中心需要多看,还有就是去看框架源码。
三、动手实践
1.打开Audio设备(使能录音功能)
2.录音功能实现
1/* wav_record.c */
2
3#include <rtthread.h>
4#include <rtdevice.h>
5#include <dfs_posix.h>
6
7#define RECORD_TIME_MS 5000
8#define RECORD_SAMPLERATE 8000
9#define RECORD_CHANNEL 2
10#define RECORD_CHUNK_SZ ((RECORD_SAMPLERATE * RECORD_CHANNEL * 2) * 20 / 1000)
11
12#define SOUND_DEVICE_NAME "mic0" /* Audio 设备名称 */
13static rt_device_t mic_dev; /* Audio 设备句柄 */
14
15struct wav_header
16{
17 char riff_id[4]; /* "RIFF" */
18 int riff_datasize; /* RIFF chunk da