- qwen-tts : GPU NVIDIA détecté automatiquement (bfloat16), image CUDA 12.8
(RTX 50xx comprises) via TORCH_VARIANT=cu128, docker-compose.gpu.yml
dédié (clé obligatoire, choix de la carte) et guide d'installation Unraid.
- Paramètres → « Qwen TTS (voix locale) » : adresse + clé du service, test
de connexion (modèle et carte graphique affichés), stockés en base
(app_config.qwen_tts_url / qwen_tts_api_key) et transmis à ffmpeg-api à
chaque voix ; QWEN_TTS_URL reste un défaut.
- Le service qwen-tts CPU du docker-compose principal devient optionnel
(profil qwen-local).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Upu97wMmsRkBoj6iVM4rH6
SRT : la voix n'est plus jamais accélérée (atempo sans plafond, jusqu'à 2×
et plus, rendait la voix incompréhensible). Un morceau plus long que son
sous-titre déborde et décale les suivants ; les sous-titres suivent la voix,
la vidéo s'allonge et un avertissement signale le décalage.
Rythme : style par défaut « neutre », consignes Gemini sans « rythme
entraînant », débit Edge des styles dynamique/promo ramené à +0 %/+3 %.
Nouveau moteur « qwen » : service qwen-tts (Qwen3-TTS sur CPU, gratuit,
français, ton piloté par consigne, clonage de voix depuis qwen-tts/voices).
Même vérification Whisper que Gemini, généralisée ; repli qwen → gemini →
edge, et une lecture sous 85 % du texte est écartée (mots sautés/faux).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Upu97wMmsRkBoj6iVM4rH6
- Contrôle de lecture : les nombres et l'unité qui les suit ne sont plus
comparés lettre à lettre. Whisper écrit « 11 € 99 » ou « 40 cm » là où le
texte dit « 11,99 € » ou « 40 centimètres » : une lecture correcte passait
pour des mots sautés (88–91 %) et relançait jusqu'à 3 générations.
- Découpe de la lecture SRT : la coupe entre deux sous-titres se fait dans
la pause mesurée la plus proche de la borne estimée (fins de phrases
préférées aux virgules), et non plus à la borne Whisper elle-même, fausse
quand un prix non reconnu termine la phrase : la coupe tombait alors au
milieu d'une phrase.
- Whisper reçoit 0,5 s de silence avant la voix : il laissait passer le
premier mot (« Alerte ») d'une voix qui démarre aussitôt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3ywVwJUjjUXuvM6PwSzSi
Fins de phrases coupées :
- Le fondu final ne commence plus avant la fin de la voix (il rognait la
dernière phrase quand la vidéo finissait peu après) ; il se raccourcit au
besoin. Même règle côté Python, aperçu et rendu Remotion
- SRT : découpe au milieu de la zone la plus calme de chaque pause, mesurée
sur l'enveloppe sonore (tranches de 10 ms), avec un seuil relatif au
niveau de la voix qui respecte les fins douces ; 300 ms gardées après le
dernier son
Bruits parasites :
- Normalisation de la voix en deux passes, en mode linéaire : le mode
dynamique relevait souffles et bruits entre les phrases (mesuré : -64 dB
avant, -75 dB après dans les pauses)
- Réduction de bruit douce (afftdn), compresseur sans gain ajouté, fondus
de 5 ms aux extrémités ; mix final moins « pompant » (LRA 20)
- Voix Gemini vérifiée : les bruits ajoutés avant le premier ou après le
dernier mot sont retirés
Vérification de lecture comparée lettre à lettre : les petites erreurs de
Whisper ne déclenchent plus de régénérations inutiles.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Ze4bs7tpF1KGWUk6ZZSZ4
Intonation :
- Gemini reçoit une température basse et une graine fixe (réglables) : la
lecture ne change plus de ton d'une génération à l'autre
- SRT : tout le texte est lu d'une seule traite puis découpé phrase par
phrase, au lieu d'une génération (et d'une intonation) par sous-titre ;
un seul traitement de niveau, plus de sauts de volume entre les phrases
Mots coupés :
- La voix est découpée dans ses vrais silences (silencedetect), plus aux
bornes des mots estimées par Whisper qui rognaient les syllabes ; fondus
de 10 ms aux coupes
- Whisper n'est plus amorcé avec le texte attendu : il hallucinait des
répétitions qui masquaient les fins tronquées
Fiabilité :
- Chaque voix Gemini est réécoutée : mots sautés, fin tronquée ou consigne
lue à voix haute déclenchent une nouvelle génération (3 au plus), puis
repli sur Edge avec avertissement
- Consigne de lecture intégrale ajoutée au prompt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Ze4bs7tpF1KGWUk6ZZSZ4
- Nouveau Reel (bureau et mobile) : bouton « Importer un fichier SRT ».
Tant qu'un SRT est chargé, le texte libre et l'assistant IA sont
désactivés ; le choix de la voix (moteur, voix, ton) reste disponible.
- Service Python : chaque sous-titre est lu séparément, ses silences
retirés, puis posé à son instant de début. Une lecture trop longue est
accélérée (atempo, sans changer la hauteur) pour tenir dans la durée du
sous-titre, avec un avertissement au-delà de ×1,35. Après un repli sur
Edge, tous les sous-titres gardent la même voix.
- Sans voix, les mots de chaque sous-titre s'affichent sur son intervalle.
- Aperçu : sous-titres calés sur le minutage du fichier.
- Tests : lecture SRT (TS), fenêtres, accélération et mixage (Python).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WVqEw4Xycgf8BtwmSftE2M