灯光与音乐同步:从截断时间戳中估算精确的搜索时间

Lobsters Hottest 新闻

摘要

一位开发者描述了一个副项目,利用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³种颜色? #### 关于本文的讨论 ### 想要更多内容?

相似文章

深入解析:构建实时和弦识别器

Lobsters Hottest

本文解释了实时和弦识别器的技术架构,详细介绍了使用音级位掩码、候选生成、分数归一化和音乐启发式的四阶段流水线。

突破音乐供应的约束

Reddit r/LocalLLaMA

作者描述了取消音乐订阅,并使用DGX Spark、Plex和Ace-Step 1.5 XL模型构建了一个自托管的AI音乐生成系统,创造了无限的个性化音乐供应。

google/magenta-realtime-2

Hugging Face Models Trending

Google DeepMind 发布了 Magenta RealTime 2,这是一个开源音乐生成模型,支持设备端流式处理,可通过文本、音频示例和 MIDI 实现低延迟控制。