话说回来,我这个人就是爱折腾,特别是对那些看起来玄乎又没啥用的东西。前阵子在家闲着没事,突然就琢磨起一个特奇怪的问题:我的声音,到底长什么样子?不是说波形图那种机械的东西,我是想知道,如果我的声音能发出颜色,那它到底是红是蓝,是亮是暗?
动手前的准备:先得抓住声音
这个想法一旦冒出来,就怎么也甩不掉了。我决定自己动手做一个能“看见”声音颜色的工具。说干就干,我第一步就是去鼓捣麦克风的输入。我发现,想把声音变成数据,比我想象中要麻烦得多。
我跑去网上翻了一堆代码和库,但那些专业的术语看得我头大。我就想着,能不能用最笨的方法来。我先是尝试抓取声音的波形,但发现波形图密密麻麻,根本没法直接和颜色挂钩。它告诉我音量大小,但没告诉我“声音的情绪”。
后来我才转去研究声音的“高低”和“变化频率”。我用了一个很简单的工具把声音拆成了一堆数字,这些数字代表了在某个瞬间,我的声音是偏高音还是偏低音,是声音稳定还是突然爆发。这一步我磨蹭了整整一个周末,主要是为了找到一个能快速响应的采集方案,不然说话都说完了,颜色才慢悠悠地跳出来,那还有什么意思?
颜色映射:给频率定基调
一旦我能拿到那些代表声音高低的数字,接下来的活就是给这些数字找个颜色搭档了。这是整个项目最“艺术”也是最主观的部分。
我坐下来,给自己定了几条粗糙的规则:
- 低沉的声音(比如我刚睡醒时的嗓音),我就觉得它应该是深沉、温暖的颜色,比如深红和棕色。我把最低频率的那一块,都扔给了红色系。
- 高亢的声音(比如我被烫到时的尖叫),那必须是冷色和刺眼的亮色,比如青色或者亮黄。所以高频率的那部分,我划给了蓝色和绿色。
- 音量大小,这个好办,直接决定颜色的“亮度”。你喊得越大声,颜色就越刺眼;你悄悄话,颜色就暗淡得几乎看不见。
我花了大量时间调整这些映射关系。刚开始弄出来的那版本简直没法看,我随便哼一声,屏幕就闪烁得像老式电视机雪花点一样,颜色也是一团浆糊。我不断调整参数的平滑度,让颜色变化慢一点,更柔和一点,才勉强得到了一个看起来不那么辣眼睛的版本。
从自娱自乐到版本大全
东西做出来,我自己玩得很开心。我的声音颜色比较偏向深蓝色和偶尔蹦出来的橙色,非常稳定。但我老婆的声音一测试,立马屏幕就热闹了,绿色和黄色跳得飞快,显得她非常活泼。
既然自己觉得好玩,那肯定想分享出去。但分享就意味着要考虑别人怎么用。我的原始代码没人能看懂,所以我决定把它打包成一个小工具,随便找个地方放着让人下载玩玩。
这个过程又是一团麻。我最初的版本,在别人电脑上不是没声音,就是颜色卡住不动。我发现,不同设备的声卡处理方式不一样,我必须给它加个设置界面,让用户自己去选输入源。
然后就有了“版本大全”这个概念。我发现大家的需求不一样:
- 有的人说,太快了,能不能做个“慢速模式”?
- 有的人说,我不喜欢红色,能不能换个配色方案?
- 甚至还有人说,能不能把颜色投影到3D模型上,像游戏里的特效一样?
我只好一个版本接一个版本地迭代和更新。我加了“冷静模式”(只有蓝色和紫色),加了“摇滚模式”(各种高对比度颜色乱闪),把最初那个简陋的工具,弄得像个小小的视觉游戏。虽然谈不上是多专业的产品,但至少能让普通人也能体验一下“声音视觉化”的乐趣。
我记得有一次,我把这个小工具发给一个朋友,他用他八岁儿子的声音测试。他儿子一喊,屏幕上爆发出大片的亮黄色和天蓝色,像烟花一样。他给我打电话说,他第一次意识到他儿子的声音是那么清澈、那么有生命力。这件事对我触动挺大的,原本只是个无聊的程序,结果变成了一种观察生活的新方式。
现在这个小工具还在不断地被我完善,主要还是解决一些奇奇怪怪的bug,比如有人用蓝牙耳机说话时,颜色会延迟半秒。我正在想办法优化这个延迟问题,让大家都能及时看到自己声音的真实色彩。