Repository navigation
Feat(audio,#19739): garde d'attaque CV3 en ligne dans la boucle p5 -- re-roll cible sur perte de tete - #23476
Conversation
… re-roll cible sur perte de tete Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
[INFO] rouge base-inherited sur la jambe La jambe de tests est rouge sur cette PR (
Le registre Le diff de cette PR porte Demande au coordinateur : fusionner #23481 (ou rejouer cette jambe après son merge) — tant qu'il est pas fusionné, la jambe de tests rougit sur toute PR du dépôt, y compris celle-ci. Le |
Path-collision (organ #13359/#13615)Cette PR #23476 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine. Le label Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans Seuil, historique et exceptions : cf. |
…ur Qwen (#23486) Les deux chemins narrateur Qwen du pipeline v4 (VoiceDesign, CustomVoice) concatenent des chunks de phrase comme le chemin CV3, et n'etaient pas gardes : un chunk qui commence au milieu du texte perd son attaque, et aucune mesure de duree ne le voit -- seule l'ASR le voit. La garde d'attaque existante (v4.attack_guard, #21459) est branchee par chunk et en ligne, sur le meme contrat d'echec dur que le chemin CV3 (#23476) : un chunk dont l'attaque n'a pas ete obtenue n'est jamais livre, la passe est refusee. Le levier est le re-rendu -- le gateway ne prend pas de graine et echantillonne a temperature 0.9. La garde est fermee par defaut au niveau du client (un banc de mesure n'a pas d'ASR a cote de lui) ; c'est le pipeline qui l'active, et V4_ATTACK_GUARD=off reste le bras A/B. 212 tests v4 verts, dont 5 nouveaux. Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
…t p5_tts.py est resolu par supersession main porte deux deliveries de la garde d'attaque (#22569 sur le chemin CV3, #23486 sur les chemins narrateur Qwen) ; cette branche en porte une implementation plus forte du meme comportement. Le conflit de contenu sur `v4/p5_tts.py` est resolu en gardant la version de cette branche, qui : - lit la convention `V4_ATTACK_GUARD` (`off` l'emporte) -- la meme que celle que #23486 vient de standardiser dans `qwen_tts_client.py`, donc un seul interrupteur governе le pipeline v4 ; - resout l'ASR par segment (`_resolve_attack_asr`) au lieu d'un client fige a l'import, ce qui rend le cablage testable hors reseau ; - delegue le verdict a `attack_guard.evaluate_chunk` (l'organe canonique) au lieu d'un `detect_missing_attack` re-invoque ; - porte 9 tests hermetiques du cablage (`test_p5_cv3_attack_guard.py`). Les deux helpers de main (`_cv3_chunk_asr`, `_cv3_chunk_attack_dropped`) sont supprimes : ils ne servaient plus qu'ici et n'etaient references par aucun autre module. Les 3 tests de main qui les monkeypatchaient sont adapteres a la convention `V4_ATTACK_GUARD`. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
Conflit de merge résolu — la PR repasse de
Résolution : version de cette branche conservée, pour trois raisons mesurées (détail dans le body) — (1) elle lit la convention Les deux helpers de Mesures : Le commit de résolution est |
Grain: DEEP/genai — lane myia-po-2024:CoursIA-2 — prev: MED/lean #23467
Ce que fait cette PR
Elle branche la garde d'attaque par chunk (
v4.attack_guard, organe livré par #21459) en ligne dans la boucle de rendu CosyVoice3 de p5 (_synthesize_narrator_cosyvoice3) : un chunk qui passe le plancher de durée n'est accepté que si l'ASR entend ses premiers mots ; sinon, re-roll ciblé à la graine espacée — la même formule que le re-roll dégénéré (seed + i + attempt * 104_729, exactementattack_guard.spaced_seed).C'est l'étape que le fil de #19739 nommait comme restante : l'organe savait dépister l'onset-drop et planifier le re-roll ; il manquait le branchement en boucle. La phase 1 (#19699) avait prouvé que la durée ne peut jamais détecter une attaque loupée (les bandes chars/s se recouvrent intégralement entre rendus propres et omettants) — seul l'ASR le peut.
Conception (les décisions qui engagent)
V4_ATTACK_GUARD=off= bras A/B)offsert à la comparaison avant/après mesurée — ce n'est pas un mode de production : un run sans garde livre l'onset-drop que l'issue existe pour fermer.attack_guard.asr_http(endpoint p7,localhost:8190,large-v3-turbo;V4_ASR_BASE_URLpour la portabilité)_CV3_RENDER_ATTEMPTS(5)reason, mots perdus)-v3→-v4Mesures
pytest tests/, worktree frais surorigin/main)test_p5_cv3_attack_guard.pyoff→ 0 appel ASR · ASR seulement après plancher · indépendance par chunk (la graine porte l'index DU chunk) · défaut ON + valeurs off reconnues (les fautes de frappe fail-safe ON) · sentinel v4 · le résolveur réutilise bien l'organe et honoreV4_ASR_BASE_URL_install_fake_runtimestubbe un verdict propre (la logique de verdict a ses propres suites) — la boucle de re-roll reste la seule sous testVerdict SOTA — la jambe corpus est RECOVERABLE-MACHINE
La preuve hermétique ci-dessus est livrée ; la mesure corpus réelle (rendre + transcrire le corpus avec la garde en ligne, critères pré-enregistrés) exige l'env moteur. Mesuré sur ce poste :
_runtime/CosyVoiceabsent,pretrained_models/Fun-CosyVoice3-0.5Babsent, cache HF sansFun-CosyVoice3-0.5B-2512niwhisper-large-v3-turbo(seulwhisper-tinyy est), tous les conteneurs GenAI DOWN — le bancrender_corpus_attack_guard.pya explicitement un env render séparé (« GPU 2 » chez la machine qui porte les services). Router vers cette machine + re-exécuter :V4_ATTACK_GUARD=off— run p5 borné sur les segments sondes (graines 4243-4245 de feat(genai,#19692): phase 1 -- routage narrateur independant du moteur + CosyVoice3 decoupe (drapeau, defaut inchange) + controle d'omission p7 #19699, onset-drop connu) ;6516437492sur feat(audio,#19692): phase 2 -- garde d'attaque ASR par chunk (onset-drop CV3 mesure, porte #17586 non conforme) #19739, écrit AVANT toute mesure) : attaques manquantes par chunk avant → après (attendu > 0 → 0) et chunk sain inchangé au tentatif 0. Pas de verdict de stratégie.Résolution du conflit avec
main(tête8103de36fd)maina livré deux fois la garde d'attaque depuis l'ouverture de cettebranche :
b63fbd7ba9_synthesize_narrator_cosyvoice3) — off par défaut (NARRATOR_CV3_ATTACK_GUARD), helpers_cv3_chunk_asr/_cv3_chunk_attack_droppedb20529e074V4_ATTACK_GUARD(offl'emporte),os.getenv(ATTACK_GUARD_ENV, "on")Le conflit de contenu portait sur
v4/p5_tts.py: deux implémentationsconcurrentes du même comportement dans la même fonction. Il est résolu en
gardant la version de cette branche, pour trois raisons mesurées :
V4_ATTACK_GUARDsurles chemins Qwen. Cette branche lit la même variable sur le chemin CV3
(même constante
V4_ASR_BASE_URL, même endpointlocalhost:8190) : unseul interrupteur gouverne le pipeline v4, au lieu de deux variables
concurrentes (
NARRATOR_CV3_ATTACK_GUARDd'un côté,V4_ATTACK_GUARDdel'autre).
_cv3_attack_verdictappelleattack_guard.evaluate_chunk(l'organe canonique, qui rend le verdictenrichi :
reason,n_missing_leading,chunk_index) ; la version deFeat(genai,#19739): garde d'attaque par chunk en ligne dans la boucle de rendu CV3 #22569 rappelait
detect_missing_attackdirectement et perdait le comptedes mots perdus.
_resolve_attack_asr,callable injectable) au lieu d'un client figé à l'import : le câblage se
teste hors réseau et hors GPU.
Les deux helpers de
main(_cv3_chunk_asr,_cv3_chunk_attack_dropped)sont supprimés dans cette tête : ils ne servaient plus qu'à la boucle CV3
(vérifié par grep sur l'arbre entier) et n'étaient référencés par aucun autre
module. Les 3 tests de #22569 qui les monkeypatchaient sont adaptés — ils
pilotent désormais la garde via
_resolve_attack_asr+V4_ATTACK_GUARD, etle stub de verdict propre de
_install_fake_runtimeest devenu undéfaut désactivable (
guard_stub=False) : sans cela le stub répondait àla place du test et l'onset-drop n'était jamais observé (échec réel mesuré :
assert 1 == 2surout.attempts).Mesure après résolution :
pytest v4/tests/ -k "p5 or attack_guard or p7_omission or qwen_chunk"→ 118 passed, 0 échec (34 tests CV3 : 25 narrateur + 9 garde). Aucune
cellule de notebook touchée : H.3 reste trivial (0 cellule sans
execution_countsur les deux carnets de la série fusionnés).Chevauchement mesuré :
git merge-tree --write-treeentre la tête de#23492 et la tête de cette PR rend rc=0, arbre propre — les deux PRs
touchent
p5_tts.pymais sur des fonctions disjointes(
_synthesize_fishaudio_pathd'un côté,_synthesize_narrator_cosyvoice3del'autre). Plus aucune PR ouverte ne touche
p5_tts.py.Portée
v4/p5_tts.py(+ le stub dans la suite existante, + la nouvelle suite).attack_guard.pylui-même est inchangé — c'est le branchement de l'organe, pas sa révision.Reprise du claim STALE de
myia-po-2023:CoursIA-2(posé 25/10, ~115 h sans activité ;check_lane_claim.py: reprise autorisée) — claim de remplacement posté :6516437492.See #19739 — l'issue n'est pas close par cette PR : il lui reste la jambe corpus mesurée. Part of #19692.
🤖 Generated with Claude Code