项目介绍站。一页讲完它是什么,站上可以直接载入线上成品。
把一首歌,织成看得见的涟漪。
给它一首歌和一份歌词,它还你两样东西:一个双击就能打开的网页,和一支 1080p60 的视频。歌在里面变成一圈会呼吸的光——鼓点落成光屑,唱到哪句,哪句歌词就亮在环心。
这份介绍写给不写代码的人:十分钟,讲清它把什么变成什么、能拿它干什么、从哪开始、以及它做不到什么。全文不讲一句实现原理——「它是怎么做出来的」是另一份文档的事,这里只回答「要不要用」。
交给它两样,拿回来两样。
打开时它不是这么热闹的。歌未开始前是一页安静的标题——歌名、九个声部围成一圈、一个播放键,像一张唱片的封套:
下面四个数出自同一次运行:2026-08-15,在作者自己的电脑上,把上面这首歌从素材做成成品网页的全程逐行留了实录。
导出视频比做网页慢得多:README 里那条参考是一首四分半的歌、1080p60,约 33 分钟。所以视频是「满意了再导」的最后一步,不是每次都要等的。
README「导出耗时参考」:4.5 分钟 · 1080p60 · 16200 帧 · 约 33 分钟 · 163 MB。还有一句值得写在介绍里的承诺:网页里看到的第几秒,就是视频里的第几秒——同一时刻的画面在两边一模一样。这不是宣传语,仓库里有一条测试专门守着它。
renderer/test/export-determinism.test.mjs:同一时刻渲两遍,逐帧比对必须完全一致。四个用法,从近到远。
《Trempe-moi》就是这么来的:作者用 Suno 生成音乐、自己作词(版权归他本人),在自己电脑上从素材一路做到成品。你要是也在写歌——不管是自己弹的还是 AI 生成的——它能给你的歌一个体面的出场。
产物是一个文件,用什么发都行。对方双击就开,什么都不用装,断网也能放——音频整个藏在文件里。像寄一张会自己发光的唱片。
任何能放静态网页的地方都行。线上示例本身就是这么挂的:一个仓库、一个文件,就是一首歌的主页。
1080p60 的 MP4,声音原样封装,画面与网页完全一致。投稿视频平台、归档、放进演出暖场,都是现成的。
不用告诉它这是哪国话,它自己听——而且把听出来的结果说出来,写在日志里、记在产物里;拿不准会承认,认错了给你一条现成的纠正命令。示例歌就是法语的。
README「语言」一节。侦测会错,且没有准确率数字——理由见第 ④ 章。这个项目一路做过五首歌,能对外展示的只有《Trempe-moi》这一首——其余几首用的音乐版权不属于本项目,所以在一切公开材料里(包括这份介绍)它们连名字都不出现。工具怎么对待你的素材,项目就怎么对待自己的。
五个歌曲目录在主仓 songs/ 下可数;「公开 demo 只放自制素材」的规矩写在 murripple/fetch.py 模块说明里。三个入口,按你想投入的时间挑一个。下面三个地址是本文仅有的三个链接。
项目介绍站。一页讲完它是什么,站上可以直接载入线上成品。
直接打开一个成品——就是本文截图的《Trempe-moi》。放一遍听完,你就知道它做出来的东西到底长什么样、动起来什么感觉。
代码仓。真要给自己的歌做一个,从这里把它装到自己电脑上。仓里带着示例歌的全部素材,装完不用先去找歌,就能原样跑出一个真成品。
装好之后一条命令唤出上面这个页面。它只在你这台机器上开门——同一个网络里的其他设备都连不上它。跑的过程是两级进度加一片日志;中途需要你的地方(核对歌词)它会停下来等,你不点「改好了,继续」,一个字都不往下走。做完自动打开成品。
壳子行为:README「用网页跑」;壳子截图:tools/public/assets/shell.png。不想用网页的话,同样的事每一步都有对应的命令,仓库首页从头写到尾。
每一条都写在项目自己的文档里;这一节不比前几节短,是有意的。
歌词对得准不准、语言认得对不对,全项目没有一个百分比。因为没有人真的量过:先后试过三个「看起来像证据」的替代指标,三个全部被推翻,其中一个把整份歌词平移六秒之后分数反而更高;早先文档里写过的一个漂亮数字已经撤回。做不到就说做不到,不拿凑出来的数字充数。
README「硬字幕的演唱时刻」一节(含撤回记录);教训与现行验收办法:MGMT.md 第七节。「先让它听一遍」那条路,机器只负责认字,断句是你的事——实测一首 36 行的歌,机器只切回 6 段,而歌词的行数直接决定对齐质量:一份行数不对的歌词比没有歌词更坏。所以它写出的草稿,管线一个字都不读,必须你亲手校完才算数。
README「transcribe」一节:草稿文件与「机器认字、人断句」的分工。画面上七种颜色,能各自独立静音的只有四组——把混好的歌拆开这件事,目前的分离技术只能拆到四份。界面不装聪明:哪几行其实连着一份,左侧用一道竖线如实连着,不点也看得出来。
README「产物里怎么操作」:七行四组与竖脊的来历。「不给音频、自己写一首」的合成线跑通过,被作者自己听完判了「不好听」,搁置了。现在的它只做一件事:把已有的歌变成看得见的。
README「当前状态」M5:只保证数据契约正确,不保证好听。成品页面开着就烧满一个处理器核心(实测 111%),暂停时也一样烧。笔记本电池介意这件事。已定位,未修——写在这里免得你以为是自己电脑的问题。
2026-08-15 项目报告第 6 节(docs/design/2026-08-15-project-report/):实测记录。单文件塞得下九个声部,塞不下第十个——上限一千五百万字节,文件的大头就是内嵌的音频本身。不是「余量紧张」,是装不下。
murripple/pack.py:15,000,000 字节上限的常量与理由。成品把完整音频嵌在里面,把成品公开,就是把那首歌公开。从链接取回的商业录音,做出来自己在家看可以,别挂到网上去。工具在每次取回时都会把这句提醒再说一遍——这道手续留着,就是给你一个想清楚的时机。
murripple/fetch.py 模块说明:「版权与伦理」一节。公开仓库用的是 PolyForm Noncommercial 1.0.0。它不是开源许可证——不符合开放源代码促进会(OSI)对「开源」的定义,因为它限制了用途。把它叫开源是不诚实的,所以这里主动写清楚:准确的说法是「源码可得,禁止商用」。
因为反过来那一面没法验证。一个看起来像证据、却经不起追问来源的说法,比没有证据更坏——它会终止追问。这份介绍里每个数字都留了出处,就是欢迎你去追问。