'init'
Some checks failed
Upstream Sync / Sync latest commits from upstream repo (push) Has been cancelled
Some checks failed
Upstream Sync / Sync latest commits from upstream repo (push) Has been cancelled
This commit is contained in:
119
docs/REALTIME_AUDIO_DEMUCS.md
Normal file
119
docs/REALTIME_AUDIO_DEMUCS.md
Normal file
@@ -0,0 +1,119 @@
|
||||
# 实时音频处理最佳方案(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
|
||||
```
|
||||
50
docs/YOUTUBE_LIVE_SEO.md
Normal file
50
docs/YOUTUBE_LIVE_SEO.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# YouTube Live 转播优化与 SEO 指南
|
||||
|
||||
## 一、推流技术参数(已自动优化)
|
||||
|
||||
- **分辨率**:720p 竖屏 (720×1280)
|
||||
- **比特率**:4.5 Mbps(可在 config/youtube.ini 的 bitrate 调整)
|
||||
- **关键帧**:2 秒(符合 YouTube 推荐)
|
||||
- **音频**:AAC 128kbps 48kHz 立体声
|
||||
- **协议**:RTMPS 加密推流(推荐)
|
||||
- **防版权**:开源音频处理链(降噪 + 带通 + EQ + 相位扰动)
|
||||
|
||||
## 二、YouTube 直播 SEO 与推荐权重
|
||||
|
||||
直播标题、描述、标签在 **YouTube 工作室** 创建直播时设置,推流程序无法修改。以下为提升推荐权重的建议:
|
||||
|
||||
### 标题(前 60 字最关键)
|
||||
|
||||
- 主关键词放前面,如:`LIVE 摆摊日常 | 路边直播`
|
||||
- 可加实时感词汇:LIVE、直播、实时、正在直播
|
||||
- 避免堆砌关键词,保持可读性
|
||||
|
||||
### 描述(前 125 字影响搜索)
|
||||
|
||||
- 首段包含主关键词和内容概要
|
||||
- 可说明:转播自抖音、直播内容类型、时间等
|
||||
|
||||
### 标签
|
||||
|
||||
- 5–15 个相关标签,如:live stream, 摆摊, 路边直播, 抖音转播
|
||||
- 与标题、描述语义一致
|
||||
|
||||
### 算法相关因素
|
||||
|
||||
- **观看时长**:用户停留越久,推荐越高
|
||||
- **互动**:点赞、评论、分享
|
||||
- **画质与音质**:清晰稳定的流有助于留存
|
||||
|
||||
## 三、config/youtube.ini 配置说明
|
||||
|
||||
| 配置项 | 说明 | 示例 |
|
||||
|--------|------|------|
|
||||
| key | 必填,YouTube stream key | key = xxxx-xxxx-xxxx |
|
||||
| rtmps | 是否用 RTMPS(默认是) | rtmps = 否 |
|
||||
| bitrate | 视频比特率 kbps | bitrate = 4500 |
|
||||
|
||||
## 四、稳定性建议
|
||||
|
||||
1. 网络:上行带宽 ≥ 6 Mbps,建议有线
|
||||
2. 推流前在 YouTube 工作室完成标题、描述、标签设置
|
||||
3. 定期检查 config/youtube.ini 中的 stream key 是否有效
|
||||
72
docs/p2p-remote.md
Normal file
72
docs/p2p-remote.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# 远程控制与 P2P 虚拟网(EasyTier)
|
||||
|
||||
## 方案对比(简要)
|
||||
|
||||
| 方案 | 特点 |
|
||||
|------|------|
|
||||
| [EasyTier](https://github.com/EasyTier/EasyTier) | 去中心化 mesh、NAT 穿透、Win/Android 有现成客户端;与「本机 HTTP API」组合简单。 |
|
||||
| Tailscale / ZeroTier | 需协调服务或自建 Moon;上手快,依赖厂商或自建协调器。 |
|
||||
| 纯 WebRTC | 真 P2P,但需信令(常要服务器)或复杂打洞流程,不适合直接替代「虚拟网 + REST」。 |
|
||||
|
||||
对本项目(`web2` FastAPI + Electron + 未来 React Native),**EasyTier + 固定虚拟 IP 访问 `http://<PC的虚拟IP>:8001`** 是务实组合。
|
||||
|
||||
## Windows 桌面端:内置 EasyTier
|
||||
|
||||
- 构建/开发前会执行 `pnpm run prepare-easytier`(或 `electron/scripts/download-easytier.mjs`),从 [EasyTier 官方 Release](https://github.com/EasyTier/EasyTier/releases) 下载 Windows x64 包并解压 `easytier-core.exe` 到 `electron/resources/easytier/`(LGPL-3.0,见同目录 `NOTICE-EasyTier.txt`)。
|
||||
- 应用启动后自动拉起该进程,并在 `config/easytier_network.json` **首次自动生成**组网名与密钥(`peerUrls` 可留空或按需添加社区共享节点)。
|
||||
- 若需跳过下载(如无网络 CI),可设置环境变量 `SKIP_EASYTIER=1`。
|
||||
|
||||
## 本项目已做的改造
|
||||
|
||||
1. **监听地址**:Electron 启动的 uvicorn 默认仍为 `127.0.0.1`。若存在 `config/web2_bind_host.txt`(单行,如 `0.0.0.0`)或环境变量 `WEB2_HOST`,则按该地址绑定。
|
||||
2. **API 鉴权(可选)**:若存在 `config/web2_api_token.txt`(单行密钥)或环境变量 `WEB2_API_TOKEN`,则除 `/health`、OpenAPI 文档路径外,请求需带:
|
||||
- `Authorization: Bearer <密钥>`,或
|
||||
- `X-API-Token: <密钥>`
|
||||
3. **Electron 前端**:自动从主进程读取 token 文件并注入请求头;浏览器 / React Native 需自行配置同一密钥。
|
||||
4. **「网络」页**:提供「允许远程」开关(写入 `web2_bind_host.txt` 并重启后端)、本机候选虚拟网 IP 列表、**生成 API 密钥**,以及 **二维码**(JSON 文本,供 RN 扫码解析)。
|
||||
|
||||
### 扫码绑定 JSON 格式(`v` 为版本号)
|
||||
|
||||
```json
|
||||
{
|
||||
"v": 1,
|
||||
"baseUrl": "http://10.126.126.1:8001",
|
||||
"port": 8001,
|
||||
"token": "与 web2_api_token.txt 一致",
|
||||
"easytier": {
|
||||
"networkName": "与 PC 上 config/easytier_network.json 一致",
|
||||
"networkSecret": "同上",
|
||||
"peerUrls": []
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
React Native:解析 JSON 后,**App 内**需使用与 PC 同版本的 EasyTier 组件并启动同一 `networkName` / `networkSecret`(可选 `peerUrls`),再请求 `baseUrl` 并带 `Authorization: Bearer ${token}`。
|
||||
|
||||
### 移动端 App 内置 EasyTier
|
||||
|
||||
- Android 可参考 [EasyTier 官方 APK](https://github.com/EasyTier/EasyTier/releases) 或同仓库原生库,将组网逻辑与扫码得到的 `easytier` 字段对齐;**同一套 JSON 即可实现 PC↔手机同网,无需用户再单独安装 EasyTier 客户端**(由你们 App 内置分发)。
|
||||
|
||||
## EasyTier 侧(用户操作)
|
||||
|
||||
1. PC 与手机分别安装 EasyTier,使用**相同** `--network-name` 与 `--network-secret`。
|
||||
2. 按 [EasyTier 文档](https://github.com/EasyTier/EasyTier) 连接共享节点或自建入口,确认两端能 `ping` 通虚拟 IP。
|
||||
3. 在 PC 上把 `config/web2_bind_host.txt` 设为 `0.0.0.0`,并创建 `config/web2_api_token.txt`(随机长串)。
|
||||
4. 重启本应用;在手机浏览器或 RN 中请求:`http://<PC的EasyTier虚拟IP>:8001/process_monitor` 等,并带上 `Authorization` 头。
|
||||
|
||||
## React Native 示例
|
||||
|
||||
```ts
|
||||
const BASE = 'http://10.126.126.1:8001' // 替换为 PC 在 EasyTier 中的 IP
|
||||
const TOKEN = '你的 web2_api_token.txt 内容'
|
||||
|
||||
fetch(`${BASE}/health`).then((r) => r.json())
|
||||
fetch(`${BASE}/process_monitor`, {
|
||||
headers: { Authorization: `Bearer ${TOKEN}` },
|
||||
})
|
||||
```
|
||||
|
||||
## 安全说明
|
||||
|
||||
- `0.0.0.0` 且无 token 时,控制台会警告;**不要**将无鉴权 API 暴露到公网。
|
||||
- 防火墙仅向 EasyTier 虚拟网段放行 `8001`(若需)。
|
||||
Reference in New Issue
Block a user