Voicebank : vraies voix françaises (CML-TTS) + pool anonyme + garde-fou Qwen3
Remplace la voicebank générée par Kokoro (timbre anglais sur français phonémisé -> accent que Qwen3 clonait) par 41 vraies voix FR issues de CML-TTS (livres audio studio) : 1 narrateur dédié, 18F/14M nommées, 4F/4M anonymes réservées. - scripts/import_voices.py : import multi-shards parquet, 1 clip/locuteur (le plus propre via levenshtein), genre estimé par F0 (YIN, anti-octave), filtre débit de parole (ref_text aligné sur l'audio). - VoiceEntry.anonymous + assign_voices : les figurants « anonyme (...) » tirent dans un pool réservé, jamais mélangé avec les voix nommées ; narrateur dédié (fr_narrator remplace fr_f_siwis). - dedup._anon_attrs : genre/âge déduits du nom anonyme (bon genre de voix). - tts/qwen3.py : garde-fou anti-dérive (rejette/réessaie les sorties en boucle ou coupées en estimant la durée plausible du chunk). Limite connue : Qwen3 ne sait pas synthétiser les fragments d'1-2 mots (incises, titres) -> trous ; à traiter (repli Kokoro ou fusion des incises). Inclut aussi du travail en cours antérieur (refacto backend LLM pluggable mlx/lmstudio, benchmark, ajustements frontend/API). Claude-Session: https://claude.ai/code/session_01XSVvcy1mfb4k1xDgib9vVU
This commit is contained in:
@@ -124,7 +124,7 @@ class Orchestrator:
|
||||
# --- etapes --------------------------------------------------------------
|
||||
def run_analyze(self, slug: str, chapter_indexes: Optional[list[int]] = None) -> None:
|
||||
def job() -> None:
|
||||
from ..analysis.gemma import Gemma
|
||||
from ..analysis.llm.client import LLM
|
||||
from ..analysis.segmenter import analyze_chapter
|
||||
from ..models import Cast
|
||||
from ..settings import get_settings
|
||||
@@ -137,7 +137,7 @@ class Orchestrator:
|
||||
state.active_stage = "analyze"
|
||||
self._save_and_emit(state)
|
||||
|
||||
gemma = Gemma()
|
||||
gemma = LLM()
|
||||
dedup_gemma = gemma if get_settings().dedup_use_gemma else None
|
||||
cast = artifacts.load_cast(slug)
|
||||
chars = list(cast.characters)
|
||||
@@ -196,7 +196,7 @@ class Orchestrator:
|
||||
tout en maintenant la coherence du livre (deduplication).
|
||||
"""
|
||||
def job() -> None:
|
||||
from ..analysis.gemma import Gemma
|
||||
from ..analysis.llm.client import LLM
|
||||
from ..analysis.segmenter import extract_characters
|
||||
from ..casting.dedup import reconcile_characters
|
||||
from ..models import Cast
|
||||
@@ -209,7 +209,7 @@ class Orchestrator:
|
||||
state.active_stage = "cast"
|
||||
self._save_and_emit(state)
|
||||
|
||||
gemma = Gemma()
|
||||
gemma = LLM()
|
||||
dedup_gemma = gemma if get_settings().dedup_use_gemma else None
|
||||
cast = artifacts.load_cast(slug)
|
||||
chars = list(cast.characters)
|
||||
@@ -239,7 +239,7 @@ class Orchestrator:
|
||||
def run_dedup_cast(self, slug: str) -> None:
|
||||
"""Replie les doublons d'un casting deja constitue (Holden/James Holden...)."""
|
||||
def job() -> None:
|
||||
from ..analysis.gemma import Gemma
|
||||
from ..analysis.llm.client import LLM
|
||||
from ..casting.dedup import dedup_cast
|
||||
from ..models import Cast
|
||||
from ..settings import get_settings
|
||||
@@ -250,7 +250,7 @@ class Orchestrator:
|
||||
self._save_and_emit(state)
|
||||
|
||||
cast = artifacts.load_cast(slug)
|
||||
gemma = Gemma() if get_settings().dedup_use_gemma else None
|
||||
gemma = LLM() if get_settings().dedup_use_gemma else None
|
||||
chars = dedup_cast(cast.characters, gemma)
|
||||
artifacts.save_cast(slug, Cast(
|
||||
narrator_voice_id=cast.narrator_voice_id, characters=chars))
|
||||
@@ -259,7 +259,7 @@ class Orchestrator:
|
||||
|
||||
def run_pronounce(self, slug: str) -> None:
|
||||
def job() -> None:
|
||||
from ..analysis.gemma import Gemma
|
||||
from ..analysis.llm.client import LLM
|
||||
from ..analysis.pronunciation import (
|
||||
merge_pronunciations,
|
||||
propose_pronunciations,
|
||||
@@ -271,7 +271,7 @@ class Orchestrator:
|
||||
state.active_stage = "pronounce"
|
||||
self._save_and_emit(state)
|
||||
|
||||
gemma = Gemma()
|
||||
gemma = LLM()
|
||||
pron = artifacts.load_pronunciation(slug)
|
||||
targets = book.render_chapters[:3] # echantillon de chapitres
|
||||
for i, ch in enumerate(targets):
|
||||
|
||||
Reference in New Issue
Block a user