910|5

154

帖子

1

TA的资源

一粒金砂(中级)

【DigiKey“智造万物,快乐不停”创意大赛】基于STM32H747Disco和百度语音云的语音... [复制链接]

本帖最后由 donatello1996 于 2024-1-15 08:18 编辑

【DigiKey“智造万物,快乐不停”创意大赛】基于STM32H747Disco和百度语音云的语音识别智能聊天机器人和信号采集系统

 

作品采用得捷上购买的STM32H747Disco开发板,通过串口,信号线及外部高速总线与ARM Linux板通信,访问百度语音云做语音识别、语音合成以及做振动信号采集,系统硬件框图如下:

1.JPG

 

 

STM32H747Disco开发板软件流程如下,如图,使用了LVGL图形库,SDRAM外扩内存访问以及QSPI字库存储读取:

2.JPG

ARM Linux板软件流程如下,录音、语音识别、访问文心一言、语音合成、语音播报都是独立完成的,分属不同功能:

3.JPG

 

使用外部自定义字库需要烧录字库文件到QPI上,所以需要CubeProgrammer软件帮忙:

4.JPG

 

微信图片_20240115003246.jpg

演示视频:


 

最新回复

干得漂亮  详情 回复 发表于 2024-1-17 22:08

回复
举报

6758

帖子

9

TA的资源

版主

赛】基于STM32H747Disco和百度语音云的 ,占楼,这也是一种方法,期待作品出现。


回复

6758

帖子

9

TA的资源

版主

大这作品,那是AI界的大佬作品呀。太利害了。期待能拿到好名次!

回复

154

帖子

1

TA的资源

一粒金砂(中级)

本帖最后由 donatello1996 于 2024-1-16 23:27 编辑

 

功能解析与代码片段解读(STM32H747开发板部分):

LVGL界面初始化,需要初始化三个文本框,两个按钮,三个文本框中的最顶部框为状态指示框,分别显示语音识别流程,从录音->录音语音识别->访问文心一言获取回答->将回答进行语音合成->播放五个环节,环节循环进行;

第二个文本框为录音问题提问框,将录音识别而成的文字显示在此框;

第三个文本框位回答显示框,将文心一言的回答文字显示在此框;

【开始流程】按钮按下后录音开始,整个流程也开始;
【清除问题和回答】框将问题文本框和回答文本框的内容全部清除;

 
微信图片_20240116231235.jpg
微信图片_20240116231239.jpg

 

 

void lv_mainstart(void)
{
	uint8_t utf8_chinese[200];
	
	dropdown_font = &myFont;
	//dropdown_font = &lv_font_montserrat_22;
	dropdown_width = 150;
	
	ta_state = lv_textarea_create(lv_scr_act());
	lv_obj_align(ta_state , LV_ALIGN_TOP_LEFT , 10 , 10);
	lv_obj_set_style_text_font(ta_state , dropdown_font, LV_STATE_DEFAULT);
	//lv_obj_add_event_cb(ta,textarea_Show1_event_cb,LV_EVENT_READY,ta);
	lv_obj_set_size(ta_state , 700 , 50);
	lv_obj_add_state(ta_state , LV_STATE_FOCUSED);
		
	ta_question = lv_textarea_create(lv_scr_act());
	lv_obj_align(ta_question , LV_ALIGN_TOP_LEFT , 10 , 60);
	lv_obj_set_style_text_font(ta_question , dropdown_font, LV_STATE_DEFAULT);
	//lv_obj_add_event_cb(ta,textarea_Show1_event_cb,LV_EVENT_READY,ta);
	lv_obj_set_size(ta_question , 700 , 99);
	lv_obj_add_state(ta_question , LV_STATE_FOCUSED);
	//lv_obj_add_state(ta1 , LV_STATE_DEFAULT);
	
	btn_start = lv_btn_create(lv_scr_act()); 
	lv_obj_set_size(btn_start, 200 , 50); 
	lv_obj_align(btn_start, LV_ALIGN_TOP_LEFT, 10 , 160); 
	lv_obj_add_event_cb(btn_start, btn_event_cb, LV_EVENT_CLICKED, NULL); 
	lv_obj_t* label_btn_start = lv_label_create(btn_start);
  lv_obj_set_style_text_font(label_btn_start , dropdown_font, LV_PART_MAIN);
  lv_obj_set_align(label_btn_start , LV_ALIGN_CENTER);
	ANSI_to_UTF8("开始流程" , utf8_chinese);
	lv_label_set_text(label_btn_start , utf8_chinese);
	
	btn_clean = lv_btn_create(lv_scr_act()); 
	lv_obj_set_size(btn_clean , 300 , 50); 
	lv_obj_align(btn_clean , LV_ALIGN_TOP_LEFT, 220 , 160); 
	lv_obj_add_event_cb(btn_clean , btn_event_cb, LV_EVENT_CLICKED, NULL); 
	lv_obj_t* label_btn_clean = lv_label_create(btn_clean);
  lv_obj_set_style_text_font(label_btn_clean , dropdown_font, LV_PART_MAIN);
  lv_obj_set_align(label_btn_clean , LV_ALIGN_CENTER);
	ANSI_to_UTF8("清除问题和回答" , utf8_chinese);
	lv_label_set_text(label_btn_clean , utf8_chinese);
	
	ta_answer = lv_textarea_create(lv_scr_act());
	lv_obj_align(ta_answer , LV_ALIGN_TOP_LEFT , 10 , 211);
	lv_obj_set_style_text_font(ta_answer , dropdown_font, LV_STATE_DEFAULT);
	//lv_obj_add_event_cb(ta,textarea_Show1_event_cb,LV_EVENT_READY,ta);
	lv_obj_set_size(ta_answer , 700 , 268);
	lv_obj_add_state(ta_answer , LV_STATE_DEFAULT);
		
}

 

点击按钮控制GPIO发送上升沿信号,GPIO初始化状态为低电平,状态文本框会在不同阶段实时改变:

static void btn_event_cb(lv_event_t* e)
{
	lv_obj_t *target = lv_event_get_target(e);

	if(target == btn_start)
	{
		printf("btn_start.\n");
		HAL_GPIO_WritePin(GPIOJ , GPIO_PIN_0 , GPIO_PIN_SET);
		
	}
	else if(target == btn_clean)
	{
		printf("btn_clean.\n");
		lv_textarea_set_text(ta_question , "");
		lv_textarea_set_text(ta_answer , "");
	}
}
void GPIOJ0_Init()
{
  GPIO_InitTypeDef  GPIO_InitStruct;

  __HAL_RCC_GPIOJ_CLK_ENABLE();

  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  HAL_GPIO_Init(GPIOJ , &GPIO_InitStruct);

  HAL_GPIO_WritePin(GPIOJ , GPIO_PIN_0 , GPIO_PIN_SET);
}
	lv_init();
	lv_port_disp_init();
	lv_port_indev_init();
	
	lv_mainstart();
	
	while(1)
	{
		count ++;
		if(count > 100)
		{
			count = 0;
			HAL_GPIO_WritePin(GPIOJ , GPIO_PIN_0 , GPIO_PIN_RESET);
		}
		
		lv_task_handler();
		lv_tick_inc(1);
		
		if(uart8_recv_end_flag)
		{
			uart8_recv_end_flag = 0;
			printf("rx8_buf[0] == 0x%x && rx8_buf[1] == 0x%x.\n" , rx8_buf[0] , rx8_buf[1]);
			if(rx8_buf[0] == 0x11 && rx8_buf[1] == 0x11)
			{
				ANSI_to_UTF8(rx8_buf + 2 , utf8_global);
				lv_textarea_set_text(ta_state , utf8_global);
			}
			else if(rx8_buf[0] == 0x11 && rx8_buf[1] == 0x12)
			{
				ANSI_to_UTF8(rx8_buf + 2 , utf8_global);
				lv_textarea_set_text(ta_question , utf8_global);
			}
			else if(rx8_buf[0] == 0x11 && rx8_buf[1] == 0x13)
			{
				ANSI_to_UTF8(rx8_buf + 2 , utf8_global);
				lv_textarea_set_text(ta_answer , utf8_global);
			}
			else if(rx8_buf[0] == 0x11 && rx8_buf[1] == 0x14)
			{
				lv_textarea_set_text(ta_question , rx8_buf + 2);
			}
			else if(rx8_buf[0] == 0x11 && rx8_buf[1] == 0x15)
			{
				lv_textarea_set_text(ta_answer , rx8_buf + 2);
			}
			else if(rx8_buf[0] == 0x11 && rx8_buf[1] == 0x16 && rx8_buf[2] == 1)
			{
				BSP_LED_Off(LED_RED);
				BSP_LED_Off(LED_ORANGE);
				BSP_LED_Off(LED_BLUE);
				BSP_LED_Off(LED_GREEN);
			}
			else if(rx8_buf[0] == 0x11 && rx8_buf[1] == 0x16 && rx8_buf[2] == 2)
			{
				BSP_LED_On(LED_RED);
				BSP_LED_Off(LED_ORANGE);
				BSP_LED_Off(LED_BLUE);
				BSP_LED_Off(LED_GREEN);
			}
			else if(rx8_buf[0] == 0x11 && rx8_buf[1] == 0x16 && rx8_buf[2] == 3)
			{
				BSP_LED_Off(LED_RED);
				BSP_LED_On(LED_ORANGE);
				BSP_LED_Off(LED_BLUE);
				BSP_LED_Off(LED_GREEN);
			}
			else if(rx8_buf[0] == 0x11 && rx8_buf[1] == 0x16 && rx8_buf[2] == 4)
			{
				BSP_LED_Off(LED_RED);
				BSP_LED_Off(LED_ORANGE);
				BSP_LED_On(LED_BLUE);
				BSP_LED_Off(LED_GREEN);
			}
			else if(rx8_buf[0] == 0x11 && rx8_buf[1] == 0x16 && rx8_buf[2] == 5)
			{
				BSP_LED_Off(LED_RED);
				BSP_LED_Off(LED_ORANGE);
				BSP_LED_Off(LED_BLUE);
				BSP_LED_On(LED_GREEN);
			}
			else if(rx8_buf[0] == 0x11 && rx8_buf[1] == 0x16 && rx8_buf[2] == 6)
			{
				BSP_LED_On(LED_RED);
				BSP_LED_On(LED_ORANGE);
				BSP_LED_On(LED_BLUE);
				BSP_LED_On(LED_GREEN);
			}
		}
	}

 


回复

136

帖子

0

TA的资源

一粒金砂(中级)

干得漂亮

回复

154

帖子

1

TA的资源

一粒金砂(中级)


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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 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
快速回复 返回顶部 返回列表