3635浏览
查看: 3635|回复: 0

班级AI电子相册

[复制链接]
本帖最后由 云天 于 2021-5-19 12:53 编辑

【项目背景】

(学生的项目)进入高中学习快一年了,与老师和同学们在一起经历了很多。有军训时的阳光和风雨,有在一起学习的日日夜夜。这是我们的青春,值得去留念。我们准备利用在创客社团学到的知识,制作一个“班级AI电子相册”,在教师节时做为礼物送给我们的班主任老师。
【项目设计】
此《班级AI电子相册》采用开源AI硬件,利用人工智能语音识别技术,通过语音控制观看电子相片,并通过语音合成模块播放相片的相关介绍。有“自动播放”、“语音控制”两种模式。
【硬件清单】


序号
硬件名称
功能
1
主控:FireBeetle Board ESP32-E(Arduino开发板)
FireBeetle ESP32-E深度支持ArduinoIDE编程,GDI显示接口,单线连接显示屏,板载充电电路以及PH2.0锂电池接口。
2
2.0" 320x240 IPS广视角TFT显示屏
2.0寸LCD显示模块采用ST7789V驱动芯片,具有320x240个彩色像素点(RGB565)。这是一款IPS显示模块,拥有优秀的可视角度(80/80/80/80);采用SPI(4线)通信方式;支持GDI接口(GDI接口必须和带GDI接口主控配合使用),即插即用。2.0寸LCD显示模块支持3.3V和5V,并兼容多个主控:UNO、Leonardo、ESP32、ESP8266、FireBeetle M0等。与ESP32配合使用GDI接口,即插即用,有效减少接线步骤。模块板载了MicroSD Card卡槽,用户可以显示更多的图片。
3
中英文语音合成模块
让声音为你的项目增添一抹特色!连接上语音合成模块,再添加几行简单的代码就可以让您的项目开口说话。无论是中文还是英文对于语音合成模块来说都是”so easy”,播报当前时间,播报环境数据统统不在话下,与语音识别模块结合还可实现语音对话!该模块采用I2C和UART两种通讯方式,Gravity接口,兼容绝大部分主控。模块上已经自带了一个喇叭,所以您无需再额外的添加喇叭。
4
I2C语音识别模块
让声音为您的项目增添一抹特色!连接上语音识别模块,再添加几行简单的代码,您的项目就可以听懂您说的话。无需机器学习,无需特定人语音,无需联网,随时随地都可以进行语音识别,结合语音合成模块还可以实现语音对话。使用Gravity I2C接口通信,兼容绝大部分主控,非常适合接入教育场景使用。三种语音识别模式和三种语音输入方式使模块可以集成入更多的场景。
【设计步骤】
步骤1:处理图片
因屏幕分辨率为240*320。所以利用Fireworks处理成宽240,高320.因所有的图片都是横拍的,所以要进行旋转处理。

班级AI电子相册图6

步骤2:主控板与屏幕及电池相连接口
主控板上有GDI接口,通过此接口与屏幕相接。PH2.0接口与3.7V电池相连,为设备供电。


班级AI电子相册图5


步骤3引脚布局通过以下“引脚布局图,可发现主控板有两个IIC接口,可与“语音识别语音合成”模块相连。

班级AI电子相册图4
步骤4:电子电路图
班级AI电子相册图3



步骤5:实物连接图
语音识别与语音合成分别连接在主控板上的两个IIC接口上。
班级AI电子相册图2
【程序设计】
  1. 使用的软件环境为:Arduino IDE
  2. #include <SD.h>
  3. #include <SPI.h>
  4. #include "DFRobot_GDL.h"
  5. #include "DFRobot_Picdecoder_SD.h"
  6. #include "DFRobot_SpeechSynthesis.h"
  7. #include "DFRobot_ASR.h"
  8. DFRobot_SpeechSynthesis_I2C ss;
  9. DFRobot_Picdecoder_SD decoder;
  10. DFRobot_ASR  asr;
  11. /*ESP32 and ESP8266*/
  12. #define TFT_DC  25
  13. #define TFT_CS  14
  14. #define TFT_RST 26
  15. #define TFT_SD  13
  16. //屏幕设置
  17. DFRobot_ILI9341_240x320_HW_SPI  screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);
  18. File root;
  19. int i;
  20. int j;
  21. int k;
  22. int num;
  23. void setup()
  24. {
  25.   num=5;
  26.   k=1;
  27.   //初始化串行端口
  28.   Serial.begin(115200);
  29.   //初始屏幕
  30.   screen.begin();
  31.   //语音识别初始化
  32.   asr.begin(PASSWORD);
  33.   asr.addCommand("xiao tian xiao tian",0);
  34.   asr.addCommand("zi dong bo fang",1);//自动播放模式
  35.   asr.addCommand("yu yin kong zhi",2);//语音控制模式
  36.   asr.addCommand("xia yi zhang",3);//播放下一张
  37.   asr.addCommand("shang yi zhang",4);//播放上一张
  38.   //开始识别
  39.   asr.start();
  40.   //语音合成初始化
  41.   ss.begin();
  42.   ss.speak(F("班级智能电子相册"));
  43.   Serial.println("OK");
  44.   //初始化SD卡,等待初始化成功
  45.   while(1)
  46.   {
  47.     if (SD.begin(/*sdcs=*/TFT_SD))
  48.     {
  49.       Serial.println("initialization done.");
  50.       break;
  51.     }
  52.     Serial.println("initialization failed!");
  53.   }
  54.   //显示开机画面
  55.   decoder.drawPicture(/*filename=*/"/picture/0.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  56.   
  57. }
  58. void loop()
  59. {
  60. j=asr.read();
  61.   switch(j)            //判断识别内容,在有识别结果的情况下asr.read()会返回识别到的词条编号,否则返回-1
  62.   {
  63.     case 0:                     //若是唤醒指令“小天 小天”,唤醒语音识别模块,并随机响应
  64.        switch(random(0,5))        
  65.          {
  66.           case 0:
  67.             ss.speak(F("嗯"));
  68.             break;
  69.           case 1:
  70.             ss.speak(F("我在"));
  71.             break;
  72.           case 2:
  73.             ss.speak(F("在听"));
  74.             break;
  75.           case 3:
  76.             ss.speak(F("来了"));
  77.             break;
  78.           case 4:
  79.             ss.speak(F("您说"));
  80.             break;
  81.           case 5:
  82.             ss.speak(F("在了"));
  83.             break;
  84.          }
  85.      break;
  86.     case 1://开启自动播放模式
  87.       k=0;
  88.       ss.speak(F("自动播放模式"));
  89.       break;
  90.     case 2://开启语音控制播放模式
  91.       k=1;
  92.       ss.speak(F("语音控制播放模式"));
  93.       break;
  94.     case 3: //处理显示下一张照片时的照片序号
  95.      if(k==1){
  96.       if(i<num-1)
  97.         {
  98.           i++;
  99.         }
  100.       else
  101.       {
  102.         i=0;
  103.       }
  104.      }
  105.       break;
  106.     case 4: //处理显示上一张照片的照片序号
  107.     if(k==1){  
  108.       if(i>0)
  109.         {
  110.           i--;
  111.         }
  112.       else
  113.       {
  114.         i=num;
  115.       }
  116.     }
  117.       break;
  118.   }
  119.   if(k==0 &&(j==-1 || j==1) )//自动播放模式下,处理显示照片序号
  120.   {
  121.    
  122.        if(i<num-1)
  123.         {
  124.           i++;
  125.         }
  126.       else
  127.       {
  128.         i=0;
  129.       }
  130.       delay(1000);
  131.   }
  132.   if(k==1 && (j==3 ||j==4)||k==0 )//显示照片
  133.   {  
  134.     switch(i)
  135.     {
  136.       
  137.     case 0:
  138.       decoder.drawPicture(/*filename=*/"/picture/1.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  139.       ss.speak(F("军训的第二天,在军训中,我们很苦很累,但这是一种人生体验,战胜自我,锻炼意志的最佳良机。"));
  140.       break;
  141.       case 1:                    
  142.       decoder.drawPicture(/*filename=*/"/picture/2.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  143.       ss.speak(F("看我的被子叠的怎么样?"));
  144.       break;
  145.     case 2:                    
  146.       decoder.drawPicture(/*filename=*/"/picture/3.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  147.       ss.speak(F("第一次阅读励志信时,激动的心如波涛汹涌的大海,久久不能平静。因为他给了我们太多心灵上的触动,他让我们振奋精神,养成良好习惯、改正坏习惯,发现自己的闪光点。"));
  148.       break;
  149.     case 3:                    
  150.       decoder.drawPicture(/*filename=*/"/picture/4.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  151.       ss.speak(F("每次考试后,班级通过表彰对优秀学生的良好表现予以充分肯定和褒扬,同时也充分发挥先进典型的示范引领及激励作用,激励更多的同学见贤思齐、奋发进取。"));
  152.       break;
  153.     case 4:                    
  154.       decoder.drawPicture(/*filename=*/"/picture/5.jpg",/*sx=*/0,/*sy=*/0,/*ex=*/screen.width(),/*ey=*/screen.height(),/*screenDrawPixel=*/screenDrawPixel);
  155.       ss.speak(F("对优秀学生进行有效表彰,可全面调动我们学习的积极性、促进我们全面发展、给我们创设良好的教学环境"));
  156.       break;
  157.    
  158.   }
  159. }
  160. }
  161. //这个函数的功能是在屏幕上画一个像素
  162. void screenDrawPixel(int16_t x, int16_t y, uint16_t color)
  163. {
  164.   //在屏幕上画一个点
  165.   screen.writePixel(x,y,color);
  166. }
复制代码
班级AI电子相册图1


程序中首先对屏幕、语音合成及语音识别模块进行初始化,并利用声音提醒初始化完成,显示开机画面。
当检测到唤醒词“xiao tian xiao tian”将唤醒语音识别模块,使用“zi dong bo fang”,开启“自动播放模式”;使用“yu yin kong zhi”,开启“语音控制模式”。
当在“语音控制模式”下,使用关键词“xia yi zhang”、“shang yi zhang”可上下翻页。
在播放照片的同时,语音合成模块用语音播报“照片简介”。



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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail