返回

文章详情

我如何逆向工程一个商业空间音频效果

Hacker News2026年10月11日 15:21

在我使用另一种操作系统时,我使用了一个实时处理播放音频的程序,使其听起来更好。它使声音感觉更远,并且听起来更加轻松,同时保留相关信息。我一直想要一个同样简单易用的Linux程序,因此决定自己写一个。0:00 / 0:10 请佩戴耳机收听。摘录来自Bacao Rhythm & Steel Band的《P.I.M.P.》。处理后的版本听起来更远离耳朵,并且感觉不那么“堵塞”,在听了一段时间的音乐后,让人觉得耳朵不那么疲劳。第一次尝试由于我为Linux编写,我的基础技术栈是PipeWire。在此之前我没有音频经验,于是我开始利用大型语言模型(LLM)作为试探工具,实验标准音频滤波器和心理声学技术。在这个过程中,我学到了HRTF(头相关传递函数),它描述了从特定方向到达耳朵的声音是如何传播的,取决于听者的方向和几何形状。我首先尝试了麻省理工学院的KEMAR数据库,觉得它听起来很糟糕,因为是在无回声的实验室录制的,缺少房间反射声,而这是这里希望获得的一种心理声学效果。结果听起来廉价而且更内向。后来我发现了SADIE II数据库,它也包含房间响应,觉得这与我记忆中的更接近。但这种方法很快显示了它的局限性。LLM开始谈论“感知包围感”、“晚场场相关性”、“频谱扩散”和“扩散空间能量”等等。Gemini在这方面特别出色,也是唯一一个有免费的学生计划的模型。尽管我能听出有什么地方不对,这些描述没有指向我可以理解或用来改善效果的任何方面。无明显方向的情况下,我将项目搁置了一段时间。重新尝试许久后,我有了一个新的想法。与其试图发现程序内部使用的确切参数或技术和算法,不如研究过滤器本身的行为。回头看这似乎显而易见,但我并没有程序的副本。由于只能在朋友的笔记本电脑上实验,所以无法随时更改我的实现并与参考进行比较。我开始阅读Signalsmith和一些音频工程师的博客,以建立足够的直觉来知道我应该测量什么,很快意识到我不需要继续使用程序来捕获其脉冲响应和其他可测量特征。我在Linux上生成了一个音频文件,短暂借用朋友的笔记本电脑,通过程序播放生成的文件并记录输出。测试的组合问题是,我应该将什么放入那个文件中,以便捕获能够区分程序的相关细节,而不必重新录制特征或滤波器。我发现的第一个有用的东西是脉冲响应测量。如果我通过滤波器传递一个包含一个非零样本的文件,那么在录音中出现在它之后的一切都将是滤波器添加的。其衰减随时间变化的程度、衰减的形状以及与之相关的相位延迟都会出现在输出中。在右声道播放脉冲可以提取两个输出对右侧播放声音的响应,左侧则同样如此。如果对一个脉冲的响应是$h$,那么位置$k$处的脉冲响应是同一个$h$平移到$k$并由$x[k]$缩放。将所有这些响应相加得出$$ y[n]= extstyle ootnotesize extstyle extstyle extstyle ootnotesize extstyle ootnotesize extstyle extstyle extstyle extstyle extstyle extstyle extstyle extstyle extstyle extstyle extstyle extstyle extstyle ootnotesize = extstyle ootnotesize extstyle extstyle extstyle ootnotesize extstyle extstyle extstyle extstyle ootnotesize extstyle ootnotesize = extstyle ootnotesize extstyle extstyle extstyle extstyle ootnotesize = extstyle ootnotesize extstyle extstyle ootnotesize extstyle extstyle extstyle extstyle extstyle ootnotesize extstyle extstyle ootnotesize ootnotesize (x*h)[n].$$这当然依赖于过滤器是线性时不变过滤器。一个更响亮的脉冲应该产生相同的响应,只是成比例地更响:$$ F(ax)=aF(x).$$两个输入一起播放应该产生每个输入单独产生的输出之和:$$ F(x_1+x_2)=F(x_1)+F(x_2).$$而后续播放相同的输入应该产生后续相同的响应。考虑到这是立体声,完整的方程是:$$ egin{bmatrix} y_L\ y_R \ ext{ extbf{}}= egin{bmatrix} h_{LL} & h_{LR}\ h_{RL} & h_{RR} ext{ extbf{}}* egin{bmatrix} x_L\ x_R ext{ extbf{}}$$鉴于我正在发送一个文件通过每种模式录制,我在不同幅度处添加了脉冲,以检查与电平相关的处理,并在两个声道中播放相同的脉冲,然后反转右声道。输出应在第一种情况下与隔离的响应相加相同,而在第二种情况下相减,验证上述条件。我还在它们之间留出了足够的静音,以便响应在下一个脉冲之前完成。在三种级别下的脉冲,在左、右、两个声道播放,并且对称标志。下载音频示例在阅读有关此事的过程中,我注意到测量论文倾向于使用正弦扫频而不是脉冲。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

☕请我喝杯咖啡