文档整理: - 重写 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
230 lines
9.7 KiB
Markdown
230 lines
9.7 KiB
Markdown
# 盲游 · 项目说明
|
||
|
||
> 全黑屏纯音频交互游戏合集。没有视觉界面,只有声音和触感。
|
||
> 玩家闭眼也能完整体验——旁白全程解释状态,操作只有六种手势。
|
||
|
||
---
|
||
|
||
## 一、项目简介
|
||
|
||
本项目是一个**盲人可玩、明眼人闭眼也好玩**的纯音频叙事游戏合集,共收录 **6 个独立游戏**:
|
||
|
||
| # | 游戏 | 一句话 | 旁白定位 |
|
||
|---|------|--------|---------|
|
||
| 1 | 《林夏》 | 一部碎屏手机,一个北漂的夜晚,16 条消息决定明天的自己 | 纪录片叙述者 |
|
||
| 2 | 《一念》 | 内心法庭,七个声音在等你,今晚必须做一个决定 | 你的内心独白 |
|
||
| 3 | 《守夜》 | 你是夜班保安,独自坐在监控室,楼里传来声音,查还是不查 | 老同事的对讲机留言 |
|
||
| 4 | 《候诊》 | 等待检查结果的两小时,等待本身就是一种体验 | 时间本身的声音 |
|
||
| 5 | 《遗声》 | 一个陌生人的手机,十五条录音,听还是跳过——跳过就永远不知道 | 手机系统语音 |
|
||
| 6 | 《浮》 | 感官漂流,声音漂过来,抓住还是让它走 | 梦里的声音 |
|
||
|
||
每个游戏有独立的旁白音色、独立的场景脚本和多种结局。游戏之间互不影响,可任意选择体验。
|
||
|
||
---
|
||
|
||
## 二、操作方式(六种手势)
|
||
|
||
全程**不看屏幕**,只靠六种手势操作。每种手势有固定的语义,贯穿所有游戏:
|
||
|
||
| 手势 | 通用含义 | 触觉反馈 | 确认音效 |
|
||
|------|---------|---------|---------|
|
||
| **单击** | 接受 / 打开 / 简单回应 | 轻触 | 清脆短音 |
|
||
| **双击** | 拒绝 / 跳过 / 忽略 | 短促双震 | 下行滑音 |
|
||
| **右滑** | 温暖 / 接受 / 靠近 | 流畅长震 | 上行音 |
|
||
| **左滑** | 冷淡 / 拒绝 / 推开 | 干脆短震 | 下行音 |
|
||
| **上滑** | 好奇 / 追问 / 主动 | 快速上弹 | 快速上行 |
|
||
| **下滑** | 沉默 / 退缩 / 不回应 | 极轻慢震 | 极轻低音 |
|
||
|
||
### 操作规则
|
||
|
||
- **每个场景只启用六种手势中的一部分**。旁白会播报当前可用的操作及其含义,玩家无需记忆。
|
||
- 若玩家做出了当前场景不支持的手势,会有"无效操作"音效提示,不会产生误操作。
|
||
- 没有时间限制,消息不会自动推进,完全由玩家控制节奏。
|
||
- 旁白会在空闲一段时间后自动重复播报当前可用的操作选项,避免玩家迷失。
|
||
|
||
### 游戏选择界面
|
||
|
||
进入后旁白播报:"欢迎来到盲游,共六个游戏。单击听下一个介绍,双击开始当前游戏。"单击切换游戏,双击开始。
|
||
|
||
### 桌面调试键位
|
||
|
||
| 键 | 手势 |
|
||
|----|------|
|
||
| 空格 | 单击 |
|
||
| 回车 | 双击 |
|
||
| ↑ | 上滑 |
|
||
| ↓ | 下滑 |
|
||
| ← | 左滑 |
|
||
| → | 右滑 |
|
||
|
||
> iOS Safari 不支持震动反馈,操作正常但无震感,建议使用 Android Chrome。
|
||
|
||
---
|
||
|
||
## 三、旁白系统
|
||
|
||
**旁白是无障碍的核心**。每个游戏都有一位独立的旁白声音,全程为玩家描述:
|
||
|
||
- 场景发生了什么("晚上九点零三分。手机震动,铃声响起。屏幕显示:妈妈。")
|
||
- 当前可用的操作选项("单击接听,双击拒接。")
|
||
- 操作后的结果("你接了。妈妈的声音从电话里传来……")
|
||
- 结局陈述
|
||
|
||
### 旁白的声音各不相同
|
||
|
||
六个游戏的旁白音色、年龄感、情感基调均不同,详见 `docs/旁白音色提示词.md`。例如《林夏》是克制的纪录片女声,《守夜》是疲惫的中年男声,《浮》是飘渺的气声。
|
||
|
||
### 旁白的实现方式
|
||
|
||
旁白台词**优先使用预录的 TTS 配音**(由模型生成 MP3,见第四节);若预录文件缺失,则回退到浏览器内置 TTS 朗读同一段文本作为兜底。这样即使部分旁白尚未生成配音,游戏也可完整运行。
|
||
|
||
---
|
||
|
||
## 四、音频制作(全部由模型生成)
|
||
|
||
> **核心原则**:所有音乐、音效、配音均由 AI 模型本地生成,不使用任何真人录音或网络素材。
|
||
|
||
### 4.1 音频分类与生成方式
|
||
|
||
| 类别 | 内容 | 生成模型 | 数量 |
|
||
|------|------|---------|------|
|
||
| **角色配音** | 各游戏角色的台词语音 | 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 种(无文件) |
|
||
|
||
### 4.2 TTS 配音流程(关键)
|
||
|
||
**所有 TTS 配音都遵循"先定音色,再生成配音"的两步流程**:
|
||
|
||
```
|
||
第一步:用提示词生成音色
|
||
├─ 根据角色/旁白定位,撰写音色描述提示词(见 docs/旁白音色提示词.md)
|
||
├─ 用 TTS 模型的 Voice Design 能力,按提示词生成多个音色样本
|
||
└─ 人工试听筛选,选定一个参考音频作为该角色的"音色锚点"
|
||
|
||
第二步:用 TTS 生成配音
|
||
├─ 将选定音色注册为参考(voice cloning)
|
||
├─ 输入台词文本 + 表演修饰(语速、情感方向)
|
||
├─ 模型克隆该音色,逐句合成配音
|
||
└─ 输出 MP3,按命名规范部署到 audio/mp3/
|
||
```
|
||
|
||
- **角色音色提示词**:见 `林夏.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 |
|
||
|
||
---
|
||
|
||
## 五、项目结构
|
||
|
||
```
|
||
/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 &
|
||
```
|
||
|
||
### 手机访问
|
||
|
||
1. 手机和电脑连接**同一 Wi-Fi**
|
||
2. 查看电脑 IP:`hostname -I | awk '{print $1}'`
|
||
3. 手机浏览器输入:`http://<服务器IP>:8765/game/`
|
||
4. **关灯,戴上耳机**,音量调到适中(建议 60–80%)
|
||
5. 轻触屏幕任意位置开始
|
||
|
||
---
|
||
|
||
## 七、开发 / 测试模式
|
||
|
||
在 URL 末尾加参数可开启调试模式:
|
||
|
||
```
|
||
http://<服务器IP>:8765/game/?dev
|
||
```
|
||
|
||
- `?dev`:屏幕底部显示调试信息(当前场景状态),缩短消息间隔
|
||
- `?test`:跳过音频播放等待(快速自动化测试用)
|
||
|
||
---
|
||
|
||
*"屏幕坏了,但她的一夜还没结束。"*
|