Mural:一个「你早晚会删掉」的语言 App——开源到自家 iPhone 上,带自己的 API Key 学说话

Mural:一个「你早晚会删掉」的语言 App——开源在自家 iPhone 上,带自己的 API Key 学说话

GitHub Trending 日报 · 2026-09-15

打开应用商店搜「学外语」,你能翻到几百个长得几乎一样的 App:打卡、连击、排行榜、每三天弹一次的年费订阅。最后它们大多躺在手机里,直到某次清理存储时被一起删掉。

本周冲上 GitHub Trending 的 Mural 就把这件事写进了自己的简介里——”The language app you eventually delete“(你早晚会删掉的那个语言 App)。它没有云账号、没有打卡、没有订阅,而是一个完全开源的原生 iPhone / Android 应用:跟一个会发光的球用目标语言聊天,让学习资料留在你自己的手机上。

按创建后的 star 增速排序,Mural 在近 7 天新建的仓库中是站得最高的几个之一:800+ star、170+ fork,MIT 协议,Apple 与 Android 双端原生代码全部公开。

项目地址:<https://github.com/Chuloo/mural>

它到底怎么「学」:从一个会呼吸的球开始

Mural 的交互只有一块屏幕。打开后你会看到一个缓慢流动的渐变色球体,下方是目标语言的一句问候——比如西班牙语的 ¡Hola!。点一下麦克风,就可以直接说目标语言,或者用英语回话,Mural 会用你正在学的语言回应你。

它把「聊天」当成了教材本身:

  • 实时语音对话:麦克风常开,Mural 会主动开口、顺着话题追问,而不是等你提问
  • 字幕可选:听不懂时打开 Meaning 字幕,会显示当前这句的英文意思;不想看就关掉,逼自己靠听力
  • 打字兜底:不方便说话时,可以切到键盘输入
  • 点词查询:对话里的任何词都能点开看释义
  • 24 个对话场景:从”咖啡店点单”到”聊今天新闻”,每个语言模块自带对应的文化细节;也可以直接说出一个当下的话题,Mural 会联网搜索并给出信息源

最上面那个渐变球不是装饰——它在说话时会扩张出波纹,停顿思考时会收缩。整个产品的信息层级被压到极简:一颗球、一行目标语言、一行可选字幕、三个按钮。

「你早晚会删掉」的潜台词:数据留在本机

Mural 这个名字解释得很清楚——It starts with a hello(一切从一声问候开始)。

但它真正和主流语言 App 分道扬镳的地方在隐私架构

  • 所有对话、词汇、偏好设置只存在你的设备上,没有 Mural 云端同步、没有分析 SDK、没有广告
  • 没有 Mural 账号也能用,只要一个 OpenAI API Key(存在系统 Keychain / Android Keystore 里,且被排除在导出文件之外)
  • 想备份?手动导出一个 JSON 学习记录,可以跨 iPhone / Android 互认
  • 想清空?设置里可以删单条对话,也可以一键删除全部学习数据

代价也很直白:API 费用你自己出。语音、文本、联网搜索都会计入你的 OpenAI 项目账单,应用里显示的用量只是估算,不是计费上限。项目作者在 README 里把这一点写得比谁都清楚——”A ChatGPT subscription does not provide API credit”(ChatGPT 订阅不送 API 额度)。

学习记录是怎么算出来的:证据驱动的自适应

Mural 的「自适应」不是靠猜。它把每一次对话里的回答表现当作证据(evidence),据此更新两样东西:

  • 词汇掌握度:哪些词你在对话里真正用出来了、用对了
  • 临时能力观察:当前水平的大致判断,每个学习语言单独记

界面上对应的是 Recall bars(回忆条)——1 到 3 根。要拿到 3 根,需要在不同场景、不同时间反复验证成功,而不是一次性答对。作者明确说明这是产品启发式,不是校准过的遗忘曲线,更不是语言等级证书。

这种「说清楚自己不是什么」的诚实,在语言学习类产品里并不多见。

八种语言,各自一套教学策略

Mural 目前的语言模块覆盖:

  • 挪威语 Bokmål(以东挪威语音为目标)
  • 西班牙语(西班牙)
  • 国际英语
  • 法语(法国)
  • 德语(德国)
  • 意大利语(意大利)
  • 巴西葡萄牙语
  • 标准普通话(简体中文)

每一种语言都有自己的对话主题、教学取向和独立进度。其中文模块做得相当细:可选拼音会出现在对话、转写和词条里,中文查词按词边界切分,原始汉字始终保留可复制;拼音用系统词典读音,作者也坦诚说明「人名、歧义词、连读变调仍需人工听校」。

架构上,语言被抽象成独立模块(apps/ios/Core/Languages/*.swift),每种语言一个文件;想知道怎么加一门新语言,仓库里有一份专门的 <https://github.com/Chuloo/mural/blob/main/docs/add-language.md> 指南。

双端原生:SwiftUI + Jetpack Compose

Mural 不是跨平台壳,而是两套真正的原生客户端:

平台 技术栈 最低版本 密钥存储
iPhone SwiftUI + Liquid Glass iOS 26.1 Keychain
Android Jetpack Compose Android 8.0 Android Keystore

两端共享同一套 API 契约和测试夹具(shared/ 目录),Android 端还能直接读写 iPhone 导出的 JSON 备份。实时语音传输锁定了原生 WebRTC 包 stasel/WebRTC 152.0.0

Android 端界面目前为英文,系统设为西班牙语时显示西班牙语;iPhone 端则做了完整的双语本地化。

装它需要的准备

这是 Mural 最「硬核」的部分——它不是一个下载即用的商店应用

  • 需要一台装了 Xcode 26+ 的 Mac,和一台 iOS 26.1+ 的 iPhone(Android 端则用 Java 17 + Android SDK 36 构建 APK)
  • 需要 Apple 账号;免费 Personal Team 可以直接装到自己的手机上,但描述文件 7 天过期,要重新跑一次构建刷新
  • 需要自己在 OpenAI 项目里开通计费,并拿到 GPT-Live-1 与 GPT-5.6 Luna 两个模型的访问权限
  • 需要自己输 API Key——作者在给 AI 编程助手的安装提示词里刻意写明:「不要让我把 Key 贴进聊天、不要从 Keychain 读取、不要写进源码或日志」

好消息是它提供了一份给本地 AI 编程助手用的安装提示词:把 Codex 或其它编程智能体接到 Mac 上,粘一段 prompt,智能体就能帮你 clone、解析依赖、跑离线测试、构建模拟器目标,再逐步引导你完成 Xcode 签名和手机授权。你只需要负责 Apple 账号登录、设备信任、开发者模式和 App 内输入 API Key。

一键构建命令长这样:

# iPhone 核心测试
swift test --package-path apps/ios

# Android:单元测试 + lint + 打包
cd apps/android
./gradlew :app:testDebugUnitTest :app:lintDebug :app:assembleDebug

项目状态:能跑,但没上架

作者在 README 里把边界划得很清楚,值得照抄:

  • 托管免费对话与按分钟付费尚未启用。iPhone 端有可选的 Google 登录,Android 端账号集成还在进行中
  • TestFlight 与 App Store 均未上架release/ 目录里记录着还有哪些发布前置条件没完成
  • 没有任何共享供应商密钥会出现在仓库或分发包里——这条是硬规定
  • 2026-09-13 记录的 iPhone 语言版本通过了 70 个核心测试 + 20 个原生 UI 测试79 个后端测试(隔离 PostgreSQL 全通过无跳过);德语、意大利语、巴西葡萄牙语、普通话各自做过一次真机检查
  • 作者同时声明:这些检查不构成对人类语音识别、发音或纠错质量的背书

换句话说:这是一个功能完整、工程严谨、但明确定位为个人自用的开源项目。它的 docs/ 目录里有 15 份文档,apps/android/ 下有几十个 Compose 界面测试,services/api/ 里有账号、计费与托管服务的基础设施——但那些商业化开关,作者选择默认全部关着。

为什么它值得关注

过去一年,我们见惯了「把大模型包一层再收订阅费」的产品。Mural 走的是相反的路:把模型能力直接交还给用户,把学习数据锁在本地,把代码全部摊开

它把一个很现实的问题摆到台面上——当语音模型的实时对话能力已经足够好的时候,语言学习 App 的价值究竟剩下什么?Mural 的答案是:剩下的是教学策略本身(教什么、什么时候纠错、如何用证据衡量掌握度),而这种东西本来就该是可以被检视、被替换、被你自己拥有的。

如果你手边正好有一台装了 Xcode 的 Mac 和一部 iPhone,又恰好想捡起一门放了很久的语言,Mural 可能是今年最值得自己动手装一次的开源项目之一。

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

请登录后发表评论

    暂无评论内容