画声音

五年前,哈布雷(Habré)发表了一篇文章“在纸上打印和再现声音” -有关创建和播放声谱图的系统。 然后,一年半前, Meklon发表了一项任务 ,其中黑白对数频谱图成为其中一个阶段。 根据作者的意图,有必要将其打印在打印机上,使用带有播放器应用程序的智能手机对其进行扫描,并以这种方式使用“指定的”密码。


那时,我无法接触打印机或智能手机,因此我对任务的两个方面感兴趣:

  1. 没有附加设备也没有附加软件的最简单的解码频谱图的方法是-最好是在浏览器中?
  2. 是否可以完全不需任何软件即可“通过肉眼”对其进行解密?

(对于那些第一次看频谱图的人来说,有必要澄清一下,这是一个曲线图,其中再现时间沿水平轴移动,声音频率沿垂直轴(对数),点的黑度表示该频率在给定时间的功率。)

尽管AnalyserNode.getByteFrequencyData()的功能已内置在Web Audio API中,但我找不到用于复制频谱图的现成脚本,尽管可以 很容易地找到逆向转换的示例(声音到频谱图AnalyserNode.getByteFrequencyData() 。 但是,要将频率阵列转换为PCM阵列以进行回放,您必须在脚本中实施傅立叶逆变换 (DFT),然后才能进行。
*在第一个示例中,作为频谱分析的音频记录,“ “来自Aphex Twin:作为秘密信息,音乐家将自拍照嵌入了这首曲目,并显示在对数频谱图上。不幸的是,在此示例中,频谱图以线性方式显示,因此脸部在顶部被拉伸,在底部被压缩。
关于DFT的实现,很明显,纯JavaScript中的这种“崩溃”将缓慢而令人遗憾地起作用。 幸运的是,我在asm.js上发现了FFTW库的现成端口 (“西方最快的傅立叶变换”),是低级代码的一种表示形式,通常用C编写,现代浏览器承诺以与编译成机器代码几乎相同的速度执行。 FFTW的绑定将黑白图像转换为WAV文件,我从ARSS那里取来,并亲自用JavaScript重写了它。 与PhonoPaper相比,ARSS接受倒置的图像,但我没有更改。

您可以在tyomitch.imtqy.com/#meklon.png欣赏的结果

在下面,您可以看到重复的水平条纹- 共振峰 ,通过其识别元音的位置。 在顶部-对应于嘈杂辅音的垂直“爆发”:较宽-开槽(摩擦),较窄-有声。 对于高音辅音([r]和[l]),中频处的“云”相对应。



为了使用频谱图,我附加了一个原始绘图,该绘图几乎完全从画布绘图教程复制而来。 “复制”按钮允许您将图像传输到红色通道(合成器将其忽略),并尝试“环绕”声音。

维基百科写道: “据信,分配四个共振峰足以表征言语的声音 我们圈出共振峰F 2 -F 4 (由于某些原因,合成器会忽略F 1 ),并确保元音被完全识别:



然后,我们圈出嘈杂的辅音: 从属词 [h]为[t],平滑变为[w]; 聋人[t]的浊音[d]的特征在于存在中频共振峰。 现在, 您可以区分数字“ six”和“ de'it”:



我们添加了深灰色的辅音:同时,我们注意到[p]稍微“提高”了元音共振峰,而[l]则相反。



仅唇音辅音[b]和[c]仍然被误解,但是即使没有它们,密码也还是差不多的

是否可以从头开始绘制声音而无需跟踪录音的频谱图? 坦白说,我没有成功。 也许您想自己尝试一下?

Source: https://habr.com/ru/post/zh-CN469775/


All Articles