周五早上,我出门跑了35分钟。出发时,我的歌只是一段低沉的嗡鸣。等我回来,它已经有了铺底音色、贝斯线、鼓组、卡林巴旋律,还混进了我跑过的那条街10秒钟的真实声音。
这就是 Grow a Song 做的事:把户外时间变成音乐。你在日光下待的每一分钟,都会给今天的曲目加一层。如果一整天都待在室内,你的歌就一直是单薄的;只有走出去,它才会丰满起来。没有跳过、没有购买层数的捷径——想听完整首歌,唯一的办法就是出门。
![]()
作曲的是一台手机
负责作曲的是 Gemma 3 1B,跑在我的 iPhone 13 Pro 上。每次散步或跑步前,它会看当前时间、太阳高度、你接下来要做什么、这周你在户外待了多久,然后决定调性、音阶、速度、和弦进行、乐器、标题和一句内页文案。
我那次跑步拿到的是:Ephemeral Echoes,D 多利亚调式,160 bpm,和弦进行 1 7 5 3,温暖铺底、脉冲贝斯、推进鼓组、卡林巴。内页文案写着:“世界在你脚下铺展开来,一份缓慢而充满期待的邀请。”
整个应用没有账号,也没有服务器,模型一次性下载完成后,飞行模式下也能用。
那天早上的数字
从手机里导出的记录是这样的:
- 计为户外的时间 35.1 分钟,跑了 3.4 公里
- 结束时全部 6 层都在播放(我原本的目标是20分钟)
- 早上 7:40 录下的一段 10 秒片段,成了这首歌的最上层
- Gemma 事后写的田野笔记:“你跑了3.2公里。‘Ephemeral Echoes’现在成了录音的一部分。”
这句笔记精神上准确,距离差了大约200米——这就是一个1B模型写日志时能给你的精度。
让模型做它擅长的事
我没打算让一个1B模型逐音符生成音频或 MIDI。这么小的模型,挑情绪很在行,但要它盯住几百个音符就力不从心了。所以 Gemma 只做大约十个音乐决策,然后以 JSON 返回,比如标题、调性、音阶、速度、和弦进行、各类乐器、能量值和内页文案。
一个确定性音序器把这些决策变成16小节的音符,旋律采用 A A' B A 的结构,重复得足够多,才容易记住。再配一个从零写的小合成器来播放:失谐锯齿波铺底、FM 卡林巴、一个从155赫兹往下扫的正弦波底鼓,还有混响。同一份规格永远产出同一首歌——这一点后来变得很重要。
从1B模型里抠出可靠的 JSON
我在 Mac 上做的第一次评测,表面看没问题:6首歌里6首都可播放。但底下,基于 XGrammar 的模式约束解码其实每次都失败了,是一个备用解析器在悄悄兜底。
把部分输出打出来才看清原因:Gemma 在不停输出换行符。JSON 允许无限空白,贪婪解码发现空白永远是合法的下一个 token,于是把全部360个 token 都填成了空白。加上库里的空白和结束 token 偏置后,问题解决了。
第二个问题是品味。Gemma 几乎每次都选 D 大调五声音阶、和弦 1 5 6 4、60 bpm,连跑步时也这样。1B模型会死死抱住它读到的第一个选项。所以现在提示词会打乱每个选项列表的顺序,用当前分钟数做种子;再加一个小守卫,把速度折叠进符合活动的区间(比如跑步的“75 bpm”会变成150)。改完之后,同样的评测在6首歌里产出了三种调性、四种音阶和五种不同的和弦进行。
没有光线传感器,怎么知道你在户外
Apple Watch 用环境光传感器测量日光下的时间,应用会在 HealthKit 里有这个数据时读取它。但我希望只有手机的人也能用,而 iPhone 应用读不到手机的光线传感器。
所以手机改用推断。一分钟要被计入,需要满足:太阳高于民用晨昏蒙影(-6度),这个条件用 NOAA 太阳方程在本地根据时间和位置算出;同时 CoreMotion 判断你在走路、跑步或骑车,或者 GPS 定位精度在20米以内(通常意味着开阔天空)且你不在家。
开车永远不算。首次启动时,CoreMotion 的7天活动历史会立刻给你一周的估算歌曲。有手表时,以实测数字为准。
那个差点终结我这次跑步的 bug
跑步前我让第二个 AI 代理审查了代码。它发现了一个真实的崩溃。iOS 不允许后台应用使用 GPU。如果我点了开始,然后在 Gemma 还在作曲时锁屏,MLX 就会撞上这个错误并调用 fatalError,把应用、音乐和分钟计数器一起干掉,就在跑步开始几秒钟后。
修复分三部分。Gemma 只在应用处于前台时运行,后台发起的请求会等你再次打开应用。作曲所需的那几秒里屏幕保持常亮。每个 MLX 调用都包在 withError 里,这样 GPU 失败……
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.