项目整理:重写主文档、归档过时文档、清理死代码、新增音频制作手册
文档整理: - 重写 game/操作说明.md 为项目主文档(6游戏/6手势/旁白/模型生成音频/TTS两步流程) - 归档过时文档至 other_docs/(林夏原始设计、旧执行文档) - 新增 docs/音频制作执行手册.md(从零制作游戏音频的完整流程) - docs/ 下保留旁白音色提示词、音频脚本 代码清理: - 删除旧架构死代码: story.js / gestures.js / profile.js - 删除耦合旧架构的过时测试目录 game/tests/ 脚本配置修正: - check_tts_env.sh: 启动脚本路径 AutoVideo → tts-server(实际位置) - gen_narrator_samples.py: 硬编码地址改为环境变量,默认对齐 tts-server 端口 8000
This commit is contained in:
+175
-135
@@ -1,189 +1,229 @@
|
||||
# 《林夏》操作说明
|
||||
# 盲游 · 项目说明
|
||||
|
||||
> 全黑屏纯音频交互游戏合集。没有视觉界面,只有声音和触感。
|
||||
> 玩家闭眼也能完整体验——旁白全程解释状态,操作只有六种手势。
|
||||
|
||||
---
|
||||
|
||||
## 一、游戏简介
|
||||
## 一、项目简介
|
||||
|
||||
全黑屏叙事游戏。玩家扮演 24 岁的林夏,用一部碎屏手机度过今晚 21:00–02:00 的 5 个小时。
|
||||
本项目是一个**盲人可玩、明眼人闭眼也好玩**的纯音频叙事游戏合集,共收录 **6 个独立游戏**:
|
||||
|
||||
- **没有视觉界面**,只有声音和触感
|
||||
- **全程约 60 分钟**(5 小时游戏时间压缩)
|
||||
- **16 条消息**,5 种结局
|
||||
- **不需要说话**,不需要麦克风
|
||||
| # | 游戏 | 一句话 | 旁白定位 |
|
||||
|---|------|--------|---------|
|
||||
| 1 | 《林夏》 | 一部碎屏手机,一个北漂的夜晚,16 条消息决定明天的自己 | 纪录片叙述者 |
|
||||
| 2 | 《一念》 | 内心法庭,七个声音在等你,今晚必须做一个决定 | 你的内心独白 |
|
||||
| 3 | 《守夜》 | 你是夜班保安,独自坐在监控室,楼里传来声音,查还是不查 | 老同事的对讲机留言 |
|
||||
| 4 | 《候诊》 | 等待检查结果的两小时,等待本身就是一种体验 | 时间本身的声音 |
|
||||
| 5 | 《遗声》 | 一个陌生人的手机,十五条录音,听还是跳过——跳过就永远不知道 | 手机系统语音 |
|
||||
| 6 | 《浮》 | 感官漂流,声音漂过来,抓住还是让它走 | 梦里的声音 |
|
||||
|
||||
每个游戏有独立的旁白音色、独立的场景脚本和多种结局。游戏之间互不影响,可任意选择体验。
|
||||
|
||||
---
|
||||
|
||||
## 二、开始前准备
|
||||
## 二、操作方式(六种手势)
|
||||
|
||||
1. 手机和电脑连接**同一 Wi-Fi**
|
||||
2. 打开手机浏览器,输入地址:
|
||||
全程**不看屏幕**,只靠六种手势操作。每种手势有固定的语义,贯穿所有游戏:
|
||||
|
||||
```
|
||||
http://<服务器IP>:8765/game/
|
||||
```
|
||||
| 手势 | 通用含义 | 触觉反馈 | 确认音效 |
|
||||
|------|---------|---------|---------|
|
||||
| **单击** | 接受 / 打开 / 简单回应 | 轻触 | 清脆短音 |
|
||||
| **双击** | 拒绝 / 跳过 / 忽略 | 短促双震 | 下行滑音 |
|
||||
| **右滑** | 温暖 / 接受 / 靠近 | 流畅长震 | 上行音 |
|
||||
| **左滑** | 冷淡 / 拒绝 / 推开 | 干脆短震 | 下行音 |
|
||||
| **上滑** | 好奇 / 追问 / 主动 | 快速上弹 | 快速上行 |
|
||||
| **下滑** | 沉默 / 退缩 / 不回应 | 极轻慢震 | 极轻低音 |
|
||||
|
||||
3. **关灯,戴上耳机**
|
||||
4. 将手机音量调到适中(建议 60–80%)
|
||||
5. 轻触屏幕任意位置开始游戏
|
||||
### 操作规则
|
||||
|
||||
> **iOS 用户注意**:Safari 不支持震动反馈,操作正常但无震感。建议使用 Android Chrome。
|
||||
- **每个场景只启用六种手势中的一部分**。旁白会播报当前可用的操作及其含义,玩家无需记忆。
|
||||
- 若玩家做出了当前场景不支持的手势,会有"无效操作"音效提示,不会产生误操作。
|
||||
- 没有时间限制,消息不会自动推进,完全由玩家控制节奏。
|
||||
- 旁白会在空闲一段时间后自动重复播报当前可用的操作选项,避免玩家迷失。
|
||||
|
||||
### 游戏选择界面
|
||||
|
||||
进入后旁白播报:"欢迎来到盲游,共六个游戏。单击听下一个介绍,双击开始当前游戏。"单击切换游戏,双击开始。
|
||||
|
||||
### 桌面调试键位
|
||||
|
||||
| 键 | 手势 |
|
||||
|----|------|
|
||||
| 空格 | 单击 |
|
||||
| 回车 | 双击 |
|
||||
| ↑ | 上滑 |
|
||||
| ↓ | 下滑 |
|
||||
| ← | 左滑 |
|
||||
| → | 右滑 |
|
||||
|
||||
> iOS Safari 不支持震动反馈,操作正常但无震感,建议使用 Android Chrome。
|
||||
|
||||
---
|
||||
|
||||
## 三、操作总览
|
||||
## 三、旁白系统
|
||||
|
||||
### 来电时
|
||||
**旁白是无障碍的核心**。每个游戏都有一位独立的旁白声音,全程为玩家描述:
|
||||
|
||||
| 操作 | 效果 |
|
||||
|------|------|
|
||||
| **单击 / 右滑** | 接听 |
|
||||
| **左滑 / 双击** | 拒接 |
|
||||
| **不动** | 铃声持续(不会自动挂断) |
|
||||
- 场景发生了什么("晚上九点零三分。手机震动,铃声响起。屏幕显示:妈妈。")
|
||||
- 当前可用的操作选项("单击接听,双击拒接。")
|
||||
- 操作后的结果("你接了。妈妈的声音从电话里传来……")
|
||||
- 结局陈述
|
||||
|
||||
### 收到消息时
|
||||
### 旁白的声音各不相同
|
||||
|
||||
| 操作 | 效果 |
|
||||
|------|------|
|
||||
| **单击** | 播放消息内容 |
|
||||
| **双击 / 左滑** | 跳过这条消息 |
|
||||
六个游戏的旁白音色、年龄感、情感基调均不同,详见 `docs/旁白音色提示词.md`。例如《林夏》是克制的纪录片女声,《守夜》是疲惫的中年男声,《浮》是飘渺的气声。
|
||||
|
||||
### 播放中
|
||||
### 旁白的实现方式
|
||||
|
||||
| 操作 | 效果 |
|
||||
|------|------|
|
||||
| **双击** | 跳过当前播放 |
|
||||
| **长按** | 重播当前消息 |
|
||||
|
||||
### 选择回复(听完消息后)
|
||||
|
||||
系统会播放提示音,进入回复选择状态:
|
||||
|
||||
| 操作 | 情感方向 |
|
||||
|------|----------|
|
||||
| **单击** | 简单回应 |
|
||||
| **右滑** | 温暖 / 接受 |
|
||||
| **左滑** | 冷淡 / 拒绝 |
|
||||
| **上滑** | 好奇 / 追问 |
|
||||
| **下滑** | 沉默 / 退缩 |
|
||||
| **双击** | 不回复(跳过) |
|
||||
|
||||
> 部分消息的回复会触发**多轮对话**——NPC 回应后,再次进入选择状态。
|
||||
|
||||
### 随时可用
|
||||
|
||||
| 操作 | 效果 |
|
||||
|------|------|
|
||||
| **两指长按** | 暂停游戏 |
|
||||
| **单击**(暂停中) | 继续游戏 |
|
||||
| **三指点击**(暂停中) | 退出游戏 |
|
||||
| **长按**(空闲/通知时) | 语音播报未读消息数 |
|
||||
旁白台词**优先使用预录的 TTS 配音**(由模型生成 MP3,见第四节);若预录文件缺失,则回退到浏览器内置 TTS 朗读同一段文本作为兜底。这样即使部分旁白尚未生成配音,游戏也可完整运行。
|
||||
|
||||
---
|
||||
|
||||
## 四、消息类型
|
||||
## 四、音频制作(全部由模型生成)
|
||||
|
||||
游戏中有四种消息形态:
|
||||
> **核心原则**:所有音乐、音效、配音均由 AI 模型本地生成,不使用任何真人录音或网络素材。
|
||||
|
||||
### 来电(call)
|
||||
手机长震 + 角色专属铃声。单击/右滑接听,左滑/双击拒接。
|
||||
### 4.1 音频分类与生成方式
|
||||
|
||||
### 微信语音(wechat_voice)
|
||||
两短震 + 系统提示音。单击播放语音内容。
|
||||
| 类别 | 内容 | 生成模型 | 数量 |
|
||||
|------|------|---------|------|
|
||||
| **角色配音** | 各游戏角色的台词语音 | TTS(VoxCPM2) | 林夏游戏 169 条 |
|
||||
| **旁白配音** | 六个游戏的旁白台词 | TTS(VoxCPM2) | 约 178 条 |
|
||||
| **BGM** | 背景音乐 | ACE-Step 1.5 | 4 段 |
|
||||
| **铃声** | 来电铃声 | ACE-Step 1.5 | 4 条 |
|
||||
| **环境音** | 场景底噪 | ACE-Step 1.5 | 3 段 |
|
||||
| **叙事音效** | 呼吸、心跳、敲门等 | ACE-Step 1.5 | 4 条 |
|
||||
| **UI 音效** | 操作反馈音 | Web Audio 浏览器合成 | 13 种(无文件) |
|
||||
|
||||
### 微信文字(wechat_text)
|
||||
两短震 + 系统提示音。单击后由系统朗读文字内容。
|
||||
### 4.2 TTS 配音流程(关键)
|
||||
|
||||
### 系统通知(system_notification)
|
||||
特殊消息,播放系统提示后自动播放内容。
|
||||
|
||||
---
|
||||
|
||||
## 五、行为画像
|
||||
|
||||
游戏全程追踪三个维度(玩家不可见):
|
||||
|
||||
| 维度 | 含义 | 触发行为 |
|
||||
|------|------|----------|
|
||||
| **avoidance**(回避) | 林夏今晚想一个人待着 | 跳过消息、不回复、沉默 |
|
||||
| **engagement**(投入) | 林夏在认真面对每一个人 | 温暖回应、好奇追问 |
|
||||
| **nostalgia**(怀旧) | 林夏在这一夜反复回望 | 与老同学深聊、分享自己 |
|
||||
|
||||
画像影响**时光胶囊**(消息15)播放哪个版本。
|
||||
|
||||
---
|
||||
|
||||
## 六、结局说明(不含剧透)
|
||||
|
||||
共 **5 种结局**,由以下变量决定:
|
||||
|
||||
| 变量 | 触发条件 |
|
||||
|------|----------|
|
||||
| 与妈妈的连接 | 是否接了妈妈的电话 / 回了消息 |
|
||||
| 阿哲是否回来 | 23:15 那通电话的选择 |
|
||||
| 与周南的深度 | 回应周南的次数与方式 |
|
||||
| 是否听自己 | 00:30 时光胶囊是否播放 |
|
||||
| 行为画像 | 整体回应风格 |
|
||||
|
||||
另有一个**隐藏结局 E**,需要与某位角色深度互动才能触发。
|
||||
|
||||
---
|
||||
|
||||
## 七、开发者 / 测试模式
|
||||
|
||||
在 URL 末尾加 `?dev` 可开启开发模式:
|
||||
**所有 TTS 配音都遵循"先定音色,再生成配音"的两步流程**:
|
||||
|
||||
```
|
||||
http://<服务器IP>:8765/game/?dev
|
||||
第一步:用提示词生成音色
|
||||
├─ 根据角色/旁白定位,撰写音色描述提示词(见 docs/旁白音色提示词.md)
|
||||
├─ 用 TTS 模型的 Voice Design 能力,按提示词生成多个音色样本
|
||||
└─ 人工试听筛选,选定一个参考音频作为该角色的"音色锚点"
|
||||
|
||||
第二步:用 TTS 生成配音
|
||||
├─ 将选定音色注册为参考(voice cloning)
|
||||
├─ 输入台词文本 + 表演修饰(语速、情感方向)
|
||||
├─ 模型克隆该音色,逐句合成配音
|
||||
└─ 输出 MP3,按命名规范部署到 audio/mp3/
|
||||
```
|
||||
|
||||
- 消息之间的等待间隔从 2 秒缩短为 0.2 秒
|
||||
- 屏幕底部显示调试信息(当前状态)
|
||||
- 适合快速测试分支和结局
|
||||
- **角色音色提示词**:见 `林夏.md`(归档于 `other_docs/`)§7.3 角色音色配置表。
|
||||
- **旁白音色提示词**:见 `docs/旁白音色提示词.md`,为六个游戏的旁白分别定义了声音特征、情感基调、中英文 TTS 提示词及朗读标注。
|
||||
- **旁白台词脚本**:见 `docs/音频脚本.md`,定义了全部旁白台词、文件命名规范与生成优先级。
|
||||
|
||||
### 4.3 音频文件命名规范
|
||||
|
||||
```
|
||||
audio/mp3/narrator/{game_id}/{game_id}_{scene_id}_{type}.mp3
|
||||
```
|
||||
|
||||
- `{game_id}`:linxia / yinian / shouye / houzhen / yisheng / fu
|
||||
- `{scene_id}`:如 msg01、s02、v03、h04、r10、f05
|
||||
- `{type}`:intro(开场)/ narrate(描述)/ tap(单击旁白)/ dt(双击旁白)/ ending_{id}(结局)等
|
||||
|
||||
### 4.4 技术规格
|
||||
|
||||
| 项目 | 规格 |
|
||||
|------|------|
|
||||
| 格式 | MP3,128kbps |
|
||||
| 采样率 | 44100 Hz |
|
||||
| 声道 | 单声道 |
|
||||
| 响度 | -18 LUFS |
|
||||
| 首尾静音 | 开头 100ms,结尾 200ms |
|
||||
|
||||
---
|
||||
|
||||
## 八、启动服务器
|
||||
## 五、项目结构
|
||||
|
||||
关机重启后需要重新启动 HTTP 服务器:
|
||||
```
|
||||
/home/xsl/blind/
|
||||
├── game/ # 游戏前端
|
||||
│ ├── index.html # 入口页面(黑屏)
|
||||
│ ├── manifest.json # PWA 配置
|
||||
│ ├── 操作说明.md # 本文件
|
||||
│ └── js/
|
||||
│ ├── utils.js # 工具函数 + 浏览器 TTS
|
||||
│ ├── haptics.js # 震动反馈
|
||||
│ ├── audio.js # 音频管理器 + 合成 UI 音效
|
||||
│ ├── narrator.js # 旁白系统(TTS 播报 + 队列)
|
||||
│ ├── input.js # 手势输入检测
|
||||
│ ├── engine.js # 场景引擎(状态机)
|
||||
│ ├── selector.js # 游戏选择器
|
||||
│ ├── main.js # 入口
|
||||
│ └── games/ # 六个游戏数据
|
||||
│ ├── linxia.js # 《林夏》
|
||||
│ ├── yinian.js # 《一念》
|
||||
│ ├── shouye.js # 《守夜》
|
||||
│ ├── houzhen.js # 《候诊》
|
||||
│ ├── yisheng.js # 《遗声》
|
||||
│ └── fu.js # 《浮》
|
||||
│
|
||||
├── audio/ # 音频资源 + 生成脚本
|
||||
│ ├── mp3/ # 游戏运行时音频(184 文件)
|
||||
│ │ ├── tts/ # 角色配音(169 条)
|
||||
│ │ ├── music/ # BGM + 铃声(8 条)
|
||||
│ │ ├── sfx/ # 叙事音效(4 条)
|
||||
│ │ └── ambience/ # 环境音(3 条)
|
||||
│ ├── narrator_samples/ # 旁白音色样本(WAV,注册音色用)
|
||||
│ ├── 00_raw/ # 原始素材
|
||||
│ ├── batch_tts_voxcpm.py # TTS 批量生成脚本
|
||||
│ ├── gen_music_acestep.py # BGM 生成脚本
|
||||
│ ├── gen_sfx_acestep.py # 音效生成脚本
|
||||
│ ├── gen_narrator_samples.py # 旁白音色样本生成
|
||||
│ ├── batch_narrator_tts.py # 旁白配音批量生成
|
||||
│ └── ... # 其他音频处理脚本
|
||||
│
|
||||
├── voice_mp3/narrator/ # 旁白预录 MP3(按游戏分目录)
|
||||
│
|
||||
├── docs/ # 设计文档
|
||||
│ ├── 旁白音色提示词.md # 六游戏旁白音色定义 + TTS 提示词
|
||||
│ └── 音频脚本.md # 六游戏旁白台词脚本 + 命名规范
|
||||
│
|
||||
└── other_docs/ # 历史参考文档(归档)
|
||||
├── 林夏_原始设计.md # 《林夏》原始游戏设计文档
|
||||
├── 执行文档_音频素材制作_归档.md # 旧版音频制作执行文档
|
||||
├── gdd/ # 其他游戏的概念设计草稿
|
||||
└── case_doc/ # 参考案例
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、启动与运行
|
||||
|
||||
### 启动 HTTP 服务器
|
||||
|
||||
```bash
|
||||
cd /home/xsl/blind
|
||||
python3 -m http.server 8765 --bind 0.0.0.0 &
|
||||
```
|
||||
|
||||
查看当前 IP:
|
||||
### 手机访问
|
||||
|
||||
```bash
|
||||
hostname -I | awk '{print $1}'
|
||||
```
|
||||
1. 手机和电脑连接**同一 Wi-Fi**
|
||||
2. 查看电脑 IP:`hostname -I | awk '{print $1}'`
|
||||
3. 手机浏览器输入:`http://<服务器IP>:8765/game/`
|
||||
4. **关灯,戴上耳机**,音量调到适中(建议 60–80%)
|
||||
5. 轻触屏幕任意位置开始
|
||||
|
||||
---
|
||||
|
||||
## 九、文件结构
|
||||
## 七、开发 / 测试模式
|
||||
|
||||
在 URL 末尾加参数可开启调试模式:
|
||||
|
||||
```
|
||||
/home/xsl/blind/
|
||||
├── game/
|
||||
│ ├── index.html 主页面(黑屏)
|
||||
│ ├── manifest.json PWA 配置
|
||||
│ ├── 操作说明.md 本文件
|
||||
│ └── js/
|
||||
│ ├── utils.js 工具函数 + 浏览器 TTS
|
||||
│ ├── haptics.js 震动反馈
|
||||
│ ├── audio.js 音频管理器 + 合成 UI 音效
|
||||
│ ├── gestures.js 单指手势检测
|
||||
│ ├── profile.js 行为画像评分
|
||||
│ ├── story.js 16条消息数据
|
||||
│ ├── engine.js 游戏状态机
|
||||
│ └── main.js 入口
|
||||
└── audio/
|
||||
└── mp3/
|
||||
├── tts/ 角色语音(169条)
|
||||
├── music/ BGM + 铃声(8条)
|
||||
├── sfx/ 音效(4条)
|
||||
└── ambience/ 环境底噪(3条)
|
||||
http://<服务器IP>:8765/game/?dev
|
||||
```
|
||||
|
||||
- `?dev`:屏幕底部显示调试信息(当前场景状态),缩短消息间隔
|
||||
- `?test`:跳过音频播放等待(快速自动化测试用)
|
||||
|
||||
---
|
||||
|
||||
*"屏幕坏了,但她的一夜还没结束。"*
|
||||
|
||||
Reference in New Issue
Block a user