Files
blind/docs/音频制作执行手册.md
T
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

12 KiB
Raw Blame History

盲游 · 音频制作执行手册

本手册是从零制作一款游戏音频的操作指南,覆盖配音、音乐、音效三类。 所有音频均由本机 AI 模型本地生成,不依赖任何真人录音或网络素材。 林夏项目将按本手册完全重头制作。


〇、环境速查(已就绪,无需再装)

类别 工具 路径 / 环境 用途
基础 FFmpeg 7.0 /usr/local/bin/ffmpeg 格式转换、响度归一化、听筒效果
基础 Python 3.13 + conda /home/xsl/miniconda3 脚本运行
GPU RTX 5090 32GB 模型推理
配音 VoxCPM2 /home/xsl/tts-server · 端口 8000 TTS 主链路(Voice Design + 克隆)
配音-备 CosyVoice 2.0 /home/xsl/tools/CosyVoice · conda cosyvoice TTS 备用
配音-备 GPT-SoVITS /home/xsl/tools/GPT-SoVITS · conda gptsovits TTS 备用
配音-备 fish-speech /home/xsl/tools/fish-speech · conda fishspeech TTS 备用
音乐 ACE-Step 1.5 /home/xsl/tools/ACE-Step-1.5 · conda acestep BGM + 铃声生成
音效 ACE-Step 1.5 同上 氛围类音效(≥5s
音效-补 Stable Audio Open /home/xsl/tools/stable-audio-tools · conda stableaudio 高品质音效补充
UI 音效 Web Audio API 浏览器端 audio.js 合成 短促反馈音(无文件)

模型权重VoxCPM2 @ /home/xsl/models/VoxCPM2

端口说明:VoxCPM2 服务固定使用 8000/home/xsl/tts-server 不动)。项目脚本通过 VOXCPM_HOST/VOXCPM_PORT 环境变量读取,默认 8000,已全部对齐。


一、总体流程(三类音频统一节奏)

准备内容(音色提示词 + 台词表 + BGM/音效 caption
        │
        ├── 配音 ─→ 启动TTS ─→ 生成音色样本 ─→ 选定音色 ─→ 克隆生成台词 ─→ 归一化
        ├── 音乐 ─→ 启动ACE-Step ─→ 生成 ─→ 归一化
        └── 音效 ─→ 启动ACE-Step ─→ 生成 ─→ 归一化
        │
        └── 统一归一化(process_audio.sh)──→ 部署到 audio/mp3/

关键原则——TTS 配音两步走:先用提示词生成音色样本 → 人工筛选 → 再用选定音色克隆生成正式配音。不要跳过选音色这一步。


二、配音制作(TTS / VoxCPM2

2.1 启动 TTS 服务

# 方式一:直接启动
bash /home/xsl/tts-server/start-voxcpm.sh
# 验证
curl http://127.0.0.1:8000/health
# 预期: {"status":"ok","model":"VoxCPM2","styled_speech":true}

# 方式二:环境检查 + 自动启动(含降噪模型回退)
bash /home/xsl/blind/audio/check_tts_env.sh
bash /home/xsl/blind/audio/check_tts_env.sh --full   # 含全链路测试合成

若降噪模型下载失败,脚本会自动回退到 VOXCPM_ENABLE_DENOISER=0 重试(更稳,降噪关闭)。

2.2 第一步:生成音色样本(Voice Design

输入:角色的音色提示词(风格描述)。 参考文档docs/旁白音色提示词.md(旁白)、other_docs/林夏_原始设计.md §7.3(角色音色配置表)。

# 生成六个旁白的音色样本(无需参考音频,纯 Voice Design
cd /home/xsl/blind
python3 audio/gen_narrator_samples.py
# 输出: audio/narrator_samples/{game_id}/sample_*.wav

若要为新游戏/新角色生成样本,修改 gen_narrator_samples.py 中的 NARRATORS 字典:填入 style(音色提示词)、speed(语速)、samples(代表性台词)。

2.3 人工筛选音色

  1. 试听 audio/narrator_samples/{game_id}/ 下的 WAV
  2. docs/旁白音色提示词.md 末尾的"样本评估标准"打分(音色符合度、情感准确度、语速节奏、清晰度、辨识度)
  3. 选定一个样本,作为该角色/旁白的音色锚点

2.4 第二步:克隆生成正式配音

将选定音色放入参考目录

voice_mp3/narrator/{game_id}/    # 或 voice/narrator/{game_id}/WAV
  └── 选定的音色样本文件

批量生产旁白配音

# 生产所有游戏旁白
python3 audio/batch_narrator_tts.py --source voice_mp3

# 只生产指定游戏
python3 audio/batch_narrator_tts.py --source voice_mp3 --game linxia

# 只生产 P0narrate/tap/dt/intro,核心体验)
python3 audio/batch_narrator_tts.py --source voice_mp3 --priority p0

# 干跑(先看任务列表,不实际合成)
python3 audio/batch_narrator_tts.py --source voice_mp3 --dry-run

输出:audio/00_raw/narrator/{game_id}/{game_id}_{scene_id}_{type}.wav

批量生产角色配音(林夏角色台词)

# 林夏角色台词(需在脚本 LINES 中维护台词表)
python3 audio/batch_tts_voxcpm.py --source voice_mp3 --dry-run    # 先看任务
python3 audio/batch_tts_voxcpm.py --source voice_mp3              # 正式生产
python3 audio/batch_tts_voxcpm.py --source voice_mp3 --role mom   # 只生产某角色

输出:audio/00_raw/tts/{filename}_wav_v1.wav

台词表在 batch_tts_voxcpm.pyLINES 变量中维护;参考音色在 voice_mp3/{角色}/voice/{角色}/ 下。重做林夏时需重新整理台词表。

2.5 VoxCPM2 API(手动单条合成时用)

接口 用途
POST /v1/voices 注册参考音频(wav_base64)→ 返回 voice_id
POST /v1/speech 纯克隆合成(text + voice_id)→ WAV
POST /v1/speech/styled Style Control(有 voice_id=克隆+表演;无=Voice Design

参数:cfg_value(默认 2.0)、inference_timesteps(默认 10);输出 48kHz 16-bit PCM WAV。


三、音乐制作(BGM + 铃声 / ACE-Step 1.5

3.1 启动环境

conda activate acestep

3.2 生成

修改 audio/gen_music_acestep.py 中的 BGM_TRACKS(每段填 filenamedurationcaptionseed),然后:

# 生成全部(BGM + 铃声)
python3 audio/gen_music_acestep.py

# 只生成 BGM
python3 audio/gen_music_acestep.py --category bgm

# 只生成铃声
python3 audio/gen_music_acestep.py --category ringtone

# 干跑
python3 audio/gen_music_acestep.py --dry-run

输出:audio/00_raw/music/{filename}.wav

RTX 5090 已在脚本顶部做了 cuBLAS 修复:torch.backends.cuda.preferred_blas_library("cublaslt"),无需额外处理。

3.3 BGM caption 示例(参考林夏已有)

{
    "filename": "bgm_main_loop",
    "duration": 90,
    "caption": "lo-fi midnight bedroom, soft piano, light vinyl crackle, muted piano, subtle synth pad, occasional distant rain, melancholy but warm, ambient loop, no drums, 70 bpm",
    "lyrics": "",
    "steps": 20,
    "seed": 2103,
}

caption 越具体,生成质量越稳定。建议包含:风格、乐器、情绪、节奏、是否带人声、bpm。


四、音效制作(ACE-Step 1.5

4.1 适用范围

  • ACE-Step 可生成:≥5s 的氛围类音效(呼吸、心跳、转场 swell、环境底噪等)
  • 需另行处理:短促 UI 音效(叮、咚、点击)—— 由 audio.js 的 Web Audio 合成,无需文件
  • 补充:可用 Stable Audio Open 生成 ACE-Step 不擅长的音效

4.2 生成

修改 audio/gen_sfx_acestep.py 中的 SFX_TRACKS(填 filenamedurationcaptionseed),然后:

conda activate acestep
python3 audio/gen_sfx_acestep.py            # 正式生成
python3 audio/gen_sfx_acestep.py --dry-run  # 干跑

输出:

  • 音效 → audio/00_raw/sfx/{filename}.wav
  • 环境音 → audio/00_raw/ambience/{filename}.wav

五、后期归一化(统一处理)

所有原始音频生成后,用 process_audio.sh 统一做响度归一化、听筒效果、格式转换:

cd /home/xsl/blind
bash audio/process_audio.sh tts       # 配音(含电话/语音听筒效果)
bash audio/process_audio.sh music     # BGM + 铃声
bash audio/process_audio.sh sfx       # 音效
bash audio/process_audio.sh ambience  # 环境音
bash audio/process_audio.sh all       # 全部

各类响度标准

类别 响度 额外处理
TTS 配音 -16 LUFS 电话/语音类加听筒效果(highpass+lowpass+EQ);长语音分段拼接
BGM -18 LUFS
音效 -14 LUFS
环境音 -22 LUFS highpass 60Hz + lowpass 12kHz

处理流程:audio/00_raw/{type}/audio/01_processed/{type}/

最终部署到 audio/mp3/ 的文件应为 44100Hz、单声道、128kbps MP3。从 01_processed 拷贝/转码到 mp3/ 时确认格式。


六、文件命名规范

配音(角色台词)

audio/mp3/tts/{role}_{scene}_{type}_wav_v1.mp3

林夏项目约定带 _wav_v1 后缀(历史命名,沿用)。

旁白

audio/mp3/narrator/{game_id}/{game_id}_{scene_id}_{type}.mp3

{type} 取值:intro(开场)/ narrate(描述)/ tap(单击旁白)/ dt(双击旁白)/ ending_{id}(结局)等。

音乐 / 音效 / 环境音

audio/mp3/music/{name}_v1.mp3
audio/mp3/sfx/sfx_{name}_v1.mp3
audio/mp3/ambience/amb_{name}_v1.mp3

七、生成优先级(生产顺序建议)

按以下顺序生产,优先保证核心体验可玩:

  1. P0(必须):每个游戏 intro + 所有 narrate + 所有 tap/dt 旁白
  2. P1(重要):所有 ending 结局配音
  3. P2(重要):角色主台词(NPC Round 1
  4. P3(次要):角色反应台词(Round 2/3)、BGM
  5. P4(可选):条件分支变体(_a/_b)、环境音、叙事音效

旁白和 intro 优先级最高——它们决定玩家能否理解游戏。即使角色台词还没生成,引擎会用浏览器 TTS 兜底旁白文本,游戏也能跑起来。


八、完整生产清单(林夏重做时按此打勾)

配音

  • 整理角色台词表(写入 batch_tts_voxcpm.pyLINES
  • 整理旁白脚本(对照 docs/音频脚本.md,写入 batch_narrator_tts.py
  • 为每个角色/旁白写音色提示词(对照 docs/旁白音色提示词.md
  • 启动 VoxCPM2bash /home/xsl/tts-server/start-voxcpm.sh
  • 生成音色样本:python3 audio/gen_narrator_samples.py
  • 试听 + 选定音色,放入 voice_mp3/narrator/{game}/voice_mp3/{角色}/
  • 生产旁白:python3 audio/batch_narrator_tts.py --source voice_mp3 --priority p0
  • 生产角色:python3 audio/batch_tts_voxcpm.py --source voice_mp3
  • 归一化:bash audio/process_audio.sh tts

音乐

  • 写 BGM caption(写入 gen_music_acestep.pyBGM_TRACKS
  • conda activate acestep && python3 audio/gen_music_acestep.py --category bgm
  • 归一化:bash audio/process_audio.sh music

音效

  • 写音效 caption(写入 gen_sfx_acestep.pySFX_TRACKS
  • conda activate acestep && python3 audio/gen_sfx_acestep.py
  • 归一化:bash audio/process_audio.sh sfx && bash audio/process_audio.sh ambience

部署

  • 确认 audio/mp3/ 下文件齐全、格式正确(44100Hz/单声道/128kbps MP3
  • 启动游戏验证:python3 -m http.server 8765 --bind 0.0.0.0,手机访问 http://<IP>:8765/game/

九、常见问题

问题 对策
TTS 服务起不来 /tmp/voxcpm-server.log;若降噪模型下载失败,用 VOXCPM_ENABLE_DENOISER=0 bash /home/xsl/tts-server/start-voxcpm.sh
端口 8000 被占 ss -lnt | grep 8000 查占用;如需换端口,VOXCPM_PORT=xxxx bash start-voxcpm.sh,并把 gen_narrator_samples.py 等脚本的 VOXCPM_PORT 一并设
某角色音色不满意 重新调 style 提示词,重跑 gen_narrator_samples.py,换样本
响度不统一 确认走了 process_audio.sh,别直接用 00_raw 的文件
长文本 TTS 质量下降 分段生成,process_audio.sh 会自动拼接(见脚本中分段处理逻辑)
ACE-Step 报 cuBLAS 错 脚本已内置修复;若仍报错,确认 conda activate acestep 后再跑