Files
blind/other_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

594 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 《林夏》音频素材本地制作执行文档
> **前置文档**:`林夏.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 规范在本地生产全部音频素材
---
## 0. 本机资源清单
| 资源 | 路径 / 状态 | 用途 |
|---|---|---|
| **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 / ACE-Step 推理 |
| MuseTalk | `/home/xsl/work/MuseTalk` | **注意:这是唇形同步工具,不是 TTS** |
> **端口说明**8000 被 head3d 占用,TTS 固定使用 **8002**`VOXCPM_PORT=8002`)。
> **游戏运行时音频**`audio/mp3/`184 文件,仅保留 `story.js` / `engine.js` 引用的 `*_wav_v1.mp3` 等)。
> CosyVoice2 保留作为备用,仅在 VoxCPM2 表现不佳时切换。
---
## 1. 环境部署
### 1.1 创建项目目录结构
```bash
cd /home/xsl/blind
mkdir -p audio/{00_raw/{tts,music,sfx,ambience,ringtone},01_processed/{tts,music,sfx,ambience,ringtone},02_final/{tts,music,sfx,ambience,ringtone},03_qa_reports,99_legal}
mkdir -p voice/{linxia,mom,azhe,xiaomei,zhounan,hr,anan,dorm_a,dorm_b,dorm_c,delivery,system} # 各角色参考音频
```
### 1.2 启动 VoxCPM2 服务
```bash
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:8002/health
# 预期: {"status":"ok","model":"VoxCPM2","styled_speech":true}
```
**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
```bash
ffmpeg -version | head -1
# 预期输出: ffmpeg version 7.0.2-static
# 测试 loudnorm 滤镜
ffmpeg -f lavfi -i "sine=frequency=440:duration=1" -af "loudnorm=I=-16:TP=-1:LRA=11" -y /tmp/test_loudnorm.wav
echo "FFmpeg loudnorm 可用"
```
---
## 2. 角色参考音频准备(关键步骤)
VoxCPM2 的声音克隆需要**每个角色一段参考音频**(WAV)。**现行方案**:先用 Voice Design 生成试听变体,人工选定后作为永久参考。
### 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 秒左右)
- **格式**WAV16kHz mono(注册前由脚本自动转换)
- **内容**:完整中文句子
- **质量**:干声为主,避免底噪、混响、BGM
### 2.3 旧方案(人工录音 / 截取)
若 Voice Design 不满意,仍可按原方案准备参考音频放入 `voice/{角色}/`
| 角色 | 音色要求 | 参考音频获取方案 |
|---|---|---|
| `mom` 妈妈 | 50 岁,温柔克制 | 真人录音或影视截取 |
| `azhe` 阿哲 | 27 岁男声,理性偏冷 | 播客/有声书截取 |
| `delivery` 外卖小哥 | 30 岁北方男声 | 语速适中,非过快 |
| … | 见 `林夏.md` §7.3 | — |
---
## 3. TTS 生产流程
### 3.0 现行主力:v5 克隆流水线 ★
**前置**VoxCPM2 已启动(§1.2),参考音频已在 `v4_voice_samples/` 每角色 1 条。
```bash
cd /home/xsl/blind
# 全量克隆 + 自动部署游戏目录
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 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
```
输出原为 `audio/00_raw/tts/`,现正式产物见 `audio_2/tts/v5_cloned/``audio/mp3/tts/`
### 3.3 长戏分段处理
SOP §5.3 规定:**超过 30 秒的台词必须分段录制**。
**妈妈 4'17" 长语音(第 16 条)分 8 段**
| 段号 | 文件名 | 台词 | 情绪提示 |
|---|---|---|---|
| 1 | `lv11_0200_mom_voice_01_seg1` | "夏夏。妈妈知道你今天电话不接。妈妈不催你,就是想跟你说一件事。" | gentle, hesitant |
| 2 | `lv11_0200_mom_voice_01_seg2` | "你24了对吧。妈妈24那年——你应该没听我说过——" | gentle, nostalgic |
| 3 | `lv11_0200_mom_voice_01_seg3` | "那时候妈妈在广州,给一个香港老板做秘书,1995年。那年我也被分手过。也被开除过。一模一样的春天。" | gentle, sad but holding back |
| 4 | `lv11_0200_mom_voice_01_seg4` | "那年我哭得特别难看。后来呢?后来就没什么后来了。我回了老家,认识了你爸,生了你。" | gentle, releasing |
| 5 | `lv11_0200_mom_voice_01_seg5` | "我跟你说这个不是想跟你说什么都会过去——我想跟你说,那年夏天我没死,是因为我外婆每天晚上都给我打一个电话。" | gentle, emotional |
| 6 | `lv11_0200_mom_voice_01_seg6` | "她不说什么,就问我今天吃饭了没。" | gentle, peaceful |
| 7 | `lv11_0200_mom_voice_01_seg7` | "我现在打给你,你不接也没事。妈妈给你发个语音,你什么时候想听就听。你不用回我。" | gentle, tender |
| 8 | `lv11_0200_mom_voice_01_seg8` | "你今天接了好多电话吧。妈妈不打扰你了。晚安。" | gentle, almost smiling |
每段单独合成后用 FFmpeg 拼接(见 §4.3)。
**小美醉语音(第 09 条)分 4 段**,speed 调低到 0.95,每段间加长停顿。
**周南 4 段长讲述(第 13 条)** 每段独立合成,段间留 800ms 静音。
### 3.4 系统 TTS
系统提示音(内容警告、暂停、热线、等待回复、memo 等)**现行方案**:
- 大部分系统语音用 **林夏音色**`linxia_ref.wav`)克隆,见 `LINES``v2_sys_*``lv11_sys_memo_01`
- 合成走 v5 流水线,与对白同一套参考
### 3.5 self-3y 三版预录
**现行**:独立参考 `self_3y_v03.wav`(非复用小美),角色 key 为 `self_3y`speed 1.15。
| 版本 | 文件名 | 情绪 |
|---|---|---|
| 明朗版 | `lv11_0030_self3y_voice_01` | 兴奋带紧张 |
| 迷茫版 | `lv11_0030_self3y_voice_02` | 疲惫假装坚强 |
| 温柔版 | `lv11_0030_self3y_voice_03` | 平静有力 |
台词见 `audio_2/scripts/04_gen_tts_clone.py``EXTRA_LINES`
---
## 4. 后期处理(FFmpeg
### 4.1 单条 TTS 标准处理链
```bash
# 变量
INPUT="audio/00_raw/tts/lv11_2103_mom_call_01_v1.wav"
OUTPUT="audio/01_processed/tts/lv11_2103_mom_call_01_v1.wav"
# 完整处理链(一条命令):
# [1] 高通 80Hz 去低频噪
# [2] 压缩器 4:1
# [3] 响度归一化到 -16 LUFS
# [4] 限制峰值 -1 dBTP
ffmpeg -i "$INPUT" \
-af "highpass=f=80,\
acompressor=threshold=-18dB:ratio=4:attack=20:release=250,\
loudnorm=I=-16:TP=-1:LRA=11,\
alimiter=limit=0.891" \
-ar 48000 -sample_fmt s16 -ac 1 \
-y "$OUTPUT"
```
### 4.2 加听筒效果(电话 / 微信语音形态)
```bash
INPUT="audio/01_processed/tts/lv11_2103_mom_call_01_v1.wav"
OUTPUT="audio/01_processed/tts/lv11_2103_mom_call_01_v1_phone.wav"
# 模拟手机听筒: HPF 300Hz + LPF 3.4kHz + 轻微饱和
ffmpeg -i "$INPUT" \
-af "highpass=f=300:poles=2,\
lowpass=f=3400:poles=2,\
equalizer=f=1500:t=q:w=1:g=1,\
acompressor=threshold=-20dB:ratio=3:attack=5:release=50" \
-y "$OUTPUT"
```
> **例外**`mom` 第 16 条 4'17" 长语音**不加听筒效果**——SOP 设计意图是"完整音质版"。
### 4.3 长戏分段拼接
```bash
# 1. 先给每段加 200ms 静音头尾
for seg in audio/00_raw/tts/lv11_0200_mom_voice_01_seg*.wav; do
ffmpeg -i "$seg" \
-af "adelay=200|200,apad=pad_dur=0.2" \
-y "${seg%.wav}_padded.wav"
done
# 2. 生成拼接文件列表
ls audio/00_raw/tts/lv11_0200_mom_voice_01_seg*_padded.wav | \
sed "s/^/file '/" | sed "s/$/'/" > /tmp/concat_list.txt
# 3. 拼接 + crossfade
ffmpeg -f concat -safe 0 -i /tmp/concat_list.txt \
-af "acrossfade=d=0.05:c1=tri:c2=tri" \
-y audio/00_raw/tts/lv11_0200_mom_voice_01_full.wav
# 注意:FFmpeg concat + acrossfade 只支持两个输入。
# 多段拼接需要逐段 crossfade,或直接 concat 后人工检查接缝。
# 推荐方案:先 concat 拼接,段间 200ms 静音已经足够自然。
ffmpeg -f concat -safe 0 -i /tmp/concat_list.txt \
-c copy \
-y audio/00_raw/tts/lv11_0200_mom_voice_01_full.wav
```
### 4.4 批量后期处理脚本
```bash
#!/bin/bash
# 批量处理 00_raw/tts/ → 01_processed/tts/
# 用法: bash audio/process_tts.sh
for f in audio/00_raw/tts/lv11_*.wav; do
basename=$(basename "$f")
output="audio/01_processed/tts/$basename"
# 跳过已处理的
[ -f "$output" ] && echo "跳过: $basename" && continue
echo "处理: $basename"
ffmpeg -i "$f" \
-af "highpass=f=80,\
acompressor=threshold=-18dB:ratio=4:attack=20:release=250,\
loudnorm=I=-16:TP=-1:LRA=11" \
-ar 48000 -sample_fmt s16 -ac 1 \
-y "$output" 2>/dev/null
echo " → $output"
done
echo "TTS 后期处理完成"
```
### 4.5 最终打包(wav → ogg
```bash
#!/bin/bash
# 01_processed → 02_final (ogg Vorbis q=5)
for f in audio/01_processed/tts/*.wav; do
basename=$(basename "${f%.wav}.ogg")
output="audio/02_final/tts/$basename"
ffmpeg -i "$f" -c:a libvorbis -q:a 5 -y "$output" 2>/dev/null
done
echo "OGG 打包完成"
```
### 4.6 角色专属后期(按 SOP §4.2 配置卡)
```bash
# mom: 高频衰减 -3dB + 轻 reverb
ffmpeg -i input.wav -af "equalizer=f=5000:t=h:w=2000:g=-3" -y output.wav
# azhe: 中频衰减 -2dB"闷"感)
ffmpeg -i input.wav -af "equalizer=f=2000:t=q:w=1:g=-2" -y output.wav
# delivery: 低频衰减 -6dB(模拟听筒)
ffmpeg -i input.wav -af "equalizer=f=200:t=h:w=200:g=-6" -y output.wav
# self-3y: 高频衰减 -2dB + 底噪(录音笔质感)
ffmpeg -i input.wav \
-af "equalizer=f=5000:t=h:w=2000:g=-2" \
-y output.wav
# 底噪可以后续叠加一层轻微白噪声
```
---
## 5. 音乐素材(ACE-Step 本地 + Suno 备选)
**现行产出**:BGM 4 轨 + 铃声 5 条,均由 **ACE-Step 1.5** 本地生成,已部署至 `audio/mp3/music/`
Suno 仍可作为备选(按 SOP §6 操作):
### 5.1 操作步骤
1. 登录 Suno(需要 Pro 订阅)
2. 选 Custom Mode
3. 按 SOP §6.2 的 4 段曲 Prompt 生成
4. 每段跑 2 轮(出 4 首候选),选最佳
5. 用 Extend 延长到目标时长
6. 下载 WAV 格式到 `audio/00_raw/music/`
### 5.2 铃声生成
按 SOP §6.3 的 9 个角色铃声 Prompt 在 Suno 生成。
下载到 `audio/00_raw/ringtone/`
### 5.3 音乐后期处理
```bash
# 音乐处理: 削 AI 浊感 + 响度 -18 LUFS
for f in audio/00_raw/music/*.wav; do
basename=$(basename "$f")
ffmpeg -i "$f" \
-af "equalizer=f=350:t=q:w=1.5:g=-2,\
loudnorm=I=-18:TP=-1:LRA=11" \
-ar 48000 \
-y "audio/01_processed/music/$basename" 2>/dev/null
done
```
---
## 6. 音效素材(ACE-Step 本地 + ElevenLabs 备选)
**现行产出**:叙事音效 4 条(敲门、心跳、呼吸、水壶)在 `audio/mp3/sfx/`,由 ACE-Step 生成。
ElevenLabs SFX 仍可作为备选:
### 6.1 操作步骤
1. 登录 ElevenLabsCreator 订阅,含 Sound Effects
2. 按 SOP §7.2 的 Prompt 逐条生成
3. **每条跑 3 次**,挑最佳
4. 下载后转 WAV
```bash
# ElevenLabs 默认 mp3,转为 wav
for f in audio/00_raw/sfx/*.mp3; do
ffmpeg -i "$f" -ar 48000 -y "${f%.mp3}.wav" && rm "$f"
done
```
### 6.2 音效后期
```bash
# 短音效响度 -14 LUFS
for f in audio/00_raw/sfx/*.wav; do
basename=$(basename "$f")
ffmpeg -i "$f" \
-af "loudnorm=I=-14:TP=-1:LRA=11" \
-ar 48000 \
-y "audio/01_processed/sfx/$basename" 2>/dev/null
done
```
---
## 7. 环境底噪(Freesound
### 7.1 操作步骤
1. 按 SOP §8.1 的清单在 Freesound 搜索
2. 过滤:CC0 优先,≥ 44.1kHz,下载 WAV
3. 文件名加 Freesound ID:如 `amb_apartment_night_fs123456.wav`
4. **立刻登记到版权表**
### 7.2 环境底噪后期
```bash
# 环境底噪处理: HPF 60Hz + LPF 12kHz + 响度 -22 LUFS
for f in audio/00_raw/ambience/*.wav; do
basename=$(basename "$f")
ffmpeg -i "$f" \
-af "highpass=f=60,lowpass=f=12000,\
loudnorm=I=-22:TP=-3:LRA=11" \
-ar 48000 -ac 2 \
-y "audio/01_processed/ambience/$basename" 2>/dev/null
done
```
### 7.3 单声道转假性立体声
```bash
# 如果下载到的是单声道,做假性立体声
INPUT="audio/01_processed/ambience/amb_apartment_night.wav"
OUTPUT="audio/01_processed/ambience/amb_apartment_night_stereo.wav"
ffmpeg -i "$INPUT" \
-filter_complex "\
[0:a]asplit=2[L][R];\
[R]adelay=12|12,equalizer=f=8000:t=q:w=1:g=1[Rd];\
[L][Rd]amerge=inputs=2[out]" \
-map "[out]" -ac 2 \
-y "$OUTPUT"
```
---
## 8. QA 验收
### 8.1 响度检查脚本
```bash
#!/bin/bash
# 检查所有已处理音频的响度
echo "=== TTS 响度检查 (目标 -16 LUFS) ==="
for f in audio/01_processed/tts/*.wav; do
result=$(ffmpeg -i "$f" -af "loudnorm=print_format=json" -f null - 2>&1 | \
grep -A1 '"input_i"' | tail -1 | tr -d ' ",' | cut -d: -f2)
echo " $(basename "$f"): ${result} LUFS"
done
echo ""
echo "=== 音乐响度检查 (目标 -18 LUFS) ==="
for f in audio/01_processed/music/*.wav; do
result=$(ffmpeg -i "$f" -af "loudnorm=print_format=json" -f null - 2>&1 | \
grep -A1 '"input_i"' | tail -1 | tr -d ' ",' | cut -d: -f2)
echo " $(basename "$f"): ${result} LUFS"
done
echo ""
echo "=== 环境底噪响度检查 (目标 -22 LUFS) ==="
for f in audio/01_processed/ambience/*.wav; do
result=$(ffmpeg -i "$f" -af "loudnorm=print_format=json" -f null - 2>&1 | \
grep -A1 '"input_i"' | tail -1 | tr -d ' ",' | cut -d: -f2)
echo " $(basename "$f"): ${result} LUFS"
done
```
### 8.2 验收流程
1. **自检**:跑响度检查脚本,确认所有文件在目标范围 ±1 LUFS
2. **单条听感**:用耳机逐条听,标记不满意的(记录到 `03_qa_reports/`
3. **上下文听感**:把同一时间段的所有音频按时间轴拼起来完整听一遍
4. **不满意的重做**:回到 §3 重新合成,调参或换参考音频
---
## 9. 执行顺序总结(现行状态 2026-05-23
```
✅ 第 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 · 常见问题
**Q: VoxCPM2 生成的语音有电流声/杂音?**
A: 检查参考音频质量。参考音频必须干净无噪,采样率 ≥ 16kHz。
**Q: 语速不自然?**
A: 用 FFmpeg atempo 调速(范围 0.5-2.0)。如果调速后音质下降,改为在合成文本中加标点控制节奏(句号=长停顿,逗号=短停顿)。
**Q: 怎样让同一个音色听起来"醉了"**
A: TTS 通常没有情绪控制参数。替代方案:
1. 在文本中插入省略号、重复字来模拟口齿不清
2. 后期用 FFmpeg 轻微变速+加混响:
```bash
ffmpeg -i drunk.wav -af "atempo=0.95,aecho=0.8:0.7:40:0.3" -y drunk_fx.wav
```
**Q: VoxCPM2 服务无法启动?**
A: 确认 `bash /home/xsl/AutoVideo/start-voxcpm.sh` 正常。确认 GPU 可用:`nvidia-smi`。
**Q: 生成很慢?**
A: RTX 5090 应该很快(远超实时)。如果慢,检查是否误用了 CPU。
---
## 附录 B · CosyVoice2 备用方案
> **仅在 VoxCPM2 表现不佳或不可用时使用。** 正常生产流程请走 §1-§3 的 VoxCPM2 主链路。
### B.1 环境验证
```bash
conda activate cosyvoice
cd /home/xsl/tools/CosyVoice
python -c "
import sys
sys.path.append('third_party/Matcha-TTS')
from cosyvoice.cli.cosyvoice import CosyVoice2
model = CosyVoice2('pretrained_models/CosyVoice2-0.5B')
print('CosyVoice2 加载成功,采样率:', model.sample_rate)
"
```
### B.2 WebUI 启动
```bash
conda activate cosyvoice
cd /home/xsl/tools/CosyVoice
python webui.py --port 8001 # 注意:用 8001 避免与 VoxCPM2 的 8000 端口冲突
```
模式选择:**3s极速复刻**(上传参考音频 + 对应文字 → 合成)。
### B.3 批量脚本
CosyVoice2 版批量脚本为 `audio/batch_tts.py`(区别于主力脚本 `audio/batch_tts_voxcpm.py`)。
用法:`conda activate cosyvoice && python audio/batch_tts.py`