跳转至

GPU 使用计划:下次开机执行清单

原则: 开机前一切就绪 → 开机即干 → 干完即关。杜绝 GPU 空闲烧钱。


一、当前需要 GPU 的任务清单

必做(阻塞发布质量)

# 任务 预估时间 产出
1 EP052 Edge TTS 片段用 Fish Audio 重生成 ~15 分钟 6 个 WAV 替换 MP3
2 EP052 合并音频重新导出 ~2 分钟 EP052.wav + EP052.mp3
3 EP052 视频用新音频重新合成 ~5 分钟 EP052.mp4

可选(提升质量/测试)

# 任务 预估时间 产出
4 英文版 EP052 音频(Fish S2 英文语音) ~15 分钟 19 个英文 WAV
5 多集批量合成(如有新脚本) ~5 分钟/集 每集 19 个 WAV
6 音色质量对比测试 ~10 分钟 对比报告

EP052 需要重做的 6 个 Edge TTS 片段

segment_011_host_serious.mp3   → .wav   (Edge TTS, 147KB)
segment_013_host_sad.mp3       → .wav   (Edge TTS, 156KB)
segment_015_host_serious.mp3   → .wav   (Edge TTS, 164KB)
segment_016_guest_neutral.mp3  → .wav   (Edge TTS, 45KB)
segment_017_host_serious.mp3   → .wav   (Edge TTS, 173KB)
segment_018_guest_serious.mp3  → .wav   (Edge TTS, 114KB)

预估总 GPU 时间: 20-30 分钟(含启动) 预估费用: ¥0.66-0.99(¥1.32/时)


二、开机前检查清单(本地执行)

开机前逐项确认,全部 ✅ 后再开机

脚本和数据

  • [ ] 脚本文件就绪: episodes/ep052/script.md 存在且内容正确
  • [ ] 参考音频就绪: voices/lingtong/voice_clip_15s.wav 存在且大小正确(~2.4MB)
  • [ ] 本地脚本测试通过: python scripts/generate_ep052.py --dry-run 能正确解析脚本

调用代码

  • [ ] fish_audio.py: src/audio/fish_audio.py 无语法错误
  • [ ] enhanced_tts.py: src/audio/enhanced_tts.py resume 逻辑正常
  • [ ] generate_ep052.py: 脚本可运行,已排除要跳过的片段(11 个已有 WAV)
  • [ ] merge 脚本: generate_ep052_hybrid.py 的 merge 函数可正常合并

环境

  • [ ] Python 包: httpx, pydub, edge-tts 已安装
  • [ ] ffmpeg: 可用 (ffmpeg -version)
  • [ ] 磁盘空间: ≥100MB 可用(音频输出)
  • [ ] .env 配置: FISH_AUDIO_API_URL 待更新(开机后填新地址)

GPU 实例准备

  • [ ] 恒源云账号: 登录正常,余额 ≥¥5
  • [ ] 实例类型: RTX 3090 24GB,数据盘已勾选
  • [ ] 数据盘状态: /root/autodl-tmp/fish-speech/ 有之前保存的模型(首次需下载 ~8GB)

三、开机后执行流程(GPU 实例上)

阶段 1: 部署(5-10 分钟,仅首次或环境丢失时)

# === 如果数据盘已有模型和环境(非首次)===
cd /root/autodl-tmp/fish-speech/fish-speech
conda create -n fish-speech python=3.12 -y && conda activate fish-speech
pip install -e ".[cu129]"

# === 如果首次全新实例 ===
cd /root/autodl-tmp
git clone https://github.com/fishaudio/fish-speech.git
cd fish-speech
conda create -n fish-speech python=3.12 -y && conda activate fish-speech
pip install -e ".[cu129]"
python -c "from huggingface_hub import snapshot_download; snapshot_download(repo_id='fishaudio/s2-pro', local_dir='checkpoints/s2-pro')"

阶段 2: 启动 API(1-2 分钟,首次 +5 分钟编译)

conda activate fish-speech
cd /root/autodl-tmp/fish-speech/fish-speech
nohup python -m tools.api \
    --listen 0.0.0.0:8080 \
    --llama-checkpoint-path checkpoints/s2-pro \
    > /root/autodl-tmp/api.log 2>&1 &

# 等待就绪
sleep 10 && tail -20 /root/autodl-tmp/api.log
# 看到 "Uvicorn running" 即可

阶段 3: 端口映射 + 本地测试

  1. 恒源云控制台 → 自定义服务 → 映射端口 8080 → 获取公网地址
  2. 本地更新 .env: FISH_AUDIO_API_URL=http://<新地址>
  3. 本地测试连通性:
# 本地执行
curl -s -o /dev/null -w "%{http_code}" http://<新地址>/v1/tts
# 应返回 405(Method Not Allowed,说明服务在跑)

阶段 4: 执行合成任务(15-20 分钟)

# 本地执行 — 只重做 6 个 Edge TTS 片段
python scripts/generate_ep052.py
# 脚本有 resume 逻辑,已有 WAV 的 11 个片段会自动跳过
# 6 个 Edge TTS 片段会被 Fish Audio 重新生成(覆盖 MP3 → WAV)

阶段 5: 合并 + 视频(5 分钟)

# 合并所有 19 个片段(全部 WAV)
python -c "
import asyncio
from pathlib import Path
from scripts.generate_ep052_hybrid import merge_segments

async def do_merge():
    audio_dir = Path('episodes/ep052/audio_fish')
    # 收集每个 segment 编号对应的最佳文件(WAV 优先)
    seg_files = []
    for i in range(19):
        wav = list(audio_dir.glob(f'segment_{i:03d}_*.wav'))
        mp3 = list(audio_dir.glob(f'segment_{i:03d}_*.mp3'))
        if wav:
            seg_files.append(wav[0])
        elif mp3:
            seg_files.append(mp3[0])
    seg_files.sort()
    await merge_segments(seg_files, audio_dir / 'EP052.wav')

asyncio.run(do_merge())
"

# 重新合成视频
python scripts/generate_ep052_video.py

阶段 6: 验证

# 检查所有片段都是 WAV
ls -la episodes/ep052/audio_fish/segment_*.wav | wc -l  # 应=19
ls -la episodes/ep052/audio_fish/segment_*.mp3 | wc -l   # 应=0 或极少

# 检查最终文件
ffprobe episodes/ep052/audio_fish/EP052.wav 2>&1 | grep Duration
ffprobe episodes/ep052/EP052.mp4 2>&1 | grep Duration

阶段 7: 关机

# 1. 停止 API 服务
pkill -f "tools.api" || true

# 2. 确认模型已保存在数据盘
ls /root/autodl-tmp/fish-speech/fish-speech/checkpoints/s2-pro/

# 3. 恒源云控制台 → 关机

四、一键部署脚本(GPU 实例上执行)

scripts/gpu_deploy_and_start.sh scp 到 GPU 实例后直接运行:

# 本地上传
scp scripts/gpu_deploy_and_start.sh root@<GPU_IP>:/root/autodl-tmp/
ssh root@<GPU_IP>
bash /root/autodl-tmp/gpu_deploy_and_start.sh

五、费用估算

场景 GPU 时间 费用
EP052 重做 6 段 + 合并 + 视频 25 分钟 ¥0.55
EP052 重做 + 英文版 45 分钟 ¥0.99
EP052 重做 + 批量 5 集 90 分钟 ¥1.98
全新实例首次部署(含下载模型) 60 分钟 ¥1.32

比 CosyVoice 月费 ¥300-500 节省 99%


六、注意事项

  1. 先本地验证脚本再开机 — 脚本语法错误浪费的是 GPU 时间
  2. 数据盘必须勾选 — 模型 8GB 每次重新下载要 30 分钟
  3. compile 模式 — 如果要用 30 分钟以上就开 --compile,否则不值得等 5 分钟编译
  4. 参考音频要 base64 编码传输 — 已在 fish_audio.py 中实现
  5. 文本 ≤80 字/段 — 超长文本会被自动拆分,但拆分点不一定最优
  6. YunjianNeural 备用 — 本地 Edge TTS fallback 已配置好,GPU 宕机不影响产出

七、下次 GPU 开机决策树

需要 GPU 吗?
├── 合成新音频 → 是 → 有多少集?→ 集齐一批再开
├── 重新合成低质量片段 → 是 → 攒够一批再开
├── 测试音色 → 不急 → 下次开机时顺便做
└── 其他 → 评估:能否 Edge TTS 替代?
    ├── 能 → 不开 GPU
    └── 不能 → 按本计划执行