迪文科技论坛

 找回密码
 立即注册
搜索
查看: 268|回复: 0

【开源】语音识别之唐诗系统

[复制链接]

17

主题

114

回帖

1289

积分

金牌会员

Rank: 6Rank: 6

积分
1289
QQ
发表于 2024-4-20 11:41:15 | 显示全部楼层 |阅读模式
本帖最后由 二哲科技 于 2024-4-20 11:56 编辑

1、介绍
语音识别功能已经很普遍了,现在的车机可以完全由语音控制,但是很多产品都不一定会联网,所以离线语音也比较多地方适用,同时通过语音控制屏幕操作也是一个比较新颖的事,可以参考小米su7的车机系统。

2、硬件准备
7英寸迪文科技工业级智能串口屏DMG80480T070_15WTR一体化电阻触摸【https://www.dwin.com.cn/product_detail_4850049.html

ASR-PRO语音智能语音识别控制模块



3、设计
首先是素材设计,唐诗选择一个比较有诗意的背景,设计背景和诗词部分。



之后要准备语音素材,采用了TTS实现语音输出。



首先要设计首页,就是一个简单的静态图片。



进入页面之后,可以选择屏幕控制唐诗还是语音控制唐诗系统。



进入触摸翻页控制页面,可以选择诗,翻页和退出。



点击诗之后会进入触摸诗词页面,进入诗词页面后,可以进行播放和停止操作。



如果是进入语音控制页面,就没有按键功能,全靠语音实现控制。



设计语音模块参数,按照如下图片方式设计,识别到指定语音,则可以从串口输出指定内容。



代码设计,首先是屏幕按键检测,代码如下:
  1. //获取按键状态
  2. void get_key_status()
  3. {
  4.     int i = 0;
  5.     //u16 Va=Read_Dgus(addr);
  6.     u16  Va=Read_Dgus(0x1F00);
  7.     if(Va != 0x0000)
  8.     {        
  9.                 if(Va == 0x0002)        //语音识别页面
  10.                 {
  11.                         video_recognition_page = 1;
  12.                 }
  13.         else if(Va == KEY_LIST_UP)   //上翻页
  14.         {
  15.             if(touch_mode_list == 1)
  16.             {
  17.                 touch_mode_list = 0;
  18.                 write_dgus_vp(TOUCH_MODE_LIST_DISPLAY_ADDR, &touch_mode_list, 1);
  19.             }
  20.         }
  21.         else if(Va == KEY_LIST_DOWN)       //下翻页
  22.         {
  23.             if(touch_mode_list == 0)
  24.             {
  25.                 touch_mode_list = 1;
  26.                 write_dgus_vp(TOUCH_MODE_LIST_DISPLAY_ADDR, &touch_mode_list, 1);
  27.             }
  28.         }
  29.         else if(Va == KEY_SELECT1_ADDR)
  30.         {
  31.             sound_poem(touch_mode_list * 5 + 0);
  32.         }
  33.         else if(Va == KEY_SELECT2_ADDR)
  34.         {
  35.             sound_poem(touch_mode_list * 5 + 1);
  36.         }
  37.         else if(Va == KEY_SELECT3_ADDR)
  38.         {
  39.             sound_poem(touch_mode_list * 5 + 2);
  40.         }
  41.         else if(Va == KEY_SELECT4_ADDR)
  42.         {
  43.             sound_poem(touch_mode_list * 5 + 3);
  44.         }
  45.         else if(Va == KEY_SELECT5_ADDR)
  46.         {
  47.             sound_poem(touch_mode_list * 5 + 4);
  48.         }
  49.         else if(Va == KEY_EXIT_SOUND_ADDR)
  50.         {
  51.             u16 play[2] = {0x0C01, 0x4000};
  52.             write_dgus_vp(VIDEO_ADDR, play, 2);
  53.         }
  54.         else if(Va == KEY_START_SOUND_ADDR)
  55.         {
  56.             u16 play[2] = {0x0A01, 0x4000};
  57.             play[0] = video_index * 0x100 + 0x01;
  58.             write_dgus_vp(VIDEO_ADDR, play, 2);
  59.         }
  60.         else if(Va == KEY_STOP_SOUND_ADDR)
  61.         {
  62.             u16 play[2] = {0x0C01, 0x4000};
  63.             write_dgus_vp(VIDEO_ADDR, play, 2);
  64.         }
  65.         Write_Dgus(0x1F00, 0);
  66.     }
  67. }
复制代码



语音模块通过串口和屏幕进行连接,语音识别到内容后,从串口发送数据,屏幕接受到数据后,根据当前所在屏幕做出相应的反馈,代码如下:
  1. void uart2_rec()
  2. {
  3.         if(video_recognition_page == 1)
  4.         {
  5.                 switch(R_u2[0])
  6.                 {
  7.                         case 0x01:
  8.                         {
  9.                                 u16 play[2] = {0x0101, 0x4000};
  10.                                 write_dgus_vp(VIDEO_ADDR, play, 2);
  11.                                 break;
  12.                         }
  13.                         case 0x11:
  14.                         {
  15.                                 if(video_mode_list == 1)
  16.                                 {
  17.                                         video_mode_list = 0;
  18.                                         write_dgus_vp(VIDEO_MODE_LIST_DISPLAY_ADDR, &video_mode_list, 1);
  19.                                 }
  20.                                 break;
  21.                         }
  22.                         case 0x10:
  23.                         {
  24.                                 if(video_mode_list == 0)
  25.                                 {
  26.                                         video_mode_list = 1;
  27.                                         write_dgus_vp(VIDEO_MODE_LIST_DISPLAY_ADDR, &video_mode_list, 1);
  28.                                 }
  29.                                 break;
  30.                         }
  31.                         case 0x20:
  32.                         {
  33.                                 video_select_poem(video_mode_list * 5 + 0);
  34.                                 break;
  35.                         }
  36.                         case 0x21:
  37.                         {
  38.                                 video_select_poem(video_mode_list * 5 + 1);
  39.                                 break;
  40.                         }
  41.                         case 0x22:
  42.                         {
  43.                                 video_select_poem(video_mode_list * 5 + 2);
  44.                                 break;
  45.                         }
  46.                         case 0x23:
  47.                         {
  48.                                 video_select_poem(video_mode_list * 5 + 3);
  49.                                 break;
  50.                         }
  51.                         case 0x24:
  52.                         {
  53.                                 video_select_poem(video_mode_list * 5 + 4);
  54.                                 break;
  55.                         }
  56.                         case 0x30:
  57.                         {
  58.                                 u16 play[2] = {0x0A01, 0x4000};
  59.                     play[0] = video_index * 0x100 + 0x01;
  60.                     write_dgus_vp(VIDEO_ADDR, play, 2);
  61.                                 break;
  62.                         }
  63.                         case 0x31:
  64.                         {
  65.                                 u16 switchpage[2] = {0x5A01, 4};

  66.                             write_dgus_vp(0x0084, switchpage, 2);
  67.                                 break;
  68.                         }
  69.                         case 0x32:
  70.                         {
  71.                                 u16 switchpage[2] = {0x5A01, 1};
  72.                                 video_recognition_page = 0;
  73.                             write_dgus_vp(0x0084, switchpage, 2);
  74.                                 break;
  75.                         }
  76.                 }
  77.         }
  78. }
复制代码



4、总结
语音控制屏幕,这和手势识别控制有异曲同工之妙,非常适用于消费产品,而且目前的语音模块价格都很便宜,且识别率也比较高,大家有兴趣可以下载附件玩一玩。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
二哲科技,欢迎联系,帮你解决问题,为你提供方案~
VX:erzhekeji
QQ:1002866443
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-1-15 12:06 , Processed in 0.134335 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表