乐于分享
好东西不私藏

我写了个即时回放录音 App,永远在听你说话,但永远不上网

我写了个即时回放录音 App,永远在听你说话,但永远不上网

想必各位生活中肯定很多时候都会错过一些美好的瞬间或者有趣的瞬间吧,比如说朋友的一句玩笑话「今天我不xxx我就是xx」,亦或是各种场面下的语录证据,总有些时候巴不得一直开着录音,不想错过这些精彩,也不想丢掉这些证据。

但是谁会随时按录音键呢。

然后我就想到了 NVIDIA ShadowPlay。

老 PC 玩家应该都懂这个东西。它常驻后台,永远在录你最近 30 秒的游戏画面,你随时按一下快捷键,刚才那个神操作就被保存成视频了。没按就丢,按了就有。

我当时就想,这玩意儿要是能装在手机上录声音就好了。

于是就有了 Echo。

中文名我叫它小E,做的是 ShadowPlay 那种「即时回放」体验,但跑在你自己的手机上,永远在听,只在你想保存时才保存。

聊到这明白大概的朋友估计只想问下载方式了,那就先放下载方式再继续介绍吧。

我把它开源在 GitHub 上了,仓库地址:github.com/xfjsssq/Echo 开源免费,APK 直接下,觉得有用可以顺手点个星标⭐

国内网络访问 GitHub 有时候抽风,所以给你备了两个加速镜像(下载后建议核对签名):

  • 主推:https://gh-proxy.com/https://github.com/xfjsssq/Echo/releases/download/v0.30/Echo-0.30.apk
  • 备选:https://ghfast.top/https://github.com/xfjsssq/Echo/releases/download/v0.30/Echo-0.30.apk

Release 页面(可核对签名指纹):https://github.com/xfjsssq/Echo/releases/latest

回到项目本身听起来很简单对吧。我真动手写才发现,这玩意儿坑比想象中多多了。

先说核心机制。

简单讲,Echo 一直在后台录着,每 10 秒切一段存起来,最近的 3 分钟滚动留着,老的自动丢掉。

你点保存的时候,这几段会被原样拼成一条完整的录音。注意是原样拼,不重新录也不重新编码,音质一点不损失。

为什么不重新编码呢。

因为重新编码一来伤音质,二来特别耗电。一个常驻后台的录音 App,每保存一次就重新编码一次,手机会烫成暖宝宝。所以 Echo 走的是底层方案,把每一段的原始音频数据读出来再拼进同一个文件里,时间戳按段累加。这玩意儿调通花了我好几个晚上。。。

为什么是 10 秒一段呢。段太短,文件太多手机会卡。段太长,万一保存前出点意外,丢的也多,比如 60 秒一段,保存时正好卡在中间,前 30 秒可能就没了。10 秒是测试下来比较稳的折中。

缓冲时长可以在设置里调,30 秒到 10 分钟五档,默认 3 分钟。我自己用的是 5 分钟,因为聊到兴头上根本意识不到要保存,等回过神来 3 分钟可能不够。

说到这个我得承认一件事。

Echo 不是那种发布即完美的产品。我现在自己用,每天还能遇到不顺手的地方。比如深色主题的色块边界还有点突兀,logo 只适配了亮色主题,页面切换动画也还略硬。

= = UI 这块确实是我弱项。

但这些我自己心里有数。我不想等「都做完了」再发布,因为做完是个伪命题,软件永远在做。所以我先把核心功能打磨稳定,把它开源出来,让真正需要的兄弟先用上,剩下的慢慢磨。

接着聊最让我执念的那块,隐私。

这块我说真的,是 Echo 跟市面上所有录音 App 拉开差距的地方。

Echo 不声明 INTERNET 权限。

不是「声明了但不上传」,是直接在 AndroidManifest 里就没有这一行。物理上无法联网。

什么意思呢,意思是你手机上装的 Echo 这玩意儿,哪怕开发者我哪天想作恶想偷你的录音去卖钱,我也做不到。我没给你留任何上传通道。

你可能要问,那自动备份怎么办。备份是写到你自己手机的 Downloads/EchoBackup 目录,是本地公共目录,不是云。

我也知道很多兄弟对国产 App 的「联网权限」已经麻木了,一个手电筒 App 都要 INTERNET 权限。但我就是觉得,录音这种东西,是个人隐私里最敏感的一类,你跟朋友聊什么、聊到谁、什么语气,全在里面。这种东西上云,是不可接受的。

所以 Echo 的设计就是从根上断网。无账号,无广告,无追踪,无任何网络库。代码里没有 OkHttp,没有 Retrofit,没有 Ktor,一行都没有。

有人可能纳闷,那这玩意儿怎么挣钱。

不挣钱。开源免费。GitHub 公开仓库,APK 直接下载。我写这个东西本身就是为了自己用,顺便给同样有这个痛点的兄弟用。能挣钱当然好,挣不到也无所谓,反正开发成本就是我的时间。

顺着上面的再聊聊密码这块。

录音既然这么敏感,那门得锁好。Echo 支持 6 位 PIN 或者 6 到 32 位的扩展密码二选一。

密码用 PBKDF2-HMAC-SHA256 加盐 10 万次迭代,只存哈希不存明文。这个算法不是我自己拍脑袋选的,是行业里认证密码的标准做法,连 1Password 这种密码管理器用的也是这套。

防暴力破解有分级锁定,错 3 次锁 30 秒,5 次锁 1 分钟,7 次锁 3 分钟。比较骚的是,密码比对用了常数时间比较,防时序攻击。这种细节可能一辈子用不上,但用上一次就救命。

还设计了恢复密钥机制。设置密码时生成一个 6 位数字密钥,只展示一次,忘记密码时用它重置。我特意做成修改密码不重置恢复密钥,关闭密码也保留哈希,这样重开不需要重设。这种用户体验上的小贴心,是我自己踩坑踩出来的。

回到数据这块。Echo 的录音分三类。

临时录音是默认分类,24 小时自动清理,不占空间。这个设计参考了 ShadowPlay 的「缓存丢掉」逻辑,你录的 90% 其实是不值得留的,让它自动过期省得手动清。

长期录音是一键转存的,永久保留,自动备份到公共目录。

比较有意思的是第三类,叫未处理。这是异常兜底用的。

什么意思呢,假如你录音录到一半系统把你杀了,或者断电了,那个没保存的缓冲段会被紧急抢救下来。下次打开 Echo,它会主动问你这段要不要留。

我自己测试的时候杀了又杀,这一套兜底机制到现在没丢过数据。这种稳是我特别骄傲的地方。

说到备份这块,再展开一下。

长期录音会自动备份到你手机的下载文件夹里,新建一个 EchoBackup 目录存着,不用手动选文件夹,新版老版系统都自动搞定。

重点是卸载不丢,重装可导入。重装之后一键导入备份文件,按源文件日期命名分组,比如「7月23日 14:30.m4a」。

公共目录文件管理页还能查看和删除备份原件,但删除是双重密码验证,应用密码加恢复密钥。我特意把删除做得这么重,是因为我发现备份误删是用户最大数据丢失原因,比软件 bug 还多。

这种「故意不让你轻易删」的设计,是反直觉的,但反得有道理。

下面聊一个我觉得挺哲学的点。

Echo 是我写的第一个 Android 项目。我之前不做移动端,是踩着 Kotlin 和 Jetpack Compose 从零开始学的。

写的过程中我突然意识到一件事。

录音这个事情,跟拍照不一样。拍照你已经有了「按一下快门」这个明确动作,你能意识到「这个瞬间值得留」。但是声音没有「快门」。

你正在跟朋友聊天,聊到一句很妙的话,你不会想到「这句话值得录」,因为你想到了就已经晚了,那句话已经过去了。

Echo 做的事情,是给声音补上了「快门」这个动作。不是按之前的快门,是按之后的快门。

我觉得这件事有点意思。它对应的是一种「当下不可知,回头才显形」的体验。很多重要的东西,在你经历它的时候你不会知道它重要,只有事后回头看,才发现那是个关键节点。

Echo 给了你回头看的余地。最长 10 分钟。

OK 文章也差不多做个结尾了

开源免费,欢迎白嫖。也欢迎提 issue,bug 和建议都可以,我会看。

再补一句,我做 Echo 不是为了创业,不是为了融资,也不是为了证明什么。我就是想给自己做一个用着舒服的工具,顺便给同样被「没来得及按录音键」困扰过的兄弟一个解。

如果这玩意儿能帮到你,我会很欣慰。如果用不上,也无所谓,反正 GitHub 上多一个不嫌多。

数字生命Q,一个成长中的 AI Agent 开发者,我们下篇见。