知漪
MURRIPPLE

把一首歌,织成看得见的涟漪。

给它一首歌和一份歌词,它还你两样东西:一个双击就能打开的网页,和一支 1080p60 的视频。歌在里面变成一圈会呼吸的光——鼓点落成光屑,唱到哪句,哪句歌词就亮在环心。

这份介绍写给不写代码的人:十分钟,讲清它把什么变成什么、能拿它干什么、从哪开始、以及它做不到什么。全文不讲一句实现原理——「它是怎么做出来的」是另一份文档的事,这里只回答「要不要用」。

全部跑在你自己的机器上 产物是一个文件 源码可得,禁止商用 做不到的照写
九个声部,一色一件乐器——后文画面里的颜色都从这里来

①它把什么变成什么

交给它两样,拿回来两样。

你交给它
一首歌一个音频文件;给视频、给链接也行(见第 ② 章)
一份歌词一行一句的纯文本
它还给你
一个网页文件双击就开、断网也能放;音频就藏在文件里面
一支视频1080p60 的 MP4,画面和网页里的一模一样
链路与产物:README「整条链路」。

成品长这样

《Trempe-moi》成品播放到 2:13 的画面:紫色的判定环,环心是正在唱的法语歌词,右侧是九声部面板,底部是走带条
《Trempe-moi》播放到 2:13。中央的环随人声呼吸;环心亮着的字就是此刻唱到的那句歌词;环外落下的光点是各件乐器的音符,一种颜色一个声部(右侧面板上写着它们的名字:撼岳是鼓,渊鸣是低音,心籁是人声……);点面板上的一行,就能把那件乐器单独静音。底部的走带条可以点、可以拖。
截图:2026-08-20 自摄于本机,songs/05-trempe-moi/dist/index.html——就是线上示例那个文件。歌的来历见第 ② 章。

打开时它不是这么热闹的。歌未开始前是一页安静的标题——歌名、九个声部围成一圈、一个播放键,像一张唱片的封套:

成品的标题页:深蓝底上一个细圆环,环上是九个声部的名字,中央是歌名 Trempe-moi 和播放键
标题页。九个声部的名字绕环一周,按下播放才开始。

一次真跑,机器上发生了什么

下面四个数出自同一次运行:2026-08-15,在作者自己的电脑上,把上面这首歌从素材做成成品网页的全程逐行留了实录。

3:58这首歌的长度
121.9秒 · 整趟跑完(那台机器)
34句歌词,全部对上
10.9MB · 产物那一个文件
docs/site/demo/run-log.txt(macOS / arm64,2026-08-15 逐行实录;出处与重抄步骤见旁边的 README.provenance.md)。这是一首歌、一台机器的实测,不是承诺——换歌换机器,最花时间的那几步会完全不一样。

导出视频比做网页慢得多:README 里那条参考是一首四分半的歌、1080p60,约 33 分钟。所以视频是「满意了再导」的最后一步,不是每次都要等的。

README「导出耗时参考」:4.5 分钟 · 1080p60 · 16200 帧 · 约 33 分钟 · 163 MB。

还有一句值得写在介绍里的承诺:网页里看到的第几秒,就是视频里的第几秒——同一时刻的画面在两边一模一样。这不是宣传语,仓库里有一条测试专门守着它。

renderer/test/export-determinism.test.mjs:同一时刻渲两遍,逐帧比对必须完全一致。

②我能拿它干什么

四个用法,从近到远。

用法一给自己写的歌,做一支「官方视觉」

《Trempe-moi》就是这么来的:作者用 Suno 生成音乐、自己作词(版权归他本人),在自己电脑上从素材一路做到成品。你要是也在写歌——不管是自己弹的还是 AI 生成的——它能给你的歌一个体面的出场。

用法二发给一个人

产物是一个文件,用什么发都行。对方双击就开,什么都不用装,断网也能放——音频整个藏在文件里。像寄一张会自己发光的唱片。

用法三挂成一个网页

任何能放静态网页的地方都行。线上示例本身就是这么挂的:一个仓库、一个文件,就是一首歌的主页。

用法四出一支视频

1080p60 的 MP4,声音原样封装,画面与网页完全一致。投稿视频平台、归档、放进演出暖场,都是现成的。

素材从哪来,它都接得住

  • 手上有音频——最顺的一条路:一个音频文件加一份歌词,直接开始。
  • 手上是视频——它先把声音抽出来,再试着认画面上烧死的字幕当歌词,然后停下来,把认出的歌词交回给你过目。识别会整行整行地漏,所以要核的是行数和内容,核完它才继续。
  • 手上只有一条链接——它替你把素材取回来再走上面的路。取不回来时它不会装死:会说清自己试了哪几条路、为什么没成,最后给你一条照着敲就能自己动手的命令。每次取回它都会提醒一句版权——从链接取回的商业录音,只该自己在家看(详见第 ④ 章)。
  • 连歌词都没有——让它先在本机把字「听」出来。听出来的只是草稿:字会认错,断句几乎肯定不对,你得亲手改完它才往下走。为什么这么设计,第 ④ 章有一条专门交代。
四条来路:README「用网页跑」「ingest 是怎么决定的」;取回的降级次序与版权提醒:murripple/fetch.py 模块说明。

外语歌不用你操心

不用告诉它这是哪国话,它自己听——而且把听出来的结果说出来,写在日志里、记在产物里;拿不准会承认,认错了给你一条现成的纠正命令。示例歌就是法语的。

README「语言」一节。侦测会错,且没有准确率数字——理由见第 ④ 章。
一条规矩,先说在前面

这个项目一路做过五首歌,能对外展示的只有《Trempe-moi》这一首——其余几首用的音乐版权不属于本项目,所以在一切公开材料里(包括这份介绍)它们连名字都不出现。工具怎么对待你的素材,项目就怎么对待自己的。

五个歌曲目录在主仓 songs/ 下可数;「公开 demo 只放自制素材」的规矩写在 murripple/fetch.py 模块说明里。

③从哪开始

三个入口,按你想投入的时间挑一个。下面三个地址是本文仅有的三个链接。

三十秒

项目介绍站。一页讲完它是什么,站上可以直接载入线上成品。

三分钟

直接打开一个成品——就是本文截图的《Trempe-moi》。放一遍听完,你就知道它做出来的东西到底长什么样、动起来什么感觉。

动手用

代码仓。真要给自己的歌做一个,从这里把它装到自己电脑上。仓里带着示例歌的全部素材,装完不用先去找歌,就能原样跑出一个真成品。

要准备什么

  • 一台自己的电脑。它不是一个网站服务——介绍站不承担任何算力,所有计算(拆乐器、对歌词、出视频)都发生在你自己的机器上,你的歌不会被上传到任何地方。
  • 照仓库首页装三样底座软件。安装说明就是几条照抄的命令;其中对 Python 的版本要求是锁死的(3.11,装别的版本跑不起来),照说明走就不会踩到。
  • 第一次跑要多等几分钟——它会自动下载分析用的模型,只此一次。
前置条件与安装:tools/public/README.zh-CN.md「前置条件」「安装」。

用起来是什么样

本机网页壳子:选一个文件或粘一条链接、把歌词贴进来、点开始
它自带的本机页面。只有三件事:选一个文件(或粘一条链接)、把歌词贴进来、点开始。

装好之后一条命令唤出上面这个页面。它只在你这台机器上开门——同一个网络里的其他设备都连不上它。跑的过程是两级进度加一片日志;中途需要你的地方(核对歌词)它会停下来等,你不点「改好了,继续」,一个字都不往下走。做完自动打开成品。

壳子行为:README「用网页跑」;壳子截图:tools/public/assets/shell.png。

不想用网页的话,同样的事每一步都有对应的命令,仓库首页从头写到尾。

④它做不到什么

每一条都写在项目自己的文档里;这一节不比前几节短,是有意的。

许可证:可以玩,不可以卖

公开仓库用的是 PolyForm Noncommercial 1.0.0。它不是开源许可证——不符合开放源代码促进会(OSI)对「开源」的定义,因为它限制了用途。把它叫开源是不诚实的,所以这里主动写清楚:准确的说法是「源码可得,禁止商用」。

  • 可以:使用、研究、修改、分发,在它之上做新东西——只要不商用。个人项目、教学、研究、公益都在「可以」里。
  • 不可以:卖它、把它打包进收费产品或服务、在经营活动中用它。
  • 想商用?来谈。许可证只是默认不授予,这是一次对话的开头,不是一句拒绝。
tools/public/LICENSE 全文为准;以上三条是人话摘要,本身没有法律效力。
为什么把短处写进产品介绍

因为反过来那一面没法验证。一个看起来像证据、却经不起追问来源的说法,比没有证据更坏——它会终止追问。这份介绍里每个数字都留了出处,就是欢迎你去追问。