Créer un système complet d'auto-traduction vidéo permettant de :
- Extraire les dialogues d'une vidéo existante ou créée
- Traduire automatiquement dans plusieurs langues cibles
- Resynchroniser les lèvres selon la nouvelle langue (lip-sync)
- Cloner les voix (optionnel) pour préserver l'identité vocale
- Ajuster le timing pour un rendu naturel
| 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 | |
| Transcription | backend/video_editor_ai_service.py |
Whisper, timestamps | ✅ Opérationnel |
| ComfyUI Executor | src/comfyui_workflow_executor.py |
Orchestration workflows | ✅ Opérationnel |
[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]
| 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é |
| Technologie | Avantages | Inconvénients | Recommandation |
|---|---|---|---|
| MarianMT (Helsinki-NLP) | Actuellement utilisé, offline | Modèles par paire de langues | |
| 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 |
| 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 |
| 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 |
| 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 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) │ │ │
└──────────────┘ └──────────────┘ └──────────────┘
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┌─────────────────────────────────────────────────────────────────┐
│ 🎬 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 ] │
└─────────────────────────────────────────────────────────────────┘
# 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èlesTâches:
- Créer
auto_translation_api.pyavec 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
# Fichiers à créer:
backend/
├── translation_service_v2.py # Service traduction amélioré
├── timing_adapter.py # Adaptation timing
└── context_preserver.py # Préservation contexteTâ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
# Fichiers à créer:
backend/
├── multi_speaker_tts.py # TTS multi-locuteur
├── voice_cloning_service.py # Service clonage voix
└── emotion_preserver.py # Préservation émotionsTâ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
Tâches:
- Interface entre traduction et TTS
- Synchronisation timing audio généré
- Gestion des pauses et silences
- Tests de qualité audio
# Fichiers à créer:
backend/
├── lip_sync_enhanced.py # Lip sync amélioré
├── video_retsalking_adapter.py # Intégration VideoRetalking
└── face_enhancement.py # Amélioration visageTâches:
- Évaluer VideoRetalking vs Wav2Lip
- Intégrer le meilleur modèle
- Ajouter amélioration visage (GFPGAN)
- Optimiser performance GPU
Tâches:
- Alignement phonème-lèvres
- Gestion des différences de durée
- Ajustement automatique du timing
- Tests de qualité visuelle
// Fichiers à créer:
creative-studio-ui/src/components/
├── AutoTranslationModal.tsx # Modal principale
├── TranslationProgress.tsx # Barre progression
├── VoiceSelectionPanel.tsx # Sélection voix
└── TranslationPreview.tsx # PrévisualisationTâ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
Tâches:
- Tests unitaires complets
- Tests d'intégration
- Documentation utilisateur
- Guide de dépannage
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
# 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# 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| 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 |
| Qualité | VRAM Min | VRAM Recommandé |
|---|---|---|
| Fast | 6 Go | 8 Go |
| Balanced | 8 Go | 12 Go |
| HQ | 12 Go | 16+ Go |
# 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/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# 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# 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/...",
},
}- Analyse infrastructure existante
- Pipeline de base traduction
- Intégration TTS existant
- Lip sync Wav2Lip basique
- Intégration M2M100
- Clonage voix OpenVoice
- Interface utilisateur complète
- Tests automatisés
- VideoRetalking pour meilleure qualité
- SeamlessM4T pour speech-to-speech
- Support temps réel
- API publique
- Traduction en temps réel streaming
- Multi-modal (gestes, expressions)
- Fine-tuning par utilisateur
- Déploiement cloud distribué
| 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 |
- Wav2Lip: "Lip Syncing Audio in the Wild" (ACM MM 2020)
- VideoRetalking: "Audio-based Lip Synchronization" (SIGGRAPH Asia 2022)
- M2M100: "Beyond English-Centric Multilingual Machine Translation" (EMNLP 2020)
- SeamlessM4T: "Seamless Multilingual Understanding" (Meta AI 2023)
- Whisper: "Robust Speech Recognition via Large-Scale Weak Supervision" (OpenAI 2022)
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