PRIVATE RESEARCH · 2026-10-21 · 真机实测,不是厂商 Demo
NanoAvatar × Remy
端侧口型与双片段实测
已将两个片段分别预处理,组成固定时间线,喂入连续语音并完成真机推理。没有逐角色训练,也没有修改模型权重。它具备作为端侧口型组件的可行性,但尚未实现 RTA 式动态片段选择、无缝过渡和生产稳定性保障。
最新:iPhone 真实流式对话、打断与恢复
真实网络链路已验证:测试语音输入 → 识别 → LLM 动态回复 → Fish 流式音频 → iPhone 本地生成口型。第一轮在回复约 1.2 秒时由测试驱动主动打断,随后第二轮问答恢复并完整结束。输入是预录测试 WAV,不是现场麦克风;识别在每句话输入结束后进行,不是流式 STT。视觉引擎为 DH_live mini 2.0,音频采用半秒 WAV 适配,不是其原生连续 PCM 接口。
直接打开流式对话与打断视频 · 逐轮验收数据 · 独立音轨转写
| 验收项目 | 实测结果 |
|---|---|
| 第一轮输入结束 → 首块音频 / 开始播放 | 3,860 / 4,044 ms;播放时网络尚未 EOF。 |
| 第一轮打断 | 请求后 5,244 ms,网络仍未 EOF;停止当前声源、清队列、恢复原片嘴部。旧播放块计数 3 → 3。 |
| 第二轮输入结束 → 首块音频 / 开始播放 | 2,398 / 2,570 ms;开始播放早于网络 EOF 3,321 ms。 |
| 第二轮恢复与尾音 | 10 块完整播放;末块预计结束 7,160 ms,完成状态 7,197 ms,没有提前收尾。 |
| 本地生成 | 两轮音频播放期间均执行图像推理;第一轮约 30 次、第二轮约 116 次。 |
| 音画录制 | iPhone 页面 canvas 与同一 Web Audio 输出直接录制,非后配音、非扬声器实录;原始视频 21.845 秒、音轨 21.931 秒,等待静音保留。 |
链路验收通过,不等于画质过关。用户指出的张嘴幅度过大、嘴角拉伸仍存在,尚未完成整段音频与半秒块的受控画质对照。此次打断是程序触发,不是用户语音抢话/VAD;没有验证持续通话、最低机型、复杂网络及多片段动态调度。首播放时刻是 Web Audio 启动,不是光学测得的屏幕/扬声器延迟。
先前:iPhone 15 本地 Remy 有声录制
这次是 DH_live mini 2.0 替代引擎,不是 NanoAvatar 转换成功。iPhone 15 / iOS 18.0 / Safari 在本地运行 WASM 图像推理,用我们自己的 Remy 片段和 Fish 语音。下方文件在手机页面内直接合并 canvas 画面与同一 Web Audio 输出录制,不是后期配音,也不是系统扬声器或麦克风实录。
直接打开 iPhone 有声视频 · iPhone 原始测量 · 打开本地推理实验页
| 指标 | 实测/核验 |
|---|---|
| 语音分块 | 18 个短 WAV 块,约 500 ms/块;使用预先生成的 Fish 音频,不是网络 TTS 联调。 |
| 运行中的图像推理调用 | 约 25.01 次/秒;录制文件原生平均视频帧率约 24.19 FPS,不把调用速率冒充呈现帧率。 |
| 单次 image 推理耗时 | 累计采样平均约 6.78 ms,含待机与说话;不等于完整帧渲染时间。 |
| 音画录制 | 9.003 秒,832×480,H.264 + AAC;音频均值 -23.4 dB、峰值 -9.4 dB,非静音。 |
| 端侧下载 | WASM 4.66 MB;Remy 视频 651,932 bytes + 角色数据 89,343 bytes;额外 JS/贴图和音频另计。 |
| 内存 | WASM 初始线性内存 50 MiB;未测 Safari 总进程、GPU或解码内存,不能与 Android PSS 直接比较。 |
| 角色准备 | 取 Remy 原片前 4 秒,离线预处理约 40.5 秒/1CPU,无训练,无抠图;默认制成正反播放 8 秒循环。 |
已验证短时本地音频驱动和有声录制;尚未验证连续原始 PCM 流、短 WAV 接缝的自然度、实际网络对话、打断、最低机型或长时间热稳定。保留上游授权状态,商业许可需另行确认。NanoAvatar 的 iOS 仍缺可转换生成器权重,不与这条结果混淆。
Android:两轮实际输入输出录屏(设备原声)
本段同时录下手机画面和设备输出音频,不是后期配音。输入是手机播放的两段测试 WAV,不是现场真人麦克风;这些音频真正经过语音识别 → Gemini 流式生成新回复 → Fish Audio → NanoAvatar 端侧口型。第二轮带上第一轮实际历史。录屏保留两次等待,没有剪掉响应间隙;只去掉开始加载与末尾空白。
下载实际输入输出录屏(有声 MP4) · 两轮计时与回复证据 · 独立音频转写
scrcpy 4.1 设备时间戳同步录制 H.264 + Opus;检测到非静音音频(均值 -25 dB,峰值 -1.7 dB),未给参考文本的独立转写识别出了两段问题和两段回答。自动转写不是人工音质/口型评分。
| 从输入结束起计 | 第一轮 | 第二轮 |
|---|---|---|
| 识别(服务端) | 1,186 ms | 1,473 ms |
| LLM 开始 → 首段文字 | 1,068 ms | 760 ms |
| 首段文字 → Fish 首音频 | 511 ms | 499 ms |
| 手机请求 → 首 PCM | 4,795 ms | 3,943 ms |
| 首 PCM → 模型开始 | 496 ms | 130 ms |
| 模型开始 → 首 RGB | 171 ms | 151 ms |
| 首 RGB → 呈现 | 116 ms | 160 ms |
| 输入结束 → 首张回复画面 | 5,578 ms | 4,384 ms |
本次在开始对话前显式调用 ready 唤醒中继;它把启动工作前移,不是消除了启动成本。手机首包减去服务端首音频的未归属余量约 1.92 / 1.15 秒,包含上传、路由、运行时调度及返回传输,不应称为“纯网络延迟”。两轮输入、回答不同,不能用 5.58→4.38 秒证明单一优化的因果效果。
当前试验 STT 是收完一句 WAV 后再转写,非生产流式 STT。明显的下一步是让识别在用户说话时进行,并提前准备连接;口型计算本身约 150–170 ms,单独优化它不足以解决数秒等待。本轮仍未证明低延迟全双工真人通话或长时稳定性。
先前:Fish Audio 有声参考版 + 实测内存
这段画面由手机上的 NanoAvatar 实际生成,声音是当次输入的 Fish Audio s2-pro 音轨,后期按首帧呈现时间对齐配入。不是手机麦克风/扬声器实录,不作为视听同步验收。它替代了先前机械的测试夹具语音;真实 Fish 网络流直达手机的追加测试已完成,见下方 Streaming 实测;本段视频仍是先前的参考音轨对齐版。
下载 Fish 有声参考版 MP4 · 听原始 Fish 语音 · 完整内存与推理证据
| 实测项目 | 结果 | 含义 |
|---|---|---|
| 设备 / 芯片 | Galaxy S24 Ultra / SM8650 | 骁龙 8 Gen 3,SM-S928U1,Android 14,arm64-v8a。 |
| 内核可见整机 RAM | 约 10.81 GiB | /proc/meminfo MemTotal;不是应用占用。 |
| 应用进程采样最大 PSS | 347.0 MiB | 共享页按比例分摊;约每两秒采样,不是真实瞬时峰值。 |
| 应用进程采样最大 RSS | 478.7 MiB | 驻留页总量;不可与 PSS 相加。 |
| NPU 独立/驱动侧内存 | 未独立测量 | 不能认为全部计入应用 PSS/RSS。 |
| Fish 语音时长 | 8.9235 秒 | 预先生成,再按 40ms 分块送手机;不是本轮端到端网络流。 |
| 实际新口型 / 计算吞吐 | 12.50 / 17.36 FPS | 112 个生成帧呈现,224 个显示帧。 |
| 首次可见 / 首帧计算 | 1,078.7 / 202.6 ms | 从本地分块输入计,不含 Fish 合成与网络。 |
| AudioTrack underrun | 0 | 软件计数;不等于录到了扬声器声音或证明视听同步。 |
运行内存与模型磁盘文件量是两件事。此内存结果覆盖一次短时测试、两个短片段;更多 clips 的预计算缓存、长通话和热降频尚未测量。
先前双片段效果与原片
以下视频来自这次真机屏幕录制。Android screenrecord 没有采集音轨,因此视频为静音;不能据此宣称视听同步已验证。裁剪版本仅去掉手机界面并缩放,没有插帧或美化。原片与输出不是逐帧同步对照。
Remy:手机实际生成画面
双片段固定时间线,连续输入测试语音。新口型更新约 12.5 FPS,身体动作来自原视频。
原始素材:未加新口型
quiet-head-tilt 与 quiet-hair-tuck,各取前 48 帧;以 24 FPS 拼成 96 帧,再沿用往返循环,共 190 帧。
若内嵌播放器被当前浏览器禁用,可使用下方 MP4 下载链接。报告已校验线上 MP4 与本地录屏文件一致;自动化浏览器返回 progressive media disabled,未确认内嵌播放成功。

展开完整手机界面录屏
测试语音:下面是单次 4.75225 秒输入,实验重复三次,共 14.25675 秒。它是测试夹具,不是实际用户通话。
第二轮:Remy 双片段实测
| 指标 | 测量 | 解释 |
|---|---|---|
| 音频输入 | 228,108 samples / 16 kHz | 约 14.26 秒,每 40 ms 计划提交 640 samples;UI 调度不是网络模拟。 |
| 收齐 / 提交播放的音频 | 228,108 / 228,108 | 完整输入已提交,最终状态 complete。 |
| 显示帧 / 新生成口型帧 | 357 / 179 | Lite 复用交替帧的嘴部;不能用显示帧数冒充新生成帧数。 |
| 模型开始前的等待 | 770.6 ms | 与原实现约 800 ms 音频窗口一致。 |
| 首帧纯计算 | 223.9 ms | 特征提取开始到首个生成 RGB;不含音频积累和呈现。 |
| 第一张生成 RGB | 994.4 ms | 从本地音频注入开始计。 |
| 第一张生成画面显示 | 1,087.3 ms | 来自实际呈现回调,不是只看模型产出。 |
第一轮官方角色:15.4 compute FPS、218.1 ms 计算首帧,整段语音一次输入;提示框未关闭,不能与第二轮当同条件性能对比。第二轮已关闭提示框。两轮均只有短时、单设备样本,不代表长通话表现。
Lite 到底多大?需要下载吗?
需要。模型可以首次使用时下载并缓存,不必每通电话重新下载。官方演示将模型直接打包进 APK。以下为读取官方 Lite APK 的实际字节统计,MB 为十进制:
| 项目 | 大小 | 范围 |
|---|---|---|
| 完整官方 Lite APK | 214.71 MB | 模型、推理库、示例角色和 UI 全部包含。 |
| 模型在 APK 中的压缩大小 | 180.65 MB | 不含推理运行库和角色。 |
| 模型完全解压后的文件量 | 393.10 MB | 不是最终安装占用;APK、压缩副本和缓存可能另占空间。 |
| 推理库 | 23.35 MB 压缩 / 70.89 MB 展开 | 包括 ONNX/QNN 等。 |
| 官方示例角色素材 | 7.05 MB 压缩 | 不是每个 RTA clip 的固定大小;原始帧、遮罩和参考缓存随素材增长。 |
模型可在多个角色间共用;新增 clips 主要增加素材、预处理特征与缓存,而不是每段再下载一套模型。作者所报约 700 MiB 运行内存没有在本次独立测量,不能当作我们的实测。
能接我们的 RTA clips 吗?
能复用原始视频,本轮已经使用 Remy 的实际片段验证。不能直接复用 RTA 的 LivePortrait 特征缓存;需要按 NanoAvatar 自己的输入准备逐帧人脸裁剪、仿射变换、遮罩和参考特征。
- 模型在一次连续音频会话中跨预先排好的片段运行;不需要为 Remy 重新训练。
- 本次是把两个片段预先组织成一条时间线,不是运行时任选动作。
- 动态调度需要同步切换背景帧、嘴部参考特征和几何信息,并预加载下一片段。
- Lite 会在相邻步复用嘴部 RGB,片段边界尤其需要避免旧嘴部贴到新底片。
- 两段身体姿势仍有硬切;NanoAvatar 不负责自动补身体过渡。
Streaming:真实网络流与打断已跑通
已实跑:分两次送入固定文本 → Fish WebSocket 持续生成音频 → 隔离 HTTP 流中继 → S24 Ultra 边收 PCM 边生成和显示 Remy。没有先下载整段音频再回放;但输入是固定测试文本,不是用户麦克风或实时 LLM 输出。动态动作调度仍未实现。
| 真实网络实测 | 结果 | 边界 |
|---|---|---|
| 首轮请求 → 首块 PCM | 7,896 ms | 包含中继启动、Fish、网络;未拆出各自占比,不能归因给单一环节。 |
| 首轮请求 → 首张生成画面 | 8,413 ms | 比音频网络流结束早约 10.22 秒,证明不等待 EOF。 |
| 首块 PCM → 首张画面 | 约 517 ms | TTS 音频可突发到达,所以 800ms 音频内容不等于必须等 800ms 墙钟。 |
| 网络 EOF | 18,634 ms | 收到和提交播放均为 83,333 samples,约 5.21 秒音频,完整推理结束。 |
| 第二轮请求 → 首块 / 首画 | 约 1,770 / 2,157 ms | 单次追加请求,不是稳态延迟分位数。 |
| 打断 | EOF 前取消 | 取消前后旧生成口型呈现计数均为 19;观察窗口约 1.5 秒,没有继续呈现旧口型。 |
| 模型计算吞吐 | 17.14 FPS | 跨整次请求含静默间隙的新口型呈现均值为 5.85 FPS;不能把它解释为每段连续说话的固定刷新率。 |
结论:支持真实 streaming 与取消,但延迟体验尚未通过产品验收。首轮 8.4 秒、第二轮 2.16 秒都不能包装成亚秒实时通话;还需要降低并测量中继/TTS/网络等待。取消验证的是软件旧帧停止,不是扬声器实录。临时测试中继已经停止。
Fish 的官方 LiveKit 插件提供 HTTP 流式音频输出,以及 /v1/tts/live WebSocket 双向文字/音频流。独立请求实测:第一段文字在 0.007 秒送出,第一块音频在 0.540 秒收到;第二段文字到 3.009 秒才发送,6.010 秒才结束输入。即音频可以在全文完成前返回。
NanoAvatar 真机已验证 40 ms 一块的 PCM 输入,未等整个文件输入完就生成并呈现画面。当前 Android 实现采用 400 ms 生成块 + 400 ms 右侧音频上下文,因此首个完整窗口约 800 ms;实际还要加模型和播放时间。它不是严格零前瞻的因果模型。减少缓冲可能降低首帧等待,但会增加重复音频特征计算并可能损伤口型,需要新一轮质量和性能验证,不能只改一个数字就宣称优化完成。
Fish 测试为单次,不是稳定延迟分位数;只证明增量音频在全文结束前返回,不证明本轮所有文本均完整、正确合成。先前内存/有声参考版使用预生成 Fish PCM;本节追加的真实网络测试没有预存输入音频。两种实验结果分别列示,不混用延迟。
延迟拆解与连接复用实验
固定同一 Fish 模型、音色、文本和音频格式,平衡 fresh/pooled 顺序共 8 次。新连接 4 次的服务端“送文字到首音频”为 983–1084 ms;预热连接的后续 3 次为 338–367 ms。第一条 pooled 请求碰到冷启动,客户端首字节 6470 ms,不能把它隐藏后宣称所有请求都快。
可行动方向:在用户进入通话界面时准备中继与 Fish 连接,通话中复用;不要每轮从零启动服务与 WebSocket。热请求这组数据显示约 0.65–0.75 秒的 Fish 首包差异,但样本小、请求顺序和供应商负载仍有影响,不是生产分位数。预热消耗前置等待/资源,不是成本凭空消失。
完整语音问答另测出 STT 约 1.45–1.78 秒、LLM 首段文字约 0.86–1.51 秒、首段文字到 Fish 音频约 0.48–0.58 秒、手机收到首批 PCM 到出画约 0.61–0.65 秒。这些来自两段不同问题,不能拿来做单变量 A/B。冷首轮总出画 11.32 秒,下一轮 5.25 秒;还有中继启动/传输等未完全归属的等待。该轮录音通道失败,不能作为有声录屏交付。
iOS 与最低机型
当前没有已验证的 iOS 版本,也不能给出最低 iPhone 型号。公开可运行移动包依赖高通 QNN/HTP;需要取得可转换的原始口型权重,重新做 Core ML/Metal 推理、音频和渲染接入。当前公开桌面权重缺少口型模型,不能把现有 QNN 编译包直接拿去转 Core ML。
作者最低公开测试档为 Snapdragon 8 Gen 1 + Lite:18 FPS 计算吞吐、183 ms 计算首帧;Lite 新口型输出固定 12.5 FPS。没有公开精确最低手机型号和长期热稳定保证。本次独立实测只有 S24 Ultra / Snapdragon 8 Gen 3,不能将作者芯片结果改写成我们的最低支持机型,也不能据此支持 Exynos 版同名手机。
硬件与稳健性判断
目前适合指定骁龙机型的实验,不能作为所有用户的默认端侧方案。实测只有一台骁龙 8 Gen 3;Android 发布模型依赖 Qualcomm QNN/NPU,不代表联发科、Pixel Tensor 或 iPhone 可直接运行。
代码已有有界队列、音频时钟播放、取消和尾音处理,但缺少成熟的动态多片段管理。桌面 Hugging Face 发布缺少必需的口型权重,不能按 README 直接复现桌面推理。未测长时间热降频、低内存、后台恢复、频繁动作切换、耳机路由或网络抖动。
画面观察:抽帧可见新口型开合,身体和背景保留原素材;口腔细节与脸部表情是否达到产品质量仍需带音频盲评。短时跑通不等于可上线。
证据与边界
- 上游源码:
1bdb246dfdf63aa07d339c1a5121c719f4a8f717;官方 Android Lite 发布:v1.0.2-20261014。 - 模型未改动;测试入口只替换语音输入并输出诊断。角色预处理使用公开检测/对齐实现,自建移动素材包。
- 完整 snapshot 被 Android logcat 单条长度上限截断。本报告只采用完整的前缀字段、完整呈现时间数组和独立 FPS 行;不声称拿到了后半段内存或音频 underrun 证据。
- 无 ASR/LLM/TTS 服务调用,无业务密钥,无生产部署。模型非商用授权,测试不构成生产使用许可。
下载实测指标 JSON · 下载手机录屏 · 下载画面裁剪版