Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    我DIY了一个可以声控刷抖音的神器,这下连手指都解放了

    H/F/TV Series
    2
    2
    2060
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • livpo
      livpo LV 6 last edited by

      用一块板两个模块三根线就可以爆改手机,实现语音控制刷抖音,上下滑动视频、点赞那都是基础操作,关键是还可以一键睡觉,懒人福音!

      9594899291f647b5bf93ade007916db5-ezgif.com-optimize.gif

      所谓一块板两个模块三根线,一块开发板就是负责接收和控制的香橙派H616开发板,两个模块分别是负责发送的语音识别模块SU-03T和一个mic,所以除了电源外,只需要将语音识别模块的TX(B7)接到香橙派的RX就可以,算上电源共三根线:

      e23c04ae769049c189c662f98db11991.jpeg

      b305beb98cf9470d8c441030a9afe63c.png

      项目需求只是简单的通过语音指令来控制安卓手机刷抖音,以实现视频切换和点赞等功能:

      1、开机播报“你好,我是你的刷抖音助手”
      2、当说出“你好抖音助手"可以唤醒模块,模块回复“抖音助手在”
      3、当超过10s没有指令或说出“退下”时,模块会进入休眠模式,并回复“有需要再叫我”
      4、当说出“下一个视频”或“这个不好看”时,模块回复“切换至下一个视频”,并划到下一个视频
      5、当说出“上一个视频”或“刚刚那个挺好看”时,模块回复“切换至上一个视频”,并划回上一个视频
      6、当说出“点个赞”或“这个视频不错”时,模块回复“已为您点赞”,并点赞当前视频
      7、当说出“不想看了”时,模块回复“已为您关闭屏幕”,并关闭手机屏幕,一键入睡!

      语音识别模块配置

      项目中所需要的是一个非特定语音识别,也就是不识别特定人类的声音的模块。所以SU-03T这个模块的操作相较于其他语音识别模块更简单,不需要编程或二次开发,只需要通过厂家给的网站配置后即可使用。

      创建产品

      cef30e83cf7c4bfba78c7d0612212d37.png

      设置PIN脚为串口模式

      对于语音识别模块,串口的RX和TX分别对应B6和B7,并设置相应的波特率

      1e1f4ab2bef64ca98fcc603ebed1c181.png

      设置唤醒词

      dfa213de176e492aae58f5f83c8b9308.png

      设置指令语句

      d168b89efe024fe88937f417d8ffa35a.png

      设置控制详情

      参数的设置就是行为的名字,大写字母 ,16进制ASCII码,已空格分开

      • next -> 4E 45 58 54
      • pre -> 50 52 45
      • zan -> 5A 41 4E
      • guan -> 47 55 41 4E

      dc2dafa537a7495db5c5875ad6fd591e.png

      测试

      在完成以上步骤,并下载SDK并烧写进入语音识别模块后,可以打开串口助手来测试一下,分别说出对应的指令,看看语音识别模块是否会向串口发送对应的字符。

      分别说出了四条指令,可见串口输出正确!

      629e75656d314e44ab7eaecb2e97fccf.png

      编写香橙派代码框架

      语音识别模块设置完成后,就可以将语音识别模块接到香橙派并进行Linux部分的代码编写,连接方式如下图所示:

      e23c04ae769049c189c662f98db11991.jpeg

      新创建一个“douyin”文件夹,将语音刷抖音项目的代码放在这里面:

      76c0a9593c3a4dfe9f505c93852ac56c.png

      然后将一些代码拷贝进来方便修改:

      2c259338d7304e40b05f540b6a851955.png
      重新编译一下,并说出4条控制语句:

      509c7e1178784bfbbb3d30983f5748be.png

      可见,语音识别模块成功识别了指令,香橙派成功的接收了语音识别模块通过串口打印的字符!

      现在,就需要修改serial_douyin.c中接收的代码,添加数据处理的部分,先简单写一个数据处理的框架

      
      void *write_serial(void *arg)
      {
          char readbuf[32] = {'\0'};
          while(1){
              while(serialDataAvail (*((int *)arg))){
                  serialGetstring (*((int *)arg),readbuf) ;
       
                  if(strcmp(readbuf,"NEXT") == 0 ){
                      printf("收到下一条视频指令\n");
                  }else if(strcmp(readbuf,"PRE") == 0){
                      printf("收到上一条视频指令\n");
                  }else if(strcmp(readbuf,"ZAN") == 0){
                      printf("收到点赞指令\n");
                  }else if(strcmp(readbuf,"GUAN") == 0){
                      printf("收到关闭指令\n");
                  }else{
                      printf("未知指令\n");
                  }
       
                  memset(readbuf,'\0',32);
              }
          }
       
          pthread_exit(NULL);
      }
      

      重新编译一下,并说出4条控制语句:

      17a1a4a6a98f45babb4f5fed054a7ac0.png

      可见,函数框架正确,接下来只需要将printf替换成真正的操作手机的代码就可以了。

      将手机接入香橙派

      将我破旧的小米5C再次拿出哈哈哈,然后通过 TYPE-C -- USB 连接到香橙派:

      9a20875f3287492f8b85171eaf5265bc.jpeg

      香橙派输入dmesg指令查看手机接入情况,可见已经成功识别

      f4d2e9b5a4d74933a85d31406cf2fc22.png

      由于安卓手机的底层也是用Linux系统来操作的,所以可以通过香橙派来直接进入控制手机shell的界面,但需要先安装adb工具,adb是做安卓开发中常用的工具

      sudo apt-get insall adb
      

      安装完之后,执行”adb devices“指令,发现好像权限不太对,因此需要在安卓手机上设置权限

      a85c1c74cfe2404b9c7c97b2ed3158d7.png

      报错的本质原因是香橙派系统还不支持USB设备的热拔插和UDEV的机制。

      什么是UDEV

      udev是一个设备管理工具,udev以守护进程的形式运行,通过侦听内核发出来的uevent来管理/dev目录下的设备文件。

      udev在用户空间运行,而不在内核空间 运行。它能够根据系统中的硬 件设备的状态动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录下。使用udev后,在/dev目录下就只包含系统中真正存在的设备。

      eeb5eeb604e44a929142c51584f00604.png

      解决办法:在 /etc/udev/rules.d 文件夹下创建规则文件:

      cd /etc/udev/rules.d/
      sudo vim 51-android.rules
      

      然后在文件中添加内容:

      cd /etc/udev/rules.d/
      sudo vim 51-android.rules
      

      9473527b5d9c434cb0a9242fdbdca65c.png

      97de761f071b4aa09f197d9c614750d1.png

      然后重新拔插手机,再次执行”adb devices“指令

      8dfa7627b23743eeb1faeb2665319120.png

      没有任何报错了,此时”adb shell“指令会显示连接成功,此时如果“ls”一下,可以看到很多文件没有权限,因为没有root,不过不重要,到这里手机端的配置就好了

      c48d24dc29364423939744a7bd8a2812.jpeg

      现在可以成功的连入手机内部的系统,关键就在于对于滑动或点击屏幕的指令模拟了,

      • adb shell input swipe <起始x坐标> <起始y坐标> <结束x坐标> <结束y坐标> <滑动持续时间ms>
      • adb shell input keyevent <按键事件的常量>
      adb shell input swipe 540 1300 540 500 500 //下滑
      adb shell input swipe 540 500 540 1300 500 //上滑
      adb shell "seq 3 | while read i;do input tap 350 1050 & input tap 350 1050 &sleep 0.01;done;" //点赞
      adb shell input keyevent 26 //锁屏
      

      最终实现效果

      现在有了基本的代码模型,和控制手机的具体指令,接下来的工作就是在数据处理的部分,执行adb指令了,显然,使用system函数就可以:

      int main ()
      {
        int fd ;
       
        int ret;
        pthread_t read_thread;
        pthread_t write_thread;
       
        if ((fd = myserialOpen ("/dev/ttyS5", 115200)) < 0) //打开驱动文件,配置波特率
        {
          fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
          return 1 ;
        }
       
        /*  if (wiringPiSetup () == -1)
          {
          fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
          return 1 ;
          }*/
       
        ret = pthread_create(&read_thread,NULL,read_serial,(void *)&fd);
        if(ret != 0){
          printf("read_serial create error\n");
          return 1;
        }
        ret = pthread_create(&write_thread,NULL,write_serial,(void *)&fd);
        if(ret != 0){
          printf("write_serial create error\n");
          return 1;
        }
       
        pthread_join(read_thread,NULL);
        pthread_join(write_thread,NULL);
       
        return 0 ;
      }
      

      和项目需求一致,可见,我的手并没有碰到手机屏幕,只是说出了对应的指令,手机就会有所反应:

      9594899291f647b5bf93ade007916db5.gif

      并且在香橙派终端也可以看到指令历史:

      71b6d91d02354456874df96b7fd67f0f.png

      R 1 Reply Last reply Reply Quote Share 2
      • R
        RayZhang LV 6 @livpo last edited by

        @livpo 哇看上去非常令人振奋! 效果很直观!

        之前用 PyTorch 做过离线语音识别,最多支持几十个指令词和几十个名词,可以扩展这个场景~ 有需要可以交流交流

        1 Reply Last reply Reply Quote Share 0
        • 1 / 1
        • First post
          Last post

        Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

        行为准则 | 用户协议 | 隐私权政策