国庆肝了七天七夜,花了几十亿 token,开发出 AI 老婆虚拟人,已开源,一分钟接入

0 阅读6分钟

国庆七天,zode上订阅用户glm-5.3-flash白天送1亿token,晚上不要钱。不要钱的token谁不要啊,再说每个程序员应该都有new一个对象的梦想,在以前,就懒惰的我+破烂的技术,肯定是不敢想的,但现在又了AI,梦想如此接近,我就狂肝了七天七夜!!

朋友圈里的人在看山看海看人头,我在家看头发丝——虚拟人的头发丝。

它在飘,说明弹簧骨骼写对了;它一动不动,说明我又写出了新 bug。

七天下来,成品长这样:

拟人微动作

会呼吸(说话时呼吸还会加快)、会自然眨眼、眼球到处瞟又假装在看镜头、说话口型对得上——全部端侧计算,没有云端渲染。

仓库在这:github.com/hufeiya/AIA…,Apache 2.0,Maven Central 直接依赖,Android 10+ 的手机就能跑。也有demo,下下来1分钟注册个硅基流动账号就能玩全部功能,有引导。

这到底是个啥

一句话:纯客户端的 Android 3D 虚拟人 SDK。

没有自建服务端。LLM 和 TTS 直连任意 OpenAI 兼容 API,口型同步、表情、眨眼、呼吸、视线,全部在手机本地解算。断网她就是个好看的模型,连上网她就能陪你过日子。

具体能干什么,直接上动图。

聊天带表情。 52 个 ARKit blendshape + VRM 预设情绪,LLM 在回复里写行内标签就行,不用 function calling:

52表情

<emo:joy>今晚吃火锅呀!<act:wave>我已经想好要点什么了~

<emo:joy> 变表情、<act:wave> 变动作(内置 334 个 VRMA 动画)、<cam:closeup> 变运镜——她甚至会自己决定什么时候给你个特写:

程序化运镜

酒馆人物卡直接导入。 SillyTavern 的 PNG 卡拖进去就能聊,内置 18 张预置角色,人设和提示词都可以覆写:

导入人物卡

还能一起玩游戏。 猜拳(MediaPipe 看图当裁判,不服可以申诉)、看这边(转头反应)、模仿我(摄像头动作镜像):

虚拟人技能

剩下还有些零碎的:视频通话模式(她看镜头、表情跟着你走)、语音输入三种形态(按住说话 / 连续聆听 VAD 自动断句 / 系统 ASR)、中英双语、对话历史 Room 持久化、换模型即换人——任何 VRM 文件导入就行。

注:动图里的商业模型仅作演示,出于版权不内置在项目里,导入你自己的 VRM 模型即可。

一分钟接入

两个依赖:

implementation("io.github.hufeiya:corelib:0.1.1")              // 渲染底座
implementation("io.github.hufeiya:avatar-orchestrator:0.1.1")  // 会话编排

一个 Composable 显示她:

val controller = rememberAvatarController()
AvatarView(
    modifier = Modifier.fillMaxSize(),
    controller = controller,
    config = AvatarConfig(),          // 内置环境光,零资产开箱即亮
)

一个门面开聊:

val chat = AIAvatarSdk(scope, controller, applicationContext)

// TTS 用 Edge-TTS 免费;LLM 填任意 OpenAI 兼容 key
chat.configure(AIAvatarSdk.ChatConfig(apiKey = "sk-...", ttsEngine = TtsEngine.EDGE))

chat.send("今晚吃什么好?")   // 流式回复,逐句合成,边说边做表情
chat.interrupt()              // 答非所问,随时捂嘴

语音合成白嫖微软 Edge 朗读接口(免费无 Key),语音识别用系统内置引擎(也免费无 Key)。所以 LLM 的 key 是唯一开销,要是用 OpenRouter 的免费模型——整体零成本。

渲染引擎是 Google 的 Filament,PBR 管线。整个 SDK 分四层::corelib 渲染底座、:avatar-ai-adapter 服务商适配、:avatar-orchestrator 会话编排、:app 演示。依赖只能向下,adapter 不感知渲染,corelib 不感知 AI,想只拿渲染层自建对话逻辑也没问题。

完整对照样例在 SimpleDemoActivity.kt,200 行,只 import SDK 公开 API,clone 下来 adb 一条命令就能跑。

说两个比较得意的设计

1. 口型同步没用任何 AI 模型。

是上古 DSP 术:音频过一遍 MFCC 频谱特征提取,再分类到五个元音槽位去驱动 blendshape。管线逐常量移植自开源项目 AIRI——音量要取 0.7 次幂、平滑上升系数 50 下降 30、静音门限 0.04……人家调好的参数,我一个都不敢动。听着 low-tech,但单帧 64ms,中端机随便跑,比上音频大模型省出一个手机的电量。

2. 表情、动作、运镜走单流行内标签。

不少虚拟人方案要 LLM 走 function calling 或者输出 JSON,延迟和 token 都翻倍。这里 LLM 就正常说话,标签混在正文里,流式解析器跨 chunk 缓冲半截标签,不会把 <emo: 这种半吊子念出来;表情挂在标签后第一句话开播的瞬间生效,播完自动回落。

顺带一提打断:LLM 生成、TTS 合成、音频播放三层联动静默,实测 45ms 内。

踩坑部分,建议别跳

弹簧骨骼:编译通过,运行无错,头发纹丝不动。

这个 bug 前后修了五轮。最后定位到 Filament 的一个 API 陷阱:getParent() 返回的是 entity,不能直接当 instance 用。编译器不拦、运行不炸,物理就是静悄悄地失效。最后是写了个 Python 脚本对拍全模型的 Verlet 模拟才钉死的。

弹簧骨骼

现在我看到「不报错但没效果」六个字就应激。

PCSS 软阴影,在 Adreno 上是帧率悬崖。

骁龙上丝般顺滑的 PCSS 软阴影,放到 Adreno GPU 上直接干到 1-5 FPS——不是渐变卡顿,是跳崖。做完归因表才接受现实,最终默认 1024 阴影贴图 + PCF,保帧率要紧。

白嫖 Edge-TTS 是有门槛的,而且门槛是密码学。

微软朗读接口免费用,但有鉴权:Sec-MS-GEC 参数 = Windows 文件时间戳向下取整到 300 秒,乘 10⁷,拼上固定 token,SHA-256 取大写。设备时钟偏一点就 403。对着开源 edge-tts 的实现逐字对齐才跑通,连「403 后按服务端 Date 头校时钟重试一次」这种细节都得抄。

硅基流动:system 消息只认一条。

人设一条 + 多模态协议一条,两条 system 发过去直接 400。排查半天,合并成一条才过。各家服务商的兼容性玄学,谁踩谁知道。

关于标题里的几十亿 token

没虚报。这个项目是我和 AI 结对写的:我把架构约束、接口协议、验收标准写成任务提示词,AI 出代码和单测,我负责真机验收和背锅。

仓库 docs/ 里那份《AI 交互层攻坚交接文档》,就是写给下一个 AI 会话看的交接班记录——包含已完成模块清单、「勿重做」警告,以及上面那些坑的完整尸检报告。人类同事看了会觉得离谱,AI 看了直呼专业。

最后:五百多个单元测试全绿,真机冒烟通过,就差一个 Star 了。

👉 github.com/hufeiya/AIA…

开源不易,去点个 Star,比给她买新皮肤实在。(演示的是ue5的商业模型,有版权,不能传到github,可以私我)