猫咪呼噜算法解析
几个月前我在做AI硬件产品,做了一个猫咪样子的AI陪伴式玩具的DEMO。它的核心功能之一就是猫咪的呼噜声,如果呼噜可以伴随它的心情和情绪而变化,他就会给用户更真实的体验。
有个印度裔开发者在十几年前做了个有趣的前端,https://purrli.com/
它对它的猫的音频进行处理,做出了可调控的各种效果,不过他并没有开源,我依据我的理解做了一个类似的前端页面。并且我会把我的原理和方法写在下面,分享给大家。
非常建议大家按照我的步骤在Cursor中用Claude复现一边,也许你的效果会比我好。我只是将原理展示出来,让大家少走一些弯路,C和python复现的逻辑原理也是类似的。可能之后有人感兴趣我会做一个C++版本的,更适合移植在硬件产品中。
tips1:呼噜声是拼接的,它在音频处理上做了些工作。而不是我之前设想的三角波和方波的组合之类的。我也是在他分享的内容中看到,我只需要用两段音频即可拼接好,一段是吸气,一段是呼气。这里我放在github上的是我自己的猫的呼噜声,它的气息绵长,适合用作样本。
tips2、音量、音调很好变化,我将它放在最后一步进行变化。前期的重点是将音频如何剪切,如何拼接。前端自带很多高效的音频处理库,需要滤波器和压缩器,其他的主要是为了效果更好。
主要步骤
**1、实现音频拼接。**我每段音频是一秒多,两段音频循环播放就是最慢频率的效果。先写一个循环播放的逻辑
将循环播放的音频进行剪切,我将两段音频放进剪映可以看到波形如下。
2、现在要实现呼噜的频率变化,这是整个项目的核心
我尝试过想剪映一样对音频进行倍速处理,但剪映的倍速处理不会改变它的音色,跟倍速看视频一样。但是我们用前端效果就不好。
我也懒得用剪映它们的处理方法了,毕竟我希望整个项目实现越简单越好。
解决方法 是:当频率变高时,我将取两段音频的最中间的部分,然后进行拼接,再循环播放。
例如:我希望频率变为原来的二倍,我就把purr_in中间截取一半,再和purr_out中间截取的一半拼接。
这样的效果出奇的好! 更适合硬件实现。
3、接下来实现purr_in和purr_out的比值变化,很简单,只需要在上一步编写每个截取的百分比即可。
4、两段音频拼接无论是在前端还是在硬件(C语言)中都可能会有刺耳的电流声,这需要在交界处用滤波器进行处理。也就是先拼接,再滤波。
5、目前的音频效果已经可以调节频率和进出比,接下来加上音量和音调变化就可以了。先实现音调再实现音量。
好了,你目前可以实现猫咪的呼噜效果了。你可以用玩具宠物的音频播放器播放处理好的音频,这样实现的效果会很有趣,所有数值都可以自己来调整。
如果这个宠物的每天心情可以改变,那你就可以将心情参数与这几个参数进行关联,从而生成独一无二的呼噜声。
你也可以将音频处理成其他动物的呼噜声,或者你自己的呼噜声。也可以加入宠物的叫声,让它更加有趣。如果你在硬件产品复现或用其他方式做出了产品可以发我邮箱,我很乐意和你一起创造好玩的东西。
我的邮箱--shangyiyong@outlook.com