Files
blind/game/操作说明.md
xsl 866f363591 项目整理:重写主文档、归档过时文档、清理死代码、新增音频制作手册
文档整理:
- 重写 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
2026-06-19 22:29:04 +08:00

230 lines
9.7 KiB
Markdown
Raw Permalink Blame History

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