项目整理:重写主文档、归档过时文档、清理死代码、新增音频制作手册

文档整理:
- 重写 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:
xsl
2026-06-19 22:29:04 +08:00
parent b3384499e3
commit 866f363591
46 changed files with 5061 additions and 2374 deletions
+175 -135
View File
@@ -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 条 |
| **旁白配音** | 六个游戏的旁白台词 | TTSVoxCPM2 | 约 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 技术规格
| 项目 | 规格 |
|------|------|
| 格式 | MP3128kbps |
| 采样率 | 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. **关灯,戴上耳机**,音量调到适中(建议 6080%
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`:跳过音频播放等待(快速自动化测试用)
---
*"屏幕坏了,但她的一夜还没结束。"*