本仓库是基于原开源项目 Kur1oR3iko/AMDS-RE 的个人修改版。由于本仓库不是通过 GitHub Fork 方式发布,因此在这里明确保留上游来源、原作者信息和资源来源说明。
原项目说明:
未来装置研究所最新力作,爱来自Kurio
本修改版主要在模型接入、CC Switch 支持、Vocu 音频链路、图片附件、永久记忆、设置界面、日志脱敏、.gitignore 和文档说明等方面做了调整。原项目作者与资源归属不因本仓库的修改而改变。
这个项目的灵感来源于《命运石之门》中的 Amadeus 系统 —— 那个可以和牧濑红莉栖的 AI 对话的系统。
原版的 Amadeus 手机软件早就已经不能用了,而且说实话,那个版本根本谈不上智能。而且正如我所说,我不是个计算机领域的专家,网上其他大佬搓出来的手工 Amadeus 效果很好但是太复杂我操作不明白,于是我就自己搓了一个简化版(笑)
上游原项目说明:
- 所有表情和预设音频都是从原版 Amadeus 手机软件中解包提取的(预设音频出现的概率默认是 30%,其余由 AI 现场生成)。
- 保留了原版的视觉和听觉体验。
- 核心 AI、双语回复、语音生成、设置和记忆功能由本项目重新实现。
使用方法(简版)
- 去火山引擎注册账号,申请一个可用于火山方舟 / 豆包模型的 API Key。
- 去 https://www.vocu.studio 注册账号,在
assets/audio/文件夹里挑一个时间稍长的语音复刻克里斯蒂娜音色,复制角色 ID,然后申请一个 Vocu API Key。 - 启动软件,在设置中填入模型和 Vocu 配置即可。
我复刻的克里斯蒂娜音频还在审核中,审核完后你们应该可以直接套用我的结果。
- 丰富的表情:克里斯蒂娜有多种预设表情(开心、生气、害羞、惊讶、烦恼、侧身等),AI 回复中的情绪标签会驱动立绘切换。
- 原版预设语音:保留从原版 Amadeus 手机软件中解包提取的预设音频,并支持按设置概率触发。
- 嘴部动画:本地预设音频、Vocu 生成音频和纯文本日语字幕都会尽量同步嘴部动画。
- 启动体验:包含启动画面、启动音效和启动问候;启用永久记忆时会跳过启动问候,避免和历史加载冲突。
- AI 对话:默认支持火山方舟 / 豆包模型,也支持 Ollama、Deepseek 和 CC Switch。
- 多模型接入:
- 默认:Volcengine / Doubao Chat Completions。
- Ollama:本地 OpenAI Chat Completions 兼容接口,默认 URL 可填
http://localhost:11434。 - Deepseek:Deepseek OpenAI 兼容 Chat Completions。
- CC Switch:通过本地中转调用 OpenAI Responses API。
- 中日双语输出:模型回复期望格式为
[emotion]Japanese|Chinese,左下角显示日语字幕,右侧聊天框显示中文。 - 流式文本显示:文本模式下会流式展示中文回复,同时提前更新日语字幕。
- 图片附件:输入框左侧可上传图片(png/jpg/jpeg/bmp/gif),图片只随当前请求发送;历史记录会保存为文本占位,避免把 base64 写入本地记忆。
- 永久记忆:可在设置中启用。启用后会从本地加载并保存聊天历史;关闭时会清理保存的历史。未启用永久记忆时,内存对话会限制在约 200 条消息内。
- Vocu TTS:支持通过 Vocu 生成日语语音,可配置 API Key、声音 ID、异步生成和 Flash 低延迟模式。
- 生成链路:启用异步模式时会优先尝试
simple-generate低延迟实时接口;未拿到可用音频时回退到异步任务创建与轮询;任务生成成功后可播放普通音频 URL 或流式 URL。 - 网络播放回退:远程流优先使用
miniaudio的低延迟网络流播放器;失败时会尝试缓存到本地并回退到 Qt / pygame 路径播放。 - 本地预设播放:本地预设音频通过
pygame在线程中播放,并通过信号同步嘴部动画状态。
- 设置窗口:统一配置模型类型、模型名称、API Key、最大 tokens、音频模式、预设音频概率、永久记忆、Vocu 选项和点数查询。
- 本地配置:使用
QSettings写入应用配置目录下的settings.ini,API Key 和历史也保存在本地配置目录。 - 私有状态不入库:
settings.ini、config.json、conversation_history.json、vocu_cache/、运行日志和logs/都属于本地私有状态,不应该提交到 GitHub。
flowchart TD
A[用户输入 / 图片附件] --> B[ChatWidget 处理]
B --> C[ChatWorker 后台线程]
C --> D{模型类型}
D -->|默认| E[火山方舟 / 豆包 Chat Completions]
D -->|Ollama| F[本地 OpenAI 兼容 Chat Completions]
D -->|Deepseek| G[Deepseek Chat Completions]
D -->|CC Switch| H[OpenAI Responses API]
E --> I[解析 emotion + 日语 + 中文]
F --> I
G --> I
H --> I
I --> J[更新立绘 / 日语字幕 / 中文聊天框]
J --> K{音频模式?}
K -->|否| L[文本嘴部动画]
K -->|是| M[Vocu simple-generate / 异步任务]
M --> N{拿到流式或普通音频?}
N -->|是| O[miniaudio 网络流 / 缓存 / Qt或pygame回退]
N -->|否| P[仅显示文本并恢复输入]
O --> Q[播放并同步嘴部动画]
src/services/ai_manager.py 是模型适配和对话历史管理中心;角色/persona 提示词从 assets/prompts/kurisu_amadeus_skill.md 加载,由 src/core/character_skill.py 派生系统提示词、双语生成、翻译、预设选择和情绪选择提示词。
src/core/reply_parser.py 负责解析 [emotion]Japanese|Chinese 格式,并提供图片历史清洗逻辑,避免把临时图片 payload 保存进长期历史。
src/ui/main_window.py 管理主窗口、设置保存和 AI 管理器重建;src/ui/chat_widget.py 协调输入、附件、流式回复、字幕、音频和播放状态;src/services/workers.py 负责把模型和音频生成放到 Qt 后台线程中执行。
src/services/audiogenerate.py 对接 Vocu 的实时生成、任务生成、轮询和音频缓存;src/services/audio_player.py 提供本地预设播放和低延迟网络流播放;ChatWidget 中还有 Qt / pygame 的播放回退逻辑。
- 语言:Python 3.13
- 桌面 UI:PyQt6
- 模型 SDK / HTTP:openai、requests
- 默认模型服务:火山方舟 / 豆包
- 可选模型服务:Ollama、Deepseek、CC Switch(OpenAI Responses API)
- 语音生成:Vocu.studio
- 音频播放:pygame(本地预设)、miniaudio(可选网络流低延迟)、PyQt6 QtMultimedia / QMediaPlayer 回退
- 图像处理:Pillow
- 打包工具:PyInstaller
AMDS-RE/
├── src/
│ ├── main.py # 程序入口,启动日志、SplashScreen、MainWindow
│ ├── core/ # 核心配置、资源路径、提示词和回复解析
│ │ ├── app_config.py # 默认模型、Deepseek/CC Switch/Vocu 默认配置
│ │ ├── character_skill.py # 角色 skill 加载和提示词生成
│ │ ├── reply_parser.py # 双语回复解析、情绪规范化、历史清洗
│ │ └── resources.py # 资源目录、配置目录、PyInstaller 路径兼容
│ ├── services/ # AI、音频和后台服务
│ │ ├── ai_manager.py # 模型适配、聊天历史、翻译和预设选择
│ │ ├── audiogenerate.py # Vocu TTS 生成、轮询、缓存
│ │ ├── audio_player.py # pygame 本地播放、miniaudio 网络流播放
│ │ ├── voice_dialog.py # 预设语音匹配、显示文本和表情映射
│ │ └── workers.py # Qt 后台线程与信号
│ ├── ui/ # PyQt 界面组件
│ │ ├── main_window.py # 主窗口、设置生命周期、配置保存
│ │ ├── chat_widget.py # 聊天界面、图片附件、流式回复、音频协调
│ │ ├── character.py # 角色立绘、字幕和嘴部动画
│ │ ├── settings_dialog.py # 设置窗口
│ │ ├── splash_screen.py # 启动画面
│ │ └── debug_window.py # 调试日志窗口
│ └── utils/ # 通用工具
│ ├── debug_log.py # 运行日志缓冲与脱敏辅助
│ ├── image_utils.py # 图片压缩、编码和 data URL
│ └── thread_pool.py # 共享 IO 线程池
├── assets/
│ ├── audio/ # 原版解包提取的预设音频和启动音
│ ├── images/ # 原版解包提取的角色表情、背景、图标等
│ └── prompts/ # Kurisu/Amadeus 角色 skill 与提示词
├── vocu音频文档/ # Vocu 接口参考文档
├── build.py # PyInstaller one-dir 打包脚本
├── README.md # 项目说明
└── 修改说明.md # 当前修改概览
python src/main.pypython -m compileall srcpython build.pybuild.py 会检查并安装缺失的运行/构建依赖(PyQt6、openai、pygame、requests、Pillow、miniaudio、pyinstaller),然后使用 PyInstaller 生成平台对应产物:
Windows: dist/AMDS/ # 包含 AMDS.exe
macOS: dist/AMDS.app # 可拖到 Applications 后右键打开
其他: dist/AMDS/
注意:当前打包入口是 python build.py,不是旧的 build.bat;Windows 输出是 dist/AMDS/ 文件夹,不是单文件 dist/AMDS.exe。macOS 未做签名和公证,首次运行如果提示“无法验证开发者”,请右键应用选择“打开”。
- 从源码运行
python src/main.py;或打包后在 Windows 运行dist/AMDS/AMDS.exe,在 macOS 运行dist/AMDS.app。 - 打开设置,选择模型类型:默认火山方舟 / 豆包、Ollama、Deepseek 或 CC Switch。
- 按所选模型填入 API Key、URL 和模型名。
- 如需语音,启用音频模式并填入 Vocu API Key 与声音 ID。
- 按需调整最大 tokens、预设音频概率、Vocu 异步 / Flash、永久记忆。
- 回到主界面,输入文字或添加图片附件开始对话。
以下文件属于本地私有状态或构建产物,不应提交到 GitHub:
settings.iniconfig.jsonconversation_history.jsonvocu_cache/runtime.log、*.log、logs/build/、dist/、*.spec.claude/本地会话文件
日志中涉及 API Key、Authorization、音频 URL 查询参数等内容时,应保持脱敏;项目中相关打印会尽量只输出摘要或隐藏敏感片段。
相对上游项目,本仓库当前主要整理和增强了以下内容:
- 将主流程按
src/core、src/services、src/ui、src/utils拆分,便于继续维护。 - 模型侧从单一豆包配置扩展为默认火山方舟 / 豆包、Ollama、Deepseek 和 CC Switch。
- 聊天侧补充图片附件和永久记忆;图片只随当前请求发送,历史中保存为文字占位。
- 音频侧整理 Vocu
simple-generate、异步任务、Flash 开关、网络流播放、缓存和 Qt / pygame 回退链路。 - 打包入口更新为
python build.py,输出目录为dist/AMDS/。 .gitignore覆盖本地配置、API Key、对话历史、运行日志、Vocu 缓存、构建产物和 Claude Code 会话文件。- 运行日志中涉及 Vocu 音频 URL 和 API 响应的输出已改为摘要或脱敏形式。
以上是修改版现状说明,不代表对项目做过完整安全审计;公开发布前仍应人工确认没有真实密钥、完整私有日志、个人聊天历史或缓存音频被纳入提交。
- 实现语音输入。
- 添加更多表情和动作。我不是个绘画领域的专家,所以我会尝试使用 AI 生图。
- 继续优化 AI 对话质量,目前的提示词我其实没有完全满意。
- 添加记忆功能,让红莉栖记住上一次软件关闭前的对话。
- 添加更多语言模型选项。
- 继续优化 Vocu 音频延迟和稳定性。
这个项目虽然不大,但包含了原作者和本修改版维护者的许多心血。虽然原版的 Amadeus 已经不能用了,但我希望这个复刻版本能给你带来一点快乐。这个修改版尽量保留上游项目的体验和署名,同时补充了一些模型、语音、设置和安全卫生方面的调整。如果你想直接操作代码,可以从 src/main.py 看入口,再按功能去对应模块里改。
如果有任何问题或建议,欢迎告诉我!
El Psy Kongroo