其实现在AI这么厉害,很多人已经可以在本地部署自己的“AI 女友”。模型跑起来了,网页也打开了。可一旦加上语音、手机访问、图片换装,体验往往立即散架——大模型吃掉显存,TTS 起不来;电脑能对话,手机没有声音;图能生成,却像每次都换了一个人。
对个人开发者而言,应该把这三件事分开,模型、声音转换、图像生成可以自己独立一套架构进行构建。所以我自己试着做了一套 MyAIGirlfriend。当前采用的是一个很朴素的三层结构:
图像生成不必强行塞进任何一层。它更像一个按需调用的动作:网页发出场景描述,服务端代为调用图像接口,生成结果再回到角色卡片和背景里。
小雅网页的实际展示:语音入口、文本输入、角色卡片与形象描述各自独立。
部署顺序不要反过来:先文字,再声音,最后才是“换装”
第一步,只验证远程模型能返回一句文字。无论你选择哪种量化模型,先让服务器端口和一个最小对话请求稳定,再谈网页体验。模型“能加载”并不等于“适合实时聊天”;响应速度、上下文长度和显存余量都要在自己的机器上验证。
第二步,让网页通过本地映射地址拿到文字回复。这一层失败时,检查远程服务、SSH 隧道和本机后端日志。不要先去改人格提示词,更不必急着重下模型。
第三步,接入 TTS 与麦克风。一个实用的小技巧是:先让文本输入也播放语音。这样即使麦克风权限或实时通道尚未理顺,也能先确认“她会说话”。如果音色克隆进入流程,只使用自己有权使用的音频。
部署清单
你可以直接让AI自己一键实现,把我下面的这部分清单直接拿去就可以了。当然也不需要服务器,也可以直接用自己本地的电脑部署也行。当前项目的实际配置(可作为复刻起点)
1. 远程大脑(服务器)
一台可通过 SSH 登录的服务器;已记录主机地址、端口、账号和私钥位置。
可用 GPU、驱动和 CUDA 运行环境;先执行一次显卡状态检查,确认显存没有被其他任务占满。
已下载与显存相符的量化模型;模型文件路径固定,不放在临时目录。
已安装兼容 OpenAI 风格接口的推理服务(例如 llama.cpp 的 llama-server)。
推理服务仅监听受控地址或通过 SSH 隧道转发;不把模型 API 裸露到公网。
用一个最小文本请求验证接口能正常返回回复,再记录模型名、端口和上下文长度。
2. 本机语音与后端(Windows)
已安装 Git、Python 3.11 或 3.12,并在终端确认 python --version 可用。
已克隆 speech-to-speech 项目,创建独立虚拟环境,并按项目要求安装依赖。
STT、TTS 所需模型已完成首次下载;磁盘为模型缓存和生成图片预留充足空间。
faster-whisper 使用本机 GPU 时,设备、精度和 CUDA 版本彼此兼容;不能用 GPU 时先退回 CPU 验证功能。
TTS 已选定中文女声或已获得授权的克隆音频;先用文字输入测试“回复文字 + 播放声音”。
本机后端能访问远程模型接口,接口地址和密钥只存于服务端环境变量或配置文件。
3. 网页、手机与网络
网页服务可在电脑本机通过 http://127.0.0.1:7860 打开。
服务监听局域网地址;电脑与手机连接同一 Wi-Fi 后,可通过 http://<电脑局域网IP>:7860 访问。
Windows 防火墙已放行网页端口;如果语音 WebSocket 走独立端口,也已单独放行。
浏览器已允许麦克风权限,并在系统声音设置里选中了存在的输入设备。
已做过一次完整链路测试:文字输入 → 远程模型回复 → 本机女声播放;随后再测试语音输入。
未把远程模型端口、图像服务密钥或 SSH 私钥写进前端代码、截图或公开文章。
4. 形象与场景能力(可选)
初始角色图已保存在项目目录,并确认自己拥有使用和展示该图像的权利。
每个场景预设至少写清颜色、服装、地点、光线和触发语句。
图像生成请求经由后端代理;API 密钥不下发给浏览器。
设定明确触发条件与冷却时间,避免每一轮对话都重新生成图片。
生成失败时,界面保留上一张有效图片并显示可理解的错误提示,不影响文字聊天和语音。
做到前三部分,应用就已经能稳定聊天;第四部分是让它更像“角色体验”的增量,而不是启动的前置条件。每新增一项能力,都重新走一次最小验证:它是否工作、失败时是否可见、失败后是否还能聊天。
场景化,把视觉状态做成预设
很多项目把形象生成理解为一句“换衣服”。这会让图像模型自由发挥:衣服换了,人也变了;图有了,网页颜色和聊天语境却还是上一幕。
更好的做法是把一个场景写成五个字段:颜色、服装、地点、光线、触发语句。
海边散步:海盐蓝、沙滩米、浅蓝度假裙、日落侧光;适合“周末一起去海边”。
居家陪伴:奶油白、鼠尾草绿、针织开衫、窗边自然光;适合“今天下雨,你在家做什么”。
餐厅约会:酒红、香槟金、简约连衣裙、烛光餐桌;适合“晚上一起吃饭吧”。
场景预设一旦确定,页面就能把同一份状态同时交给头像、暗色背景、提示词输入框和下一次图片请求。下面三张不是单独的渲染图,而是该状态已经切进网页后的实际案例。
海边场景:角色图和背景进入蓝金色日落氛围,仍保留深色遮罩保证交互区可读。
居家场景:柔和的奶油白与绿植背景,适合低刺激、长时间的聊天状态。
餐厅场景:酒红服装、烛光与夜景被同步带入头像和背景。
自动出图也该遵守同一条原则:不要每句话都画。只在用户明确提出视觉请求,或对话出现足够明确的时间、地点、天气和活动时触发;并给它设置冷却时间。这样能减少等待、费用和画面频繁跳变,也让用户知道“为什么这次会换图”。
写在最后
真正做下来以后会发现,AI 陪伴并不一定需要一个“全能模型”。
大模型负责思考,TTS 负责声音,网页负责交互,图像模型负责视觉。各模块彼此独立,后续想换模型、换声音、加 Live2D 或视频生成,都不用推倒重来。
而真正决定体验的,也不只是模型参数量,而是延迟、声音、记忆、角色一致性和场景连续性。
所以最适合个人开发者的方式,反而是先跑通最简单的一条链路:
你说一句话 → AI 理解 → 回复 → 用声音说出来。
然后再逐步加入记忆、场景、换装和长期状态。
当这些能力真正连接起来,它才不再只是一个套着角色皮肤的聊天机器人,而开始变成一个连续存在的 AI 角色。