基于 Cloudflare Worker 的虚拟女友聊天服务后端,提供 AI 对话、语音合成、图片生成等功能。 因为 Cloudflare 每天提供的免费AI配额,所以普通用户也可以部署,生成自己的专属虚拟女友。 再次感谢赛博活佛! 因为 Cloudflare 的tts模型对于中文支持很差,所以默认界面是英文,聊天也尽量使用英文。 富哥或不习惯英文的用户请自行注册ElevenLabs或使用CosyVoice2来支持中文(音色克隆由于成本原因未开发,接入ElevenLabs或CosyVoice2可支持)。 最后,所有的VIP功能,都是使用的 Cloudflare 每天提供的免费AI配额,所以效果一般,富哥或要求较高的用户可以自行接入其他更加智能的模型。
点击上方图片观看演示视频,了解如何使用本应用。
点击上方按钮即可一键部署到 Cloudflare Workers!部署完成后,请访问 https://你的域名/init 完成数据库初始化。
部署后步骤:
- 点击部署按钮,按提示完成 Cloudflare 授权和部署
- 部署完成后,访问
https://你的域名/init初始化数据库 - 使用默认账号登录:用户名
admin,密码admin123 - 开始与你的虚拟女友聊天吧!💕
- AI 聊天对话 - 使用 Cloudflare AI (Llama 3.1) 提供角色化对话
- 语音合成 (TTS) - 支持文字转语音,使用 Deepgram Aura-2
- 语音转文字 (STT) - 使用 OpenAI Whisper 实现语音识别
- AI 图片生成 - 根据对话上下文生成场景图片(支持浴室、卧室等场景)
- 语音通话 - 实时语音对话功能
支持 3 个虚拟角色:
- Yuki - 温柔体贴的虚拟女友
- Aria - 神秘傲娇的赛博朋克女孩
- Luna - 活力开朗的阳光少女
- VIP 会员解锁高清图片查看
- 非 VIP 用户看到模糊图片 + 升级引导
- 支持月卡和年卡订阅
- 运行时: Cloudflare Worker
- 数据库: Cloudflare D1 (SQLite)
- 对象存储: Cloudflare R2
- AI 推理: Cloudflare AI (Workers AI)
- 认证: JWT Token
最简单的部署方式,无需安装任何本地工具:
-
点击部署按钮
-
登录 Cloudflare 账号
按页面提示授权 Cloudflare 访问你的 GitHub 仓库
-
自动部署
系统会自动创建 D1 数据库、R2 存储桶并部署 Worker
-
初始化数据库
部署完成后,访问
https://你的域名/init完成数据库初始化你会看到成功提示:
{"success": true, "message": "Database initialized successfully"} -
开始使用
- 访问
https://你的域名打开应用 - 使用默认账号登录:用户名
admin,密码admin123 - 开始与你的虚拟女友聊天!
- 访问
如果你需要本地开发或自定义修改,可以使用手动部署:
- Node.js 18+
- Wrangler CLI
npm install -g wranglergit clone https://github.com/heibais1986/cloudflare-virtual-girlfriend.git
cd cloudflare-workerwrangler loginwrangler d1 create virtual-girlfriend记录输出的 database_id,更新 wrangler.toml:
[[d1_databases]]
binding = "DB"
database_name = "virtual-girlfriend"
database_id = "your-database-id-here"wrangler r2 bucket create virtual-girlfriend-media方式 A:通过 Web 界面(推荐)
部署后访问 https://你的域名/init 自动初始化
方式 B:通过命令行
wrangler d1 execute virtual-girlfriend --file=./schema.sqlwrangler dev服务将在 http://localhost:8787 启动。
wrangler deployPOST /api/auth/register
Content-Type: application/json
{
"username": "yourname",
"password": "yourpassword"
}POST /api/auth/login
Content-Type: application/json
{
"username": "yourname",
"password": "yourpassword"
}
# 响应
{
"status": "ok",
"token": "your-jwt-token",
"user": {
"id": 1,
"username": "yourname",
"is_vip": false
}
}GET /api/auth/check
Authorization: Bearer <token>POST /api/chat
Authorization: Bearer <token>
Content-Type: application/json
{
"message": "你好",
"character": "yuki",
"history": [
{"role": "user", "content": "之前的消息"}
]
}
# 普通响应
{
"reply": "你好呀~ 很高兴见到你!"
}
# 图片生成响应(当用户请求图片时)
{
"type": "image_placeholder",
"generation_id": 123,
"character_id": "yuki",
"message_zh": "Yuki 正在准备相机...",
"message_en": "Yuki is preparing the camera..."
}GET /api/image/status/<generation_id>
Authorization: Bearer <token>
# 响应 - 生成中
{
"status": "processing",
"is_vip": false
}
# 响应 - 已完成
{
"status": "completed",
"is_vip": false,
"image_url": "https://.../generated/123/xxx.png",
"requires_vip": true
}POST /api/tts/speak
Content-Type: application/json
{
"text": "你好呀~"
}
# 响应: audio/wav 二进制数据POST /api/speech-to-text
Authorization: Bearer <token>
Content-Type: multipart/form-data
file: <音频文件>GET /api/vip/plansPOST /api/vip/purchase
Authorization: Bearer <token>
Content-Type: application/json
{
"plan_id": "monthly" // 或 "yearly"
}用户发送包含以下关键词的消息时会触发图片生成:
- 中文:照片、图片、自拍、看看、发张、来张、拍张
- 英文:photo、picture、selfie、image、pic、send、snap
系统会根据对话上下文自动识别场景:
| 上下文关键词 | 生成场景 |
|---|---|
| 洗澡、沐浴、bath | 浴室场景(浴缸视角) |
| 睡觉、床、sleep、bed | 卧室场景(床上视角) |
| 厨房、做饭、kitchen、cook | 厨房场景 |
| 外面、公园、outside、park | 户外公园场景 |
| 工作、办公、work、office | 办公室场景 |
- VIP 用户:直接展示高清原图
- 非 VIP 用户:展示模糊图片 + "升级 VIP 解锁" 按钮
cloudflare-worker/
├── src/
│ └── index.js # 主入口文件
├── public/ # 静态文件(前端页面)
│ ├── css/
│ ├── js/
│ ├── images/ # 预置的各种图片
│ └── *.html
├── schema.sql # 数据库结构
├── wrangler.toml # Cloudflare 配置
└── README.md # 本文档
- users - 用户信息(含 VIP 状态)
- sessions - 登录会话(JWT Token)
- chat_sessions - 聊天会话
- chat_messages - 聊天消息
- image_generations - AI 图片生成任务记录
- user_viewed_images - 用户查看图片记录
- character_media - 角色预置媒体
- user_unlocks - 用户解锁记录
| 变量名 | 说明 | 位置 |
|---|---|---|
DB |
D1 数据库绑定 | wrangler.toml |
R2_BUCKET |
R2 存储桶绑定 | wrangler.toml |
AI |
Workers AI 绑定 | wrangler.toml |
所有图片都通过 Worker API (/api/media/view/{r2_key}) 代理访问,不需要配置 R2 公开访问。如果图片无法加载:
- 检查 R2 bucket 名称是否为
virtual-girlfriend-media - 检查
wrangler.toml中的binding是否为R2_BUCKET - 检查图片是否成功上传到 R2(查看生成日志)
- 检查
database_id是否正确 - 运行
wrangler d1 list确认数据库存在 - 执行 schema.sql 初始化表结构
检查 Cloudflare 账户的 Workers AI 配额和权限。
- 本地开发:使用
wrangler dev会自动读取.dev.vars文件中的环境变量 - 生产部署:敏感信息应使用
wrangler secret put <KEY>设置 - 数据库迁移:修改 schema.sql 后需要手动执行迁移
- 图片存储:生成的图片存储在 R2 的
generated/目录下
Apache-2.0 license
本人自去年大厂毕业后就一直没有收入,纯靠独立开发勉强度日。如果本项目对您有帮助,可以请我喝杯咖啡,谢谢!
ETH: 0x143C6b1A6893efafc8F2f76E93dfD08b1441c29a
SOL: 6GTQQNBuDySX7DAsF4mAxjuYygMZ4qfqnMDX4pDKGVds


