TTS Diphone
Lectura TTS Diphone
Synthese vocale par concatenation de diphones WORLD — prosodie reglee, retimbre multi-voix, 44.1 kHz
Presentation
Moteur de synthese vocale pour le francais base sur la concatenation de diphones dans le domaine WORLD (F0 + spectral envelope + aperiodicity). Produit un signal audio haute fidelite a 44100 Hz avec une prosodie reglee (intonation, pauses, expressivite).
| Caracteristique | Valeur |
|---|---|
| Qualite | Voix feminine claire (corpus SIWIS) |
| Sortie | Audio 44100 Hz, float32 |
| Taille modele | ~15 Mo (diphones compresses) |
| Entree | Texte francais ou phonemes IPA |
| Prosodie | Declaratif, interrogatif, exclamatif, suspensif |
| Controles | Vitesse, pauses, expressivite macro/micro, contraste spectral |
| Retimbre | OpenVoice zero-shot (optionnel) : presets, blend de voix, variantes homme/enfant |
Trois modes de lecture : FLUIDE (lecture naturelle), MOT_A_MOT et SYLLABES — adapte a l’apprentissage de la lecture.
Essayer en ligne
La demo utilise l’API Lectura — aucun telechargement necessaire.
Cliquez sur le bouton pour synthetiser.
Exemple de code
from lectura_tts_diphone import synthetiser
# Synthese simple (necessite lectura-g2p)
audio = synthetiser("Le soleil brille sur la ville.")
# Avec retimbre OpenVoice (necessite pip install 'lectura-tts-diphone[vc]')
audio = synthetiser("Bonjour comment allez-vous.",
voix="siwis")
# Blend de presets
audio = synthetiser("Bonjour comment allez-vous.",
voix={"siwis": 0.5, "nadine": 0.3, "ezwa": 0.2})
# Variante vocale (formants decales)
audio = synthetiser("Bonjour comment allez-vous.",
voix="siwis",
voix_variante=0.3) # +0.3 = legerement aigu
from lectura_tts_diphone import creer_engine
engine = creer_engine()
# Depuis des phonemes IPA avec controles
audio = engine.synthesize_groups(
[
{"phones": ["l", "ə", "s", "ɔ", "l", "ɛ", "j"], "boundary": "none"},
{"phones": ["b", "ʁ", "i", "j"], "boundary": "none"},
{"phones": ["s", "y", "ʁ", "l", "a", "v", "i", "l"], "boundary": "period"},
],
mode="FLUIDE",
duration_scale=1.2,
macro_expressivity=2.0,
micro_expressivity=5.0,
spectral_contrast=1.5,
)
Architecture
Texte --> [G2P] --> Phonemes IPA --> Diphone chain
|
WORLD params (F0 + SP + AP)
|
Stretch + Concat (overlap)
|
Prosodie (F0 contour + durees)
|
GV compensation (contraste spectral)
|
pw.synthesize --> Audio 44100 Hz
|
[Retimbre OpenVoice] (optionnel, si voix!=None)
|
Audio final 44100 Hz
Les diphones sont des parametres WORLD (F0 + spectral envelope + aperiodicity) extraits du corpus SIWIS et moyennes par type de transition phonetique. La prosodie est reglee par des contours F0 adaptes au francais (chute declarative, montee interrogative, pauses aux ponctuations).
Le retimbre (optionnel) passe l’audio synthetise dans OpenVoice pour remplacer le timbre “moyen” du diphone par un timbre coherent issu d’une voix de reference.
Installation
pip install lectura-tts-diphone # import seul
pip install "lectura-tts-diphone[local]" # inference locale (pyworld + numpy + scipy)
pip install "lectura-tts-diphone[vc]" # avec retimbre OpenVoice (lectura-vc-zeroshot)
pip install "lectura-tts-diphone[all]" # local + G2P + retimbre
Controles prosodiques
| Parametre | Defaut | Description |
|---|---|---|
| duration_scale | 1.0 | Vitesse globale (>1 = plus lent) |
| pause_scale | 1.0 | Duree des pauses intra-phrase (virgules, etc.) |
| sentence_pause_ms | 400 | Pause inter-phrase en ms (entre phrases separees par . ! ? …) |
| macro_expressivity | 2.0 | Gestes prosodiques aux ponctuations (0=neutre, 4=exagere) |
| micro_expressivity | 5.0 | Micro-variations (0=robot, 10=tres expressif) |
| spectral_contrast | 1.5 | Contraste spectral GV (1.0=off, 2.0=fort) |
| prosody_style | “regles” | Style prosodique : “regles” (LHiLH*, stable) ou “corpus” (extrait du corpus SIWIS, plus varie) |
| seed | None | Graine aleatoire pour micro-prosodie reproductible |
Retimbre (OpenVoice)
Le retimbre est un post-traitement optionnel qui remplace le timbre “moyen” du diphone par une voix coherente via OpenVoice zero-shot. Active par le parametre voix.
# Prerequis
pip install "lectura-tts-diphone[vc]"
Parametre voix
Le parametre voix est polymorphe et accepte plusieurs types :
| Type | Exemple | Description |
|---|---|---|
str (preset) |
voix="siwis" |
Utilise un preset pre-calcule |
str (fichier) |
voix="ref.wav" |
Extrait le timbre d’un fichier audio |
list[str] |
voix=["siwis", "nadine"] |
Moyenne de plusieurs presets (poids egaux) |
dict[str, float] |
voix={"siwis": 0.5, "nadine": 0.5} |
Blend pondere |
None |
voix=None |
Pas de retimbre (defaut) |
Presets disponibles : siwis, ezwa, nadine, bernard, gilles, zeckou.
Parametre voix_variante
Curseur de -1 a +1 qui decale les formants sans changer le pitch fondamental :
| Valeur | Effet |
|---|---|
| -1.0 | Formants baisses (voix grave/masculine) |
| 0.0 | Neutre (pas de decalage) |
| +1.0 | Formants montes (voix aigue/enfant) |
Exemples
from lectura_tts_diphone import synthetiser
# Voix neutre (preset siwis)
audio = synthetiser("Bonjour.", voix="siwis")
# Blend 50/50 siwis + nadine
audio = synthetiser("Bonjour.", voix={"siwis": 0.5, "nadine": 0.5})
# Variante masculine (meme preset, formants baisses)
audio = synthetiser("Bonjour.", voix="bernard", voix_variante=-0.5)
# Variante enfant (formants montes)
audio = synthetiser("Bonjour.", voix="siwis", voix_variante=0.8)
# Combinaison : blend + variante + pitch bas
audio = synthetiser("Bonjour.",
voix={"siwis": 0.5, "nadine": 0.5},
voix_variante=-0.3,
base_f0=120.0)
Caracteristiques techniques
- Vocoder WORLD : analyse/synthese haute qualite a 44100 Hz
- 1290 diphones moyennes depuis le corpus SIWIS (~9800 phrases)
- Prosodie francaise : declination, chute declarative non-lineaire, montee interrogative, allongement pre-frontiere
- GV compensation : restaure le contraste spectral perdu par le moyennage
- 3 modes : FLUIDE, MOT_A_MOT, SYLLABES
- Retimbre OpenVoice (optionnel) : presets, blend pondere, variantes formantiques
- Python 3.10+ avec type hints complets (PEP-561)
- Licence : AGPL-3.0 (code) — les modeles sont sous licence commerciale