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

9.7 KiB
Raw Permalink Blame History

盲游 · 项目说明

全黑屏纯音频交互游戏合集。没有视觉界面,只有声音和触感。 玩家闭眼也能完整体验——旁白全程解释状态,操作只有六种手势。


一、项目简介

本项目是一个盲人可玩、明眼人闭眼也好玩的纯音频叙事游戏合集,共收录 6 个独立游戏

# 游戏 一句话 旁白定位
1 《林夏》 一部碎屏手机,一个北漂的夜晚,16 条消息决定明天的自己 纪录片叙述者
2 《一念》 内心法庭,七个声音在等你,今晚必须做一个决定 你的内心独白
3 《守夜》 你是夜班保安,独自坐在监控室,楼里传来声音,查还是不查 老同事的对讲机留言
4 《候诊》 等待检查结果的两小时,等待本身就是一种体验 时间本身的声音
5 《遗声》 一个陌生人的手机,十五条录音,听还是跳过——跳过就永远不知道 手机系统语音
6 《浮》 感官漂流,声音漂过来,抓住还是让它走 梦里的声音

每个游戏有独立的旁白音色、独立的场景脚本和多种结局。游戏之间互不影响,可任意选择体验。


二、操作方式(六种手势)

全程不看屏幕,只靠六种手势操作。每种手势有固定的语义,贯穿所有游戏:

手势 通用含义 触觉反馈 确认音效
单击 接受 / 打开 / 简单回应 轻触 清脆短音
双击 拒绝 / 跳过 / 忽略 短促双震 下行滑音
右滑 温暖 / 接受 / 靠近 流畅长震 上行音
左滑 冷淡 / 拒绝 / 推开 干脆短震 下行音
上滑 好奇 / 追问 / 主动 快速上弹 快速上行
下滑 沉默 / 退缩 / 不回应 极轻慢震 极轻低音

操作规则

  • 每个场景只启用六种手势中的一部分。旁白会播报当前可用的操作及其含义,玩家无需记忆。
  • 若玩家做出了当前场景不支持的手势,会有"无效操作"音效提示,不会产生误操作。
  • 没有时间限制,消息不会自动推进,完全由玩家控制节奏。
  • 旁白会在空闲一段时间后自动重复播报当前可用的操作选项,避免玩家迷失。

游戏选择界面

进入后旁白播报:"欢迎来到盲游,共六个游戏。单击听下一个介绍,双击开始当前游戏。"单击切换游戏,双击开始。

桌面调试键位

手势
空格 单击
回车 双击
上滑
下滑
左滑
右滑

iOS Safari 不支持震动反馈,操作正常但无震感,建议使用 Android Chrome。


三、旁白系统

旁白是无障碍的核心。每个游戏都有一位独立的旁白声音,全程为玩家描述:

  • 场景发生了什么("晚上九点零三分。手机震动,铃声响起。屏幕显示:妈妈。")
  • 当前可用的操作选项("单击接听,双击拒接。")
  • 操作后的结果("你接了。妈妈的声音从电话里传来……")
  • 结局陈述

旁白的声音各不相同

六个游戏的旁白音色、年龄感、情感基调均不同,详见 docs/旁白音色提示词.md。例如《林夏》是克制的纪录片女声,《守夜》是疲惫的中年男声,《浮》是飘渺的气声。

旁白的实现方式

旁白台词优先使用预录的 TTS 配音(由模型生成 MP3,见第四节);若预录文件缺失,则回退到浏览器内置 TTS 朗读同一段文本作为兜底。这样即使部分旁白尚未生成配音,游戏也可完整运行。


四、音频制作(全部由模型生成)

核心原则:所有音乐、音效、配音均由 AI 模型本地生成,不使用任何真人录音或网络素材。

4.1 音频分类与生成方式

类别 内容 生成模型 数量
角色配音 各游戏角色的台词语音 TTSVoxCPM2 林夏游戏 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 服务器

cd /home/xsl/blind
python3 -m http.server 8765 --bind 0.0.0.0 &

手机访问

  1. 手机和电脑连接同一 Wi-Fi
  2. 查看电脑 IPhostname -I | awk '{print $1}'
  3. 手机浏览器输入:http://<服务器IP>:8765/game/
  4. 关灯,戴上耳机,音量调到适中(建议 6080%
  5. 轻触屏幕任意位置开始

七、开发 / 测试模式

在 URL 末尾加参数可开启调试模式:

http://<服务器IP>:8765/game/?dev
  • ?dev:屏幕底部显示调试信息(当前场景状态),缩短消息间隔
  • ?test:跳过音频播放等待(快速自动化测试用)

"屏幕坏了,但她的一夜还没结束。"