536|2

154

帖子

1

TA的资源

纯净的硅(初级)

楼主
 

【STM32H7S78-DK】(11)语音控制之旅 [复制链接]

本帖最后由 cc1989summer 于 2024-11-9 22:39 编辑

语音识别、人工智能是目前的大热门。

 

咱们的STM32H7S78-DK是自带有数字麦克风的,也就是U1:MP23DB01

 

 

 

 

 

 

然而要想实现STM32语音识别,涉及到人工智能CNN,我目前还没摸索会。

网上有相关的内容参考:

https://github.com/gk969/stm32-speech-recognition

 

 

这里就基于离线语音识别模块:ASR-PRO

 

模块介绍:本模块是针对低成本离线语音应用方案开发的一款通用、便携、低功耗高性能的语音识 别模组,采用最新的 ASRPRO 芯片,内置神经网络处理器,能支持 DNN\TDNN\RNN 等神 经网络及卷积运算,支持语音识别、声纹识别、语音增强、语音检测等功能,具备强劲的回 声消除和环境噪声抑制能力,语音识别效果优于其它语音芯片。该芯片方案还支持汉语、英 语、日语等多种全球语言,可广泛应用于家电、照明、玩具、可穿戴设备、工业、汽车等产 品领域,搭配天问 Block 图形化编程软件,快速实现语音交互及控制和各类智能语音方案应 用。

 

大概模式是这样:

 

 

使用模块配套的软件:可以自定义语音模型,并下载到芯片中,实现离线语音识别:

 

下图是我预先定义好的唤醒语句,以及控制语句,生成模型并下载后,就可以开启STM32语音控制之旅了。

 


 

STM32H7S78-DK需要设置的主要是串口(UART7,PE8/PE7)以及GPIO。

关于串口(UART7,PE8/PE7),需要注意的是,开发板没有引出,整块开发板只有虚拟串口(UART4)可用。

需要对电路加以改动,详见我的前述帖子:

 

https://bbs.eeworld.com.cn/thread-1295392-1-1.html

 

 

 

 

记得一定要开启串口中断。
 
以下是main.c函数,
记得此语句开启串口接收中断:
  HAL_UART_Receive_IT(&huart7, UART_BUF,sizeof(UART_BUF));
 
 
int main(void)
{
	  MPU_Config();
  /* USER CODE BEGIN 1 */
	  /* Enable I-Cache---------------------------------------------------------*/
	  SCB_EnableICache();

	  /* Enable D-Cache---------------------------------------------------------*/
	  SCB_EnableDCache();
  /* USER CODE END 1 */



  /* MCU Configuration--------------------------------------------------------*/

  /* Update SystemCoreClock variable according to RCC registers values. */
  SystemCoreClockUpdate();

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_UART7_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart7, UART_BUF,sizeof(UART_BUF));



  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}
 

 

在串口中断语句中,加入控制语句:

 

 

此句是把语音识别模块发给MCU的指令,由MCU发给电脑端,做串口监听。

HAL_UART_Transmit(&huart7, UART_BUF,sizeof(UART_BUF),1000);

 

此句是处理完串口接收中断,再次进入串口中断。

HAL_UART_Receive_IT(&huart7, UART_BUF,sizeof(UART_BUF));

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart7, UART_BUF,sizeof(UART_BUF),1000);

	if(UART_BUF[0] == 0x01)
	{HAL_GPIO_WritePin(LD1_GPIO_PORT, LD1_Pin,SET);}
	if(UART_BUF[0] == 0x02)
	{HAL_GPIO_WritePin(LD2_GPIO_PORT, LD2_Pin,SET);}
	if(UART_BUF[0] == 0x03)
	{HAL_GPIO_WritePin(LD3_GPIO_PORT, LD3_Pin,RESET);}
	if(UART_BUF[0] == 0x04)
	{HAL_GPIO_WritePin(LD4_GPIO_PORT, LD4_Pin,RESET);}
	if(UART_BUF[0] == 0x05)
	{HAL_GPIO_WritePin(LD1_GPIO_PORT, LD1_Pin,RESET);}
	if(UART_BUF[0] == 0x06)
	{HAL_GPIO_WritePin(LD2_GPIO_PORT, LD2_Pin,RESET);}
	if(UART_BUF[0] == 0x07)
	{HAL_GPIO_WritePin(LD3_GPIO_PORT, LD3_Pin,SET);}
	if(UART_BUF[0] == 0x08)
	{HAL_GPIO_WritePin(LD4_GPIO_PORT, LD4_Pin,SET);}
	if(UART_BUF[0] == 0x09)
	{
	HAL_GPIO_WritePin(LD1_GPIO_PORT, LD1_Pin,SET);
	HAL_GPIO_WritePin(LD2_GPIO_PORT, LD2_Pin,SET);
	HAL_GPIO_WritePin(LD3_GPIO_PORT, LD3_Pin,RESET);
	HAL_GPIO_WritePin(LD4_GPIO_PORT, LD4_Pin,RESET);
	}
	if(UART_BUF[0] == 0x10)
	{
	HAL_GPIO_WritePin(LD1_GPIO_PORT, LD1_Pin,RESET);
	HAL_GPIO_WritePin(LD2_GPIO_PORT, LD2_Pin,RESET);
	HAL_GPIO_WritePin(LD3_GPIO_PORT, LD3_Pin,SET);
	HAL_GPIO_WritePin(LD4_GPIO_PORT, LD4_Pin,SET);
	}


	HAL_UART_Receive_IT(&huart7, UART_BUF,sizeof(UART_BUF));



}

 

 

 

                                                                                                                                                                                                                                                                                                                                                                                                                   

 

运行效果:                                                                                                                                                                                                                                                                                                                                                                              

语音控制

 

 

再增加点花样,对于显示屏的颜色给与控制。增加以下指令:

 

 

程序代码,参考BSP中的LCD显示:

 

int main(void)
{
  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* Enable the CPU Cache */

  /* Enable I-Cache---------------------------------------------------------*/
  SCB_EnableICache();

  /* Enable D-Cache---------------------------------------------------------*/
//  SCB_EnableDCache();

  /* STM32H7RSxx HAL library initialization:
       - Systick timer is configured by default as source of time base, but user
         can eventually implement his proper time base source (a general purpose
         timer for example or other time source), keeping in mind that Time base
         duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
         handled in milliseconds basis.
       - Set NVIC Group Priority to 4
       - Low Level Initialization
     */
  HAL_Init();

  /* Configure the system clock to 400 MHz */
  SystemClock_Config();

  /* Initialize leds */
  BSP_LED_Init(LED_GREEN);
  BSP_LED_Init(LED_RED);

  /* Configure the User push-button in EXTI Mode */
  BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI);
  MX_UART7_Init();


  HAL_UART_Transmit(&huart7, UART_BUF9, sizeof(UART_BUF9),100);
  HAL_UART_Receive_IT(&huart7, UART_BUF,sizeof(UART_BUF));



  /* Init LCD */
  BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);
  BSP_LCD_GetBrightness(0, &Brightness);
  BSP_LCD_SetBrightness(0, 40);
  BSP_LCD_GetBrightness(0, &Brightness);
  UTIL_LCD_SetFuncDriver(&LCD_Driver);
  //BSP_LCD_Reload(0, BSP_LCD_RELOAD_VERTICAL_BLANKING);
  //Display_DemoDescription();
  UTIL_LCD_FillRect(0, 0, 800, 480, UTIL_LCD_COLOR_GREEN);

  //AudioPlay_demo();
  //BSP_examples[4].DemoFunc();








  while (1)
  {

  }



}

 

 

 

串口中断部分,解析语音指令显示代码:

 

 

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{



HAL_UART_Transmit(&huart7, UART_BUF,sizeof(UART_BUF),1000);

	if(UART_BUF[0] == 0x11)
	{

		  /* Display LCD messages */
     	  UTIL_LCD_FillRect(0, 0, 800, 480, UTIL_LCD_COLOR_RED);
		  UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_WHITE);
		  UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_MAGENTA);
		  UTIL_LCD_SetFont(&Font24);
		  UTIL_LCD_DisplayStringAt(0, 200, (uint8_t *)"AUDIO PLAYER by cc1989summer", CENTER_MODE);

	}


	if(UART_BUF[0] == 0x12)
	{

		  /* Display LCD messages */
     	  UTIL_LCD_FillRect(0, 0, 800, 480, UTIL_LCD_COLOR_GREEN);
		  UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_WHITE);
		  UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_BLUE);
		  UTIL_LCD_SetFont(&Font24);
		  UTIL_LCD_DisplayStringAt(0, 200, (uint8_t *)"AUDIO PLAYER by cc1989summer", CENTER_MODE);

	}

	if(UART_BUF[0] == 0x13)
	{

		  /* Display LCD messages */
     	  UTIL_LCD_FillRect(0, 0, 800, 480, UTIL_LCD_COLOR_BLUE);
		  UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_WHITE);
		  UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_BLUE);
		  UTIL_LCD_SetFont(&Font24);
		  UTIL_LCD_DisplayStringAt(0, 200, (uint8_t *)"AUDIO PLAYER by cc1989summer", CENTER_MODE);

	}

	if(UART_BUF[0] == 0x14)
	{

		  /* Display LCD messages */
     	  UTIL_LCD_FillRect(0, 0, 800, 480, UTIL_LCD_COLOR_WHITE);
		  UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_WHITE);
		  UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_BLUE);
		  UTIL_LCD_SetFont(&Font24);
		  UTIL_LCD_DisplayStringAt(0, 200, (uint8_t *)"AUDIO PLAYER by cc1989summer", CENTER_MODE);

	}

	if(UART_BUF[0] == 0x15)
	{

		  /* Display LCD messages */
     	  UTIL_LCD_FillRect(0, 0, 800, 480, UTIL_LCD_COLOR_MAGENTA);
		  UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_WHITE);
		  UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_BLUE);
		  UTIL_LCD_SetFont(&Font24);
		  UTIL_LCD_DisplayStringAt(0, 200, (uint8_t *)"AUDIO PLAYER by cc1989summer", CENTER_MODE);

	}

	if(UART_BUF[0] == 0x16)
	{

		  /* Display LCD messages */
     	  UTIL_LCD_FillRect(0, 0, 800, 480, UTIL_LCD_COLOR_BLACK);
		  UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_WHITE);
		  UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_BLUE);
		  UTIL_LCD_SetFont(&Font24);
		  UTIL_LCD_DisplayStringAt(0, 200, (uint8_t *)"AUDIO PLAYER by cc1989summer", CENTER_MODE);

	}
	if(UART_BUF[0] == 0x17)
	{

		  /* Display LCD messages */
     	  UTIL_LCD_FillRect(0, 0, 800, 480, UTIL_LCD_COLOR_ORANGE);
		  UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_WHITE);
		  UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_BLUE);
		  UTIL_LCD_SetFont(&Font24);
		  UTIL_LCD_DisplayStringAt(0, 200, (uint8_t *)"AUDIO PLAYER by cc1989summer", CENTER_MODE);

	}


	HAL_UART_Receive_IT(&huart7, UART_BUF,sizeof(UART_BUF));

}

 

运行效果;

 

 

语音切换颜色

 

 

最后,结合此前的练习:

 

【STM32H7S78-DK】⑦连接WIFI获取时间(基于ESP8266)

https://bbs.eeworld.com.cn/thread-1295392-1-1.html

 

 

加入语音唤醒WIFI时间指令,思路跟上述一样。

在对应的串口中断中加入获取时间的指令。

 

语音唤醒时间

 

 

 

至此,全部的【STM32H7S78-DK】体验及分享就到这里了。

总计11篇贴文,付出很多时间精力,也收获很多知识和经验,不仅对对STSTM32H7S78开发掌握更深,对ST的各类软件操作也更加熟练。

 

当然,由于时间关系,很多高端、丰富的功能还没时间体验,转眼就到交作业的截止时间了。

包括 MXCHIP的SPI WIFI模块、数字麦克风、摄像头(坛友有首发)、以太网、DMA、TouchGFX、Free-RTOS、NanoEdge™ AI Studio等等。

有些浅尝辄止,有些还未开始体验,待后续有时间,一定深入学习,进一步发掘和体验STM32H7S78-DK的宝藏功能。

 

 

我目前接下来的目标是:做一个基于互联网的网络收音机,结合TouchGFX的丰富界面,功能一定很酷炫。

还有就是视频播放器、将存在SD卡上的视频,比如mp4格式,解码并播放出来。

再有就是目前流行的人工智能,比如基于TouchGFX的手写识别,直接在触摸屏上一边手写,一边自动识别。

想法很多,接下来逐步实践吧,所谓学无止境就是这样吧。

 

 

最后,非常感谢EEWORLD和ST给我的这次机会,我很珍惜也很努力,希望EEWORLD越办越好,给我们电子从业人员和电子爱好者提供更多的学习成长机会,也祝愿ST越来越强大!

 

 

 

 

 

 

 

 

 

 

此帖出自stm32/stm8论坛

最新回复

大佬给力!竟然输出10+篇。   详情 回复 发表于 2024-11-13 12:31
点赞 关注
 

回复
举报

158

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

大佬给力!竟然输出10+篇。

此帖出自stm32/stm8论坛

点评

这么强大的板子,测评100+也不过分  详情 回复 发表于 2024-11-14 07:22
 
 

回复

154

帖子

1

TA的资源

纯净的硅(初级)

板凳
 
ly87802541 发表于 2024-11-13 12:31 大佬给力!竟然输出10+篇。

这么强大的板子,测评100+也不过分

此帖出自stm32/stm8论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
直流电源模块的设计难点在什么地方

作者: 快意江湖: 本人认为: 1、热处理。这应该是电源模块设计的最大局限性,也是最容易被用户所忽略的地方。市场 ...

电子竞赛设计经验全攻略

本帖最后由 paulhyde 于 2014-9-15 09:26 编辑 竞赛时应该注意的问题: 1、软件与硬件电路最好是同时做,不要前几天都在搞软件 ...

在Sitara平台上如何优化Linux启动过程?

请问目前大家的平台上,Linux从启动到运行自己的图形程序,需要大概多少秒?我们要想优化一个系统的启动时间,首先我们需要知道 ...

ADI书籍_语音信号处理及Blackfin DSP实现_电子版

ADI书籍_语音信号处理及Blackfin DSP实现_电子版 118968 118969 118970

如何测量放大电路的输出阻抗

在下是模电小白,求问各位大神,如下图所示的放大电路,我如何测量其输出阻抗? 求各位大神赐教 (Ps:输入端为0-3.3V ...

【二哈识图人工智能视觉传感器】测评之一:赢家芯片级别测评

非常开心收到电子工程世界和DFRobo社区二哈识图人工智能视觉传感器开发套件。DFRobo总部位于上海浦东,是一家国际领先的从事 ...

【bk7231N】涂鸦tuya产品在SPI等通信方面的探索

做嵌入式做多了,本能的就会去考量一款芯片的外设丰富程度,就想调研一下手中涂鸦这款芯片的外设性能。于是拟题希望调研一下tuya ...

【平头哥RVB2601创意应用开发】+开箱安装开发环境

前言 很荣幸评测平头哥RVB2601开发板,感谢EEWORLD给的机会,最近大环境不好,项目比较忙,对这个进度影响太大了,废话 ...

[HPM-DIY]hpm6750 openmv移植成功,使用cherryusb作为repl交互

使用官方板子hpm6750evkmini,移植成功openmv,全新的Board支持,移植过程中学到不少东西,新鲜玩意就是好。 使用ses工程进 ...

【家中宝】项目提交

本帖最后由 damiaa 于 2022-10-17 12:19 编辑 【家中宝】项目提交 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表