当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]再来看一下二维码。即使是最大的第40版二维码,根据编码和纠错设置的不同,也只能容纳大约3KB的有效二进制数据。所以我们正试图做一件荒谬的事:把一首2.9MB的歌曲塞进只能容纳3KB的空间里。

这就是“Paper Tunes”的理念:一种基于二维码的实体音乐格式,结合离网的LoRa音乐网络。

我想要验证一个想法:能否将真实的音乐文件压缩到足够小的体积,打印成纸质二维码,然后重新还原出整首歌。

当纸质版本成功运行后,我又用LoRa技术将相同的压缩音乐数据在两台ESP32之间传输,从而实现了一种完全离线的音乐共享方式。

但最让我感兴趣的是纸质版本本身。一首数字音乐变成了一个实体物品。

问题来了:一首歌对纸张来说太大了

我选取了一首约2分7秒的歌曲,以MP3格式计算,大约有2.9MB大小。

再来看一下二维码。即使是最大的第40版二维码,根据编码和纠错设置的不同,也只能容纳大约3KB的有效二进制数据。所以我们正试图做一件荒谬的事:把一首2.9MB的歌曲塞进只能容纳3KB的空间里。

如果我简单地把MP3文件放进二维码中,就需要大约一千个二维码。这听起来已经不像音乐盒了。所以真正的挑战不是找到更大的二维码,而是找到一种更小的方式来表示音乐。

将音乐压缩成极小的载体

普通的文件压缩无法解决这个问题。

MP3本身就是一个有损压缩格式,因此用ZIP或其他无损压缩器压缩后,也无法神奇地让其体积缩小数百倍。

我需要以不同的方式来表示音频本身。这时Meta的EnCodec就派上用场了。EnCodec是一种神经网络音频编解码器。它不会像普通音频文件那样处理歌曲,而是通过编码器将音频波形转换为由离散代码组成的紧凑表示形式。随后,解码器可以将这些代码还原为原始音频。

可以把这想象成将一首歌翻译成另一种非常紧凑的语言,而另一个编解码器副本能够理解这种语言。

我不再把歌曲本身写在纸上,而是把这种紧凑的表示形式写在纸上。

我的第一个实验设定的目标带宽是3 kbps。

结果出人意料地惊人:2.9 MB的MP3音频压缩后,仅保留约21 KB的隐藏数据。  这大约是原来的千分之一。

但21 KB仍然远大于一个二维码的大小。  因此,我解决了第一个问题,但尚未解决论文中的核心难题。

我还尝试了更低的1.5 kbps设置,生成了更小的表示,但解码后的音频质量严重下降。  考虑到其高度压缩的程度,3 kbps版本听起来却出奇地好,于是我以此作为起点。

该编码器本质上使用:

你可以尝试不同的带宽值。较低数值会生成更小的文件,而较高数值通常能更好地保持音频质量。

步骤2:如果一个二维码不够怎么办?

此时,我已经拥有一个大约21 KB的文件。而一个二维码本身只能容纳约3 KB的数据。我试图让单个二维码承载更多容量,但无论怎么尝试,都无法再压缩超过3.3 KB的数据。

于是,我放弃了让单个二维码做它原本不被设计的功能。相反,我想:“为什么不使用八个二维码呢?”

第三步:纸质音乐盒

我大约21KB的压缩歌曲可以分成约八个部分,每个部分都足够小,能放入一个二维码中。

因此,我把数据分成了八段:

QR 1 > ID 1 + 音乐数据  QR 2 > ID 2 + 音乐数据  QR 3 > ID 3 + 音乐数据,以此类推……

每个二维码都以一个小标识开头。解码器无需知道你先扫描了哪个二维码,只需读取这些ID,然后将各个部分按正确顺序重新组合即可。

我希望最终效果更像一种实体音乐格式,而不仅仅是一张布满条形码的乐谱。

于是,我从流媒体出现之前就已存在的东西中汲取灵感:双面实体介质。

有些黑胶唱片在播放过程中需要翻转一半。因此,我也决定用我的二维码卡来实现同样的功能。

我做了同样的事情,A面有4个二维码,B面也有4个。

第四步:将数据转为纸质文件

我编写了一个Python脚本,它接收压缩后的music.raw文件,并执行以下操作:

- 将文件分割成八个部分;- 为每个部分添加一个ID;- 生成二维码;- 在A面上排列四个二维码;- 在B面上排列四个二维码;- 输出可打印的图像。

其中非常重要的一点是每个二维码周围的静默区域。二维码需要周围有一个清晰的空间,以便扫描仪能够可靠地检测到其边界。最后,我在普通纸上将两面都按全尺寸打印出来。

而这一点至今仍令人难以置信:这首歌现在已实实在在地存在于纸张上,不再是链接到歌曲的地址,也不是指向流媒体服务的二维码。这些二维码中包含重建歌曲所需的压缩数据。纸张本身就成了存储介质!

第五步:从纸张中读取回歌曲

当然,打印出歌曲只是实验的一半。

真正的考验在于能否将其还原回来。

接收程序会收到两张磁带图像:

- 它能识别出二维码并读取其内容;- 每个内容包都包含自己的标识符,因此程序可以确定各个部分对应的是哪个片段;- 然后:

•读取全部八个二维码。  •提取它们的ID。  •对数据块进行排序。  •移除标识符字节。  •合并八个数据块。  •重建原始的music.raw文件。  •将该数据发送至EnCodec解码器。  •生成重构后的音频。

第六步:让纸质调音变得便携

如果纸张可以物理承载一首歌曲,那我是否也能在没有互联网的情况下,将同样的压缩数据从一个地方传输到另一个地方呢?

这让我想到了LoRa技术。

LoRa是一种长距离、低功耗的无线通信技术,专为传输相对较小的数据量而设计。

在这个实验中,我使用了两个ESP32开发板和两个REYAX RYLR998 LoRa模块。

为什么选择Reyax LoRa模块?

Reyax生产的通信模块性能出色,对于业余爱好者来说编程和使用都非常简便。本次实验中,我使用了两个Reyax RYLR998模块。

一个ESP32存储压缩后的音乐文件,另一个接收它。有趣的是,两者之间没有任何路由器、云服务或蜂窝网络,两个LoRa模块直接通信。

由于我发送的是约21 KB的压缩版本,而不是原始的2.9 MB MP3文件,因此实验变得更加真实。论文和LoRa系统正是同一理念的不同物理实现方式:将音乐本地存储、进行强力压缩,并将互联网排除在传输之外。

步骤7:连接LoRa硬件

RYLR998通过UART与ESP32通信。

我的接线如下:

RYLR998 → ESP32  VDD → 3.3V  GND → GND  TXD → ESP32 RX  RXD → ESP32 TX

ESP32通过AT命令与RYLR998通信,而LoRa模块则负责实际的无线通信。

请确保使用正确的RYLR998频率版本,并根据您所在地区的法规配置无线电设备。

步骤8:通过LoRa发送音乐

发送端的ESP32会将music.raw文件存储在其LittleFS文件系统中。

当接收端发送GET请求时,发送端开始传输。首先发送描述文件的元数据,然后将文件分割成多个小数据包。发送端等待收到确认(ACK)后继续传输;若未收到确认,则重试该数据包。最后,发送END消息。

这在LoRa连接之上创建了一个简单可靠的文件传输系统。

关键在于,我们并不试图通过这个慢速的无线链路发送数兆字节的MP3文件。

我们只是发送专为本项目设计的微型数据表示。

步骤9:歌曲重建

第二个ESP32接收到数据包后,将其重新组合成:

对于每个接收到的数据包,它会检查包号,解码Base64数据,写入文件,并发送确认信息。

传输完成后,它会检查所接收的字节数是否与原始文件大小一致。

然后,ESP32通过USB将重建后的二进制文件发送到电脑。

接下来,Python程序接管工作,将EnCodec格式的数据重新解码为音频。

在这个概念验证中,我特意保留了电脑的参与,而不是先开发一个专用的Android应用程序。这样可以更方便地测试底层的存储和通信系统。

步骤10:软件实现

Python接收端可以兼容项目的两个版本:

QR模式

读取两张纸盒图像,重建八个片段,并解码音乐。

LoRa模式

通过USB从ESP32接收重建后的文件并进行解码。

所需的Python包包括:

然后运行:

程序提供一个简单的菜单,用于选择LoRa接收或二维码卡解码。

项目文件包含编码器、解码器、二维码生成代码、发射机代码、接收机代码以及PC接收端。

最终成果

完成的系统为我提供了两种方式来播放同一首歌曲,而无需依赖在线基础设施。

纸

歌曲 → 编码器 → 21 KB → 8 个二维码 → 纸张 → 扫描 → 解码 → 歌曲

广播

歌曲 → 编码器 → 21 KB → LoRa → ESP32 → 电脑 → 解码 → 歌曲

将一首无形的数字歌曲变成可以放在桌上的实体物品,总有一种令人满足的感觉。

你可以打印它,可以折叠它,也可以亲手交给别人。

如果实验成功,你还能扫描它,听到那首一直藏在纸页里的歌。

本文编译自hackster.io

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭