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.pyresume 逻辑正常 - [ ] 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: 端口映射 + 本地测试
- 恒源云控制台 → 自定义服务 → 映射端口 8080 → 获取公网地址
- 本地更新
.env:FISH_AUDIO_API_URL=http://<新地址> - 本地测试连通性:
# 本地执行
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%
六、注意事项
- 先本地验证脚本再开机 — 脚本语法错误浪费的是 GPU 时间
- 数据盘必须勾选 — 模型 8GB 每次重新下载要 30 分钟
- compile 模式 — 如果要用 30 分钟以上就开
--compile,否则不值得等 5 分钟编译 - 参考音频要 base64 编码传输 — 已在 fish_audio.py 中实现
- 文本 ≤80 字/段 — 超长文本会被自动拆分,但拆分点不一定最优
- YunjianNeural 备用 — 本地 Edge TTS fallback 已配置好,GPU 宕机不影响产出