我DIY了一个可以声控刷抖音的神器,这下连手指都解放了
-
用一块板两个模块三根线就可以爆改手机,实现语音控制刷抖音,上下滑动视频、点赞那都是基础操作,关键是还可以一键睡觉,懒人福音!
所谓一块板两个模块三根线,一块开发板就是负责接收和控制的香橙派H616开发板,两个模块分别是负责发送的语音识别模块SU-03T和一个mic,所以除了电源外,只需要将语音识别模块的TX(B7)接到香橙派的RX就可以,算上电源共三根线:
项目需求只是简单的通过语音指令来控制安卓手机刷抖音,以实现视频切换和点赞等功能:
1、开机播报“你好,我是你的刷抖音助手”
2、当说出“你好抖音助手"可以唤醒模块,模块回复“抖音助手在”
3、当超过10s没有指令或说出“退下”时,模块会进入休眠模式,并回复“有需要再叫我”
4、当说出“下一个视频”或“这个不好看”时,模块回复“切换至下一个视频”,并划到下一个视频
5、当说出“上一个视频”或“刚刚那个挺好看”时,模块回复“切换至上一个视频”,并划回上一个视频
6、当说出“点个赞”或“这个视频不错”时,模块回复“已为您点赞”,并点赞当前视频
7、当说出“不想看了”时,模块回复“已为您关闭屏幕”,并关闭手机屏幕,一键入睡!语音识别模块配置
项目中所需要的是一个非特定语音识别,也就是不识别特定人类的声音的模块。所以SU-03T这个模块的操作相较于其他语音识别模块更简单,不需要编程或二次开发,只需要通过厂家给的网站配置后即可使用。
创建产品
设置PIN脚为串口模式
对于语音识别模块,串口的RX和TX分别对应B6和B7,并设置相应的波特率
设置唤醒词
设置指令语句
设置控制详情
参数的设置就是行为的名字,大写字母 ,16进制ASCII码,已空格分开
- next -> 4E 45 58 54
- pre -> 50 52 45
- zan -> 5A 41 4E
- guan -> 47 55 41 4E
测试
在完成以上步骤,并下载SDK并烧写进入语音识别模块后,可以打开串口助手来测试一下,分别说出对应的指令,看看语音识别模块是否会向串口发送对应的字符。
分别说出了四条指令,可见串口输出正确!
编写香橙派代码框架
语音识别模块设置完成后,就可以将语音识别模块接到香橙派并进行Linux部分的代码编写,连接方式如下图所示:
新创建一个“douyin”文件夹,将语音刷抖音项目的代码放在这里面:
然后将一些代码拷贝进来方便修改:
重新编译一下,并说出4条控制语句:可见,语音识别模块成功识别了指令,香橙派成功的接收了语音识别模块通过串口打印的字符!
现在,就需要修改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条控制语句:
可见,函数框架正确,接下来只需要将printf替换成真正的操作手机的代码就可以了。
将手机接入香橙派
将我破旧的小米5C再次拿出哈哈哈,然后通过 TYPE-C -- USB 连接到香橙派:
香橙派输入dmesg指令查看手机接入情况,可见已经成功识别
由于安卓手机的底层也是用Linux系统来操作的,所以可以通过香橙派来直接进入控制手机shell的界面,但需要先安装adb工具,adb是做安卓开发中常用的工具
sudo apt-get insall adb
安装完之后,执行”adb devices“指令,发现好像权限不太对,因此需要在安卓手机上设置权限
报错的本质原因是香橙派系统还不支持USB设备的热拔插和UDEV的机制。
什么是UDEV
udev是一个设备管理工具,udev以守护进程的形式运行,通过侦听内核发出来的uevent来管理/dev目录下的设备文件。
udev在用户空间运行,而不在内核空间 运行。它能够根据系统中的硬 件设备的状态动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录下。使用udev后,在/dev目录下就只包含系统中真正存在的设备。
解决办法:在 /etc/udev/rules.d 文件夹下创建规则文件:
cd /etc/udev/rules.d/ sudo vim 51-android.rules
然后在文件中添加内容:
cd /etc/udev/rules.d/ sudo vim 51-android.rules
然后重新拔插手机,再次执行”adb devices“指令
没有任何报错了,此时”adb shell“指令会显示连接成功,此时如果“ls”一下,可以看到很多文件没有权限,因为没有root,不过不重要,到这里手机端的配置就好了
现在可以成功的连入手机内部的系统,关键就在于对于滑动或点击屏幕的指令模拟了,
- 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 ; }
和项目需求一致,可见,我的手并没有碰到手机屏幕,只是说出了对应的指令,手机就会有所反应:
并且在香橙派终端也可以看到指令历史:
-
@livpo 哇看上去非常令人振奋! 效果很直观!
之前用 PyTorch 做过离线语音识别,最多支持几十个指令词和几十个名词,可以扩展这个场景~ 有需要可以交流交流
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号