LD3320模块原理简述
LD3320 芯片是一款“语音识别”芯片,集成了语音识别处理器和一些外部电路,包括AD、DA 转换器、麦克风接口、声音输出接口等。LD3320不需要外接任何的辅助芯片如Flash、RAM 等,直接集成在LD3320中即可以实现语音识别/声控/人机对话功能。并且,识别的关键词语列表是可以任意动态编辑的。
一、LD3320模块原理以及其流程
LD3320语音识别芯片的实现原理主要可以分为以下几个步骤:
- 音频采集:LD3320内置一个麦克风放大器,它可以对周围的声音进行采集,并将采集到的音频信号送入芯片内部的语音信号处理器。
- 信号处理:LD3320内置一个语音信号处理器,它可以对音频信号进行预处理、降噪、滤波等处理,以提高识别的准确率。
- 特征提取:经过信号处理后,LD3320将音频信号转换成数字信号,并提取出其中的语音特征。
- 模型匹配:LD3320内置了一些语音识别的模型,比如说中文数字、英文数字、中文拼音等。LD3320将提取出的语音特征与这些模型 进行匹配,以识别出用户说的话。
- 输出结果:一旦LD3320识别出了用户的话,它会将识别结果输出到外部的MCU或DSP芯片中,以供后续的应用程序使用。
对此,使用一张简单的图解释:
二、语音识别芯片LD3320主要特征
1、特有的快速而稳定的优化算法,完成非特定人语音识别。不需要用户事先训练和录音,识别准确率95%。
2、不需要外接任何辅助的Flash芯片,RAM芯片和AD芯片,就可以完成语音识别功能。真正提供了单芯片语音识别解决方案。
3、每次识别最多可以设置50项候选识别句,每个识别句可以是单字,词组或短句,长度为不超过10个汉字或者79个字节的拼音串。另一方面,识别句内容可以动态编辑修改, 因此可由一个系统支持多种场景。
4、芯片内部已经准备了16位A/D转换器、16位D/A转换器和功放电路,麦克风、立体声耳机和单声道喇叭可以很方便地和芯片管脚连接。立体声耳机接口的输出功率为20mW,而喇叭接口的输出功率为550mW,能产生清晰响亮的声音。
5、支持并行和串行接口,串行方式可以简化与其他模块的连接。
6、可设置为休眠状态,而且可以方便地激活。
7、支持MP3播放,无需外围辅助器件,主控MCU将MP3数据依次送入LD3320芯片内部就可以从芯片相应PIN输出声音。可以选择从立体声耳机或者单声道喇叭获得声音输出。支持MPEG1(ISO/IEC11172-3), MPEG2(ISO/IEC13818-3) 和MPEG 2.5 layer 3等格式。
8、工作供电为3.3V,如果用于便携式系统,使用3节AA电池就可以满足供电需要。
(以上是对完全不了解的萌新们的解释,虽然也是截取自其他大佬的blog)
三、具体代码解释
请注意,这里的代码来源是买LD3320后商家自己附赠的一套测试代码,想要可以后台私信我。
#define DATE_A 5
#define DATE_B 20 //这里的长和宽随用户的需求进行调整
UBYTE sRecog[DATE_A][DATE_B] = { //在这里添加命令的拼音,芯片会进行识别
"liu shui deng",\
"an jian",\
"shan shuo",\
"bo fang",\
};
UBYTE pCode[DATE_A] = { //这里是命令的代码,在后面的编程中方便分辨
CODE_RUN, \ //在另外一个文件中针对每个命令代码进行了定义
CODE_KEY, \
CODE_FLASH,\
CODE_PLAY,\
};
//1中不同命令对应的数字编码(也可以用0x01)
#define CODE_RUN 1 //commond code for LED waterfall
#define CODE_KEY 2 //commond code for LED flash
#define CODE_FLASH 3 //commond code for LED reversal
#define CODE_PLAY 4 //commond code for PLAY MP3
//LD GPIO
#define CS_0 HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET)
#define CS_1 HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET)
#define WR_0 HAL_GPIO_WritePin(WR_GPIO_Port, WR_Pin, GPIO_PIN_RESET)
#define WR_1 HAL_GPIO_WritePin(WR_GPIO_Port, WR_Pin, GPIO_PIN_SET)
#define RST_0 HAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, GPIO_PIN_RESET)
#define RST_1 HAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, GPIO_PIN_SET)
//对应接口的定义,到时根据需要在这里进行修改
/* ----------------------------截取自main.h -----------------------*/
#define UART2_TX_Pin GPIO_PIN_2
#define UART2_TX_GPIO_Port GPIOA
#define UART2_RX_Pin GPIO_PIN_3
#define UART2_RX_GPIO_Port GPIOA
#define SPI1_SCK_Pin GPIO_PIN_5
#define SPI1_SCK_GPIO_Port GPIOA
#define SPI1_MISO_Pin GPIO_PIN_6
#define SPI1_MISO_GPIO_Port GPIOA
#define SPI1_MOSI_Pin GPIO_PIN_7
#define SPI1_MOSI_GPIO_Port GPIOA
#define LED4_Pin GPIO_PIN_5
#define LED4_GPIO_Port GPIOC
#define IRQ_Pin GPIO_PIN_0
#define IRQ_GPIO_Port GPIOB
#define IRQ_EXTI_IRQn EXTI0_IRQn
#define LED3_Pin GPIO_PIN_8
#define LED3_GPIO_Port GPIOC
#define LED2_Pin GPIO_PIN_9
#define LED2_GPIO_Port GPIOC
#define WR_Pin GPIO_PIN_8
#define WR_GPIO_Port GPIOA
#define RST_Pin GPIO_PIN_9
#define RST_GPIO_Port GPIOA
#define CS_Pin GPIO_PIN_10
#define CS_GPIO_Port GPIOA
/* ----------------------------截取自main.h ------------------------*/
最重要的都在上面了,下面的是一个示例输出
四.结果的输出
case CODE_RUN:
printf("灯已打开 \r\n");
break;
case CODE_KEY:
printf("灯已关闭\r\n");
break;
case CODE_FLASH:
printf("电视机已打开\r\n");
break;
case CODE_PLAY:
printf("电视机已关闭\r\n");
break;
这里是串口调试的部分代码,在LD3320接收到相应的命令之后,printf会在串口端输出相应的文字,后续接上对应的模块后会输出相应的信号以执行命令。
实物图:
运行结果: