文档整理: - 重写 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
9.7 KiB
9.7 KiB
盲游 · 项目说明
全黑屏纯音频交互游戏合集。没有视觉界面,只有声音和触感。 玩家闭眼也能完整体验——旁白全程解释状态,操作只有六种手势。
一、项目简介
本项目是一个盲人可玩、明眼人闭眼也好玩的纯音频叙事游戏合集,共收录 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 服务器
cd /home/xsl/blind
python3 -m http.server 8765 --bind 0.0.0.0 &
手机访问
- 手机和电脑连接同一 Wi-Fi
- 查看电脑 IP:
hostname -I | awk '{print $1}' - 手机浏览器输入:
http://<服务器IP>:8765/game/ - 关灯,戴上耳机,音量调到适中(建议 60–80%)
- 轻触屏幕任意位置开始
七、开发 / 测试模式
在 URL 末尾加参数可开启调试模式:
http://<服务器IP>:8765/game/?dev
?dev:屏幕底部显示调试信息(当前场景状态),缩短消息间隔?test:跳过音频播放等待(快速自动化测试用)
"屏幕坏了,但她的一夜还没结束。"