我声音的颜色:一开始就是瞎折腾
我这人就是爱折腾,尤其是对着那些冷冰冰的数据,总想给它们穿上点好看的衣服。这个给“声音着色”的实践,起源特别简单,就是我那会儿买了个新的监听耳机,成天对着声卡搞来搞去,突然就觉得电脑里那波形图太无聊了,上上下下的,没啥意思。
我当时就想,能不能把声音的“情绪”给可视化了? 我自己哼个歌,或者我老婆吼我一嗓子,在屏幕上得立马变个颜色,让我知道这情绪到了哪一层。
说干就干。我先是去抓了一个最基础的音频输入库,想办法把它跟我能控制的色彩系统连起来。我不是搞专业的,就是自己瞎鼓捣。第一步,我直接把声音的响度(振幅),对应成了颜色的亮度(V值)。声音越大,颜色就越亮。
结果一看,简直惨不忍睹。只要稍微安静一点,颜色就黑乎乎一片;一出声,立马白得晃眼。这种对应方式太粗暴了,完全没法用。
从振幅到频率:颜色乱成一锅粥
我扔掉了第一次的尝试,开始琢磨声音的“本质”——频率。声音的频率对应的是音高。我就想,是不是应该用频率(音高)来控制颜色的色相(H值)。
我费了九牛二虎之力,才把实时捕获到的频率数据给处理出来。但是人声变化太快了,我一句话说出来,那屏幕上的颜色跟抽风一样,红的蓝的绿的黄的,每秒钟跳几十次,根本看不出规律。
我当时气得把键盘都砸了,冷静下来后,我知道问题出在哪了:我得给这个颜色变化加个“缓冲”,不能让它那么灵敏。
- 第一周,我先是给数据加了平均值滤波。 抓取最近0.5秒的数据求平均,这样颜色就不会跳得那么快了。
- 第二周,我开始调整映射算法。 我发现低频(深沉的声音)用冷色调(蓝色、紫色)比较舒服,高频(尖锐的声音)用暖色调(红色、橙色)比较合适。我手动调了几百次参数,直到找了一个看着没那么“刺耳”的色彩曲线。
- 第三周,我加入了饱和度(S值)。 我觉得,只有当声音的特点特别明显,比如持续发出一个单音,或者音调特别稳定时,颜色才应该特别鲜艳。如果声音很混杂,颜色就应该灰一点。这一下子,整个系统的表现就变得有层次了。
关于版本和地址:土办法管理我的成果
这个项目我断断续续搞了快一年,中间迭代了十几个版本。你们看标题里那个“更新地址”和“最新版本是多少”,就是我的土办法。
我不是用那些高大上的版本管理系统,我就是懒得学。我每次觉得自己搞了个大改进,就直接把整个工程文件夹复制一份,然后用日期加功能做命名。比如:
v20230520_稳定版_饱和度优化
v20230615_最新版_加入降噪
那个“更新地址”,说出来丢人,就是我家里的那个NAS存储盘的内部IP。我生怕自己电脑崩了,所有的工作白费,就扔了个共享文件夹在那。每次我跟别人吹牛说“你去看最新版”,就是给他们发那个内部地址,让他们自己去翻文件夹,找到那个最新的带日期的版本。
虽然过程粗糙,但是看着自己的声音能在屏幕上变幻出绚烂的色彩,那种成就感真是没法比。现在我还在继续优化,主要是想把“噪音”和“人声”的颜色区分开来,让它更智能一些。等我搞定了,再来给大家分享我的新发现。