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
InkFlow
Transforme un EPUB en livre audio, 100 % en local sur Mac (Apple Silicon / MLX), avec des modèles open-source. Sortie : 1 dossier par livre, 1 MP3 par chapitre (tags ID3 + cover), au format calqué sur un audiobook classique.
- Analyse de texte : Gemma via
mlx-lm(segmentation narration/dialogue, attribution des locuteurs, extraction du casting, prononciations). - Synthèse vocale : backend pluggable —
- Kokoro : rapide, voix préréglées → previews / mono-narrateur.
- Qwen3-TTS : qualité + clonage par audio de référence → rendu final, casting par personnage.
- Langue : optimisé français (puis multilingue).
Pré-requis
- macOS Apple Silicon (arm64), Python ≥ 3.11
ffmpegetespeak-ng:brew install ffmpeg espeak-ng
Installation
python3.13 -m venv .venv
source .venv/bin/activate
pip install -e backend # installe inkflow + dépendances
python backend/scripts/setup_models.py # vérifie l'env + télécharge les modèles MLX
Kokoro en français nécessite
espeak-ng; InkFlow localise automatiquementlibespeak-ng.dylib(sinon, exporterPHONEMIZER_ESPEAK_LIBRARY).
Utilisation (CLI)
# 1. Parser l'EPUB -> data/<slug>/book.json + chapters/chNN.json
inkflow parse "samples/Colère de Tiamat, La - James S.A. Corey.epub"
# 2. Analyser (Gemma) -> analysis/chNN.json + cast.json
inkflow analyze la-colere-de-tiamat --chapter 5 # un chapitre
inkflow analyze la-colere-de-tiamat # tous les chapitres
# 3. Synthétiser un chapitre -> output/<livre>/NN-....mp3
inkflow render la-colere-de-tiamat 5 --backend kokoro # rapide
inkflow render la-colere-de-tiamat 5 --backend qwen3 --no-mono # qualité + multi-voix (M3)
# Infos
inkflow info la-colere-de-tiamat
(Sans installation -e, lancer depuis backend/ via python -m inkflow.cli ….)
Interface web
# 1. Build du frontend (une fois)
cd frontend && npm install && npm run build && cd ..
# 2. Lancer l'app (API + UI servie sur le même port)
inkflow serve # http://127.0.0.1:8000
L'UI permet : import EPUB par glisser-déposer, suivi temps réel des étapes (WebSocket), édition du casting (personnage → voix, avec preview), édition du dictionnaire de prononciation, choix du moteur (Kokoro/Qwen3) et rendu des chapitres avec lecteur audio + téléchargement.
Pour le développement frontend avec rechargement à chaud :
inkflow serve # backend sur :8000
cd frontend && npm run dev # UI sur :5173 (proxy API/WS vers :8000)
Architecture
backend/inkflow/
epub/parser.py EPUB -> book.json + texte par chapitre
analysis/gemma.py wrapper mlx-lm (Gemma)
analysis/segmenter.py narration/dialogue + locuteurs + casting
analysis/pronunciation.py
tts/base.py interface TTSBackend + VoiceSpec
tts/kokoro.py tts/qwen3.py tts/factory.py
audio/postprocess.py concat + normalisation + MP3 (ffmpeg) + cover
pipeline/render.py (segments + voix) -> MP3
store/artifacts.py persistance JSON (reprenable)
data/<slug>/ artefacts intermédiaires (json, wav, cover)
output/<livre>/ MP3 finaux (1 par chapitre)
voicebank/ clips de référence pour le clonage (M3)
État d'avancement
- M1 — Parsing EPUB, analyse Gemma (segments + casting), CLI.
- M2 — TTS bout-en-bout (Kokoro/Qwen3), mono-narrateur → MP3 taggé + cover.
- M3 — Multi-voix : voice bank + auto-casting personnage → voix (clonage Qwen3).
- M4 — Interface web (FastAPI + WebSocket + React) : suivi, éditeurs casting/prononciation, previews.
- M5 — État reprenable (réconciliation avec les artefacts), run par lots via UI/CLI.
Note sur les moteurs
- Kokoro : ~30 s/chapitre, voix distinctes par timbre (rendu rapide, brouillons).
- Qwen3-TTS : clonage des voix de la banque par personnage, qualité supérieure, nettement plus lent — réservé au rendu final. Tout rendu est repris chapitre par chapitre (relancer ne refait pas les MP3 déjà produits).