# 实时音频处理最佳方案（Demucs + RTX 3060）

## 一、方案对比

| 方案 | 版权规避率 | 延迟 | 算力 | 复杂度 |
|------|------------|------|------|--------|
| **FFmpeg 纯滤波**（当前） | 60-70% | 0 | 低 | 低 |
| **Demucs 人声分离** | 90%+ | 4-8s | RTX 3060 | 中高 |

---

## 二、推荐架构：Demucs 实时管道

```
抖音流 ─┬─ FFmpeg 解复用 ─┬─ 视频 ─────────────────────────────┐
        │                │                                    │
        │                └─ 音频 ─→ Python Demucs ─→ 人声 ────┼─→ FFmpeg 复用 ─→ YouTube RTMP
        │                     (分块处理)                      │
        └────────────────────────────────────────────────────┘
```

### 核心参数（RTX 3060 12GB）

| 参数 | 推荐值 | 说明 |
|------|--------|------|
| **模型** | `htdemucs`（单模型，非 _ft） | 速度最快，质量够用 |
| **chunk 长度** | 2.5-3 秒 | 延迟 ≈ 2×chunk ≈ 5-6s |
| **overlap** | 0.25 | 减少接缝，质量更好 |
| **shifts** | 0 | 降低算力，实时必需 |
| **segment** | 7.8（默认）或更小 | 显存不足时减小 |

### RTX 3060 算力

- 约 13 TFLOPS，高于 Demucs 实时所需 2 TFLOPS
- 12GB 显存足够 htdemucs（约 6-8GB）
- 预期：**2-4× 实时速度**，可满足直播

---

## 三、实现方式

### 方式 A：Python 自建管道（推荐）

```python
# 伪代码流程
# 1. FFmpeg 从抖音拉流，输出: -vn -acodec pcm_s16le -ar 44100 -ac 1 pipe:1
# 2. 主进程读取音频块（2.5s = 110250 samples @ 44.1kHz）
# 3. 调用 demucs.separate_audio(model, chunk) 得到 vocals
# 4. 人声写入 pipe，FFmpeg 另一进程读取并与视频复用推流
```

**依赖**：
```
demucs
torch
torchaudio
```

**模型加载**：
```python
from demucs.pretrained import get_model
model = get_model('htdemucs')  # 单模型，非 htdemucs_ft
```

### 方式 B：GStreamer（若可用）

GStreamer 1.28+ 内置 demucs 元素，CPU 约 8× 实时：

```bash
# 需安装 gst-plugins-rs (含 demucs)
gst-launch-1.0 uridecodebin uri=抖音流 ! audioconvert ! demucs ! ...
```

---

## 四、分块处理要点

1. **重叠**：chunk 之间 25% 重叠，避免接缝
2. **队列**：双缓冲，一块处理时另一块接收
3. **采样率**：Demucs 默认 44100 Hz，与 FFmpeg 输出一致
4. **延迟**：总延迟 ≈ 2 × chunk 长度（约 5-6 秒可接受）

---

## 五、快速验证（离线测试）

```bash
# 安装
pip install demucs torch torchaudio

# 测试 30 秒音频分离速度
demucs -n htdemucs --two-stems=vocals -j 1 test_30s.mp3 -o output/

# 若 30s 在 10s 内完成 → 可实时
```

---

## 六、与当前方案的关系

- **当前**：`douyin_youtube_ffplay.py` 纯 FFmpeg，60-70% 规避率
- **升级**：可新增 `douyin_youtube_demucs.py`，集成 Demucs 管道
- **切换**：通过 config 选择 `mode = ffmpeg` 或 `mode = demucs`

---

## 七、配置建议（config/youtube.ini）

```ini
[youtube]
key = xxx

# 音频模式: ffmpeg | demucs
; audio_mode = ffmpeg

# Demucs 专用
; demucs_chunk = 2.5
; demucs_model = htdemucs
```
