TTS Monospeaker

Lectura TTS Monospeaker

Moteur acoustique monospeaker — modèles High (Conformer) et Light (FastPitch) au choix (ONNX)

Présentation

Moteur de synthèse vocale neuronale pour le français, avec deux modèles au choix : High (Matcha-Conformer, meilleure qualité) et Light (FastPitch, plus rapide). Produit un signal audio naturel à 22050 Hz à partir de phonèmes IPA ou de texte.

Caractéristique Valeur
Qualité Voix féminine naturelle (corpus SIWIS)
Modèle High Matcha-Conformer (17.9M params), ~29 Mo INT8, ~30x temps-réel
Modèle Light FastPitch v6 (16M params), ~28 Mo INT8, ~50x temps-réel
Entrée Phonèmes IPA ou texte français (via pipeline lectura-tts-mono)
Sortie Audio 22050 Hz, float32
Style 7 presets : neutre, narratif, dialogue, expressif, méditatif, rapide, lent
Contrôles prosodiques Pitch, énergie, débit, pauses + vecteur style 5D
Qualité ODE n_ode_steps configurable (High uniquement, 4 = rapide, 8 = haute qualité)
Retimbre Changement de voix optionnel via OpenVoice (pipeline [retimbre])

Deux modes d’utilisation : API (zéro dépendance, zero config) ou local (ONNX Runtime, inférence offline).

Brique vs Pipeline : Ce moteur est la brique acoustique (phonèmes → audio). Pour le pipeline complet TTS (texte → audio avec G2P intégré et choix de moteur), voir la page TTS.


Essayer en ligne


Exemple de code

from lectura_monospeaker import creer_engine, synthetiser

# Engine High (Conformer, par défaut)
engine = creer_engine()
result = engine.synthesize(text="Bonjour, comment allez-vous ?")
print(f"Durée : {len(result.samples) / result.sample_rate:.2f}s")

# Engine Light (FastPitch, plus rapide)
engine_light = creer_engine(model="light")
result = engine_light.synthesize(text="Bonjour le monde.")

# Raccourci avec choix du modèle
audio = synthetiser("Bonjour.", model="light")

# Avec un style preset (High)
result = engine.synthesize(
    text="Il était une fois, dans un pays lointain...",
    style="narratif",
)

# À partir d'IPA avec contrôles prosodiques + style personnalisé
result = engine.synthesize_phonemes(
    "bɔ̃ʒuʁ kɔmɑ̃ ale vu",
    style_vector=[0.5, 0.0, 0.0, 0.0, 0.0],
    pitch_range=1.3,
    energy_scale=1.0,
    n_ode_steps=8,  # plus de pas ODE = meilleure qualité (High uniquement)
)

Architecture

Phonemes IPA + style
        ↓
  creer_engine(model=...)
        ↓
┌──────────────┐  ┌─────────────┐
│ model="high" │  │model="light"│
│  Conformer   │  │  FastPitch  │
│  Encoder     │  │  Encoder    │
│     +        │  │     +       │
│  CFM UNet    │  │ FFT Decoder │
│  (ODE, N pas)│  │             │
└──────┬───────┘  └──────┬──────┘
       ▼                 ▼
    mel spectrogram 80 bandes
              ↓
      HiFi-GAN Vocoder
   (mel → waveform 22050 Hz)
  • High : 3 modèles ONNX — encodeur Conformer (d_model=256, style 5D), UNet (flow-matching ODE), vocoder HiFi-GAN
  • Light : 3 modèles ONNX — encodeur FastPitch, décodeur FFT, vocoder HiFi-GAN

Installation

# Moteur brut (phonèmes → audio)
pip install lectura-monospeaker              # mode API (zero config, zéro dépendance)
pip install lectura-monospeaker[onnx]        # backend ONNX Runtime local

# Pipeline complet (texte → audio)
pip install lectura-tts-mono[onnx]           # G2P + moteur ONNX
pip install lectura-tts-mono[onnx,retimbre]  # + retimbre multi-voix (OpenVoice)
Extra Package Contenu
[onnx] lectura-monospeaker Backend ONNX Runtime local + numpy
[onnx] lectura-tts-mono Pipeline G2P + moteur ONNX
[retimbre] lectura-tts-mono Retimbre multi-voix via OpenVoice
[aligneur] lectura-tts-mono Syllabation pour le mode lecture syllabique (lectura-aligneur)

Par défaut, le module utilise l’API Lectura (aucune configuration nécessaire). Le backend local ONNX nécessite les modèles pré-entraînés, disponibles sous licence commerciale.

Retimbre (optionnel)

Avec lectura-vc-zeroshot installé (ou via pip install lectura-tts-mono[retimbre]), le paramètre voix= permet de changer le timbre de la voix synthétisée via OpenVoice zero-shot :

from lectura_monospeaker import synthetiser

# Voix preset
audio = synthetiser("Bonjour le monde.", voix="bernard")

# Blend de voix
audio = synthetiser("Bonjour.", voix={"siwis": 0.5, "nadine": 0.5})

# Variante grave/aigu (-1 à +1)
audio = synthetiser("Bonjour.", voix="ezwa", voix_variante=-0.5)

Presets disponibles : siwis, ezwa, nadine, bernard, gilles, zeckou.


Caractéristiques techniques

  • Deux modèles au choix : High (Conformer, qualité) et Light (FastPitch, vitesse)
  • Matcha-Conformer (High) : 17.9M paramètres, Conformer 6 couches (d_model=256), flow-matching OT-CFM, ~29 Mo INT8
  • FastPitch v6 (Light) : 16M paramètres, FFT decoder, ~28 Mo INT8
  • HiFi-GAN : vocoder universel partagé, signal 22050 Hz
  • 7 styles : neutre, narratif, dialogue, expressif, méditatif, rapide, lent (vecteur style 5D)
  • Qualité ODE : n_ode_steps configurable (High uniquement, 4 = rapide ~30x temps-réel, 8 = haute qualité)
  • 2 backends : API (zero config) ou ONNX Runtime local (modèles sous licence commerciale)
  • Contrôles prosodiques : pitch_shift, pitch_range, energy_scale, duration_scale, pause_scale
  • Retimbre optionnel : changement de voix via OpenVoice zero-shot (6 presets, blend pondéré, variante formants)
  • Factory creer_engine(model=...) : choix explicite du modèle (high par défaut)
  • Python 3.10+ avec type hints complets (PEP-561)
  • Licence : AGPL-3.0 (code) — les modèles pré-entraînés sont sous licence commerciale