Agent 能渲染整部电影,却听不见自己配的音:MIT 开源 earshot,22 秒片子里没有一个录音

Agent 能渲染整部电影,却听不见自己配的音:MIT 开源 earshot,22 秒片子里没有一个录音

Agent 能渲染整部电影,却听不见自己配的音:MIT 开源 earshot,22 秒片子里没有一个录音 封面

说真的,这一年最让我失望的,不是 AI 写不出东西。是它写得出来,却压根不知道自己写出来的是什么声音。

现在的 AI 编程 Agent 已经能写出渲染一整部电影的代码,你给个想法,它哗哗往下写。可它配进去的音,一个都听不见。

分不清一次高级的按键声和廉价的按键声,也注意不到打击声比画面切点晚了 80 毫秒。声音对它来说就是代码里的一行文件名。

所以看到 MIT 开源的 earshot 时,我的第一反应不是”又一个音频工具”。官方那支 22 秒的发布短片,每一个声音都是 earshot forge 用代码合成的,没有一段录音,也没有音乐轨。

仓库叫 Leonxlnx/earshot,Python 写的,CPU 就能跑,1604 星。建库 2026-10-15,最后一次 push 是 2026-10-18,到今天才五天。

声音被拆成 Agent 能读的证据
声音被拆成 Agent 能读的证据

先别急着装:它跟语音转文字压根不是一回事

这是最容易搞错的地方。Whisper 那一类干的是”把人说的话变成字”,earshot 干的是让 Agent 判断一段声音是什么、像不像、真不真、在第几秒。前者吐文字,后者吐判断。

圈圈之前聊过的 Whistle 走的是前一条路,音频进去,工具调用出来;一句指令改录音的 AuK 是音频编辑这条线上的邻居。earshot 谁的活都不抢,只干一件事:给 AI 编程助手装耳朵。

语音转文字earshot
输入人说的话任何声音
输出文字判断:是什么、像不像、真不真、在第几秒

说白了,一个回答”他说了什么”,一个回答”这是不是我想要的那种声音”。

第一步,让它先听得见:四个问题,四个命令

安装就四行命令,README 里原样摆着,跑完再用 earshot doctor --load 验一遍。

git clone https://github.com/Leonxlnx/earshot && cd earshot
python -m venv .venv
.venv/bin/python -m pip install torch --index-url https://download.pytorch.org/whl/cpu
.venv/bin/python -m pip install -e ".[mcp,llm,dev]"

第一次用会拉两个开源模型,约 1.1 GB,落在 .cache/hf,之后只从缓存加载。CLAP 管文本和音频的嵌入,AudioSet tagger 管打标签。

然后就能问它问题了。官方 README 给了四个真实输出,我原样摘过来。

$ earshot describe enter.ogg
  0.56 s short transient (attack 3 ms, decays in 190 ms). Sounds most like: a single mechanical keyboard key press
  (z +5.4), a soft key release click (z +3.6) ... [clear reading]. peak -0.1 dBFS, brightness 1.5 kHz ...

$ earshot match key.ogg "a deep thocky mechanical keyboard press" --alts "a clicky blue switch keyboard" "a mouse click"
  -> strong (z +3.7; would rank #2 among 322 vocabulary descriptions) ...

$ earshot find keys.ogg "a single mechanical key press" --top 4
  0:03.94-0:04.19 (0.24 s stroke, z +4.1 strong); 0:10.60-0:10.86 ...

$ earshot critique film.mp4
  VERDICT: close - 21 of 23 scored metrics in range ... FIX FIRST: 1. [major] nothing reaches body level until 0:01.01 ...

describe 告诉你这段听起来像什么,标签带着校准过的 z 值,顺手把最接近的替代读法也给你。match 判描述贴不贴合,给 strong、plausible、weak 或 no match。find 在长录音里找最佳时刻,返回能直接裁的起止秒。critique 最狠,拿 7 部专业发布片建出来的画像给你的片子打分,还带修改建议。

其余也有分工:realness 判断是真录音还是代码合成的,timeline 出听写稿(事件时间、和画面切点的同步),sheet 出带标注的 PNG 给读图的 Agent 用,measure 只做客观测量。--json 拿完整结果,--out 存盘。

官方自测(docs/VALIDATION.md):125 条真实录音的 held-out 库上,strong 判定 98% 是正确种类的声音;真假合成的区分 held-out ROC-AUC 0.92;60 秒影片混音里的音效 93% 被检成事件。

顺带接一句,你只当甲方、AI 组个剧组替你出片 那篇讲的是画面这条线。声音这半边,现在才有人补上。

音效存成代码,按 id 直接渲染
音效存成代码,按 id 直接渲染

第二步,让它自己做出来:声音写成代码,一个采样都不用

forge 是整套东西里最野的部分,规矩只有一条:不许用素材,只许写代码。

一份 recipe 里全是物理合成的部件,模态共振器、接触激励、滤波噪声、算出来的房间和一支麦克风,没有任何录音素材。forge 按参数渲染一堆候选,再由 earshot 自己搭的 critic 打分:对描述的匹配、真实度、跟参考录音的接近程度。然后是不依赖模型的惩罚项:音色平衡、时频谱包络、瑕疵和打磨度,尾巴消太快就在这儿暴露。

再往下是便宜的无模型预筛,用同样的测量给大量渲染排队,让模型只听最好的几个,然后进化式搜索留下最好的再变异。Agent 读 critic 的话,比如 “sounds like: a cork pop, a glass ting”、”bumpy tail”,对着参考看频谱图,改 recipe,再跑一轮。

earshot forge --list
earshot forge keypress --refs path/to/real/keypresses/ --budget 144 --variants 4 --dir made/keypress
earshot forge whoosh --refset whoosh_fast --budget 96 --dir made/whoosh

跑完 --dir 里躺着最好的几个有差异的声音,外加 report.md、compare.png、audition.wav(做成和参考成对播放)和 report.json。

v2 把 recipe 扩成 34 个动效类别的角色家族。数字很实在:变体之间不再是近乎复制,CLAP cosine 从 0.89-0.97 降到 0.71-0.85;click 的 t40 从 0.56 倍做到 1.44 倍 bench 中位数。有数字的 21 类里,18 类至少和另一批真实录音一样接近参考。

盲测也得说。一次按键、一次点击、一个 pop、一个 whoosh、一个 impact 全部从零做出来,和同类真实录音盲放对比,作者 15 次里只挑对 8 次,等于抛硬币。只有 impact 被听出来,因为尾巴消得太快。一个听众、15 次,小样本,不是证明。

第三步,反着来:把一段录音翻译成代码

fit 走分析合成的路子,方向正好反过来。它先拟合一个参数可读的小合成模型,振铃模态、被追踪的分音、时变噪声手势,拟合到渲染和录音对得上,再写成一个 forge recipe 模块,它的 render() 能重新造出这个声音。

关键在模块存的是结构不是采样。所以能出新 take,能做变体,大小、阻尼、音高、亮度都能调。

earshot fit click.wav -o made/click_fit.py --report
python made/click_fit.py 3 take3.wav
earshot fit --morph a.wav b.wav --amount 0.5 -o made/ab_morph.py

官方给的是 12 条真实录音(click、key press、pop、impact、whoosh、notification 各 2 条):录音和生成代码的渲染之间 CLAP cosine 中位数 0.945,10 条的头号标签一致。12 次等响度盲测里听众分不出哪个是原录音。一个听众,小样本,不是证明。渲染是接近不是相同,起振和噪声质地仍有可测量差异。还有一条:fit 出来的是衍生作品,recipe 要保留原始许可。

0.3 已经在 main 上了:201 个音效,全存成代码

版本号最容易看走眼:这些东西在 main 分支上,最新 tag 仍是 v0.2.0。0.3 给了一个按 id 渲染的音效库,不用模型也不用网络:183 个 forge v2 成品,3 个 kalimba 音色,15 条从 CC0 录音拟合出来的。

earshot sfx list --kind whoosh
earshot sfx render whoosh_fast/crisp -o w.wav --dur 0.8 --apex 0.32
earshot sfx render pluck/kalimba -o e5.wav --pitch E5
earshot sfx check w.wav

旋钮改的是 recipe 自己的参数,绝不做重采样。dur 精确落点,apex 把 whoosh 最响时刻放到目标 5 毫秒内(实测 2.5 毫秒内),pitch 接受音名或 Hz(实测 0 音分偏差),噪声类会拒绝音高并说明原因。201 个里有 185 个是干净的,preset 里一个不干净的都不用。

再往上是 kit,每个角色渲染一个确定性的可缓存 take,写出 kit.lock.json 记录实测的 onset、peak、end,没过审计的换新种子重摇。earshot gallery 还能把 forge 产出变成静态 HTML 试听页,183 个声音约 9 MB。

坑我给你排好:这五个地方最容易翻车

  • 坑1:跑一条命令干等半分钟。根因是每次 CLI 调用都是新进程,回答问题前要先加载模型,20 到 40 秒。解法看量:如果你只是偶尔听一两个文件,CLI 直接跑没问题;如果你要给整部片子配音,超过几次就该换 MCP server(模型常驻),或者写个 Python 脚本 from earshot import api。另外 measure、sfx、kit 不加载模型。
  • 坑2:forge 照样能跑,但真实度不作数。根因是参考录音有许可、不在仓库里。解法是用 --refs DIR 自带参考,或按 earshot/forge/refsets.py 摆好;没有 refs 时 critic 跑 designed 模式,不作硬性要求。
  • 坑3:模型被讨好了,声音却没变好。官方自己承认这是 Goodhart 陷阱:搜索优化的是 earshot 自己的模型,一轮之后做出的声音能过每一个模型检查,只剩 1/3 倍频程测量还分得出来;真实度模型很好骗,模态共振器加房间和底噪就读成 real。解法是靠不依赖模型的测量、换种子重渲染(earshot forge --check 会让每个成品从 report.json 重新渲染一遍),以及人耳盲测。
  • 坑4:标签和情绪别当真。docs/LIMITS.md 写得很清楚:可信的是响度、时间点、与画面的同步、单个突出声音上”这是不是我要的那种声音”;只是提示的是繁忙混音里的事件标签、音乐流派和情绪;判断不了的是品味、情绪、出处、许可和语音内容,还有 14 kHz 以上的东西。评分卡描述的是它背后那 7 部片的风格,不是所有好片。
  • 坑5:版本号看走眼。最新 tag 仍是 v0.2.0,想用 sfx 和 kit 就拉 main,别只盯 release 页。

写在最后:听得见,才做得好

回到开头那句。AI 编程 Agent 能写出渲染整部电影的代码,却听不见自己配的音,earshot 补的就是这一层。

它做的事就三件:先听得见,才做得好,最后还能把声音写成代码。三步走完,声音从一行文件名变成了 Agent 能推理的证据。

说实话,我最喜欢的不是那些分数,是官方把局限、把 Goodhart 陷阱、把”小样本不是证明”全写进了文档。一个出生五天的仓库愿意这么干,比多跑 0.1 的分数值钱。

再补几个细节:仓库里没有任何音频或视频文件。代码是 MIT,CLAP 是 Apache-2.0,AST 是 BSD-3-Clause。仓库还自带两个 agent skill,一个教 Agent 怎么读判定、什么时候别信,一个是用真实授权录音做配乐的完整流程。

声音是最后一块还没被 AI 认真对待的素材。现在有人给它装上了耳朵。

圈圈

关注圈圈,持续带你玩转 AI 工具。

© 版权声明
THE END
喜欢就支持一下吧
点赞99 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容