Skip to content

Latest commit

 

History

History
809 lines (652 loc) · 30.1 KB

File metadata and controls

809 lines (652 loc) · 30.1 KB

🔬 Recherche & Développement : Système d'Auto-Traduction Vidéo

📋 Objectif

Créer un système complet d'auto-traduction vidéo permettant de :

  1. Extraire les dialogues d'une vidéo existante ou créée
  2. Traduire automatiquement dans plusieurs langues cibles
  3. Resynchroniser les lèvres selon la nouvelle langue (lip-sync)
  4. Cloner les voix (optionnel) pour préserver l'identité vocale
  5. Ajuster le timing pour un rendu naturel

🏗️ Architecture Actuelle du Codebase

Services Existant à Intégrer

Service Fichier Capacités État
Lip Sync backend/lip_sync_api.py Wav2Lip via ComfyUI, presets qualité ✅ Opérationnel
TTS backend/qwen_tts_service.py Qwen TTS, voix intégrées, clonage voix ✅ Opérationnel
Traduction backend/video_editor_ai_service.py MarianMT, multi-langues ⚠️ Basique
Transcription backend/video_editor_ai_service.py Whisper, timestamps ✅ Opérationnel
ComfyUI Executor src/comfyui_workflow_executor.py Orchestration workflows ✅ Opérationnel

Flux de Données Actuel

[Vidéo Source] 
    → [Extraction Audio] (ffmpeg_service.py)
    → [Transcription Whisper] (video_editor_ai_service.py)
    → [Traduction MarianMT] (video_editor_ai_service.py) ← BASIQUE
    → [TTS Qwen] (qwen_tts_service.py)
    → [Lip Sync Wav2Lip] (lip_sync_api.py)
    → [Vidéo Finale]

🔍 Analyse des Technologies Disponibles

1. Extraction de Dialogues

Technologie Avantages Inconvénients Recommandation
Whisper (OpenAI) Haute précision, timestamps, multi-langue Lourd, GPU recommandé À utiliser
Vosk Léger, offline Moins précis Alternative légère
Google STT Très précis Coût, online Non recommandé

2. Traduction

Technologie Avantages Inconvénients Recommandation
MarianMT (Helsinki-NLP) Actuellement utilisé, offline Modèles par paire de langues ⚠️ À améliorer
M2M100 (Facebook) Multilingue, 100 langues Lourd Recommandé
NLLB-200 (Meta) 200 langues, haute qualité Très lourd Alternative
SeamlessM4T (Meta) Speech-to-Speech direct Complexe à intégrer R&D à explorer
API DeepL Excellente qualité Coût, online Option premium

3. Synthèse Vocale (TTS)

Technologie Avantages Inconvénients Recommandation
Qwen TTS Déjà intégré, qualité élevée Chinois optimisé À utiliser
XTTS v2 (Coqui) Clonage voix excellent Projet arrêté Alternative
Bark (Suno) Expressivité, non-verbal Lourd, lent Pour créativité
VITS Rapide, qualité Configuration complexe Pour production
Azure TTS Qualité professionnelle Coût, online Option premium

4. Resynchronisation Labiale (Lip Sync)

Technologie Avantages Inconvénients Recommandation
Wav2Lip Déjà intégré, efficace Parfois saccadé Base actuelle
VideoRetalking Meilleure qualité Plus complexe À intégrer
SadTalker Mouvements naturels Focus tête seule Alternative
SyncLips Open source récent Peu documenté À surveiller
HeyGen API Qualité pro Coût élevé Option premium

5. Clonage de Voix

Technologie Avantages Inconvénients Recommandation
Qwen TTS Fine-tuning Déjà intégré Dataset nécessaire À utiliser
RVC (Retrieval-based VC) Rapide, efficace Post-processing Alternative
So-VITS-SVC Haute qualité chant Complexe Pour musique
OpenVoice Clonage rapide Nouveau À évaluer
YourTTS Multi-langue Qualité variable Alternative

📊 Pipeline Complet Proposé

┌─────────────────────────────────────────────────────────────────────────────┐
│                    PIPELINE AUTO-TRADUCTION VIDÉO                           │
└─────────────────────────────────────────────────────────────────────────────┘

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│  VIDÉO       │────▶│  Extraction  │────▶│  Transcription│
│  SOURCE      │     │  Audio       │     │  (Whisper)    │
└──────────────┘     │  (FFmpeg)    │     │  + Timestamps │
                     └──────────────┘     └──────┬───────┘
                                                  │
                    ┌─────────────────────────────┘
                    ▼
┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│  Détection   │────▶│  Segmentation│────▶│  Dialogue    │
│  Locuteurs   │     │  Dialogues   │     │  Extract     │
│  (pyannote)  │     │  (VAD)       │     │  par segment │
└──────────────┘     └──────────────┘     └──────┬───────┘
                                                  │
                    ┌─────────────────────────────┘
                    ▼
┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│  Extraction  │────▶│  Traduction  │────▶│  Adaptation  │
│  Voix        │     │  (M2M100/    │     │  Timing      │
│  (Optionnel) │     │  NLLB-200)   │     │  & Durée     │
└──────────────┘     └──────────────┘     └──────┬───────┘
                                                  │
                    ┌─────────────────────────────┘
                    ▼
┌──────────────────────────────────────────────────────────────┐
│              SYNTHÈSE VOCALE (Choix Utilisateur)              │
├──────────────┬──────────────┬──────────────┬─────────────────┤
│ Voix         │ Clonage      │ Voix         │ Voix            │
│ Standard     │ Voix         │ Premium      │ Personnalisée   │
│ (Qwen TTS)   │ (RVC/        │ (API)        │ (Fine-tuned)    │
│              │ OpenVoice)   │              │                 │
└──────────────┴──────────────┴──────────────┴────────┬────────┘
                                                       │
                    ┌──────────────────────────────────┘
                    ▼
┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│  Alignement  │────▶│  Lip Sync    │────▶│  Post-       │
│  Phonèmes    │     │  (Wav2Lip /  │     │  Processing  │
│  & Timing    │     │  VideoRetalk)│     │  (Amélioration)│
└──────────────┘     └──────────────┘     └──────┬───────┘
                                                  │
                    ┌─────────────────────────────┘
                    ▼
┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│  Mixage      │────▶│  Encodage    │────▶│  VIDÉO       │
│  Audio       │     │  Final       │     │  FINALE      │
│  (Bruitages) │     │  (H.264)     │     │              │
└──────────────┘     └──────────────┘     └──────────────┘

🎯 Fonctionnalités Utilisateur

Options Principales

class AutoTranslationOptions:
    """Options pour l'auto-traduction vidéo"""
    
    # Langues
    source_language: str = "auto"  # Détection automatique
    target_languages: List[str] = ["en", "es", "de"]  # Langues cibles
    
    # Voix
    voice_mode: str = "clone"  # "clone", "standard", "premium"
    preserve_emotion: bool = True  # Conserver l'émotion
    preserve_speaker_identity: bool = True  # Identité du locuteur
    
    # Synchronisation
    lip_sync_mode: str = "high_quality"  # "fast", "balanced", "high_quality"
    stretch_tolerance: float = 0.15  # Tolérance étirement audio (15%)
    add_pauses: bool = True  # Ajouter pauses si nécessaire
    
    # Qualité
    output_quality: str = "1080p"  # "720p", "1080p", "4k"
    enhance_face: bool = True  # Améliorer visage (GFPGAN)
    
    # Avancé
    speaker_diarization: bool = True  # Distinction locuteurs
    subtitle_overlay: bool = False  # Ajouter sous-titres
    keep_original_audio: bool = False  # Garder piste originale

Interface Utilisateur Proposée

┌─────────────────────────────────────────────────────────────────┐
│  🎬 Auto-Traduction Vidéo                                       │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  📁 Source: [video_source.mp4]          Durée: 02:34           │
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ 🎤 Détection: 2 locuteurs détectés                      │   │
│  │    • Locuteur 1 (M): 01:45 de dialogue                  │   │
│  │    • Locuteur 2 (F): 00:49 de dialogue                  │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  🌍 Langue source: [Auto-détecté: Français ▼]                  │
│                                                                 │
│  🌐 Langues cibles:                                            │
│     [✓] Anglais    [✓] Espagnol    [ ] Allemand               │
│     [ ] Italien    [ ] Portugais   [ ] Japonais               │
│                                                                 │
│  🎭 Mode Voix:                                                 │
│     ○ Voix standard (rapide)                                   │
│     ● Cloner voix originales (recommandé)                      │
│     ○ Voix premium (API externe)                               │
│                                                                 │
│  👄 Synchronisation lèvres:                                    │
│     ● Haute qualité (plus lent)                                │
│     ○ Équilibré                                                │
│     ○ Rapide                                                   │
│                                                                 │
│  ⚙️ Options avancées:                                          │
│     [✓] Améliorer qualité visage (GFPGAN)                      │
│     [✓] Préserver émotions                                     │
│     [ ] Ajouter sous-titres                                    │
│     [ ] Conserver piste audio originale                        │
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ 📊 Estimation:                                          │   │
│  │    • Durée traitement: ~12 min (RTX 4090)              │   │
│  │    • Espace disque: 1.2 Go                              │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  [  Annuler  ]                    [ 🚀 Démarrer la traduction ] │
└─────────────────────────────────────────────────────────────────┘

📝 Plan d'Implémentation Détaillé

Phase 1: Infrastructure de Base (2 semaines)

Semaine 1: Pipeline Audio

# Fichiers à créer:
backend/
├── auto_translation_api.py          # API principale
├── auto_translation_service.py      # Service orchestration
├── dialogue_extractor.py            # Extraction dialogues
├── speaker_diarization.py           # Identification locuteurs
└── translation_adapter.py           # Adaptateur multi-modèles

Tâches:

  • Créer auto_translation_api.py avec endpoints REST
  • Implémenter extraction audio avec FFmpeg
  • Intégrer Whisper avec timestamps
  • Ajouter détection locuteurs (pyannote.audio)
  • Créer segmentation automatique des dialogues

Semaine 2: Pipeline Traduction

# Fichiers à créer:
backend/
├── translation_service_v2.py        # Service traduction amélioré
├── timing_adapter.py                # Adaptation timing
└── context_preserver.py             # Préservation contexte

Tâches:

  • Intégrer M2M100 pour traduction multi-langue
  • Implémenter détection de langue automatique
  • Créer système d'adaptation timing
  • Ajouter préservation du contexte narratif

Phase 2: Synthèse Vocale (2 semaines)

Semaine 3: TTS Multi-Locuteur

# Fichiers à créer:
backend/
├── multi_speaker_tts.py             # TTS multi-locuteur
├── voice_cloning_service.py         # Service clonage voix
└── emotion_preserver.py             # Préservation émotions

Tâches:

  • Étendre Qwen TTS pour multi-locuteur
  • Intégrer OpenVoice pour clonage rapide
  • Implémenter transfert d'émotions
  • Créer système de correspondance voix

Semaine 4: Intégration TTS

Tâches:

  • Interface entre traduction et TTS
  • Synchronisation timing audio généré
  • Gestion des pauses et silences
  • Tests de qualité audio

Phase 3: Lip Sync Avancé (2 semaines)

Semaine 5: Amélioration Wav2Lip

# Fichiers à créer:
backend/
├── lip_sync_enhanced.py             # Lip sync amélioré
├── video_retsalking_adapter.py      # Intégration VideoRetalking
└── face_enhancement.py              # Amélioration visage

Tâches:

  • Évaluer VideoRetalking vs Wav2Lip
  • Intégrer le meilleur modèle
  • Ajouter amélioration visage (GFPGAN)
  • Optimiser performance GPU

Semaine 6: Synchronisation

Tâches:

  • Alignement phonème-lèvres
  • Gestion des différences de durée
  • Ajustement automatique du timing
  • Tests de qualité visuelle

Phase 4: Interface & Finalisation (2 semaines)

Semaine 7: UI/UX

// Fichiers à créer:
creative-studio-ui/src/components/
├── AutoTranslationModal.tsx         # Modal principale
├── TranslationProgress.tsx          # Barre progression
├── VoiceSelectionPanel.tsx          # Sélection voix
└── TranslationPreview.tsx           # Prévisualisation

Tâches:

  • Créer interface de sélection vidéo
  • Implémenter panneau de configuration
  • Ajouter preview temps réel
  • Intégrer dans le dashboard existant

Semaine 8: Tests & Documentation

Tâches:

  • Tests unitaires complets
  • Tests d'intégration
  • Documentation utilisateur
  • Guide de dépannage

🔧 Spécifications Techniques

Structure des Fichiers

backend/
├── auto_translation/                    # Module principal
│   ├── __init__.py
│   ├── api.py                           # Endpoints FastAPI
│   ├── service.py                       # Logique principale
│   ├── pipeline/                        # Pipeline stages
│   │   ├── __init__.py
│   │   ├── audio_extraction.py
│   │   ├── transcription.py
│   │   ├── translation.py
│   │   ├── synthesis.py
│   │   └── lip_sync.py
│   ├── models/                          # Modèles ML
│   │   ├── whisper_adapter.py
│   │   ├── m2m100_adapter.py
│   │   ├── qwen_tts_adapter.py
│   │   └── wav2lip_adapter.py
│   ├── voice/                           # Gestion voix
│   │   ├── cloning.py
│   │   ├── matching.py
│   │   └── emotion.py
│   └── utils/                           # Utilitaires
│       ├── timing.py
│       ├── audio.py
│       └── video.py
├── workflows/                           # Workflows ComfyUI
│   ├── auto_translation/
│   │   ├── full_pipeline.json
│   │   ├── voice_clone.json
│   │   └── lip_sync_enhanced.json
│   └── ...
└── tests/
    └── auto_translation/
        ├── test_pipeline.py
        ├── test_translation.py
        └── test_synthesis.py

API Endpoints

# backend/auto_translation/api.py

from fastapi import APIRouter, BackgroundTasks, UploadFile
from pydantic import BaseModel
from typing import List, Optional

router = APIRouter(prefix="/auto-translation", tags=["auto-translation"])

class TranslationJobRequest(BaseModel):
    video_path: str
    source_language: Optional[str] = "auto"
    target_languages: List[str]
    voice_mode: str = "clone"  # clone, standard, premium
    lip_sync_quality: str = "balanced"  # fast, balanced, high_quality
    preserve_emotion: bool = True
    enhance_face: bool = True
    output_format: str = "mp4"

class TranslationJobResponse(BaseModel):
    job_id: str
    status: str
    estimated_duration: float

class JobProgress(BaseModel):
    job_id: str
    stage: str
    progress: float
    current_language: Optional[str]
    message: str

@router.post("/submit", response_model=TranslationJobResponse)
async def submit_translation(
    request: TranslationJobRequest,
    background_tasks: BackgroundTasks
):
    """Soumettre une nouvelle tâche de traduction"""
    pass

@router.get("/status/{job_id}", response_model=JobProgress)
async def get_job_status(job_id: str):
    """Obtenir le statut d'une tâche"""
    pass

@router.get("/result/{job_id}")
async def get_result(job_id: str):
    """Télécharger le résultat"""
    pass

@router.post("/preview")
async def preview_translation(
    video_path: str,
    target_language: str,
    sample_duration: int = 10
):
    """Prévisualiser un échantillon"""
    pass

@router.get("/voices/{language}")
async def get_available_voices(language: str):
    """Lister les voix disponibles pour une langue"""
    pass

@router.post("/voices/clone")
async def clone_voice(
    audio_sample: UploadFile,
    speaker_name: str
):
    """Cloner une voix depuis un échantillon audio"""
    pass

Modèles de Données

# backend/auto_translation/models/schemas.py

from dataclasses import dataclass
from typing import List, Optional, Dict, Any
from datetime import datetime
from enum import Enum

class VoiceMode(Enum):
    STANDARD = "standard"
    CLONE = "clone"
    PREMIUM = "premium"

class LipSyncQuality(Enum):
    FAST = "fast"
    BALANCED = "balanced"
    HIGH_QUALITY = "high_quality"

@dataclass
class Speaker:
    id: str
    gender: str
    voice_embedding: Optional[List[float]]
    total_duration: float
    segments: List[Dict[str, Any]]

@dataclass
class DialogueSegment:
    speaker_id: str
    text: str
    translated_text: str
    start_time: float
    end_time: float
    duration: float
    translated_duration: float
    audio_path: Optional[str]
    translated_audio_path: Optional[str]

@dataclass
class TranslationJob:
    id: str
    video_path: str
    source_language: str
    target_languages: List[str]
    voice_mode: VoiceMode
    lip_sync_quality: LipSyncQuality
    speakers: List[Speaker]
    segments: List[DialogueSegment]
    status: str
    progress: float
    created_at: datetime
    updated_at: datetime
    output_paths: Dict[str, str]  # lang -> output_path

@dataclass
class TranslationResult:
    success: bool
    job_id: str
    output_videos: Dict[str, str]  # lang -> video_path
    subtitles: Dict[str, str]  # lang -> subtitle_path
    error_message: Optional[str] = None

📊 Benchmarks & Performance

Temps de Traitement Estimés (RTX 4090)

Durée Vidéo Traduction Simple + Clonage Voix + Lip Sync HQ
1 minute 30 sec 1 min 2 min
5 minutes 2 min 4 min 8 min
15 minutes 5 min 10 min 20 min
1 heure 15 min 35 min 1h 15min

Ressources GPU Requises

Qualité VRAM Min VRAM Recommandé
Fast 6 Go 8 Go
Balanced 8 Go 12 Go
HQ 12 Go 16+ Go

🧪 Tests & Validation

Tests Unitaires

# tests/auto_translation/test_pipeline.py

import pytest
from backend.auto_translation import AutoTranslationService

class TestAutoTranslationPipeline:
    
    @pytest.fixture
    def service(self):
        return AutoTranslationService()
    
    async def test_audio_extraction(self, service, sample_video):
        """Test extraction audio depuis vidéo"""
        audio = await service.extract_audio(sample_video)
        assert audio.duration > 0
        assert audio.sample_rate == 16000
    
    async def test_transcription(self, service, sample_audio):
        """Test transcription Whisper"""
        result = await service.transcribe(sample_audio)
        assert result.text != ""
        assert len(result.segments) > 0
    
    async def test_translation(self, service):
        """Test traduction M2M100"""
        text = "Bonjour, comment allez-vous?"
        result = await service.translate(text, "fr", "en")
        assert "hello" in result.lower() or "how" in result.lower()
    
    async def test_voice_cloning(self, service, sample_voice):
        """Test clonage voix"""
        voice_id = await service.clone_voice(sample_voice, "test_speaker")
        assert voice_id is not None
    
    async def test_lip_sync(self, service, sample_video, sample_audio):
        """Test lip sync"""
        result = await service.lip_sync(sample_video, sample_audio)
        assert result.success
        assert result.output_path.exists()
    
    async def test_full_pipeline(self, service, sample_video):
        """Test pipeline complet"""
        job = await service.submit(
            video_path=sample_video,
            target_languages=["en"],
            voice_mode="clone"
        )
        
        # Attendre completion
        result = await service.wait_for_completion(job.id, timeout=300)
        
        assert result.success
        assert "en" in result.output_videos

Tests de Qualité

# tests/auto_translation/test_quality.py

class TestTranslationQuality:
    """Tests de qualité de traduction"""
    
    async def test_emotion_preservation(self, service):
        """Vérifier préservation des émotions"""
        # Audio avec émotion marquée
        emotional_audio = "test_data/angry_speech.wav"
        result = await service.synthesize(
            text="I am very angry!",
            reference_audio=emotional_audio,
            preserve_emotion=True
        )
        
        # Analyser l'émotion du résultat
        emotion_score = await service.analyze_emotion(result.audio_path)
        assert emotion_score["angry"] > 0.7
    
    async def test_timing_preservation(self, service):
        """Vérifier préservation du timing"""
        original_duration = 5.0
        result = await service.translate_and_synthesize(
            text="This is a test",
            original_duration=original_duration,
            target_language="es"
        )
        
        # Tolérance de 15%
        assert abs(result.duration - original_duration) < original_duration * 0.15
    
    async def test_lip_sync_quality(self, service):
        """Évaluer qualité lip sync"""
        result = await service.lip_sync("test_data/speaker.mp4", "test_data/audio.wav")
        
        # Score de synchronisation
        sync_score = await service.evaluate_lip_sync(result.output_path)
        assert sync_score > 0.8  # 80% de précision minimum

🚀 Dépendances Requises

Python Packages

# requirements_auto_translation.txt

# Transcription
openai-whisper>=20231117

# Traduction
transformers>=4.35.0
sentencepiece>=0.1.99

# TTS
TTS>=0.17.0  # Coqui TTS

# Clonage voix
# openvoice  # À ajouter manuellement

# Diarisation
pyannote.audio>=3.1.0

# Lip Sync
# wav2lip  # Via ComfyUI
# video-retalking  # À ajouter

# Audio processing
librosa>=0.10.0
soundfile>=0.12.0
noisereduce>=2.0.0

# Vidéo
opencv-python>=4.8.0
moviepy>=1.0.3

# GPU
torch>=2.0.0
torchaudio>=2.0.0

# API
fastapi>=0.104.0
uvicorn>=0.24.0
python-multipart>=0.0.6

Modèles à Télécharger

# scripts/download_models.py

MODELS = {
    "whisper": {
        "base": "https://openaipublic.azureedge.net/whisper/models/...",
        "medium": "https://openaipublic.azureedge.net/whisper/models/...",
    },
    "m2m100": {
        "418M": "facebook/m2m100_418M",
        "1.2B": "facebook/m2m100_1.2B",
    },
    "wav2lip": {
        "basic": "https://github.com/Rudrabha/Wav2Lip/releases/...",
        "hq": "https://github.com/Rudrabha/Wav2Lip/releases/...",
    },
    "gfpgan": {
        "1.4": "https://github.com/TencentARC/GFPGAN/releases/...",
    },
}

📈 Roadmap Future

Version 1.0 (Actuel)

  • Analyse infrastructure existante
  • Pipeline de base traduction
  • Intégration TTS existant
  • Lip sync Wav2Lip basique

Version 1.5 (Court terme)

  • Intégration M2M100
  • Clonage voix OpenVoice
  • Interface utilisateur complète
  • Tests automatisés

Version 2.0 (Moyen terme)

  • VideoRetalking pour meilleure qualité
  • SeamlessM4T pour speech-to-speech
  • Support temps réel
  • API publique

Version 3.0 (Long terme)

  • Traduction en temps réel streaming
  • Multi-modal (gestes, expressions)
  • Fine-tuning par utilisateur
  • Déploiement cloud distribué

⚠️ Risques & Mitigations

Risque Probabilité Impact Mitigation
Performance GPU insuffisante Moyenne Élevé Mode qualité adaptatif, cloud fallback
Qualité traduction variable Moyenne Moyen Fallback API externe, validation humaine
Lip sync non naturel Élevée Élevé Post-processing, options manuelles
Clonage voix défaillant Moyenne Moyen Voix standard fallback
Temps traitement excessif Élevée Moyen Progression temps réel, pause/resume

📚 Références

Papers

  1. Wav2Lip: "Lip Syncing Audio in the Wild" (ACM MM 2020)
  2. VideoRetalking: "Audio-based Lip Synchronization" (SIGGRAPH Asia 2022)
  3. M2M100: "Beyond English-Centric Multilingual Machine Translation" (EMNLP 2020)
  4. SeamlessM4T: "Seamless Multilingual Understanding" (Meta AI 2023)
  5. Whisper: "Robust Speech Recognition via Large-Scale Weak Supervision" (OpenAI 2022)

Repositories

Documentation


👥 Équipe & Contact

Auteur: StoryCore Team
Date: Février 2026
Version: 1.0.0
Statut: R&D - En planification


Document généré automatiquement pour le projet StoryCore Engine