声 明
本文中提到的本人所有代码及文档均遵守CC0开源协议。
注意:本改造方案仅能让鱼根据PC的指令张嘴、摆动。
【适宜人群】
需要有一定的电路、编程基础和动手能力,还需要一个电烙铁。
运行效果请看:
改造方案介绍:
整体思路
由PC开启UDP服务器,与鱼进行内网通信,先用PC解算出音频中的人声和鼓点信息,在播放音频的时候同步将当前的人声和鼓点响度发送给鱼,鱼在接收到响度信息后判断是否超过阈值,超过则张嘴抬尾,实现跟随音乐做动作的目的。
硬件部分
硬件接线
硬件:
大嘴巴比利巴斯(唱歌鱼)、MX1508电机驱动板、ESP8266开发板。
工具:
螺丝刀、电烙铁、热熔胶(选用)
如果想要固定各个板子,可选用热熔胶进行固定。
这里补充说明一下,供电方案使用原版的4节5号电池,在满电的情况下输出为6V,普通5号电池续航有点疲软,这里推荐使用充电电池会好一些。或者使用更高电压的串联锂电池,降压后接入整个系统中。
软件部分
代码链接:
度盘链接:https://pan.baidu.com/s/1Qglqg2zsDfkddlem3Yf6yw?pwd=k6jo
提取码:k6jo
鱼客户端C++代码:
烧录软件使用ArduinoIDE,烧录前需要添加链接中带有的MX1508运行库
MX1508运行库需自行百度ArduinoIDE运行库添加方法
在硬件改造完毕后,建议先不要安装后盖,先进行电机测试。
修改代码底部loop代码块,取消最后一行test();的注释,将其他代码注释掉,如下:
烧录代码后即可看见鱼张嘴抬头摆尾,以下是测试代码:
由代码可知,测试动作顺序为:
张嘴,抬头
等待1秒
闭嘴,低头,抬尾
等待1秒
重复循环
测试通过将代码还原,并修改账号密码为你的wifi名称和密码:
PC端Python代码
需要手动安装ffmpeg并配置环境变量。
pip安装依赖包:
这里使用了spleeter音频分轨模块,它的GUI版也非常好用
想单独使用的话可以到这里下载:https://makenweb.com/SpleeterGUI
将需要播放的音乐文件放入mp3文件夹,或者你有wav文件可以直接放入wav文件夹内
然后在代码第18行修改:
运行Python文件,第一次运行需要下载分轨用的模型文件,耐心等待一会。
如果PC能正常播放音乐,同时鱼跟随音乐做动作,则说明所有功能测试通过,可放心安装后盖。
至此,唱歌鱼改造完毕。
后记
目前这个项目并不完美,还有各种各样的bug和问题:
比如鱼的软件部分,我采用的是严格控制的方案,写的很啰嗦很麻烦,c++代码也是刚学,只会一点ctrl C、ctrl V,难免会有一些bug;
还有就是一首歌的解算时间非常长,在我的笔记本上,一个5M大小的音频文件的解算时间大约为30秒,也就是运行程序以后要等待30秒才能开始播放,能不能直接解算mp3文件,或者在播放音频的同时直接从人声和鼓的音轨文件上读取响度信息;
而且解算结果有时并不是很准确,有些疑似人声的部分会让鱼张嘴,Spleeter的代码我还没来得及好好研究,可能换一套高效的模型可能会更好一点;
另一个亟待解决的问题是每首歌的人声和鼓点的响度都不一样,比如在播放一首激烈的摇滚乐时鱼可能一直张着嘴,在播放另一首安静的摇篮曲时鱼可能一动也不动。
这也是我制作这个视频写下这篇专栏的目的——将我写的这坨代码拉出来给大家尝尝咸淡,就算作是抛砖引玉,希望有相同爱好的同学互相学习交流。
附:
原蓝牙版改造方案:
作者:唐纳德·贝尔 Donald Bell
https://maker.pro/arduino/projects/how-to-animate-billy-bass-with-bluetooth-audio-source
代码:
https://github.com/TensorFlux/BTBillyBass
原文中并未提及是否开源或出示相关协议,请大家自行斟酌。