From 9c02fbcd74bc72418f6a0511f0563d2e203b03dc Mon Sep 17 00:00:00 2001 From: xsl Date: Sun, 24 May 2026 10:35:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E9=9F=B3=E9=A2=91=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E8=87=B3=20v5=20=E5=85=8B=E9=9A=86=E7=8E=B0=E8=A1=8C?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新林夏设计纲要、执行文档与技术报告,对齐 VoxCPM2 8002 端口、v4/v5 流水线、游戏 184 个 MP3 引用及 13 角色参考音色。 Co-authored-by: Cursor --- audio_2/角色语音风格提示词.md | 93 +++++------ audio_2/项目状态说明.md | 5 +- 执行文档_音频素材制作.md | 294 ++++++++++++++++++---------------- 技术报告_音频资源制作.md | 79 ++++++--- 林夏.md | 200 +++++++++++++---------- 5 files changed, 372 insertions(+), 299 deletions(-) diff --git a/audio_2/角色语音风格提示词.md b/audio_2/角色语音风格提示词.md index 262b2d9..3a872d8 100644 --- a/audio_2/角色语音风格提示词.md +++ b/audio_2/角色语音风格提示词.md @@ -1,73 +1,74 @@ -# 《林夏》角色 Voice Design 提示词 +# 《林夏》角色语音提示词 -> **模式**:VoxCPM2 **Voice Design**(纯提示词,**不使用** `voice/` 参考音频) -> **接口**:`POST /v1/speech/styled` — `{ "text": "...", "style": "..." }`(**不传** `voice_id`) -> **目的**:每个角色用不同提示词生成**不同音色**;同角色内用表演修饰控制 warm/cold 等分支。 +> **现行生产(v5)**:参考 wav 锚定音色 + `get_clone_style()` 表演修饰 → `04_gen_tts_clone.py` +> **试听选音色(v4)**:Voice Design 纯提示词 → `03_gen_voice_samples.py` +> **详细状态**:`audio_2/项目状态说明.md` --- -## 1. 与 v2 的区别 +## 1. 三阶段关系 -| | v2 (`v2_styled`) | v3 (`v3_voice_design`) | -|---|---|---| -| 音色来源 | `voice/{角色}/` 参考音频克隆 | 提示词描述音色 | -| API | `voice_id` + `style` | 仅 `style` | -| 同角色音色 | 与 audio_1 相同 | **全新,各角色互不相同** | +| 阶段 | 脚本 | 音色来源 | 状态 | +|------|------|----------|------| +| v4 试听 | `03_gen_voice_samples.py` | Voice Design 提示词(无参考) | 已选定 13 角色参考 | +| **v5 克隆** | `04_gen_tts_clone.py` | 选定 wav + 表演修饰 | **游戏正在使用** | +| v3 纯设计 | `02_gen_tts_voice_design.py` | 仅提示词 | 已废弃 | + +v5 克隆时**不再**叠加 `ROLE_VOICE_DESIGN` 音色描述,音色由 `v4_voice_samples/` 中选定 wav 决定。 --- -## 2. 角色音色提示词(Voice Design 核心) +## 2. 已选定参考音色(v4 试听结果) -| 角色 | 性别 | design 提示词 | -|------|------|--------------| -| `linxia` | 女 | 24岁中国女性,中低音女声,声线偏薄但稳定,疲惫但清醒,克制有温度,普通话,像深夜发微信语音 | -| `mom` | 女 | 52岁中国女性,温厚的中老年女声,音色略哑,轻微西部口音,说话慢而稳,像母亲打电话 | -| `azhe` | **男** | 27岁中国男性,清朗偏低男声,城市口音,理性偏冷,语速平稳,用词克制,略带距离感 | -| `xiaomei` | 女 | 24岁中国女性,明亮偏高的女声,语速快,活泼直接,像闺蜜连发语音,能量足 | -| `xiaomei_drunk` | 女 | 24岁中国女性,同闺蜜音色但喝醉了,口齿略含糊,情绪起伏大,时而哭时而笑 | -| `zhounan` | **男** | 26岁中国男性,温和偏闷的男中音,略拘谨,语速偏慢,像很久没联系的老同学,真诚不油 | -| `hr` | 女 | 38岁中国女性,成熟职场女声,中音区,知性干练,疲惫的善意,像HR发工作语音 | -| `anan` | 女 | 23岁中国女性,甜亮高音女声,语速快,比闺蜜更嗲,像在酒吧里喊,背景略吵 | -| `dorm_a` | 女 | 22岁中国女性,兴奋尖亮女声,语速很快,像群里报喜,充满喜悦 | -| `dorm_b` | 女 | 23岁中国女性,普通随和女声,中音,语速正常,像室友起哄 | -| `dorm_c` | 女 | 23岁中国女性,温柔低声女声,语速略慢,像注意到朋友沉默的室友 | -| `delivery` | **男** | 30岁中国北方男性,**男声**,偏低略粗,麻利直接,语速快,北方口音,像外卖小哥打电话 | -| `self_3y` | 女 | 21岁中国女性,比林夏更亮更高的女声,刚来北京,兴奋带紧张,声音更年轻 | +| 角色 | 文件 | 性别 | +|------|------|------| +| 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/b/c | `v03` / `v02` / `v03` | 女 | +| delivery | `delivery_v04.wav` | **男** | +| self_3y | `self_3y_v03.wav` | 女 | -配置文件:`audio_2/voice_style_prompts.py` +路径:`audio_2/tts/v4_voice_samples/{角色}/` · 副本:`voice/{角色}/{角色}_ref.wav` --- -## 3. 表演修饰(同角色叠加) +## 3. 表演修饰(v5 克隆时使用) -林夏等分支台词会在音色描述后追加,例如: +由 `audio_2/voice_style_prompts.py` → `get_clone_style()` 按文件名返回,例如: -- `_warm` → `,语气温暖开放,柔软但有分寸` -- `_cold` → `,语气冷淡疏离,短促` -- 妈妈长语音 seg1–seg8、周南 seg1–seg4、小美醉 seg1–seg4 等见 `voice_style_prompts.py` +- 林夏 `_warm` / `_cold` / `_curious` / `ending_` / `sys_` +- 妈妈长语音 `seg1`–`seg8`、周南 `seg1`–`seg4`、小美醉 `seg1`–`seg4` +- self-3y 三版:`voice_01` 兴奋带紧张 / `voice_02` 疲惫假装坚强 / `voice_03` 平静有力 --- -## 4. 批量生产 +## 4. Voice Design 提示词(v4 试听用) + +试听变体配置:`audio_2/voice_sample_prompts.py` → `ROLE_VOICE_VARIANTS` +统一试听文本:`AUDITION_TEXT`(每角色约 10 秒) + +重新生成某角色试听: ```bash -VOXCPM_PORT=8002 bash /home/xsl/tts-server/start-voxcpm.sh - -# 全量 -VOXCPM_PORT=8002 python audio_2/scripts/02_gen_tts_voice_design.py --force - -# 试听单个角色 -python audio_2/scripts/02_gen_tts_voice_design.py --role delivery --test --force -python audio_2/scripts/02_gen_tts_voice_design.py --role linxia --test --force +VOXCPM_PORT=8002 python audio_2/scripts/03_gen_voice_samples.py --role delivery --force ``` -输出:`audio_2/tts/v3_voice_design/*_wav_v3.mp3` -清单:`audio_2/tts/v3_voice_design/voice_design_manifest.tsv` +选定后替换 `v4_voice_samples/{role}/` 中 wav,再跑: + +```bash +VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --role delivery --force +``` --- ## 5. 注意事项 -1. **Voice Design 同角色各条之间音色可能略有漂移**——无参考音频锚定。若某角色不稳定,可挑一条满意的音频注册为参考,改回 Style Control。 -2. **调整音色**:改 `ROLE_VOICE_DESIGN` 里对应角色的描述,重跑该角色即可。 -3. **外卖小哥必须是男声**——已在 `delivery` 提示词中写明「中国北方男性,男声」。 +1. **Voice Design 音色会漂移**——因此正式版必须「试听选定 → 克隆锚定」。 +2. **男声角色**:`azhe`、`zhounan`、`delivery`(delivery 语速已调慢,后处理倍率 1.00)。 +3. **游戏仅加载** `audio/mp3/tts/*_wav_v1.mp3`。 diff --git a/audio_2/项目状态说明.md b/audio_2/项目状态说明.md index f48aa69..da435e7 100644 --- a/audio_2/项目状态说明.md +++ b/audio_2/项目状态说明.md @@ -18,7 +18,7 @@ ``` ../audio/mp3/ -├── tts/ 对白(177 条) +├── tts/ 对白(169 条,游戏引用) ├── music/ BGM、铃声 ├── sfx/ 音效 └── ambience/ 环境音 @@ -120,7 +120,7 @@ blind/ ├── audio/ │ ├── batch_tts_voxcpm.py 台词表 LINES + 角色语速 ROLES │ └── mp3/ 游戏运行时音频(184 文件,已清理) -│ ├── tts/ 177 条对白 +│ ├── tts/ 169 条对白(游戏引用) │ ├── music/ │ ├── sfx/ │ └── ambience/ @@ -208,7 +208,6 @@ VoxCPM2 **不能**用提示词生成敲门、心跳等 SFX,只能做人声 TTS - [ ] 实机/playtest 听一遍各角色,标记需重跑的台词或角色 - [ ] 若某角色不满意:改 `voice_sample_prompts.py` → 重跑 `03` 挑选 → 替换 `v4_voice_samples/{role}/` → 重跑 `04` - [ ] 微调单条表演:改 `voice_style_prompts.py` 中 `_performance` 规则 → `--role xxx --force` -- [ ] 设计文档:`林夏.md`、`执行文档_音频素材制作.md` --- diff --git a/执行文档_音频素材制作.md b/执行文档_音频素材制作.md index 51ac339..ad4322f 100644 --- a/执行文档_音频素材制作.md +++ b/执行文档_音频素材制作.md @@ -1,9 +1,10 @@ # 《林夏》音频素材本地制作执行文档 -> **前置文档**:`林夏.md`(游戏设计)、`SOP_AI音频生产.md`(生产规范) -> **执行环境**:本机 WSL2 · RTX 5090 32GB · FFmpeg 7.0 -> **TTS 主链路**:**VoxCPM2**(见 `林夏.md` §7.2),批量脚本 `audio/batch_tts_voxcpm.py` -> **TTS 备用**:CosyVoice2-0.5B(见附录 B) +> **前置文档**:`林夏.md`(游戏设计)、`SOP_AI音频生产.md`(生产规范) +> **现行状态**:`audio_2/项目状态说明.md`(v5 音色、目录、命令,**以此为准**) +> **执行环境**:本机 WSL2 · RTX 5090 32GB · FFmpeg 7.0 +> **TTS 主链路**:**VoxCPM2**(Voice Design 试听 → 克隆 → Style Control 表演),脚本 `audio_2/scripts/04_gen_tts_clone.py` +> **TTS 备用**:CosyVoice2-0.5B(见附录 B) > **目标**:按 SOP 规范在本地生产全部音频素材 --- @@ -12,14 +13,17 @@ | 资源 | 路径 / 状态 | 用途 | |---|---|---| -| **VoxCPM2** | `bash /home/xsl/AutoVideo/start-voxcpm.sh` → `http://127.0.0.1:8000` | **TTS 主链路**(声音克隆 + 合成) | +| **VoxCPM2** | `/home/xsl/tts-server/` · 端口 **8002** · `bash /home/xsl/tts-server/start-voxcpm.sh` | **TTS 主链路**(Voice Design + 声音克隆 + Style Control) | | CosyVoice 2.0 (0.5B) | `/home/xsl/tools/CosyVoice` · conda env: `cosyvoice` | TTS 备用(见附录 B) | +| ACE-Step 1.5 | `/home/xsl/tools/ACE-Step-1.5` · conda env: `acestep` | BGM / 铃声 / 叙事音效 / 环境音 | +| Stable Audio Open 1.0 | `/home/xsl/tools/stable-audio-tools` · conda env: `stableaudio` | 高品质音效补充 | | FFmpeg 7.0 | `/usr/local/bin/ffmpeg` | 音频格式转换、响度归一化、听筒效果 | -| GPU | RTX 5090 32GB | 跑 VoxCPM2 / CosyVoice 推理 | +| GPU | RTX 5090 32GB | 跑 VoxCPM2 / CosyVoice / ACE-Step 推理 | | MuseTalk | `/home/xsl/work/MuseTalk` | **注意:这是唇形同步工具,不是 TTS** | -> **SOP 中的 MiniMax / 豆包 API 全部替换为本地 VoxCPM2**。音乐(Suno)、音效(ElevenLabs SFX)、环境采样(Freesound)仍走云端。 -> CosyVoice2 保留作为备用方案(见附录 B),仅在 VoxCPM2 表现不佳时切换。 +> **端口说明**:8000 被 head3d 占用,TTS 固定使用 **8002**(`VOXCPM_PORT=8002`)。 +> **游戏运行时音频**:`audio/mp3/`(184 文件,仅保留 `story.js` / `engine.js` 引用的 `*_wav_v1.mp3` 等)。 +> CosyVoice2 保留作为备用,仅在 VoxCPM2 表现不佳时切换。 --- @@ -36,20 +40,26 @@ mkdir -p voice/{linxia,mom,azhe,xiaomei,zhounan,hr,anan,dorm_a,dorm_b,dorm_c,del ### 1.2 启动 VoxCPM2 服务 ```bash -# 启动 VoxCPM2 TTS 服务 -bash /home/xsl/AutoVideo/start-voxcpm.sh -# uvicorn 服务: http://127.0.0.1:8000 +VOXCPM_PORT=8002 VOXCPM_ENABLE_DENOISER=0 bash /home/xsl/tts-server/start-voxcpm.sh +# 服务: http://127.0.0.1:8002 ``` 验证服务可用: ```bash -curl -s http://127.0.0.1:8000/docs | head -5 -# 应返回 API 文档页面 +curl -s http://127.0.0.1:8002/health +# 预期: {"status":"ok","model":"VoxCPM2","styled_speech":true} ``` -**VoxCPM2 API 接口**(详见 `林夏.md` §7.2): -- `POST /v1/voices` — 注册参考音频(wav_base64)→ 返回 voice_id -- `POST /v1/speech` — 合成语音(text + voice_id)→ 返回 WAV +**VoxCPM2 API 接口**(详见 `林夏.md` §7.2、`/home/xsl/tts-server/server.py`): + +| 接口 | 用途 | +|------|------| +| `POST /v1/voices` | 注册参考音频(wav_base64)→ voice_id | +| `POST /v1/speech` | 纯克隆合成(text + voice_id)→ WAV | +| `POST /v1/speech/styled` | Style Control / Voice Design(见下) | + +- 有 `voice_id` → 克隆音色 + style 表演修饰 +- 无 `voice_id` → 纯 Voice Design(仅提示词,无参考音频) - 输出格式:48kHz 16-bit PCM WAV ### 1.4 验证 FFmpeg @@ -67,104 +77,118 @@ echo "FFmpeg loudnorm 可用" ## 2. 角色参考音频准备(关键步骤) -VoxCPM2 的声音克隆需要**每个角色一段参考音频**(WAV 格式)。参考音频的音色决定了最终 TTS 的音色。参考音频存放在 `voice/{角色}/` 目录下(详见 `林夏.md` §7.3 角色音色配置)。 +VoxCPM2 的声音克隆需要**每个角色一段参考音频**(WAV)。**现行方案**:先用 Voice Design 生成试听变体,人工选定后作为永久参考。 -### 2.1 参考音频来源方案 +### 2.1 现行流程(v4 → v5) + +``` +1. 03_gen_voice_samples.py → 每角色 5 条约 10s 试听(不同提示词) +2. 人工试听,每角色保留 1 条 → audio_2/tts/v4_voice_samples/{role}/ +3. 04_gen_tts_clone.py → 全量克隆 + 部署 audio/mp3/tts/*_wav_v1.mp3 +4. 副本同步到 voice/{角色}/{角色}_ref.wav +``` + +**已选定参考**(2026-05-23): + +| 角色 | 文件 | 性别 | +|------|------|------| +| 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/b/c | `v03` / `v02` / `v03` | 女 | +| delivery | `delivery_v04.wav` | **男** | +| self_3y | `self_3y_v03.wav` | 女 | + +提示词配置:`audio_2/voice_sample_prompts.py`(试听)、`audio_2/voice_style_prompts.py`(表演修饰)。 + +### 2.2 参考音频规格(仍适用) + +- **时长**:5-20 秒(推荐 10 秒左右) +- **格式**:WAV,16kHz mono(注册前由脚本自动转换) +- **内容**:完整中文句子 +- **质量**:干声为主,避免底噪、混响、BGM + +### 2.3 旧方案(人工录音 / 截取) + +若 Voice Design 不满意,仍可按原方案准备参考音频放入 `voice/{角色}/`: | 角色 | 音色要求 | 参考音频获取方案 | |---|---|---| -| `mom` 妈妈 | 50 岁,温柔克制 | 方案 A:找一位 45-55 岁女性朋友录 15 秒朗读(最佳);方案 B:从影视作品中截取合适片段 | -| `azhe` 阿哲 | 27 岁,理性偏冷 | 从播客/有声书截取年轻男声冷淡片段 | -| `xiaomei` 小美 | 24 岁,活泼 | 找年轻女性朋友录制,或从 vlog 截取 | -| `zhounan` 周南 | 26 岁,温和拘谨 | 播客/有声书截取温和男声 | -| `hr` HR 王姐 | 38 岁,知性 | 新闻女主播或播客截取 | -| `anan` 安安 | 23 岁,可爱 | 年轻女性活泼语调截取 | -| `dorm-a/b/c` | 三个不同年轻女声 | 需要 3 段风格不同的女声参考 | -| `delivery` 外卖小哥 | 30 岁,北方腔 | 短视频/影视截取 | -| `system` 系统 | 中性 AI 女声 | VoxCPM2 注册一个中性女声参考音频 | -| `self-3y` 3年前自己 | 同 xiaomei 基底 | 复用 xiaomei 参考音频,调速度和音调 | - -### 2.2 参考音频制作规格 - -- **时长**:5-20 秒(推荐 10 秒左右) -- **格式**:WAV,16kHz 以上采样率 -- **内容**:完整的中文句子(需同时记录对应文字) -- **质量**:干声为主,避免底噪、混响、BGM - -存放路径:`voice/{角色代号}/`(与 `林夏.md` §7.3 保持一致) - -```bash -# 如果参考音频不是 wav 或采样率不对,用 FFmpeg 转换 -ffmpeg -i input.mp3 -ar 16000 -ac 1 voice/mom/ref.wav -``` - -### 2.3 创建参考音频记录表 - -在 `voice/` 下创建 `ref_manifest.txt`,记录每条参考音频对应的文字: - -``` -mom/ref.wav | 今天天气不错,妈妈给你做了红烧排骨,等你回来吃饭。 -azhe/ref.wav | 好的,我知道了,那件事明天再说吧。 -xiaomei/ref.wav | 哎你猜怎么着,今天路上遇到一个超级搞笑的事! -zhounan/ref.wav | 嗯,其实我也不太确定,就是觉得应该跟你说一声。 -hr/ref.wav | 好的,那我们下周三前把流程走完,有什么问题随时联系我。 -anan/ref.wav | 天呐天呐你快来!这边超级好玩的! -dorm_a/ref.wav | 嘿你们看看我,今天升职了!请大家吃饭! -dorm_b/ref.wav | 恭喜恭喜啊,太厉害了,我就知道你行的。 -dorm_c/ref.wav | 嗯,不错,对了夏夏怎么不说话啊。 -delivery/ref.wav | 你好你的外卖到了,放门口了啊,麻辣烫注意别洒了。 -``` +| `mom` 妈妈 | 50 岁,温柔克制 | 真人录音或影视截取 | +| `azhe` 阿哲 | 27 岁男声,理性偏冷 | 播客/有声书截取 | +| `delivery` 外卖小哥 | 30 岁北方男声 | 语速适中,非过快 | +| … | 见 `林夏.md` §7.3 | — | --- ## 3. TTS 生产流程 -### 3.1 VoxCPM2 声音克隆流程 +### 3.0 现行主力:v5 克隆流水线 ★ -**前置**:确认 VoxCPM2 服务已启动(§1.2)。 - -**单条合成步骤**: -1. 将角色参考音频注册为 voice_id:`POST /v1/voices`(wav_base64) -2. 调用合成接口:`POST /v1/speech`(text + voice_id) -3. 获得 48kHz 16-bit PCM WAV -4. 用 FFmpeg atempo 调速(按 `林夏.md` §7.3 各角色语速配置) -5. 保存到 `audio/00_raw/tts/` - -**角色音色目录**(与 `林夏.md` §7.3 一致): -``` -voice/ -├── linxia/ # 林夏(speed 1.00) -├── mom/ # 妈妈(speed 0.92) -├── azhe/ # 阿哲(speed 1.05) -├── xiaomei/ # 小美(speed 1.10,醉态 0.95) -├── zhounan/ # 周南(speed 0.95) -├── hr/ # HR 王姐(speed 1.00) -├── anan/ # 安安(speed 1.15) -├── dorm_a/ # 室友 A(speed 1.10) -├── dorm_b/ # 室友 B(speed 1.00) -├── dorm_c/ # 室友 C(speed 0.95) -└── delivery/ # 外卖小哥(speed 1.20) -``` - -### 3.2 用批量脚本生产(主力方式) - -使用项目自带的 VoxCPM2 批量合成脚本: +**前置**:VoxCPM2 已启动(§1.2),参考音频已在 `v4_voice_samples/` 每角色 1 条。 ```bash -# 确保 VoxCPM2 服务已启动 -bash /home/xsl/AutoVideo/start-voxcpm.sh +cd /home/xsl/blind -# 批量合成所有台词 -python audio/batch_tts_voxcpm.py --source voice +# 全量克隆 + 自动部署游戏目录 +VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --force -# 只合成特定角色 -python audio/batch_tts_voxcpm.py --source voice --role linxia +# 只重跑某角色 +VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --role delivery --force -# 干跑查看任务列表 +# 预览任务 +python audio_2/scripts/04_gen_tts_clone.py --dry-run +``` + +| 步骤 | 脚本 | 输出 | +|------|------|------| +| 试听选音色 | `03_gen_voice_samples.py` | `audio_2/tts/v4_voice_samples/` | +| 全量克隆 | `04_gen_tts_clone.py` | `audio_2/tts/v5_cloned/*_wav_v5.mp3` | +| 游戏部署 | (04 脚本自动) | `audio/mp3/tts/*_wav_v1.mp3` | + +- 台词来源:`audio/batch_tts_voxcpm.py` → `LINES`(173 条)+ `EXTRA_LINES`(self-3y ×3、系统 memo) +- 表演修饰:`audio_2/voice_style_prompts.py` → `get_clone_style()` +- 清单:`audio_2/tts/v5_cloned/clone_manifest.tsv` + +**游戏仅加载 `*_wav_v1.mp3`**,不加载 `*_mp3_v1.mp3`。 + +### 3.1 VoxCPM2 声音克隆流程(底层原理) + +**单条合成步骤**: +1. 将角色参考音频注册为 voice_id:`POST /v1/voices` +2. 调用:`POST /v1/speech/styled`(text + voice_id + style 表演修饰) +3. 获得 48kHz WAV → ffmpeg atempo 调速(`ROLES` 配置)→ MP3 +4. 部署到 `audio/mp3/tts/` + +**角色语速**(`audio/batch_tts_voxcpm.py` → `ROLES`,与 `林夏.md` §7.3 一致): + +``` +voice/ +├── linxia/ # 1.00 +├── mom/ # 0.92 +├── azhe/ # 1.05 +├── xiaomei/ # 1.10(醉态 xiaomei_drunk 0.95) +├── zhounan/ # 0.95 +├── hr/ # 1.00 +├── anan/ # 1.15 +├── dorm_a/b/c # 1.10 / 1.00 / 0.95 +├── delivery/ # 1.00(已从 1.20 调慢) +└── self_3y/ # 1.15(独立参考 self_3y_v03.wav) +``` + +### 3.2 旧版批量脚本(参考,已被 v5 替代) + +```bash +# 旧流程:直接读 voice/ 参考,无 Style Control 表演 python audio/batch_tts_voxcpm.py --source voice --dry-run ``` -脚本读取 `voice/` 目录下的参考音频,按 `林夏.md` §7.3 角色配置自动注册 voice_id 并批量合成。输出到 `audio/00_raw/tts/`。 +输出原为 `audio/00_raw/tts/`,现正式产物见 `audio_2/tts/v5_cloned/` 与 `audio/mp3/tts/`。 ### 3.3 长戏分段处理 @@ -191,29 +215,22 @@ SOP §5.3 规定:**超过 30 秒的台词必须分段录制**。 ### 3.4 系统 TTS -系统提示音(播报状态、念选项等)用 VoxCPM2 注册一个中性女声参考音频: +系统提示音(内容警告、暂停、热线、等待回复、memo 等)**现行方案**: -1. 准备一段清晰的中性女声参考音频(如新闻播报片段),存入 `voice/system/` -2. 通过 `POST /v1/voices` 注册为 system voice_id -3. 用 `POST /v1/speech` 合成所有系统语句 - -系统语句示例: -- "阿哲,发来1条语音。8秒。" -- "是否回复?" -- "一,好,明天寄。二,你怎么不自己来拿。三,你那边都好吗。四,什么都不说。" -- "妈妈3条未读、小美1条已读、阿哲1条未播放" +- 大部分系统语音用 **林夏音色**(`linxia_ref.wav`)克隆,见 `LINES` 中 `v2_sys_*` 与 `lv11_sys_memo_01` +- 合成走 v5 流水线,与对白同一套参考 ### 3.5 self-3y 三版预录 -使用与 `xiaomei` 同基底参考音频,但调整 speed 为 +0.05(即 1.15): +**现行**:独立参考 `self_3y_v03.wav`(非复用小美),角色 key 为 `self_3y`,speed 1.15。 -| 版本 | 文件名 | 内容要求 | 情绪 | -|---|---|---|---| -| 明朗版 | `lv11_0030_self-3y_voice_01` | 3 年前刚来北京,对一切新鲜 | 兴奋带紧张 | -| 迷茫版 | `lv11_0030_self-3y_voice_02` | 3 年前已经累了 | 假装坚强 | -| 温柔版 | `lv11_0030_self-3y_voice_03` | 写给未来的自己 | 平静有力 | +| 版本 | 文件名 | 情绪 | +|---|---|---| +| 明朗版 | `lv11_0030_self3y_voice_01` | 兴奋带紧张 | +| 迷茫版 | `lv11_0030_self3y_voice_02` | 疲惫假装坚强 | +| 温柔版 | `lv11_0030_self3y_voice_03` | 平静有力 | -> 台词需要编剧写好,每版约 50 秒。 +台词见 `audio_2/scripts/04_gen_tts_clone.py` → `EXTRA_LINES`。 --- @@ -346,9 +363,11 @@ ffmpeg -i input.wav \ --- -## 5. 音乐素材(Suno) +## 5. 音乐素材(ACE-Step 本地 + Suno 备选) -音乐生产仍走 Suno 云端,按 SOP §6 操作。 +**现行产出**:BGM 4 轨 + 铃声 5 条,均由 **ACE-Step 1.5** 本地生成,已部署至 `audio/mp3/music/`。 + +Suno 仍可作为备选(按 SOP §6 操作): ### 5.1 操作步骤 @@ -380,7 +399,11 @@ done --- -## 6. 音效素材(ElevenLabs SFX) +## 6. 音效素材(ACE-Step 本地 + ElevenLabs 备选) + +**现行产出**:叙事音效 4 条(敲门、心跳、呼吸、水壶)在 `audio/mp3/sfx/`,由 ACE-Step 生成。 + +ElevenLabs SFX 仍可作为备选: ### 6.1 操作步骤 @@ -491,34 +514,25 @@ done --- -## 9. 执行顺序总结 +## 9. 执行顺序总结(现行状态 2026-05-23) ``` -第 1 步 · 启动 VoxCPM2 + 部署环境 (§1) - ↓ 约 30 分钟 -第 2 步 · 准备参考音频到 voice/ (§2) ← 这一步最关键,音色质量取决于此 - ↓ 约 1-3 天(需要找人录音或搜集素材) -第 3 步 · 系统 TTS 先行 (§3.4) ← 最简单的先跑通 VoxCPM2 流程 - ↓ 约 1 小时 -第 4 步 · 短台词批量生产 (§3.2 batch_tts_voxcpm.py) - ↓ 约 3-4 小时 -第 5 步 · 长戏分段录制 (§3.3) - ↓ 约 2-3 小时 -第 6 步 · 后期处理 (§4) - ↓ 约 2-3 小时 -第 7 步 · 铃声 + 音乐 (§5) ← 可与 TTS 并行 - ↓ 约 3 小时 -第 8 步 · 音效 (§6) ← 可与 TTS 并行 - ↓ 约 3 小时 -第 9 步 · 环境底噪 (§7) ← 可与 TTS 并行 - ↓ 约 2 小时 -第 10 步 · QA 验收 (§8) - ↓ 约 4-6 小时 -第 11 步 · 最终打包 (§4.5) - ↓ 约 30 分钟 -完成 +✅ 第 1 步 · 部署 VoxCPM2(/home/xsl/tts-server,端口 8002) +✅ 第 2 步 · Voice Design 试听 → 选定 13 角色参考 wav(v4) +✅ 第 3 步 · v5 全量克隆 + 部署 audio/mp3/tts/(04_gen_tts_clone.py) +✅ 第 4 步 · BGM / 铃声 / 音效 / 环境音(ACE-Step → audio/mp3/) +✅ 第 5 步 · 清理未引用音频(184 文件与游戏对齐) +⬜ 第 6 步 · Playtest 听感迭代 + QA(§8) ``` +**重跑 TTS**(改参考或表演修饰后): + +```bash +VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --force +``` + +详细目录与命令见 `audio_2/项目状态说明.md`。 + --- ## 附录 A · 常见问题 diff --git a/技术报告_音频资源制作.md b/技术报告_音频资源制作.md index 021f295..828c92f 100644 --- a/技术报告_音频资源制作.md +++ b/技术报告_音频资源制作.md @@ -1,8 +1,9 @@ # 音频资源制作技术落地报告 > 调研日期:2026-05-20 -> 最后更新:2026-05-20(新增 Stable Audio 部署完成状态) -> 硬件环境:NVIDIA RTX 5090 (32GB VRAM) / CUDA Driver 12.9 / WSL2 Linux +> 最后更新:**2026-05-23**(VoxCPM2 v5 克隆落地、游戏音频清理对齐) +> 硬件环境:NVIDIA RTX 5090 (32GB VRAM) / CUDA Driver 12.9 / WSL2 Linux +> **项目现行状态**:见 `audio_2/项目状态说明.md` --- @@ -10,7 +11,7 @@ | 能力域 | 工具 | 状态 | 环境 | |--------|------|------|------| -| TTS 语音合成 | VoxCPM2 | **运行中** (port 8000) | Python 3.13 venv | +| TTS 语音合成 | VoxCPM2 | **运行中** (port **8002**) | `/home/xsl/tts-server/` Python venv | | TTS 语音合成 | CosyVoice2-0.5B | 已部署,需手动启动 | conda cosyvoice | | 音乐/铃声生成 | ACE-Step 1.5 | 已部署,需手动启动 | conda acestep | | 音效/氛围生成 | ACE-Step 1.5 | 同上 | conda acestep | @@ -22,16 +23,21 @@ | 音频分析 | librosa / soundfile / pydub | 可用 | pip | | 音视频同步 | MuseTalk / LatentSync | 已部署 | conda 环境 | -### 当前产出数据 (《林夏》项目) +### 当前产出数据 (《林夏》项目,2026-05-23) -| 类型 | 数量 | 生成工具 | -|------|------|----------| -| TTS 对话语音 | 216 条 (mp3/tts/) | VoxCPM2 | -| BGM 背景音乐 | 4 轨 (90s/30s/120s/120s) | ACE-Step 1.5 | -| 角色铃声 | 9 条 | ACE-Step 1.5 | -| 音效 | 18 条 | ACE-Step 1.5 | -| 环境氛围 | 6 条 | ACE-Step 1.5 | -| 总计 MP3 | 372 个文件 | — | +| 类型 | 数量 | 路径 | 生成工具 | +|------|------|------|----------| +| TTS 游戏对白 | **169** 条 | `audio/mp3/tts/*_wav_v1.mp3` | VoxCPM2 v5 克隆 | +| TTS 归档产物 | **177** 条 | `audio_2/tts/v5_cloned/*_wav_v5.mp3` | 同上(含台词表全量 + extra) | +| 参考音色 | **13** 角色 | `audio_2/tts/v4_voice_samples/` + `voice/*_ref.wav` | Voice Design 试听选定 | +| BGM | 4 轨 | `audio/mp3/music/` | ACE-Step 1.5 | +| 角色铃声 | 5 条(游戏引用 4 场景) | `audio/mp3/music/` | ACE-Step 1.5 | +| 叙事音效 | 4 条 | `audio/mp3/sfx/` | ACE-Step 1.5 | +| 环境氛围 | 3 条 | `audio/mp3/ambience/` | ACE-Step 1.5 | +| UI 短音效 | 13 种 | 浏览器内 | Web Audio API | +| **游戏 MP3 合计** | **184** | `audio/mp3/` | 已与 story.js 对齐 | + +> 注:8000 端口被 head3d 占用,VoxCPM2 固定 **8002**。旧 `*_mp3_v1.mp3` 与 legacy 目录(`audio/mp3/linxia/`、`react/`)已清理。 --- @@ -43,12 +49,22 @@ | 工具 | 模型大小 | VRAM | 中文质量 | 声音克隆 | 延迟 | 特点 | |------|---------|------|---------|---------|------|------| -| **VoxCPM2** | 4.7GB | ~6GB | A | 零样本 (5-30s参考音频) | ~1s/句 | FastAPI 服务,REST API,48kHz WAV 输出,带降噪器 | +| **VoxCPM2** | 4.7GB | ~6GB | A | 零样本 (5-30s参考音频) | ~1s/句 | FastAPI,`/home/xsl/tts-server/`,port **8002**;支持 Style Control + Voice Design | | **CosyVoice2-0.5B** | 5.3GB | ~8GB | A+ | 零样本 | ~2s/句 | WebUI,多语言,语速可控,阿里开源 | | **Kokoro-82M** | <200MB | <2GB (可CPU) | B (中文社区扩展) | 不支持 | <0.3s | 超轻量,英文为主,适合实时场景 | | **Edge-TTS** | 0 (云端) | 0 | B+ | 不支持 | 网络延迟 | 微软在线服务,免费,多音色 | -**当前主链路**:VoxCPM2 为主 → CosyVoice2 为备 → Edge-TTS 为最终兜底 +**当前主链路**:《林夏》已落地 **Voice Design 试听 → 克隆锚定 → Style Control 表演**: + +``` +03_gen_voice_samples.py (v4 试听,每角色 5 变体) + → 人工选定参考 wav + → 04_gen_tts_clone.py (v5 全量克隆) + → audio/mp3/tts/*_wav_v1.mp3 (游戏加载) +``` + +API:`POST /v1/speech/styled`(有 voice_id = 克隆+表演;无 voice_id = 纯 Voice Design)。 +备用:CosyVoice2 → Edge-TTS 兜底。 #### 推荐部署到本地 @@ -142,18 +158,24 @@ #### 本机已有 -VoxCPM2 和 CosyVoice2 均内置零样本声音克隆。当前《林夏》项目已为 12 个角色建立参考音频库: +VoxCPM2 和 CosyVoice2 均内置零样本声音克隆。《林夏》**13 角色**参考库(2026-05-23 选定): ``` +audio_2/tts/v4_voice_samples/ # 每角色 1 条选定 wav/mp3 voice/ - linxia/ linxia_ref.wav - mom/ mom_extra_04.wav - azhe/ azhe_extra_05.wav - xiaomei/ ... - zhounan/ delivery/ hr/ anan/ - dorm_a/ dorm_b/ dorm_c/ + linxia/linxia_ref.wav linxia_v05 + mom/mom_ref.wav mom_v01 + azhe/azhe_ref.wav azhe_v03(男声) + xiaomei/xiaomei_ref.wav xiaomei_v05 + xiaomei/xiaomei_drunk_ref.wav xiaomei_drunk_v05 + zhounan/zhounan_ref.wav zhounan_v05(男声) + hr/ anan/ dorm_a/ dorm_b/ dorm_c/ + delivery/delivery_ref.wav delivery_v04(男声) + linxia/self_3y_ref.wav self_3y_v03 ``` +批量脚本:`audio_2/scripts/04_gen_tts_clone.py` · 清单:`audio_2/tts/v5_cloned/clone_manifest.tsv` + #### 推荐部署到本地 | 工具 | Stars | 为什么值得 | 适用场景 | @@ -265,5 +287,18 @@ RTX 5090 (32GB) 可同时运行的组合: | 现状 | 升级方案 | 收益 | |------|---------|------| -| ACE-Step 生成全部音效 | → Stable Audio Open 1.5 补充精细音效 | 44.1kHz 立体声,电话底噪/UI 音效品质更高 | +| v5 克隆已部署,待 playtest | 实机听感迭代 → 微调 `voice_style_prompts.py` 或重选 v4 参考 | 各角色区分度与情感准确度 | +| ACE-Step 生成叙事音效 | → Stable Audio Open 1.5 补充精细音效 | 44.1kHz 立体声,电话底噪/UI 音效品质更高 | | 结局仅语音 + 字幕 | → ACE-Step/DiffRhythm 生成结局专属 BGM | 5 个结局各有独立氛围音乐,沉浸感提升 | + +--- + +## 七、文档索引(保持一致性) + +| 文档 | 用途 | +|------|------| +| `林夏.md` §7 | 设计纲要:资产分类、角色配置、文件结构 | +| `执行文档_音频素材制作.md` | 操作步骤:环境、流程、后期、QA | +| `audio_2/项目状态说明.md` | **现行状态**:端口、目录、命令、选定音色表 | +| `audio_2/角色语音风格提示词.md` | Voice Design / 表演修饰参考 | +| `audio/batch_tts_voxcpm.py` | 台词表 `LINES` + `ROLES` 语速 | diff --git a/林夏.md b/林夏.md index 3b85b09..bd0dbf9 100644 --- a/林夏.md +++ b/林夏.md @@ -552,70 +552,99 @@ E(隐藏,优先级 1)→ A(优先级 2)→ B(优先级 3)→ C( | **林夏语音** | 主角对话回应(通用 + 专属) | ~55 条, ~100s | VoxCPM2 声音克隆 | | **NPC Round 1 语音** | 各角色主要台词 | ~30 条, ~300s | VoxCPM2 声音克隆 | | **NPC Round 2/3 反应** | 对话分支反应 | ~54 条, ~205s | VoxCPM2 声音克隆 | -| **self-3y 三版** | 时光胶囊备忘录 ×3 | 3 条, ~150s | VoxCPM2(linxia 音色) | +| **self-3y 三版** | 时光胶囊备忘录 ×3 | 3 条, ~150s | VoxCPM2(`self_3y_v03` 独立参考) | | **UI 短音效** | 提示音、选择反馈、打字/发送 | ~12 种 | Web Audio 合成(无需文件) | -| **BGM** | 4 段主题音乐 | 4 段 | Suno / Udio 生成 | -| **环境音** | 卧室夜噪、酒吧、街声 | 4-5 段 | Freesound (CC0/CC-BY) | -| **角色铃声** | 来电铃声 | 3-4 段 | 简单合成或 Suno 短旋律 | +| **BGM** | 4 段主题音乐 | 4 轨 | ACE-Step 1.5 本地生成 | +| **环境音** | 卧室夜噪、厨房、黎明等 | 3 段 | ACE-Step 1.5 本地生成 | +| **角色铃声** | 来电铃声 | 5 条(游戏引用 4 种场景) | ACE-Step 1.5 本地生成 | +| **叙事音效** | 敲门、心跳、呼吸、水壶等 | 4 条 | ACE-Step 1.5 本地生成 | -### 7.2 TTS 方案:VoxCPM2 本地声音克隆(唯一主链路) +### 7.2 TTS 方案:VoxCPM2 本地克隆(现行 v5 链路) -> **注意**:本项目 TTS 统一使用 **VoxCPM2**。`执行文档_音频素材制作.md` 中早期记录的 CosyVoice2 方案作为备用,不作为主生产链路。批量脚本、音色目录、QA 标准均以 VoxCPM2 为准。 +> **注意**:本项目 TTS 统一使用 **VoxCPM2**。CosyVoice2 仅作备用,不作为主生产链路。 +> **详细操作与目录**:见 `audio_2/项目状态说明.md`、`执行文档_音频素材制作.md`。 -所有角色语音使用 **VoxCPM2**(本地部署,无需外部 API),通过声音克隆实现一致的角色音色。 +**现行流程**(2026-05 落地): + +``` +Voice Design 试听(v4,每角色 5 条提示词变体) + → 人工选定参考 wav + → Style Control 克隆 + 表演修饰(v5) + → 部署到 audio/mp3/tts/*_wav_v1.mp3(游戏直接加载) +``` + +**服务启动**(端口 **8002**,8000 被其他服务占用): -**服务启动**: ```bash -bash /home/xsl/AutoVideo/start-voxcpm.sh -# uvicorn 服务: http://127.0.0.1:8000 +VOXCPM_PORT=8002 VOXCPM_ENABLE_DENOISER=0 bash /home/xsl/tts-server/start-voxcpm.sh +curl http://127.0.0.1:8002/health +# 预期: {"status":"ok","model":"VoxCPM2","styled_speech":true} ``` **API 接口**: -- `POST /v1/voices` — 注册参考音频(wav_base64)→ 返回 voice_id -- `POST /v1/speech` — 合成语音(text + voice_id)→ 返回 WAV + +| 接口 | 用途 | +|------|------| +| `POST /v1/voices` | 注册参考音频(wav_base64)→ voice_id | +| `POST /v1/speech` | 纯克隆合成(text + voice_id) | +| `POST /v1/speech/styled` | Style Control:有 voice_id = 克隆+表演;无 voice_id = Voice Design | + - 输出格式:48kHz 16-bit PCM WAV - 参数:cfg_value(默认 2.0)、inference_timesteps(默认 10) -**声音克隆流程**: -``` -参考音频 (voice/{角色}/*.wav) - → 转换为 16kHz mono WAV - → POST /v1/voices 注册 → voice_id - → POST /v1/speech 合成台词 → WAV - → ffmpeg atempo 调速 → 最终音频 +**批量生产(现行)**: + +```bash +# 全量克隆并部署游戏目录 +VOXCPM_PORT=8002 python audio_2/scripts/04_gen_tts_clone.py --force + +# 只重跑某角色 +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 ``` +**游戏音频命名**:仅 `*_wav_v1.mp3` 被 `story.js` / `engine.js` 引用;`*_mp3_v1.mp3` 为旧流水线产物,已清理。 + ### 7.3 角色音色配置 -| 角色 | 参考音频目录 | 语速 | 音色描述 | -|------|-------------|------|---------| -| **林夏** | `voice/linxia/` | 1.00 | 24 岁女生,疲惫但清醒,克制但有温度 | -| 妈妈 | `voice/mom/` | 0.92 | 50 上下,温柔不黏腻,西部口音轻微 | -| 阿哲 | `voice/azhe/` | 1.05 | 27 岁,城市男生,理性偏冷 | -| 小美 | `voice/xiaomei/` | 1.10 | 24 岁,活泼,语速快 | -| 小美(醉) | `voice/xiaomei/` | 0.95 | 同音色,降速模拟醉态 | -| 周南 | `voice/zhounan/` | 0.95 | 26 岁,温和略拘谨 | -| HR 王姐 | `voice/hr/` | 1.00 | 38 岁,职场化,疲惫的善意 | -| 安安 | `voice/anan/` | 1.15 | 23 岁,活泼,比小美更嗲 | -| 室友 A | `voice/dorm_a/` | 1.10 | 年轻女声,兴奋 | -| 室友 B | `voice/dorm_b/` | 1.00 | 年轻女声,随和 | -| 室友 C | `voice/dorm_c/` | 0.95 | 年轻女声,温柔 | -| 外卖小哥 | `voice/delivery/` | 1.20 | 30 岁,麻利 | -| self-3y | `voice/linxia/` | 1.15 | 3 年前的林夏,更明朗(同一音色,不同语速) | +参考音频来自 Voice Design 试听选定,存放在 `voice/{角色}/{角色}_ref.wav` 与 `audio_2/tts/v4_voice_samples/{角色}/`。 -### 7.4 批量合成脚本 +| 角色 | 参考文件 | 目录 | 语速 | 音色描述 | +|------|----------|------|------|---------| +| **林夏** | `linxia_v05.wav` | `voice/linxia/` | 1.00 | 24 岁女生,疲惫但清醒,克制但有温度 | +| 妈妈 | `mom_v01.wav` | `voice/mom/` | 0.92 | 50 上下,温柔不黏腻,西部口音轻微 | +| 阿哲 | `azhe_v03.wav` | `voice/azhe/` | 1.05 | 27 岁男声,城市男生,理性偏冷 | +| 小美 | `xiaomei_v05.wav` | `voice/xiaomei/` | 1.10 | 24 岁,活泼,语速快 | +| 小美(醉) | `xiaomei_drunk_v05.wav` | `voice/xiaomei/` | 0.95 | 同闺蜜基底,降速模拟醉态 | +| 周南 | `zhounan_v05.wav` | `voice/zhounan/` | 0.95 | 26 岁男声,温和略拘谨 | +| HR 王姐 | `hr_v05.wav` | `voice/hr/` | 1.00 | 38 岁,职场化,疲惫的善意 | +| 安安 | `anan_v04.wav` | `voice/anan/` | 1.15 | 23 岁,活泼,比小美更嗲 | +| 室友 A | `dorm_a_v03.wav` | `voice/dorm_a/` | 1.10 | 年轻女声,兴奋 | +| 室友 B | `dorm_b_v02.wav` | `voice/dorm_b/` | 1.00 | 年轻女声,随和 | +| 室友 C | `dorm_c_v03.wav` | `voice/dorm_c/` | 0.95 | 年轻女声,温柔 | +| 外卖小哥 | `delivery_v04.wav` | `voice/delivery/` | **1.00** | 30 岁**男声**,北方腔,语速适中 | +| self-3y | `self_3y_v03.wav` | `voice/linxia/` | 1.15 | 3 年前的林夏,更年轻明亮(独立参考,非复用小美) | + +表演修饰(warm/cold/分段等)由 `audio_2/voice_style_prompts.py` 的 `get_clone_style()` 控制;音色本身由参考 wav 锚定。 + +### 7.4 脚本与产物目录 + +| 脚本 | 用途 | 输出 | +|------|------|------| +| `audio_2/scripts/03_gen_voice_samples.py` | v4 试听(每角色 5 条) | `audio_2/tts/v4_voice_samples/` | +| `audio_2/scripts/04_gen_tts_clone.py` | **v5 全量克隆 + 部署** ★ | `audio_2/tts/v5_cloned/*_wav_v5.mp3` → `audio/mp3/tts/*_wav_v1.mp3` | +| `audio/batch_tts_voxcpm.py` | 台词表 `LINES`(173 条)+ 语速配置 | 旧版直连克隆,已被 v5 替代 | +| `audio_2/voice_style_prompts.py` | 表演修饰 / Voice Design 提示词 | — | +| `audio_2/voice_sample_prompts.py` | v4 试听变体与统一试听文本 | — | + +**台词表**:`audio/batch_tts_voxcpm.py` 中 `LINES` + `04_gen_tts_clone.py` 中 `EXTRA_LINES`(self-3y ×3、系统 memo)。 + +**配置与文档**: ```bash -# 启动 VoxCPM2 服务 -bash /home/xsl/AutoVideo/start-voxcpm.sh - -# 使用 WAV 参考音色,批量合成所有台词 -python audio/batch_tts_voxcpm.py --source voice - -# 只合成特定角色 -python audio/batch_tts_voxcpm.py --source voice --role linxia - -# 干跑查看任务列表 +# 旧版批量(仅参考,不再用于正式产出) python audio/batch_tts_voxcpm.py --source voice --dry-run ``` @@ -815,14 +844,13 @@ async _handleChoice(dir) { | self-3y | 3 版 | 0 | ~3 条 | ~150s | | **合计** | | | **~90 条** | **~835s** | -### 总计 +### 总计(现行部署) -- 林夏 ~55 条,~100 秒 -- NPC ~90 条,~835 秒 -- **总语音约 145 条,约 15.5 分钟** +- 游戏引用 **184** 个 MP3(`audio/mp3/`,已与 `story.js` / `engine.js` 对齐) + - TTS 对白 **169** 条(`tts/*_wav_v1.mp3`) + - BGM + 铃声 **8** 条 · 音效 **4** 条 · 环境音 **3** 条 +- v5 克隆产物归档 **177** 条(`audio_2/tts/v5_cloned/`,含台词表全量 + self-3y + 系统 memo) - UI 音效:13 种,全部 Web Audio 合成 -- BGM:4 段 -- 环境音:4-5 段 --- @@ -831,39 +859,35 @@ async _handleChoice(dir) { ``` blind/ ├── game/ -│ ├── index.html # 入口 +│ ├── index.html │ └── js/ -│ ├── main.js # 启动 + 事件绑定 -│ ├── gestures.js # 7 种手势识别(含长按) -│ ├── haptics.js # 触觉反馈 +│ ├── story.js # 16 条消息 + 音频引用(*_wav_v1.mp3) +│ ├── engine.js # 系统语音、结局、BGM/环境音 │ ├── audio.js # 音频管理 + UI 合成音效 -│ ├── story.js # 16 条消息剧情数据 -│ ├── engine.js # 游戏引擎(状态机 + 对话流程) -│ ├── profile.js # 行为画像 + 状态变量 -│ └── utils.js # 工具函数(sleep, dbg 等) +│ └── … ├── audio/ -│ ├── mp3/ -│ │ ├── linxia/ # 林夏语音(当前 edge-tts 版本) -│ │ └── react/ # NPC 反应语音(当前 edge-tts 版本) -│ ├── 00_raw/tts/ # VoxCPM2 生成原始 WAV -│ └── batch_tts_voxcpm.py # VoxCPM2 批量合成脚本 -├── voice/ # VoxCPM2 参考音色(WAV) -│ ├── linxia/ # 林夏 -│ ├── mom/ # 妈妈 -│ ├── azhe/ # 阿哲 -│ ├── xiaomei/ # 小美 -│ ├── zhounan/ # 周南 -│ ├── hr/ # HR 王姐 -│ ├── anan/ # 安安 -│ ├── dorm_a/ # 室友 A -│ ├── dorm_b/ # 室友 B -│ ├── dorm_c/ # 室友 C -│ └── delivery/ # 外卖小哥 -├── gdd/ -│ └── redesign_v2.md # v2 重构设计文档 -└── 林夏.md # 本文档(总设计纲要) +│ ├── batch_tts_voxcpm.py # 台词表 LINES + ROLES 语速 +│ └── mp3/ # 游戏运行时音频(184 文件) +│ ├── tts/ # 169 条对白 +│ ├── music/ # BGM + 铃声 +│ ├── sfx/ # 叙事音效 +│ └── ambience/ # 环境音 +├── voice/ # 各角色参考音频(v5 选定 *_ref.wav) +├── audio_2/ # TTS v4/v5 流水线 +│ ├── 项目状态说明.md +│ ├── voice_style_prompts.py +│ ├── voice_sample_prompts.py +│ ├── scripts/ # 03 试听 · 04 克隆部署 ★ +│ └── tts/ +│ ├── v4_voice_samples/ # 选定参考音色 +│ └── v5_cloned/ # 正式产物 + clone_manifest.tsv +├── 林夏.md +├── 执行文档_音频素材制作.md +└── 技术报告_音频资源制作.md ``` +TTS 服务(独立部署):`/home/xsl/tts-server/`(端口 **8002**) + --- ## 11. 风险与对策 @@ -871,7 +895,7 @@ blind/ | 风险 | 对策 | |------|------| | VoxCPM2 长情绪戏(妈妈 4 分钟)质感不够 | 分段录制 + 后期拼接,预留调参时间 | -| 声音克隆音色不够区分 | 每角色选择差异大的参考音频 + 调速区分 | +| 声音克隆音色不够区分 | Voice Design 试听多变体 → 人工选定 → 克隆锚定;男声角色单独标注 | | 60+ 分支语音管理复杂 | batch_tts_voxcpm.py 统一管理,命名规范 | | 手势误判导致选错 | 滑动阈值 30px + 40°范围;双击间隔 250ms 内 | | 玩家不理解手势含义 | MSG-02(小美教学关)强引导,每步正向反馈 | @@ -902,14 +926,14 @@ blind/ ## 12. 制作流程 -| 阶段 | 关键交付 | -|------|---------| -| **剧本定稿** | 16 条全脚本 + 5 结局完整对白 + 所有分支台词 | -| **参考音色准备** | voice/ 下 12 个角色参考音频确认 | -| **VoxCPM2 批量合成** | ~145 条语音 + 语速调整 + 质检 | -| **BGM + 环境音** | 4 段 BGM + 环境采样 | -| **程序集成** | story.js 对接最终音频路径 + 全流程调试 | -| **测试** | 全 5 结局通关测试 + 分支覆盖 | +| 阶段 | 关键交付 | 状态 | +|------|---------|------| +| **剧本定稿** | 16 条全脚本 + 5 结局完整对白 + 所有分支台词 | ✅ | +| **参考音色准备** | v4 试听选定 13 角色参考 wav | ✅ | +| **VoxCPM2 v5 批量合成** | 177 条克隆 + 部署 `audio/mp3/tts/` | ✅ | +| **BGM + 环境音 + 音效** | ACE-Step 本地生成,游戏引用 15 条 | ✅ | +| **程序集成** | story.js 对接 `*_wav_v1.mp3` | ✅ | +| **测试** | 全 5 结局通关 + 各角色听感迭代 | 待 playtest | ---