搞这个事儿,真是被一个朋友给逼的
话说回来,我本来只是想安安静静地录一段自己的独白,给我的一个业余小视频当旁白。我把音轨导出来,清噪音,做压缩,正调得起劲儿,一个搞绘画的朋友跑过来串门。
他坐在我旁边听了一会儿,没头没尾地冒出来一句:“老兄,你这声音真蓝。”
我当时就懵了。什么叫声音是蓝的?我以为他是说我的声音听起来很忧郁或者很沉闷。我问他,是不是我录得不
他楞是摇摇头,说:“不是,就是蓝。你知道,频率嘛高频是紫色,低频是红色,你说话的这个基频,听着就是偏冷的蓝调。”
我当时就笑了,觉得他纯粹是艺术家的胡言乱语。声音和颜色,那是两个赛道的东西。但是,架不住他一直在我耳边叨叨,说什么声波和光波都是能量传递,肯定有内在的逻辑。就是容易被激将。行,既然你觉得有颜色,那我就把它给你画出来,看看你到底能瞎扯到什么程度。
就是为了这句“你这声音真蓝”,我决定动手,把我的声音可视化,而且要用色彩来表达。我可不是搞专业声谱分析的,我就是想搞个土办法,能实时看到说话的时候,到底屏幕上跑出来的是不是蓝色。
撸起袖子,我开始瞎搞
我这人做东西,就喜欢用手头已有的东西。我可不想去买什么昂贵的专业软件。我翻出了我那块尘封已久的声卡,插上我的录音麦克风。第一步,就是要捕获声音的能量。
我琢磨着,要实时把声音变成颜色,肯定得用到快速傅里叶变换(FFT)。我以前学编程的时候,捣鼓过一个很基础的音频库。我就想着,先用这个老掉牙的库试试看,能不能把麦克风采集到的声波,快速分解成一个个频率的能量点。
这个过程简直是一团麻。是驱动。我的声卡太老了,跟新系统水土不服。我光是找合适的驱动程序,就折腾了两天,装了又卸,卸了又装,电脑都快被我搞瘫痪了。
好不容易能采集了,又遇到了延迟问题。我对着麦克风说话,屏幕上的声谱图要过了半秒才跳一下,那怎么叫“实时”?我把缓冲设置调到最低,结果就是噼里啪的爆音,根本没法用。没办法,我直接绕过了那个高级库,换了一个更底层的音频API,虽然写起来费劲,但延迟总算是压下去了。
怎么把频率变成人能看的颜色?
解决了声音输入的问题,接下来的就是核心:映射。我拿到的数据就是一堆数字——几十个“频段”和它们对应的“能量值”。怎么把这些枯燥的数字变成漂亮的颜色?
- 第一次尝试:简单粗暴的线性映射。我当时想,就学彩虹嘛最低频(80Hz以下)定义为红色,最高频(10KHz以上)定义为紫色,中间平分。
这个结果简直是灾难。人说话的声音主要集中在低频和中低频,我的“色彩”永远只在红色和橙色之间晃悠,除非我尖叫,否则根本看不到蓝色。而且一旦有背景噪音,屏幕就全部被灰黄色的块状物占领了,难看得要命。
我得换个思路。我意识到,人对声音的感知和对颜色的感知都不是线性的。尤其是颜色,我们对色相(Hue)、饱和度(Saturation)和亮度(Value)的感受是独立的。
我决定这么干:
- 色相(Hue):由声音的“质心频率”(Frequency Centroid)决定。简单说,就是找到声音能量的平均中心点。如果我的声音偏低沉,这个中心点就往低频跑,色相就朝红/橙/黄走。如果我的声音很高亢,中心点就往高频跑,色相就朝蓝/紫走。
- 饱和度(Saturation):由声音的“瞬时动态范围”决定。如果我说话的起伏很大,声音层次丰富,饱和度就拉满。如果我只是低语,或者声音太平,色彩就变得灰暗。
- 亮度(Value):这最简单,直接就是声音的整体响度(RMS)。我说话越大声,屏幕就越亮。
我用了几天时间把这个对数映射的逻辑给写死进去。这回跑起来,效果立刻就不一样了!
的展示和那句“真蓝”
我把这个实时色彩可视化工具命名为“我声音的颜色”,因为做完之后,我发现它真的能反映出我说话时的情绪和特质。
我对着麦克风念了一段平静的文字,屏幕上流淌的是一种深沉的青色和灰蓝,饱和度不高,非常稳定。这就是我说话的常态。我故意提高了语速,声音变得尖锐,屏幕立刻闪烁出刺眼的亮黄色和浅绿色。
等我把整个工具基本定型,我赶紧叫那个画家朋友过来验收成果。他坐在我旁边,看着屏幕上跳动的色彩。我问他:“怎么样?我的声音到底是不是蓝色?”
我重新播放了我一开始录的那段独白,也就是他第一次说我声音是蓝色的那段。当声音播出的时候,屏幕上流淌的色彩,绝大多数时间都聚焦在HUE值偏向青色(Cyan)和深蓝(Sapphire Blue)的区域。
他满意地点了点头,说:“看,我没说错。”
我不得不承认,他可能不是个技术天才,但他对声音的感受是准确的。原来,我日常说话的那个频率基准,在人类对数听觉模型里,恰好就落在了“冷调”的范围。这个实践过程真是让我体会到了,有时候我们以为毫不相干的学科,其底层逻辑是共通的。我也成功地实现了一个土法炼钢的工具,把这个神奇的色彩记录了下来。
现在这个小工具我已经打包虽然很粗糙,但效果是实现了。我把它放出来,就是想让大家也试试,你的声音,到底是什么颜色?也许你会发现一个完全不一样的自己。