# 盲游 · 项目说明 > 全黑屏纯音频交互游戏合集。没有视觉界面,只有声音和触感。 > 玩家闭眼也能完整体验——旁白全程解释状态,操作只有六种手势。 --- ## 一、项目简介 本项目是一个**盲人可玩、明眼人闭眼也好玩**的纯音频叙事游戏合集,共收录 **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`:跳过音频播放等待(快速自动化测试用) --- *"屏幕坏了,但她的一夜还没结束。"*