灯光与音乐同步:从截断时间戳中估算精确的搜索时间
摘要
一位开发者描述了一个副项目,利用OCR和逆向工程DJ软件自动将灯光与现场音乐同步,并介绍如何通过区间平均值从截断的时间戳中估算精确的搜索时间。
<p><a href="https://lobste.rs/s/usw42s/syncing_lights_with_music_estimating">评论</a></p>
查看缓存全文
缓存时间: 2026/06/01 14:32
# 音乐与灯光同步:DJ台上的马尔祖洛算法
来源:https://aaronjanse.substack.com/p/syncing-lights-with-music-marzullos
我一直以来最喜欢的副项目之一,就是在家庭派对上自动让灯光随着音乐同步。我在2022-23年间搭建了一套系统来实现这个功能,此后它已在几十个小规模活动中投入使用。
这是技术与非技术主题的有趣交汇点,所以我终于抽出时间,把它写成一系列简短的文章。在这第一篇里,我将讨论如何与现场DJ保持同步,即使他们跳过了歌曲的某些部分或改变了节奏。
我希望我的灯光系统能全自动地跟随歌曲的结构,并在高潮段落前逐步铺垫,就像你在演唱会上看到的那样。理想情况下,我只需在Spotify、Djay Pro(自动混音)或Rekordbox(现场打碟)上点击播放,一些彩色灯光就会自动开始工作。这需要知道当前正在播放的歌曲以及我们在歌曲中的位置,这样才能为整首歌规划灯光秀¹。
我希望直接从音乐软件中提取这些信息(当前曲目和播放位置),而不是尝试用麦克风搞什么花样(想想混音版和重复的副歌)²。那么如何实现呢?
Spotify是最容易集成的平台,因为我们可以通过AppleScript³查询其内部状态。
但Rekordbox和Djay Pro呢?针对Rekordbox已经做了大量的逆向工程工作,包括从DJ硬件的网络数据包或Windows上的进程内存转储中提取播放状态。但这些方法存在大量限制。
**我最终选择了对Rekordbox进行屏幕录制,并用OCR从界面中提取信息**。这方法很糟糕,但效果非常好,而且在打碟用的笔记本电脑上设置起来最简单。对于Djay Pro,我用了类似的方法,不过使用了macOS的无障碍工具代替OCR。
例如,从下面的截图中,我们可以提取出“00:30.9”的播放位置、“124.0”的播放速度、曲目名称和艺术家⁴:
[](https://substackcdn.com/image/fetch/$s_!6LTN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feaefd880-e9c3-459e-b76f-e1b20bfdbf1e_1027x530.png)
**为了让灯光看起来同步,我们需要10毫秒的播放位置精度,然而用户界面通常只显示0.1秒或1秒的精度。如何解决这个问题?**
由于当前播放位置是一个动态目标,我们应从曲目的墙上时钟开始时间和播放速度的角度来思考。我们还可以通过区间的概念来量化不确定性。
一种方法是对多张截图中被截断的播放位置进行平均。如果我们在热循环中录制并避免混叠,这个平均值将接近真实的歌曲开始时间,根据截断情况会有0.05秒或0.5秒的偏移。我使用平均法一段时间,效果还不错,但很难判断延迟问题究竟来自音频堆栈、灯光、歌曲分析,还是播放位置估计错误。
幸运的是,有一种更稳健的方法。在每张截图中,被截断的播放位置暗示了一个精确播放位置的区间,进而暗示了一个曲目开始时间的区间。如果我们拍摄多张截图,可以观察这些区间的重叠部分,从而获得更高的精度:
[](https://substackcdn.com/image/fetch/$s_!bt0R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb846eeb6-a773-49fb-86d7-6e0dbda8c445_2048x603.png)
这本质上就是马尔祖洛算法,该算法最初是为了“从多个有噪声的时间源估计精确时间”而创建的,并被NTP所采用。
该算法能让我们做一些很酷的事情:
- 我们可以有意识地对截图进行定时,使其平分我们的开始时间估计区间,从而获得1毫秒的精度(做法是:在我们认为截断的时间会跳变的那一刻进行截图,然后检查我们是提前了还是晚了)
- OCR错误不成问题,因为它们会被准确的读取结果否决
- 如果我们寻找的是最流行的(速度、开始时间区间)交集,而不是只考虑开始时间,那么播放速度变化也能自然处理
- 我们可以编写更好的启发式规则来检测DJ跳过了歌曲的某部分。例如,通过检查最近截图的区间是否相互一致,但与之前截图的区间全部不一致,就能快速检测出跳歌
迁移到这种方法后,我可以信任播放位置的估计,从而解放思想去考虑其他事情。这正是我对播放状态跟踪实现所能期望的一切。
如果大家觉得这些内容有趣,我会在后续文章中继续介绍这个项目。可能的话题包括:
- 如何规划灯光效果?如何处理DJ转场?为什么要用马尔可夫链?
- 如何使用各种硬件协议控制灯光?(红外遥控、DMX、ws2812b)
- 如何滥用LED灯带以获得超过256³种颜色?
#### 关于本文的讨论
### 想要更多内容?
相似文章
Live Music Diffusion Models: 交互式扩散音乐生成器的高效微调与后训练
本文介绍了Live Music Diffusion Models(LMDMs),它通过修改扩散过程,实现了高效的块式处理以及新颖的训练范式,从而在消费级硬件上进行实时交互式音乐生成,在推理复杂度上超越了离散自回归模型,并实现了稳定的后训练对齐。
深入解析:构建实时和弦识别器
本文解释了实时和弦识别器的技术架构,详细介绍了使用音级位掩码、候选生成、分数归一化和音乐启发式的四阶段流水线。
突破音乐供应的约束
作者描述了取消音乐订阅,并使用DGX Spark、Plex和Ace-Step 1.5 XL模型构建了一个自托管的AI音乐生成系统,创造了无限的个性化音乐供应。
@HuggingPapers:谷歌刚刚在Hugging Face上发布了Magenta RealTime 2,这是唯一一个用于实时连续音乐生成的开源权重模型……
谷歌在Hugging Face上发布了Magenta RealTime 2,这是一个开源权重模型,可在设备上实现实时连续音乐生成,延迟约200毫秒,并可通过文本、音频或MIDI进行控制。
google/magenta-realtime-2
Google DeepMind 发布了 Magenta RealTime 2,这是一个开源音乐生成模型,支持设备端流式处理,可通过文本、音频示例和 MIDI 实现低延迟控制。