鱼眼 · See on Phone
让 AI 住进手机 —— 在手机上聊天,需要时自己看世界。
一个 Android App + 一个电脑插件,同一个仓库,同一份 Apache-2.0。
English, briefly. See on Phone puts an AI agent on the phone instead of on a server: a self-contained Android chat app that can open the camera, fold several frames into one contact sheet, remember things, write files, speak, and listen — no PC required. A companion Node plugin lets a desktop agent borrow the same camera. Blind navigation is one optional mode, not the product.
🐟 它是什么
鱼眼是一个能自己看东西的 AI 聊天 App。 你打字或说话,模型需要知道"眼前有什么"时,
自己调用 look 打开摄像头、看 1~8 秒、把几帧拼成一张宫格、然后回答你。
不需要电脑、不需要上传视频流、不需要装 ffmpeg。
它同时还能:听(语音输入)、说(在线音色 / 系统 TTS)、记(跨会话记忆)、 写文件(自己的一个工作区目录)、搬会话(和桌面 DSH 互通)。
电脑上的插件 dsh-see-on-phone 是另一半:让桌面上的 agent 借手机的眼睛看一眼,
一张 JPEG 回来 —— 屏幕里看不到你桌上的杯子。
三条设计取向(决定了它长成现在这样)
| 取向 | 具体做法 |
|---|---|
| 端上跑,不绕服务器 | 模型 API 你自己填;画面在手机本地拼成一张 471×628 的宫格(4~7 KB)再发出去。没有中转、没有统计 |
| 相机是工具,不是取景器 | 只有 look 被调用时借相机,没人要 3 秒后自动关。想自己看画面进"通话页" |
| 导盲只是读者之一 | normal(你看得见,它给你细节)和 guide(你看不见,它只给结论和动作)是同一个模型的两个提示词,不是两套代码。它不是辅具,见 NOTICE |
📦 装哪个
仓库的 Releases 里每次都放两个文件, 按你需要挑:
| 你想要 | 下这个 | 还需要 |
|---|---|---|
| 手机上有个能聊天、能看东西的 AI | see-on-phone-<ver>.apk |
一个 OpenAI 兼容的 API Key |
| 让电脑上的 agent 借手机的眼睛 | dsh-see-on-phone-<ver>.tgz |
必须先装上面那个 APK(手机就是服务端) |
| 两个都要 | 两个都下 | 同上 |
不需要新仓库,也不需要两个仓库。 App 和插件是一个产品的两端,版本一起发、契约一起改, 分开放只会让"插件 0.4 配 App 0.29"这种错配变成常态。Release 用两个资产区分就够了。
🐠 鱼眼 App
能干什么
- 聊天:流式输出、Markdown 渲染、思考过程可折叠、上下文预算可调(2k~900k)
- 看:
look工具 —— 开相机 → 采样 → 挑帧 → 拼宫格 → 交给模型。宫格是按镜头切换点排的, 动得多的帧给大格子,静止的给一条;不是平均切九宫格 - 听:系统语音识别,单句输入
- 说:内置在线音色(小轩 / 晓晓 / 晓伊 / 云希 / 云扬),失败回落系统 TTS
- 记:
memory_read/memory_write,跨会话;每轮自动带上 - 写:
files工具,一块固定工作区Download/DSH-Go/workspace/—— 文件管理器里能直接看到、拷走、删 (目录名沿用DSH-Go,这样老版本的会话、记忆、日志原地还能用,不用迁移) - 搬:会话与记忆的摊平导出/增量导入,和桌面
phone-bridge对得上 - 给别人看:内置 HTTP 服务(
127.0.0.1:4444),电脑插件靠它工作
界面
| 会话页 | 通话页 | 设置 | 对话 |
|---|---|---|---|
| 消息流 + 输入栏 + 工具状态 | 实时预览 + 字幕(离开就还相机) | 分组卡片,17 项配置一页到底 | 置顶 / 今天 / 更早,搜索和新建 |
截图是实机(华为,1084×2412)跑的 1.0.0,没有修饰。
它看到的是什么
不是平均切的九宫格。 先算逐帧变化分 → 找镜头切点 → 按切点密度分档 → 行 DP 装箱:动得多的帧给大格子,没动的给一条。所以一张图里信息量是被分配过的。
一张 471×628 的 JPEG,4~7 KB,约 197 token。
装法
# 1. 从 Releases 下 APK,然后
adb install -r see-on-phone-<ver>.apk
# 2. 打开「鱼眼」→ 右上角齿轮 → 填接口和 Key
# 接口:https://api.deepseek.com/v1 (任何 OpenAI 兼容端点都行)
# 模型:deepseek-chat
第一次点"看"会申请相机权限。装在应用商店之外(sideload),系统会提示风险,正常。
自己编译
不需要 Gradle,不需要 Android Studio。只要 JDK 17 + 一份 android.jar + 四个 jar(d8 / aapt2 / apksigner / lib):
export ANDROID_SDK=/path/to/android-sdk # 里面有 android.jar 和 build-tools
bash app/build.sh # 6 步:javac → d8 → aapt2 compile → link → 塞 dex → 签名
产物 app/see-on-phone.apk,约 220 KB(图标是 WebP)。构建细节与踩过的坑:app/docs/BUILD.md。
- ≤ 28 会被新系统弹"此应用是针对旧版 Android 打造的",OPPO/小米上都见过;
- ≥ 30 强制分区存储,
Download/鱼眼/下的工作区文件就写不进去,得改成 SAF 或申请全盘权限; - Android 12 的后台启动限制只管 targetSdk ≥ 31 的 App,而它要开机自启;
- sideload 没有 Play 的 targetSdk 门槛,所以 29 没有代价。
🖥 电脑插件 dsh-see-on-phone
npm i -g dsh-see-on-phone # 或者从 Release 里的 .tgz 装
模型调用 see_phone → 插件 HTTP 打手机 /look → 手机自己采、自己挑、自己拼 → 一张 JPEG 回来。
电脑这边不抽帧、不装 ffmpeg、不拉原始流。
| action | 干什么 | 等待 |
|---|---|---|
look(默认) |
抓一张宫格 | 手机采集 12 秒(wait 可调 0.58) |
watch |
看"这一会儿发生了什么" | 默认 8 秒 |
peek |
最快的一张 | 1 秒 |
status |
手机状态(相机/上下文/思考/朗读) | — |
stop |
停语音(相机归手机自己关) | — |
mode:"normal"(默认,用户看得见画面)或 mode:"guide"(导盲:只给结论和动作)。
配置只有两项,在 ~/.dsh/see-phone.json:url 和 mode —— 档位、节奏、前后摄像头都在手机 App 里,
两个地方各存一份配置最后一定会打架。
node scripts/doctor.mjs # 手机通不通、语音播放有没有
node scripts/smoke.mjs 6 # 拍 6 秒存成 jpg,自己看
🧭 出处与署名
拼图那套(切点检测 → 档位 → 行 DP 装箱 → 拼图 → token 换算)最初写在
dsh-see-now 和
dsh-video-storyboard 里,
App 里这份是同一套算法的 Java 逐行移植(同作者,同许可),曾经逐字节对拍过。
在线音色的 Sec-MS-GEC 令牌参考 edge-tts(GPL-3.0)的
协议行为,但 Drm.java / EdgeTts.java 是独立 Java 实现,仓库里不含它的任何一行代码。
当前代码树没有任何第三方源码。逐条见 CREDITS.md。
⚖️ 许可
Apache-2.0。拿去商用、改名、闭源分发都可以,保留版权与许可声明即可。
但它不是辅具。 这个 App 会把画面变成文字描述,它会看错、会延迟、会在暗处失灵。 过马路、上下楼梯、避障 —— 用白杖、用导盲犬、用无障碍设施。详见 NOTICE。
No comments yet. Be the first to write one.