Files
blind/audio_2/项目状态说明.md
T
xslandCursor 9c02fbcd74 同步音频文档至 v5 克隆现行状态
更新林夏设计纲要、执行文档与技术报告,对齐 VoxCPM2 8002 端口、v4/v5 流水线、游戏 184 个 MP3 引用及 13 角色参考音色。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-24 10:35:49 +08:00

8.2 KiB
Raw Blame History

《林夏》音频制作 — 当前状态说明

更新日期:2026-05-23
本文档记录 TTS 音色选型、全量生成、游戏部署的现行状态,便于下次继续迭代。


1. 一句话总结

游戏当前使用的是 v5 克隆音色:从 Voice Design 试听样本中选定参考音频 → VoxCPM2 Style Control 克隆 → 部署到 audio/mp3/tts/*_wav_v1.mp3
audio/mp3/ 已清理,仅保留游戏引用的 184 个文件。


2. 游戏实际加载哪些音频

游戏代码在 game/js/story.jsgame/js/engine.js,根路径:

../audio/mp3/
├── tts/        对白(169 条,游戏引用)
├── music/      BGM、铃声
├── sfx/        音效
└── ambience/   环境音

命名规则(重要)

文件名 游戏是否使用
*_wav_v1.mp3 — 全部对白、系统语音都用这种
*_mp3_v1.mp3 — 旧流水线遗留,已全部删除

后缀里的 wav 表示「用 WAV 参考音色生成的 v1 版」,文件格式仍是 MP3。

示例

game/js/story.js → npc('lv11_0015_mom_call_01_wav_v1.mp3')
实际文件         → audio/mp3/tts/lv11_0015_mom_call_01_wav_v1.mp3

不需要改 story.js,只要更新 audio/mp3/tts/ 里对应的 *_wav_v1.mp3 即可。


3. TTS 服务

项目 路径 / 值
服务目录 /home/xsl/tts-server/
启动脚本 VOXCPM_PORT=8002 VOXCPM_ENABLE_DENOISER=0 bash /home/xsl/tts-server/start-voxcpm.sh
端口 80028000 被 head3d 占用)
健康检查 curl http://127.0.0.1:8002/health
主要接口 POST /v1/voices 注册参考音频
POST /v1/speech/styled 合成(voice_id + style = 克隆;无 voice_id = Voice Design

4. 音色演进(v1 → v5

版本 目录 方式 状态
v1 audio_1/tts/v1_voxcpm2/ 旧参考音频直接克隆,无 style 已被 v5 替代
v2 audio_2/tts/v2_styled/(已不在磁盘) 旧参考 + Style Control 表演 已废弃
v3 audio_2/tts/v3_voice_design/(已不在磁盘) 纯 Voice Design,无参考 已废弃
v4 audio_2/tts/v4_voice_samples/ 每角色 5 条试听,用户挑选 保留选定样本
v5 audio_2/tts/v5_cloned/ 选定样本克隆 + 表演修饰 当前正式版
游戏 audio/mp3/tts/*_wav_v1.mp3 v5 自动部署副本 游戏正在使用

5. 各角色选定的参考音色(v4 试听挑选)

参考文件位于 audio_2/tts/v4_voice_samples/{角色}/,每角色仅保留 1 条 .wav

角色 选定文件 性别
linxia linxia_v05.wav
mom mom_v01.wav
azhe azhe_v03.wav
xiaomei xiaomei_v05.wav
xiaomei_drunk xiaomei_drunk_v05.wav
zhounan zhounan_v05.wav
hr hr_v05.wav
anan anan_v04.wav
dorm_a dorm_a_v03.wav
dorm_b dorm_b_v02.wav
dorm_c dorm_c_v03.wav
delivery delivery_v04.wav
self_3y self_3y_v03.wav

副本已同步到 voice/{角色}/{角色}_ref.wavxiaomei_drunkvoice/xiaomei/xiaomei_drunk_ref.wavself_3yvoice/linxia/self_3y_ref.wav)。


6. v5 全量生成结果

  • 177 条 MP3audio_2/tts/v5_cloned/*_wav_v5.mp3
  • 177 条已部署:audio/mp3/tts/*_wav_v1.mp3
  • 生成清单:audio_2/tts/v5_cloned/clone_manifest.tsv

来源台词表:audio/batch_tts_voxcpm.pyLINES173 条)+ 脚本内 EXTRA_LINES4 条):

额外文件 角色 说明
lv11_0030_self3y_voice_01/02/03 self_3y 三年前录音三版
lv11_sys_memo_01 linxia 系统提示「三年前今天…」

克隆时只用表演修饰(warm/cold/分段等),音色完全由参考 wav 决定。配置见 audio_2/voice_style_prompts.pyget_clone_style()


7. 目录结构速查

blind/
├── game/js/story.js          游戏剧情 + 音频引用
├── game/js/engine.js         系统语音、结局、BGM
├── audio/
│   ├── batch_tts_voxcpm.py   台词表 LINES + 角色语速 ROLES
│   └── mp3/                  游戏运行时音频(184 文件,已清理)
│       ├── tts/              169 条对白(游戏引用)
│       ├── music/
│       ├── sfx/
│       └── ambience/
├── voice/                    各角色参考音频(含 v5 选定副本)
└── audio_2/
    ├── 项目状态说明.md        ← 本文档
    ├── 角色语音风格提示词.md   Voice Design 说明(历史参考)
    ├── voice_style_prompts.py  表演修饰 + Voice Design 提示词
    ├── voice_sample_prompts.py v4 试听:5 变体/角色 + 统一试听文本
    ├── scripts/
    │   ├── 01_gen_tts_styled.py       v2 Style Control(旧)
    │   ├── 02_gen_tts_voice_design.py v3 Voice Design(旧)
    │   ├── 03_gen_voice_samples.py    v4 生成试听样本
    │   └── 04_gen_tts_clone.py        v5 克隆 + 部署游戏 ★
    └── tts/
        ├── v4_voice_samples/   选定参考音色(每角色 1 wav + mp3
        └── v5_cloned/          正式产物 + clone_manifest.tsv

8. 常用命令

启动 TTS

VOXCPM_PORT=8002 VOXCPM_ENABLE_DENOISER=0 bash /home/xsl/tts-server/start-voxcpm.sh
curl http://127.0.0.1:8002/health

重跑全量克隆(改参考音频或提示词后)

cd /home/xsl/blind
VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --force
  • 输出:audio_2/tts/v5_cloned/*_wav_v5.mp3
  • 自动覆盖:audio/mp3/tts/*_wav_v1.mp3

只重跑某角色

VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --role mom --force

重新生成某角色试听(换提示词挑音色)

VOXCPM_PORT=8002 python audio_2/scripts/03_gen_voice_samples.py --role delivery --force

预览任务不合成

python audio_2/scripts/04_gen_tts_clone.py --dry-run

9. 其他音频服务(非 TTS

用途 位置
音乐 / 音效生成 /home/xsl/tools/ACE-Step-1.5
Stable Audio /home/xsl/tools/stable-audio-tools
UI 短音效 Web Audio(浏览器内合成)

VoxCPM2 不能用提示词生成敲门、心跳等 SFX,只能做人声 TTS。


10. 已知注意点

  1. Voice Design 音色不稳定:同角色各条可能漂移,因此最终方案是「试听选定 → 克隆锚定」。
  2. 外卖小哥语速delivery 提示词已调慢,ROLES["delivery"]["speed"] 已从 1.20 改为 1.00
  3. 男声角色azhezhounandelivery
  4. 重新清理未使用音频:扫描 game/js/*.jsaudio/mp3/ 对比删除;当前已对齐(184 = 184)。
  5. 改游戏引用:若将来改用 _wav_v5.mp3 等新后缀,需批量改 story.js / engine.js;目前无需改动。

11. 下次可继续的事

  • 实机/playtest 听一遍各角色,标记需重跑的台词或角色
  • 若某角色不满意:改 voice_sample_prompts.py → 重跑 03 挑选 → 替换 v4_voice_samples/{role}/ → 重跑 04
  • 微调单条表演:改 voice_style_prompts.py_performance 规则 → --role xxx --force

12. 快速验证游戏音频是否正常

# 游戏引用的文件是否都存在
python3 - <<'PY'
import re
from pathlib import Path
root = Path("/home/xsl/blind")
text = "".join((root/"game/js/story.js").read_text() + (root/"game/js/engine.js").read_text())
refs = set()
for m in re.finditer(r'\$\{(MUS|SFX|AMB|T)\}/([^`\']+\.mp3)', text):
    sub = {'MUS':'music','SFX':'sfx','AMB':'ambience','T':'tts'}[m.group(1)]
    refs.add(root/f"audio/mp3/{sub}/{m.group(2)}")
for m in re.finditer(r"(?:npc|lx|rx)\('([^']+\.mp3)'\)", text):
    refs.add(root/f"audio/mp3/tts/{m.group(1)}")
missing = [r for r in refs if not r.exists()]
print(f"引用 {len(refs)}  缺失 {len(missing)}")
for p in sorted(missing): print(" MISSING:", p.relative_to(root))
PY

预期输出:缺失 0