feat: Initial pipeline for Twitch highlight detection

- New 2-of-3 detection system (chat + audio + color)
- GPU support (PyTorch ROCm/CUDA ready)
- Draft mode (360p) for fast testing
- HD mode (1080p) for final render
- Auto download video + chat
- CLI pipeline script
- Documentation in Spanish
This commit is contained in:
ren
2026-02-18 20:41:58 -03:00
parent f9836a4265
commit fb8b390740
21 changed files with 1412 additions and 673 deletions

221
contexto.md Normal file
View File

@@ -0,0 +1,221 @@
# Contexto del Proyecto
## Resumen Ejecutivo
Pipeline automatizado para detectar y generar highlights de streams de Twitch. El objetivo es:
1. Descargar un VOD completo de Twitch (varias horas)
2. Analizar el chat y el video para detectar momentos destacados
3. Generar un video resumen con los mejores momentos
El sistema original planeaba usar 3 métricas para detectar highlights (2 de 3 deben cumplirse):
- Chat saturado (muchos mensajes en poco tiempo)
- Picos de audio (gritos del streamer)
- Colores brillantes en pantalla (efectos visuales)
**Estado actual:** Solo chat implementado. Audio y color pendientes.
---
## Historia y Desarrollo
### Inicio
El proyecto comenzó con la carpeta `clipper/` que contenía código antiguo para descargar streams de Twitch en vivo. El usuario quería actualizar el enfoque para procesar VODs completos (streams de varias horas) y detectar automáticamente los mejores momentos.
### Primera Iteración (Código Viejo)
Existía código en `clipper/` y `analyser/` que:
- Descargaba streams en vivo
- Usaba `twitchAPI` para autenticación
- Tenía issues con versiones de dependencias (Python 3.14 incompatibilidades)
### Limpieza y Nuevo Pipeline
Se eliminó el código viejo y se creó una estructura nueva:
```
downloaders/ - Módulos para descargar video/chat
detector/ - Lógica de detección de highlights
generator/ - Creación del video resumen
```
### Problemas Encontrados
#### 1. Chat Downloader - Múltiples Intentos
Se probaron varios repositorios para descargar chat de VODs:
- **chat-downloader (xenova)**: No funcionó con VODs (KeyError 'data')
- **tcd (PetterKraabol)**: Mismo problema, API de Twitch devuelve 404
- **TwitchDownloader (lay295)**: Este sí funcionó. Es un proyecto C#/.NET con CLI.
**Solución:** Compilar TwitchDownloaderCLI desde código fuente usando .NET 10 SDK.
#### 2. Dependencias Python
Problemas de versiones:
- `requests` y `urllib3` entraron en conflicto al instalar `tcd`
- Streamlink dejó de funcionar
- **Solución:** Reinstalar versiones correctas de requests/urllib3
#### 3. Video de Prueba
- VOD: `https://www.twitch.tv/videos/2701190361` (elxokas)
- Duración: ~5.3 horas (19GB)
- Chat: 12,942 mensajes
- El chat estaba disponible (no había sido eliminado por Twitch)
#### 4. Detección de Highlights
Problemas con el detector:
- Formato de timestamp del chat no era reconocido
- **Solución:** Usar `content_offset_seconds` del JSON directamente
El detector actual solo usa chat saturado. Encuentra ~139 picos pero la mayoría son de 1-2 segundos (no útiles). Con filtro de duración >5s quedan solo 4 highlights.
#### 5. Generación de Video
- Usa moviepy
- Funciona correctamente
- Genera video de ~39MB (~1 minuto)
---
## Stack Tecnológico
### Herramientas de Descarga
| Herramienta | Uso | Estado |
|-------------|-----|--------|
| streamlink | Video streaming | ✅ Funciona |
| TwitchDownloaderCLI | Chat VODs | ✅ Compilado y funciona |
### Processing (Python)
| Paquete | Uso | GPU Support |
|---------|-----|-------------|
| opencv-python-headless | Análisis de video/color | CPU (sin ROCm) |
| librosa | Análisis de audio | CPU |
| scipy/numpy | Procesamiento numérico | CPU |
| moviepy | Generación de video | CPU |
### GPU
- **ROCm 7.1** instalado y funcionando
- **PyTorch 2.10.0** instalado con soporte ROCm
- GPU detectada: AMD Radeon Graphics (6800XT)
- **Pendiente:** hacer que OpenCV/librosa usen GPU
---
## Hardware
- **GPU Principal:** AMD Radeon 6800XT (16GB VRAM) con ROCm 7.1
- **GPU Alternativa:** NVIDIA RTX 3050 (8GB VRAM) - no configurada
- **CPU:** AMD Ryzen (12 cores)
- **RAM:** 32GB
- **Almacenamiento:** SSDNVMe
---
## Credenciales
- **Twitch Client ID:** `xk9gnw0wszfcwn3qq47a76wxvlz8oq`
- **Twitch Client Secret:** `51v7mkkd86u9urwadue8410hheu754`
---
## Pipeline Actual (Manual)
```bash
# 1. Descargar video
bajar "https://www.twitch.tv/videos/2701190361"
# 2. Descargar chat (después de compilar TwitchDownloaderCLI)
TwitchDownloaderCLI chatdownload --id 2701190361 -o chat.json
# 3. Convertir chat a texto
python3 -c "
import json
with open('chat.json') as f:
data = json.load(f)
with open('chat.txt', 'w') as f:
for c in data['comments']:
f.write(f\"[{c['created_at']}] {c['commenter']['name']}: {c['message']['body']}\n\")
"
# 4. Detectar highlights
python3 detector.py
# 5. Generar video
python3 generate_video.py
```
---
## Resultados Obtenidos
| Métrica | Valor |
|---------|-------|
| Video original | 19GB (5.3 horas) |
| Mensajes de chat | 12,942 |
| Picos detectados | 139 |
| Highlights útiles (>5s) | 4 |
| Video final | 39MB (~1 minuto) |
### Highlights Encontrados
1. ~4666s - ~4682s (16s)
2. ~4800s - ~4813s (13s)
3. ~8862s - ~8867s (5s)
4. ~11846s - ~11856s (10s)
---
## Pendientes (TODO)
### Alta Prioridad
1. **Sistema 2 de 3**: Implementar análisis de audio y color
2. **GPU**: Hacer que OpenCV/librosa usen la 6800XT
3. **Mejor detección**: Keywords, sentimiento, ranking
4. **Kick**: Soporte para chat (sin API pública)
### Media Prioridad
5. Paralelización
6. Interfaz web (Streamlit)
7. CLI mejorada
### Baja Prioridad
8. STT (reconocimiento de voz)
9. Detectar cuando streamer muestra algo en pantalla
10. Múltiples streamers
---
## Archivos del Proyecto
```
Twitch-Highlight-Detector/
├── .env # Credenciales Twitch
├── .git/ # Git repo
├── .gitignore
├── requirements.txt # Dependencias Python
├── lower # Script: descargar streams
├── pipeline.sh # Pipeline automatizado
├── detector.py # Detección de highlights (chat)
├── generate_video.py # Generación de video resumen
├── highlight.md # Docs: uso del pipeline
├── contexto.md # Este archivo
├── todo.md # Lista de tareas pendientes
├── chat.json # Chat descargado (TwitchDownloader)
├── chat.txt # Chat en formato texto
├── highlights.json # Timestamps de highlights
├── highlights.mp4 # Video final
└── 20260218_193846_twitch.mp4 # Video original de prueba
```
---
## Notas Importantes
1. **Twitch elimina el chat** de VODs después de un tiempo (no hay tiempo exacto definido)
2. **El threshold actual** es muy sensible - detecta muchos falsos positivos de 1-2 segundos
3. **El video de prueba** es de elxokas, un streamer español de League of Legends
4. **PyTorch con ROCm** está instalado pero no se está usando todavía en el código
---
## Links Relevantes
- TwitchDownloader: https://github.com/lay295/TwitchDownloader
- streamlink: https://streamlink.github.io/
- PyTorch ROCm: https://pytorch.org/
- ROCm: https://rocm.docs.amd.com/