Skip to content

Releases

v2.3.0

Choose a tag to compare

@SAOS-3624 SAOS-3624 released this 15 Nov 05:28

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

Choose a tag to compare

@SAOS-3624 SAOS-3624 released this 14 Nov 12:35

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

Choose a tag to compare

@SAOS-3624 SAOS-3624 released this 14 Nov 11:50

⚠️ 这一版搬会话会失败(导出被并发请求撞死,一张图缺失就整包失败),请用 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

Choose a tag to compare

@SAOS-3624 SAOS-3624 released this 14 Nov 11:11

⚠️ 这一版把在线音色删了,理由是「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 / 厂商自带的都行):

  1. 设置 → 语音 → 音色 → 对话框右下角 「更多音色」,直接跳到系统的「文字转语音」设置;
  2. 在那儿装引擎、下中文语音包;
  3. 回设置 → 音色,刚装的那些就在列表里。

功能没有消失,只是不再由我们替你联网合成。

其他改动

  • 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

Choose a tag to compare

@SAOS-3624 SAOS-3624 released this 14 Nov 07:42

⚠️ 这个版本含 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

Choose a tag to compare

@SAOS-3624 SAOS-3624 released this 13 Nov 12:46

⚠️ 这个版本含 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

Choose a tag to compare

@SAOS-3624 SAOS-3624 released this 13 Nov 12:24

⚠️ 这个版本含 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 修的三件事(还没装的话一起补上)

  1. 自动开/关都不抓帧、问它一直是同一张图 —— 现在通话页一开就一直采,关着也采,只是不发
  2. 说出来的话不显示、说完了还显示"在想" —— 字幕现在只放它真说过的话
  3. 通话页相机 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

Choose a tag to compare

@SAOS-3624 SAOS-3624 released this 13 Nov 12:14

⚠️ 这个版本含 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

Choose a tag to compare

@SAOS-3624 SAOS-3624 released this 13 Nov 11:30

⚠️ 这个版本含 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(都是这一轮才发现的)

  1. 流式回答收尾丢最后一段字 —— 气泡停在中途。现在 onReply 用落盘全文先覆盖再重建,
    日志里 ui reply streamed=N authoritative=M 两个数对不上就是还有问题
  2. 键盘弹起时整条输入栏被压在键盘下面(沉浸式顶掉了 adjustResize)——
    改成按 window insets 补底部留白,键盘收起再降回去
  3. 长段落气泡只有半屏宽(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

Choose a tag to compare

@SAOS-3624 SAOS-3624 released this 11 Nov 05:51

首个公开版本。

两种模式: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/。