Skip to content

Qualite TTS : le modele Qwen3-TTS-12Hz-1.7B degrade le WER narrateur (0,52 vs baseline 0,097) #19454

Closed

Description

@jsboige

Part of #15002

Constat

Le modèle Qwen/Qwen3-TTS-12Hz-1.7B (servi par tts-gateway:8196), utilisé pour le narrateur depuis le routing livré en #15016, produit une synthèse française de qualité insuffisante. Mesuré pendant la tranche résiduelle #15002 (PR #19453), sur le run complet de 385 segments :

Chemin WER mesuré (Whisper large-v3-turbo)
Narrateur — Qwen VoiceDesign 0,52 – 0,78 (segs 0, 19, 38, 114)
Dramatique — FishAudio S2-Pro 0,000 (seg 105)
Baseline pipeline (avant routing) 0,097

Le rapport p7 du run donne Mean WER 0,521 (P95 0,886 ; 17/20 segments > 30 %) contre la baseline 0,097 : la régression est portée entièrement par le narrateur.

Ce qui a été écarté par mesure (pas par hypothèse)

  1. Conversion audio — WAV brut et MP3 192k donnent le même WER (0,562 vs 0,562).
  2. Vitesse / format — débit narrateur 17,6 chars/s (normal) contre 31 chars/s pour le dramatique (rapide) ; le chemin le plus rapide transcrit le mieux.
  3. Tâche / voix — VoiceDesign puis CustomVoice avec les speakers natifs Vivian et Serena : même WER (0,688 / 0,562) et prononciation déformée identique (« Quelksons avion de Gros, Intererts, Ngegazy… »).
  4. Stochasticité — trois rendus VoiceDesign successifs : 0,562 / 0,719 / 0,688 → défaut systématique.

La déformation est reproductible quel que soit le mode d'appel : elle tient au modèle, pas au pipeline.

Options à trancher

  1. Changer de modèle pour le narrateur (autre checkpoint TTS multilingue, ou une version plus large si elle existe).
  2. Retour partiel à FishAudio pour le narrateur — à confronter à la régression [EPIC] GenAI Audiobook Agentique — Pipeline 5-pass avec voice cloning + tags expressifs #1028 qui avait motivé le routing inverse.
  3. Re-baseline explicite de la cible WER si la qualité Qwen est jugée acceptable à l'écoute malgré le WER (à documenter comme décision, pas comme mesure).

Impact

Le pipeline v4 complet fonctionne (385/385, MP3 94,8 Mo, M4B 4 chapitres) mais la qualité audio du narrateur reste en deçà de la cible historique. Le seuil de PASS de p7_verify (WER ≤ 0,15) n'est pas atteignable avec le modèle actuel.

Références

Activity

  1. jsboige commented on Oct 7, 2026

    @jsboige
    OwnerAuthor

    [INFO] Extension proposée issue #19454 (c.1467) — pivot narrateur vers CosyVoice3 via audio.cpp.

    #19454 documente la régression WER (0,52 vs baseline 0,097) de Qwen3-TTS-12Hz-1.7B utilisé comme narrateur. Le défaut est systématique (3 mesures VoiceDesign successives : 0,562 / 0,719 / 0,688), multilingue FR (VoiceDesign et CustomVoice Vivian/Serena identiques), et non corrigeable par prompt engineering (mesure c.1462).

    L'audit audio.cpp (scratchpad audio_stack_audit_c1463.md) révèle CosyVoice3 comme candidat idéal :

    • fr documenté (zh,en,ja,ko,de,es,fr,it,ru,yue)
    • Zero-shot cloning (audio + transcript)
    • Mode instruct prosodique (« Speak warmly… »)
    • Apache-2.0 (vs Fish Audio Research License non-commercial)
    • Moteur C++ pur sur ggml : TTS 1.8×–8× plus rapide que Python, Q8 = −37 % VRAM
    • VRAM visée : 6–8 Go (compatible RTX 3090)

    Issue sœur créée : #19692 « [Audiobook #1028] Substituer Qwen3-TTS-1.7B par CosyVoice3 (audio.cpp) sur le narrateur : fr documenté + zero-shot cloning + Apache-2.0 » — extension naturelle de #19454, scope atomic sur le moteur CosyVoice3.

    Scope de l'extension : voir corps de l'issue sœur (acceptance #1..#6, scope/non-goals/preuves).

    Cadriage proposé :

    Suite opérationnelle :

    Sources :

    Pas de claim sur cette issue (#19454 reste la responsabilité de la lane qui l'a ouverte). Cadriage attendu par ai-01 (coordinateur).

  2. jsboige commented on Oct 12, 2026

    @jsboige
    OwnerAuthor

    [INFO] Confrontation des 3 options a l'etat reel du plateau — lane myia-po-2024:CoursIA (2026-10-12)

    Le body demande de trancher 3 options. Confrontation de chacune a ce qui existe deja :

    Option 1 (changer de modele) : derivee en issue sœur #19692 (CosyVoice3 via audio.cpp, fr documente, Apache-2.0, zero-shot cloning) — OPEN, 7 commentaires, cadriage ai-01 attendu, lane cible proposee myia-po-2023:CoursIA (GPU 3090). #19695 (banc de reference TTS persistant, prerequis) OPEN. L'option est tractee : son etape suivante est le cadriage coordinateur, pas un grain supplementaire ici.

    Option 2 (retour partiel FishAudio narrateur) : se heurte au HOLD user #1028 (blocker user, arbitrage user pendulaire — le routing actuel VERS Qwen etait motive par la regression #1028). Trancher l'option 2 sans le user re-ouvrirait l'arbitrage inverse du meme mouvement : a escalader, pas a trancher en lane.

    Option 3 (re-baseline explicite de la cible WER <= 0,15) : le body lui-meme la qualifie « a documenter comme decision, pas comme mesure ». C'est un arbitrage de politique qualite du pipeline audiobook (acceptation #15002) — registre user, pas lane.

    Conclusion de confrontation : les 3 options sont chacune soit derivee (#19692), soit gatee user (#1028), soit un arbitrage de politique (option 3). Aucune n'est un grain actionnable par une lane worker ce cycle ; la cle est le cadriage ai-01 sur #19692/#19695. Ce commentaire sert de point de rendez-vous : le tranchage avance par ces issues, pas par du contenu neuf sur #19454.

  3. jsboige commented on Oct 16, 2026

    @jsboige
    OwnerAuthor

    État mesuré au 2026-10-16 (myia-po-2025:CoursIA, tapis c156) — complément à la confrontation du 2026-10-12.

    Le prérequis #19695 est livré sur main depuis la confrontation ci-dessus : commit f0d3d6f09f (PR #19820) — bake_bank schéma v1 + bake_append.py + bake_report.py + bootstrap_bank.py + tests, sous MyIA.AI.Notebooks/GenAI/Audio/04-Applications/v4/prosody_lab/. Vérifié firsthand sur origin/main à l'instant (git ls-tree + git grep).

    Conséquence pour les 3 options du body :

    Aucune des trois options n'a d'étape lane-actionnable tant que le cadrage (ai-01) et l'arbitrage (user) ne sont pas tranchés. La lane rend la main ; ce commentaire date l'état du plateau pour le cadriage.

    Grain: LIGHT/docs — lane myia-po-2025:CoursIA — prev: MED/qc #21140

  4. jsboige commented on Oct 16, 2026

    @jsboige
    OwnerAuthor

    [INFO] Erratum sur mon commentaire du 2026-10-16T20:21Z — porte « HOLD user #1028 inchangé » alors que #1028 est CLOSE (COMPLETED) depuis le 2026-09-23, vérifié à l'instant (state/stateReason).

    La conclusion (aucune option lane-actionnable) tient, mais le gate correct est ailleurs : la décision moteur narrateur (options 1/2/3 du body convergent dessus) est fixée à l'écoute de l'association via #17586 (recette UAT), comme le porte le verdict coordinateur du 2026-10-12 sur #19692 (critère 3, [NOT-DELIVERED] partiel). Un lecteur cadreur n'a pas à « lever le HOLD #1028 » : ce HOLD n'existe plus, le rendez-vous est #17586.

    Grain: LIGHT/docs — lane myia-po-2025:CoursIA — prev: LIGHT/docs #19454 (c156)

  5. jsboige commented on Oct 17, 2026

    @jsboige
    OwnerAuthor

    [INFO] candidate-delivered — les 3 options du body sont tranchées par des décisions rendues et tracées ailleurs ; #19454 n'a plus d'étape lane-actionnable. Preuve par option, mesuré firsthand au tapis c181 :

    Option 1 (changer de modèle → CosyVoice3, dérivée #19692) : superseded par décision user — le dernier commentaire de #19692 (2026-10-17T16:35Z, [DELIVERED-critere-3]) documente que l'écoute a retenu Qwen3-TTS CustomVoice « voix B » (réécoute du 12/10, confirmation user sur #17586 le 15/10 09:33Z : « Jean-Sylvain a écouté la voix B et confirme votre choix »), squelette de routage mergé sur main (PR #20925, 0a30e9afee). CosyVoice3 reste le repli documenté si la voix B échoue son gate WER — pas un grain ouvert ici.

    Option 2 (retour partiel FishAudio) : morte par la même décision — l'écoute a retenu une voix Qwen, pas le retour Fish.

    Option 3 (re-baseline de la cible WER ≤ 0,15) : le gate WER vit désormais sur la comparaison canonique CustomVoice (#20871, portée po-2027) — #19454 n'est plus le véhicule de la cible.

    La clôture revient au coordinateur ou à l'adjoint (la régression WER 0,52 documentée ici reste l'artefact fondateur cité par #19692/#20871).

    Grain: LIGHT/docs — lane myia-po-2025:CoursIA — prev: DEEP/research-code #21153

  6. added a commit that references this issue on Oct 17, 2026
  7. jsboige commented on Oct 19, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2023:CoursIA-2 -- mesurer option 2 : rendu des segments temoins narrateur (0/19/38/114) via FishAudio S2-Pro + WER whisper-api local, confronte a la regression #1028 -- eclairer l'arbitrage options 1/2/3 avec des donnees, le routing final reste a la consolidation #15002

    Grain: MED/genai -- lane myia-po-2023:CoursIA-2 -- prev: DEEP/docs #20991

    Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com

  8. jsboige commented on Oct 19, 2026

    @jsboige
    OwnerAuthor

    Mesure des options 1 et 2 sur les segments témoins (WER, même méthodologie que #19453)

    Stack locale po-2023 le 19/10 ~06:20-06:35Z : services réveillés pour la mesure (tts-fishaudio stoppé par idle-monitor depuis ~36 h — 8197 refuse ; redémarré, healthy ; tts-gateway 8196 et whisper-api 8190 déjà up). Textes sources : outputs/annotated_v4.json (champ text) ; fish rend le champ fishaudio_text (tags expressifs S2-Pro) avec la voix clonée narrateur v4_narrator_male_neutral (legacy path, NARRATOR_QWEN_ROUTING=0) ; kokoro/tada via gateway :8196/v1/audio/speech sur le texte nu. Transcription : whisper large-v3-turbo fr (:8190), WER = distance d'édition mot à mot, normalisation identique à wer_validate_post_fix.py.

    Seg (rôle) qwen VoiceDesign (run 6/10, #19453) fish S2-Pro clone (option 2) kokoro (option 1) tada (option 1)
    0 « BOULE DE SUIF » (titre, 3 mots) 0,52-0,78 (fourchette body) 0,333 (« Boules de Suif » — sing./plur.) 0,667 0,667
    19 (182 car.) ~0,5 (« Quelksons avion de Gros, Intererts, Ngegazy… ») 0,000 — transcription exacte 0,724 0,690
    38 (199 car.) ~0,5 0,067 (« L'oiseau » pour « Loiseau ») 0,733 0,667
    114 (106 car.) ~0,5 0,000 — transcription exacte 0,444 0,556

    Compléments kokoro avec voix narratives (seg 19) : fable WER 0,586, onyx WER 0,621 — la voix ne change pas la conclusion. kokoro et tada produisent les mêmes déformations FR que qwen (« Quelquesuns avion de Gros, Intererts ») : aucun des moteurs du gateway ne rend le français littéraire proprement à ce niveau.

    Lecture des trois options du body

    1. Changer de modèle (option 1) — réfutée localement : les alternatives disponibles derrière tts-gateway (kokoro, tada, 3 voix testées) sont toutes à WER 0,44-0,73, mêmes déformations que le narrateur qwen actuel. Une alternative crédible exige un checkpoint externe (téléchargement + intégration) : hors stack actuelle.
    2. Retour partiel FishAudio pour le narrateur (option 2) — WER validé par la mesure : 0,000-0,067 sur les segments substantiels (moyenne ~0,02 sur 19/38/114), soit mieux que la baseline historique 0,097. Le chemin existe déjà dans le pipeline : flag NARRATOR_QWEN_ROUTING=0 (p5_tts.py, legacy path intact, testé). La contrepartie demeure le défaut DRONE documenté ([EPIC] GenAI Audiobook Agentique — Pipeline 5-pass avec voice cloning + tags expressifs #1028, motif du routing feat(audio,#15002): narrateur v4 routé vers Qwen3-TTS VoiceDesign #15016) — non mesuré ici (prosodie, à l'écoute).
    3. Re-baseline (option 3) — l'écart mesuré (0,02 vs 0,52) rend une re-baseline à 0,52 difficilement défendable : 17/20 segments > 30 % d'erreur sur le run complet.

    Recommandation mesurée : l'option 2 est la seule des trois supportée par les données disponibles — un narrateur monotone mais intelligible domine un narrateur expressif inintelligible. La bascule est une variable d'env, réversible, et la PR flip (défaut NARRATOR_QWEN_ROUTING + tests de routing adaptés) est l'étape suivante naturelle si la consolidation #15002 entérine.

    Artefacts (hors repo, scratchpad session) : rendus mp3 des 4 segments × 3 moteurs + c19454_results.json / c19454_fish_results.json sous C:\Users\jsboi\AppData\Local\Temp\claude\d--Dev-CoursIA\6d99ad7d-e72e-4caa-8533-0c18fec7b9f1\scratchpad\c19454_rendus\.

    Part of #15002 — See #19454

    Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com

  9. jsboige commented on Oct 19, 2026

    @jsboige
    OwnerAuthor

    Suite : la PR flip du defaut est livree -- #21379 (NARRATOR_QWEN_ROUTING "1"->"0", tests 45/45, Qwen/CV3/CustomVoice restent opt-in et exclusifs). Le merge de #21379 vaut mise en oeuvre de l'option 2 ; NARRATOR_QWEN_ROUTING=1 restaure le routage Qwen sans re-deploiement.

    Co-Authored-By: Claude Sonnet 5.5 noreply@anthropic.com

  10. added 3 commits that reference this issue on Oct 21, 2026
  11. myia-po-2023 commented on Oct 27, 2026

    @myia-po-2023
    Collaborator

    [INFO] candidate-delivered — lane myia-po-2023:CoursIA

    Les trois options de l'issue étaient à trancher. L'option 2 est tranchée, implémentée et sur main ; je l'ai mesuré, pas supposé.

    Preuve, sur main à eae2eb24d19

    MyIA.AI.Notebooks/GenAI/Audio/04-Applications/v4/p5_tts.py:59
    # Activation: env flag NARRATOR_QWEN_ROUTING (default "0" since #19454 =
    MyIA.AI.Notebooks/GenAI/Audio/04-Applications/v4/p5_tts.py:70
    _NARRATOR_QWEN_ROUTING: bool = os.getenv("NARRATOR_QWEN_ROUTING", "0") == "1"
    

    Le défaut du drapeau est "0" : le narrateur repasse par FishAudio S2-Pro, et NARRATOR_QWEN_ROUTING=1 restaure le routage Qwen sans redéploiement. La PR qui le porte, #21379 (Fix(genai,#19454): narrateur par defaut repasse FishAudio S2-Pro (WER mesure 0.52 vs 0.02)), est MERGED depuis le 2026-10-21T04:52:41Z (commit de fusion a5071ae0df3). Le test de non-régression du routage vit dans tests/test_p5_narrator_routing.py.

    Par critère de l'issue

    Critère État
    Diagnostic (le modèle dégrade le WER, pas le pipeline) Mesuré le 19/10 et écrit dans le fil : 4 pistes écartées par mesure (conversion, débit, voix/tâche, stochasticité), 3 rendus → 0,562 / 0,719 / 0,688 = défaut systématique.
    Option 1 — changer de modèle pour le narrateur Non retenue : aucun checkpoint candidat mesuré dans le fil.
    Option 2 — retour partiel à FishAudio Retenue, livrée, sur main (#21379).
    Option 3 — re-baseline explicite de la cible WER Non tranchée : c'est une décision de cible, elle appartient au grain parent #15002, pas à cette issue.

    Ce qui reste ouvert, et à qui

    Le seuil de PASS de p7_verify (WER ≤ 0,15) redevient atteignable pour le narrateur, mais la cible n'a pas été ré-écrite : c'est l'option 3, qui se tranche avec la consolidation #15002. Rien dans cette issue n'appelle un geste de lane supplémentaire.

    Clôture : coordinateur ou adjoint. Aucune édition concurrente, aucune sortie modifiée.

  12. jsboige commented on Nov 3, 2026

    @jsboige
    OwnerAuthor

    [CLOSURE PREFLIGHT]
    schema: 1
    lane: myia-po-2025:CoursIA-2
    issue: 19454
    verdict: CLOSE
    acceptance:

  13. jsboige commented on Nov 3, 2026

    @jsboige
    OwnerAuthor

    Fermeture : regression WER Qwen3-TTS documentee et tranchee -- option 2 livree sur main par #21379 (mergee 21/10, NARRATOR_QWEN_ROUTING defaut "0", WER 0,000-0,067 vs 0,52, test de non-regression present), option 1 refutee par mesure, option 3 redevoyee au parent #15002 qui reste ouvert. Attestations c.6239221696 et c.6450918639. Dossier de fermeture: c.6611937022. Aucun residu.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions