Repository navigation
Releases
v2.3.0
2.3.0 —— 小轩回来了
2.1.0 曾把在线音色整段删掉,理由是「GPL 会污染整个 APK」。那个判断不准确。
重新核过 rany2/edge-tts 的 LICENSE 原文:它是 LGPLv3
(只有 src/edge_tts/srt_composer.py 是 MIT),不是 GPL-3.0。而 LGPL 有「组合作品」例外 ——
把 LGPL 代码编进同一个程序,不会让整个程序变成 LGPL/GPL。
所以这一版:
- 5 个 Edge 在线音色加回来了:小轩 / 晓晓 / 晓伊 / 云希 / 云扬(设置 → 音色,前 5 项)
- 许可标对:
Drm.java/EdgeTts.java两个文件加SPDX-License-Identifier: LGPL-3.0-or-later,
其余代码仍是 Apache-2.0;CREDITS 新增 §4.1 说清边界,APK 内许可页同步 - 默认仍是系统 TTS:设置里选中才联网合成;合成/播放任一步失败都自动回落,不会让 App 哑掉
关于「小轩」
它不在音色列表接口里(今天拉下来 318 个音色、中文 14 个,都没有 zh-CN-XiaoxuanNeural),
但合成接口认它 —— 实测 2.33s / 13968 字节,和晓晓(2.14s)、云希(2.30s)哈希各不相同,
不是被静默替换成默认嗓子。
升级注意
- 升过 2.1 / 2.2 的人:那两版会把你选的「小轩」清空成系统默认,升级后要去 设置 → 音色 里重选一次。
- 这一版不再清空旧值,以后不会再丢。
⚠️ 在线音色连的是微软没有公开的消费级接口(Edge 的「大声朗读」后端):随时可能失效,
也可能不符合微软服务条款。用不用、担不担这个风险,自己判断;失效时不影响其它功能。
资产
| 文件 | 给谁 |
|---|---|
see-on-phone-2.3.0.apk |
手机 App(241 KB,与旧版同一签名) |
dsh-see-on-phone-2.3.0.tgz |
电脑插件(或 npm i -g dsh-see-on-phone) |
SHA256
5073af8036f983a1f8e2ef34e323495d2c15cc31d8c797e1b0fb0dc1eb58a3bd see-on-phone-2.3.0.apk
f1a35ba70d6743228d7168334766ad778abf731a24d0417176c1498e70a4b5bb dsh-see-on-phone-2.3.0.tgz
v2.2.1
2.2.1 —— 一张图不该让整个导出崩掉
真机上把 dsh-see-on-phone sync 跑起来才炸出来的问题,两个原因叠在一起:
① 两个导出撞车。 sync 先走数据线、失败再回落局域网,各触发一次「导出」。
后一次的清理动作把前一次正在打包的文件删了,前一次读到一半就
1794572042952.jpg: open failed: ENOENT —— 整个导出返回失败,一条也搬不了。
→ 导出改成串行(synchronized),一次只跑一个。
② 单张图缺失就整包失败。 列目录到真正读之间,文件可能已经没了(并发 / 用户自己清了图)。
一张图不该毁掉整包。→ 拷图、拷会话、拷记忆、打包四处都改成"这份跳过,剩下的照做",
并在 eye.log 留一行 port 跳过 …,事后查得到。
这次只改 App 侧,插件代码没动;版本号跟着同号,方便两端对得上。
怎么升
装上覆盖即可,对话和设置都在。注意:不要停在 2.2.0 —— 那一版搬会话基本搬不动。
资产
| 文件 | 给谁 |
|---|---|
see-on-phone-2.2.1.apk |
手机 App(230 KB,与旧版同一签名) |
dsh-see-on-phone-2.2.1.tgz |
电脑插件(或 npm i -g dsh-see-on-phone) |
SHA256
742f07ca88c177511cf645d9e58fc90d59092f0ecb8255038d9a2c02c98036a4 see-on-phone-2.2.1.apk
59d5d21e056f21ab9eaf88a95a1d29ace4040c087286845ad7820cd1b0e96a8d dsh-see-on-phone-2.2.1.tgz
v2.2.0
⚠️ 这一版搬会话会失败(导出被并发请求撞死,一张图缺失就整包失败),请用 v2.2.1。
2.2.0 —— 搬会话,一条命令
新增:装完插件就能搬,不用再 cd 进仓库
以前搬会话要 git clone 下来、在仓库里跑 tools/phone-sync.mjs —— 那是给开发用的。
这些能力现在搬进了包:
npm i -g dsh-see-on-phone| 命令 | 干什么 |
|---|---|
dsh-see-on-phone sync |
一条命令:从手机拉包 + 导进 DSH |
dsh-see-on-phone status |
先看手机在不在 |
dsh-see-on-phone export latest |
反向:把 DSH 里最近改过的那条导出来 |
dsh-see-on-phone push |
推到手机 |
dsh-see-on-phone doctor |
体检:哪些会话 DSH 打不开、为什么 |
dsh-see-on-phone repair --write |
修(默认只看不改,每个文件先备 .bak-*) |
- 只加不删:手机侧按时间戳增量追加,电脑侧新建/补齐,从不 truncate。
- 图片不跟着搬:导出时换成一行「图已省略」占位,手机上的原图还在。
- 不插线也能搬:手机开「局域网」,
sync --host 192.168.1.5:4444。 - 默认值改成对陌生人成立(
~/.dsh、PATH里的 adb、当前目录当项目),
每个都能用环境变量覆盖。找不到时给一句能照做的话,不甩ENOENT。
修复:APK 里的「许可」页点不开(2.1.1)
setMessage + setItems 一起用,在真机上列表项整个不显示,只剩一坨文字和「关了」,
许可全文根本点不开 —— 等于 Apache-2.0 §4(a) 那条"随分发附许可"没做到。
改成三个按钮(许可全文 / 第三方署名 / 关了);NOTICE 走 Markdown 渲染,不再原样显示 # 和 **。
App 里的说明同步换了
设置 →「备份与迁移」写 dsh-see-on-phone sync,「局域网」写 dsh-see-on-phone status --host <ip>:4444;
「发到电脑」失败时提示装插件,不再让人去翻 tools/phone-sync.mjs。
资产
| 文件 | 给谁 |
|---|---|
see-on-phone-2.2.0.apk |
手机 App(230 KB,与旧版同一签名,可覆盖安装) |
dsh-see-on-phone-2.2.0.tgz |
电脑插件(或 npm i -g dsh-see-on-phone) |
SHA256
35ec05e4da3dab5f8730a6688632000bacac651f772f0da490a450af1db7ea2b see-on-phone-2.2.0.apk
4f5506e35cf479031b5d37870ed28da9f5816bb440f14f6c92d784191db394ad dsh-see-on-phone-2.2.0.tgz
⚠️ 更早的版本
- 2.1.0:许可页有上面的 bug,用 2.2.0。
- 1.3.x 及更早:APK 内含 GPL-3.0 演绎代码(在线音色),请按 GPL-3.0 使用。
说明见 CREDITS §5.1。
v2.1.0
⚠️ 这一版把在线音色删了,理由是「GPL 污染整包」——那个判断不准确(那是 LGPL)。想要小轩请用 v2.3.0。
⚠️ 这一版的「许可」页在真机上点不开(列表项不显示),请用 v2.2.0。
2.1.0 —— 拿掉在线音色,换成"你自己装"
为什么砍功能
App 1.x 内置过 5 个 Edge 在线音色(小轩 / 晓晓 / 晓伊 / 云希 / 云扬)。连那个接口要自己算
Sec-MS-GEC 令牌,而当时的实现是照着 GPL-3.0 的 edge-tts
逐位翻译成 Java 的 —— 把一份实现翻译成另一种语言,在著作权上就是演绎作品。那两个文件受
GPL-3.0 约束,而它们被编译进同一个 APK,整个 APK 就会被一起拖进 GPL。
这个项目的卖点是 Apache-2.0:拿去商用、改名、闭源分发都可以。所以整条链路删掉了(852 行)。
音色怎么补回来
装一个系统语音引擎就行(讯飞 / 搜狗 / Google TTS / 厂商自带的都行):
- 设置 → 语音 → 音色 → 对话框右下角 「更多音色」,直接跳到系统的「文字转语音」设置;
- 在那儿装引擎、下中文语音包;
- 回设置 → 音色,刚装的那些就在列表里。
功能没有消失,只是不再由我们替你联网合成。
其他改动
- APK 自带许可:许可全文与 NOTICE 打进包里(
res/raw/),设置 → 关于 → 许可 能直接看。
(Apache-2.0 §4(a) 要求随分发附许可,而 APK 是独立下载的二进制。) - CREDITS 重写:§3 补上 PySceneDetect(BSD-3) 的思想署名(HSV 加权打分);§5.1 如实记下
上面这段 GPL 演绎与删除;§8 说明许可怎么随二进制走。 - 设置页「关于」多了「许可」一行。
⚠️ 旧版本请注意
1.3.x 及更早的 APK 内含上述 GPL 演绎代码(Drm.java / EdgeTts.java)。
拿到那些包的人,请按 GPL-3.0 使用与再分发,对应源码见 v1.3.20 标签。
2.1.0 起不含任何 GPL 代码。
资产
| 文件 | 给谁 |
|---|---|
see-on-phone-2.1.0.apk |
手机 App(230 KB,与旧版同一签名,可直接覆盖安装) |
dsh-see-on-phone-2.1.0.tgz |
电脑插件(或 npm i -g dsh-see-on-phone) |
SHA256
c96167025fdccbb80f87fe27e4ff7b8119b40da3022b51abae6714dff53f9af6 see-on-phone-2.1.0.apk
beff9f86a1a2231f39ef1597523c1130006fe42bdb6c97f1649179f853d48c5f dsh-see-on-phone-2.1.0.tgz
v2.0.0
⚠️ 这个版本含 GPL-3.0 演绎代码,请按 GPL-3.0 使用。它的在线音色(
app/src/com/dsh/eye/Drm.java+EdgeTts.java)是把
edge-tts(GPL-3.0)逐位翻译成 Java 的,属于演绎作品;
同一个 APK 里的 Apache-2.0 代码因此也受 GPL-3.0 约束。想拿纯 Apache-2.0 的包,用
v2.1.0 及以后(那条链路已删除)。说明见
CREDITS §5.1。
App 和插件第一次同号:以后两边都跟着 2.x 走,不再一个 1.x、一个 1.3.x。
App(2.0.0)
- 新增「设置 → 数据 → 电脑地址」:不插数据线也能点「发到电脑」
- 以前这个地址写死
127.0.0.1:7788,只有插着线(电脑端会建 adb 反向隧道)时才指得到电脑,
拔线后按钮必然失败 —— 但包其实已经导出到手机本地,只是通知不到电脑 - 现在可以填电脑的局域网地址(形如
192.168.0.100:7788),两边同一个 WiFi 就能直接发 - 留空仍是
127.0.0.1:7788,插线的用法完全不变
- 以前这个地址写死
- versionCode 200
插件(2.0.0)
- 对外契约无变化:
/status/frame.jpg/video/mjpeg/look/say/ask/config一个字段没动 - 这次只跟随 App 改版本号
资产
see-on-phone.apk—— 手机端,Android 5.0+dsh-see-on-phone-2.0.0.tgz—— 电脑端插件(也可以在 npm 上装dsh-see-on-phone@2.0.0)
鱼眼 · See on Phone 1.0.3
⚠️ 这个版本含 GPL-3.0 演绎代码,请按 GPL-3.0 使用。它的在线音色(
app/src/com/dsh/eye/Drm.java+EdgeTts.java)是把
edge-tts(GPL-3.0)逐位翻译成 Java 的,属于演绎作品;
同一个 APK 里的 Apache-2.0 代码因此也受 GPL-3.0 约束。想拿纯 Apache-2.0 的包,用
v2.1.0 及以后(那条链路已删除)。说明见
CREDITS §5.1。
鱼眼 · See on Phone 1.0.3
修通话页抓帧 —— "只抓很近的两帧"是真的算法问题,不是感觉。
| 文件 | 是什么 |
|---|---|
see-on-phone-1.0.3.apk |
手机 App(Android 5.0+) |
dsh-see-on-phone-1.0.3.tgz |
电脑插件(手机上也必须先装 App) |
病根一:采样窗口和发送节奏完全脱节
采样定死 900ms 一张,N=3 只横跨 1.8 秒 —— 而发送窗口是 15~25 秒。
中间那十几秒一帧都没采,所以每次发出去的永远是"刚刚这一两秒"。
改成 间隔 = max(1s, min(6s, 发送间隔 / 张数)):三张正好覆盖一个窗口。
实测日志(改前 → 改后):
look compose fed=3 frames=2 ← 1.0.2
look compose fed=3 frames=2 span=12.0s ← 1.0.3
病根二:拼图前又被切点算法筛掉一帧
Looker.compose 原来用默认参数(cutAbs=12 / integralSeconds=3 / silentFloorSec=20)。
那是给"几十秒连续帧流"设计的:判据负责从一大堆帧里挑出有信息的几张。
但这里已经按时间挑好了,再筛一遍的结果就是中间那帧被判"变化不够大"丢掉。
现在 compose 用单独一套:切点/孤立/邻域/跳变/尖峰判据全部置 0,积分与兜底关掉,
只挡完全一致的两帧。喂几张留几张(档位、装箱、拼图仍走同一套对拍过的实现)。
所以静止画面(比如手机扣在桌上)仍然可能只有 1~2 格 —— 那是忠实地告诉你
"这段时间画面没变",不是丢帧。画面一动就是满格。
病根三:"攒满了也不发"
上一版加的"跟上一次一样就跳过" + 连续没变化的翻倍退避(最久 60 秒),
表现就是攒满 3/3 停在那里不动。两条都删了:攒满就发。
真没内容时模型会回一句「没什么变化」,那一轮不朗读、不落盘,不会污染聊天记录。
另加一个看门狗:一轮超过 120 秒没回(回调丢了),自动放行,不会永久卡死。
节奏对照(顶部胶囊 0/3 → 3/3 要多久)
| 灵敏度 | 发送间隔 | 每张间隔 | 攒满耗时 |
|---|---|---|---|
| 平静 | 25s | 6s(夹到上限) | ~18s |
| 正常 | 15s | 5s | ~15s |
| 灵敏 | 8s | 2.7s | ~8s |
| 游戏 | 20s | 6s(夹到上限) | ~18s |
adb install -r see-on-phone-1.0.3.apk
npm i -g dsh-see-on-phone@1.0.3它不是辅具。 导盲模式只是"读者"之一,会看错、会延迟、会在暗处失灵。
鱼眼 · See on Phone 1.0.2
⚠️ 这个版本含 GPL-3.0 演绎代码,请按 GPL-3.0 使用。它的在线音色(
app/src/com/dsh/eye/Drm.java+EdgeTts.java)是把
edge-tts(GPL-3.0)逐位翻译成 Java 的,属于演绎作品;
同一个 APK 里的 Apache-2.0 代码因此也受 GPL-3.0 约束。想拿纯 Apache-2.0 的包,用
v2.1.0 及以后(那条链路已删除)。说明见
CREDITS §5.1。
鱼眼 · See on Phone 1.0.2
把 灵敏度 和 档位映射 还回设置页 —— 之前它们只活在模型的 tune 工具里,
设置页面上一眼看不到,看起来像"被删了"。
下哪个?
| 文件 | 是什么 |
|---|---|
see-on-phone-1.0.2.apk |
手机 App(Android 5.0+)。只想要手机上能用就下这个 |
dsh-see-on-phone-1.0.2.tgz |
电脑插件(DSH 的 see_phone)。手机上也必须先装 App |
设置 · 采集(新)
| 项 | 取值 | 作用 |
|---|---|---|
| 灵敏度 | 平静 / 正常 / 灵敏 / 游戏 | 画面变化多快算"变了":切点门槛 20 / 12 / 7 / 80。自动看的频率也跟它走:25s / 15s / 8s / 20s |
| 档位映射 | 标准 / 原生 / 更大 / 更小 / 逐帧 | 每帧在宫格里占多大:越大越清楚也越贵,越小越省 token |
这两个和电脑版 see-now 的「灵敏度 / 档位映射」是同一组参数、同一套取值
(pace / tierStyle),所以在电脑上调好的口径可以直接搬过来,也可以反过来搬回去。
模型用 tune 工具调的也是这两个键 —— 你在设置里改完,它下次看一眼就按新的来。
自动看不再"太灵敏"
- 间隔跟着灵敏度走(见上表),默认「正常」= 15 秒一次,之前写死 8 秒。
- 连续"没什么变化"会自动退避:每连着一次没内容,间隔翻倍,最多 60 秒。
手上举着手机轻微晃这种场景,它自己就安静下来了;真有事(画面明显变了)立刻恢复。 - 判"是不是同一张画面"的阈值也跟着灵敏度走:平静要变很多才算变,灵敏动一点就算。
- 改灵敏度会立刻生效并清掉退避(不用等下一分钟)。
设置 · 通话(1.0.1 已有)
- 攒帧张数(2~6,默认 3)
- 自动看 开关
- 顶部胶囊
在看 · 自动 · 开 · 2/3读作"攒了几张还没发",发完归零重新攒
1.0.1 修的三件事(还没装的话一起补上)
- 自动开/关都不抓帧、问它一直是同一张图 —— 现在通话页一开就一直采,关着也采,只是不发
- 说出来的话不显示、说完了还显示"在想" —— 字幕现在只放它真说过的话
- 通话页相机 640 → 1024,拼宫格不再糊到认不出
装法
adb install -r see-on-phone-1.0.2.apk # 手机,覆盖安装,会话与记忆都在
npm i -g dsh-see-on-phone@1.0.2 # 电脑Apache-2.0。出处署名见
CREDITS.md。
它不是辅具。 导盲模式只是"读者"之一,会看错、会延迟、会在暗处失灵。
鱼眼 · See on Phone 1.0.1
⚠️ 这个版本含 GPL-3.0 演绎代码,请按 GPL-3.0 使用。它的在线音色(
app/src/com/dsh/eye/Drm.java+EdgeTts.java)是把
edge-tts(GPL-3.0)逐位翻译成 Java 的,属于演绎作品;
同一个 APK 里的 Apache-2.0 代码因此也受 GPL-3.0 约束。想拿纯 Apache-2.0 的包,用
v2.1.0 及以后(那条链路已删除)。说明见
CREDITS §5.1。
鱼眼 · See on Phone 1.0.1
修的是通话页 —— 上一版有三个真 bug,根因都是同一个"永远不触发"。
下哪个?
| 文件 | 是什么 |
|---|---|
see-on-phone-1.0.1.apk |
手机 App(Android 5.0+)。只想要手机上能用就下这个 |
dsh-see-on-phone-1.0.1.tgz |
电脑插件(DSH 的 see_phone)。手机上也必须先装 App |
1. 「自动开/关都不抓帧,问它一直是同一张图」
病根:自动关着的时候根本不采帧;自动开着又要"这一轮攒够 2 帧以上"才发 ——
而静止画面永远只有 1 帧,于是永远不发。两头都堵死,它只能看历史里那张老图。
现在:只要通话页开着,就一直采(900ms 一张),滚动缓冲只保留最新 N 张
(N = 设置 · 通话 · 攒帧张数,默认 3)。
| 自动 | 行为 |
|---|---|
| 开 | 攒满 N 张新帧就拼成一张宫格发过去,它自己看一眼、有话说就说一句。间隔 ≥8 秒;画面一直没变则最多憋 30 秒再看一眼 |
| 关 | 一个字节都不发。等你打字或说话时,把这 N 张拼成一张宫格挂在你的话上一起发 —— 它回答的是"你现在看到的" |
发出去之后计数归零:胶囊上的 3/3 是"攒了几张还没发",发完立刻变 0/3 再从头攒。
(1.0.1 早期构建发完不清队列,计数器一直停在满格、同一批帧还会被反复拼 —— 已修。)
配套修的四个坑:
current != null不能用来判断"有没有一轮在跑"。current是"最近一个 asker",
跑完也不置空 —— 于是只要用户说过一句话,自动看就永久失效。换成真正会复位的busyRound。- "画面没变"不能用字节相等判断。静止画面的 JPEG 也有自动曝光/传感器噪声,
逐字节比永远判不出"没变",结果是每 6 秒发一次同样的图、模型每 6 秒回一次"没变化"。
改成抽 128 个点、明显不同(|差|>16)超过 8% 才算变了。 - 通话页相机改用 medium(1024)。640 长边拼成宫格后模型会直接说"糊到认不出"。
- 新增
Looker.compose():从缓冲直接拼宫格,不碰相机、不空等两秒。
顶部胶囊现在显示 在看 · 自动 · 开 · 2/3 —— 那个 2/3 是缓冲进度,
它是"到底有没有在抓帧"的唯一证据。
2. 「说出来的话有时不显示,说完了还一直显示还在想」
onTool / onRoundReset 以前会把字幕换成"自己看一眼…" / "正在想…",
而朗读是异步排队的 —— 于是声音还在念上一句,字幕已经变成"在想"。
现在:字幕只放它真说过的话,"在想 / 在看 / 在说"只进顶部胶囊。
另外 onDelta 的 80ms 节流补了一次收尾刷新,最后一段不会再被吞。
3. 设置页新增「通话」组
- 攒帧张数(2~6,默认 3)
- 自动看 开关(和通话页顶部胶囊那个是同一个值)
装法
# 手机(覆盖安装,会话和记忆都在)
adb install -r see-on-phone-1.0.1.apk
# 电脑
npm i -g dsh-see-on-phone@1.0.1出处与许可
Apache-2.0。代码出处、算法署名逐条见
CREDITS.md。
它不是辅具。 导盲模式只是"读者"之一,会看错、会延迟、会在暗处失灵。
鱼眼 · See on Phone 1.0.0
⚠️ 这个版本含 GPL-3.0 演绎代码,请按 GPL-3.0 使用。它的在线音色(
app/src/com/dsh/eye/Drm.java+EdgeTts.java)是把
edge-tts(GPL-3.0)逐位翻译成 Java 的,属于演绎作品;
同一个 APK 里的 Apache-2.0 代码因此也受 GPL-3.0 约束。想拿纯 Apache-2.0 的包,用
v2.1.0 及以后(那条链路已删除)。说明见
CREDITS §5.1。
鱼眼 · See on Phone 1.0.0
第一个以 鱼眼 为名发布的版本。改名只是顺带的 —— 界面整个重做了一遍。
下哪个?
| 文件 | 是什么 | 装给谁 |
|---|---|---|
see-on-phone-1.0.0.apk |
手机 App「鱼眼」(221 KB,Android 5.0+) | 你的手机 |
dsh-see-on-phone-1.0.0.tgz |
电脑插件(DSH 的 see_phone 工具) |
电脑。手机上也必须先装 App,它才是服务端 |
只想要"手机上有个能聊天、能看东西的 AI" → 只下 APK。
想让电脑上的 agent 借手机的眼睛 → 两个都下。
手机 App
改名与品牌
- 看见 → 鱼眼,图标换成霓虹鱼眼标(含自适应图标,圆形/方形蒙版都不切字)
- 主色从
#4C9AFF换成图标里的电光蓝 → 紫的渐变,深色底整体提亮一档
界面重做
- 会话页:新顶栏(会话名 + 模型·思考档副标题)、渐变用户气泡、带描边的助手气泡、
自绘矢量图标(不再用 emoji 和「说」「图」「↑」这种字)、空态引导、工具状态胶囊、
滚动到底按钮、气泡入场动效 - 设置页:一长串平铺行 → 分组卡片(分组标题 + 行图标 + 副标题 + 右值),并补上「← 设置」顶栏
- 通话页:顶部状态胶囊 + 底部字幕卡 + 圆形挂断键
- 对话列表:置顶/今天/昨天分组,卡片 + 当前会话竖条 + 新建 FAB
交互
- 输入栏改成胶囊:拍一张 · 相册 · 输入框 · 话筒 · 发送
- 相册多选(最多 4 张),预览条是横向缩略图 + 单张删除
- 输入框支持粘贴图片(直接进待发列表)
- 待发图片存在服务里 —— 切后台/被系统回收不丢
- 图片气泡长按 → 再问一句 / 保存;文字气泡长按 → 复制 / 朗读 / 重发
- 发送失败 → 气泡下方出现「重试」
- 输入框随内容长高(最多 5 行)
真机上修掉的三个 P0(都是这一轮才发现的)
- 流式回答收尾丢最后一段字 —— 气泡停在中途。现在
onReply用落盘全文先覆盖再重建,
日志里ui reply streamed=N authoritative=M两个数对不上就是还有问题 - 键盘弹起时整条输入栏被压在键盘下面(沉浸式顶掉了
adjustResize)——
改成按 window insets 补底部留白,键盘收起再降回去 - 长段落气泡只有半屏宽(
setWidth只设了 maxWidth,被父容器的 AT_MOST 夹住)——
改成显式LayoutParams宽度
没变的(故意的)
- 零三方依赖、无 Gradle、
targetSdk 29 - 相机仍然只在
look被调用时借,3 秒留手;离开通话页就还 - HTTP 端点一个没删(电脑插件靠它们活着)
电脑插件
dsh-see-on-phone@1.0.0 —— 内含 0.4.0 的全部重写,首个公开发布版:
- 电脑不再抽帧、不需要装 ffmpeg、不拉原始流;一次
/look拿回一张拼好的宫格 - 与 App 1.0.0 的契约不变:
/look/status/say/ask - 工具描述重写:对齐 0.4.0 的真实行为(
peek不再是"领队列",stop只停语音) - 19 项单元测试 + 语法检查全过
装法
# 手机
adb install -r see-on-phone-1.0.0.apk
# 没有 adb:把 APK 传到手机点安装(sideload,系统会提示风险,正常)
# 电脑
npm i -g dsh-see-on-phone@1.0.0
# 或直接用这个包
npm i -g ./dsh-see-on-phone-1.0.0.tgz装完打开 App → 右上角齿轮 → 填接口(任何 OpenAI 兼容端点)和 Key。
第一次点「看」会申请相机权限。
出处与许可
Apache-2.0。拼图引擎(切点 → 档位 → 行 DP 装箱 → 拼图 → token 换算)是同作者
dsh-see-now 与
dsh-video-storyboard 那套算法的 Java 逐行移植;
在线音色的 Sec-MS-GEC 令牌参考 edge-tts 的协议行为,
但代码是独立实现(仓库里不含它一行)。
当前代码树没有任何第三方源码。逐条见
CREDITS.md。
它不是辅具。 导盲模式只是"读者"之一,会看错、会延迟、会在暗处失灵。
过马路、上下楼梯、避障请用白杖 / 导盲犬 / 无障碍设施。
v0.3.1
首个公开版本。
两种模式:normal(多帧宫格,默认)/ guide(导盲:单帧 + 强制朗读)。
采集链只有一个外部程序:「看见」App 的 MJPEG → 插件内置 jpeg-js 解码 → rgb24。
不依赖 Termux / ffmpeg / python。
画布统一 471×628 = 197 token。 token 按 544² 地板放大后计费,336×448 / 420×560 /
471×628 都是 197 —— 旧的两个尺寸是同一个价买半张票(normal 白扔 21% 像素、guide 白扔 49%)。
471×628 面积≈地板(放大 1.0002 倍)、3:4 与摄像头源同比例零裁切、宽 ≤ 源宽只缩不放。
许可:Apache-2.0。内置 jpeg-js 0.4.4 —— 封装 BSD-3-Clause、lib/decoder.js 是
notmasteryet 的 Apache-2.0,两份许可全文都在 src/cam/vendor/jpeg-js/。