LD3320模块原理简述

LD3320 芯片是一款“语音识别”芯片,集成了语音识别处理器和一些外部电路,包括AD、DA 转换器、麦克风接口、声音输出接口等。LD3320不需要外接任何的辅助芯片如Flash、RAM 等,直接集成在LD3320中即可以实现语音识别/声控/人机对话功能。并且,识别的关键词语列表是可以任意动态编辑的。

一、LD3320模块原理以及其流程

LD3320语音识别芯片的实现原理主要可以分为以下几个步骤:

  1. 音频采集:LD3320内置一个麦克风放大器,它可以对周围的声音进行采集,并将采集到的音频信号送入芯片内部的语音信号处理器。
  2. 信号处理:LD3320内置一个语音信号处理器,它可以对音频信号进行预处理、降噪、滤波等处理,以提高识别的准确率。
  3. 特征提取:经过信号处理后,LD3320将音频信号转换成数字信号,并提取出其中的语音特征。
  4. 模型匹配:LD3320内置了一些语音识别的模型,比如说中文数字、英文数字、中文拼音等。LD3320将提取出的语音特征与这些模型 进行匹配,以识别出用户说的话。
  5. 输出结果:一旦LD3320识别出了用户的话,它会将识别结果输出到外部的MCU或DSP芯片中,以供后续的应用程序使用。

对此,使用一张简单的图解释:

LD3320语音识别模块与stm32连接图 ld3320语音识别模块编程教学_stm32

二、语音识别芯片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会在串口端输出相应的文字,后续接上对应的模块后会输出相应的信号以执行命令。

实物图:

LD3320语音识别模块与stm32连接图 ld3320语音识别模块编程教学_语音信号处理_02

运行结果:

LD3320语音识别模块与stm32连接图 ld3320语音识别模块编程教学_#define_03