GUIDE

Une appli Streamlit de synthèse vocale avec des voix gratuites hors ligne

Streamlit transforme un script Python en application web, et avec un moteur vocal dans le même processus vous obtenez une appli vocale sans service externe, ni clé, ni facture. Ce guide la construit en environ 35 lignes avec le moteur gratuit SuperClonica : une zone de texte, le choix de la voix et de la langue, un lecteur et un téléchargement WAV.

Nous avons testé l’appli avec le framework AppTest de Streamlit. Tout tourne dans votre processus Python, les textes ne quittent donc jamais votre ordinateur ou votre serveur.

Installation

Il faut Python 3.10 ou plus récent. Installez les deux paquets :

pip install streamlit superclonica-cpu

Au premier lancement, le moteur télécharge le modèle Supertonic 3, environ 400 Mo ; ensuite il fonctionne hors ligne sur un processeur ordinaire, et une carte graphique NVIDIA ne fait que l’accélérer.

L’appli

Enregistrez ceci sous app.py :

import io, threading, wave
import numpy as np
import streamlit as st
from superclonica import Superclonica

VOICES = ["F1", "F2", "F3", "F4", "F5", "M1", "M2", "M3", "M4", "M5"]
LANGUAGES = {"English": "en", "Español": "es", "Deutsch": "de", "Français": "fr", "Русский": "ru", "日本語": "ja"}

@st.cache_resource
def engine():
    return Superclonica(), threading.Lock()

def to_wav(audio, rate):
    pcm = (np.clip(np.asarray(audio, dtype=np.float32).reshape(-1), -1, 1) * 32767).astype(np.int16)
    buffer = io.BytesIO()
    with wave.open(buffer, "wb") as file:
        file.setnchannels(1)
        file.setsampwidth(2)
        file.setframerate(rate)
        file.writeframes(pcm.tobytes())
    return buffer.getvalue()

st.title("Text to speech")
text = st.text_area("Text", max_chars=2000)
voice = st.selectbox("Voice", VOICES)
language = st.selectbox("Language", list(LANGUAGES))

if st.button("Voice it", disabled=not text.strip()):
    tts, lock = engine()
    with st.spinner("Voicing..."), lock:
        audio, rate = tts.synthesize(text, voice=voice, lang=LANGUAGES[language])
    wav = to_wav(audio, rate)
    st.audio(wav, format="audio/wav")
    st.download_button("Download WAV", wav, file_name="speech.wav", mime="audio/wav")

Lancez-la et ouvrez l’adresse qu’elle affiche :

streamlit run app.py

st.cache_resource crée le moteur une seule fois pour tous les visiteurs au lieu de le faire à chaque exécution, et le verrou fait passer les requêtes de plusieurs personnes à tour de rôle. Le bouton reste désactivé tant qu’il n’y a pas de texte, et st.download_button remet au visiteur le même WAV.

Voix, langues et vitesse

La liste contient les dix voix de base, M1 à M5 et F1 à F5. Pour ajouter une voix du catalogue SuperClonica, mettez dans la liste le chemin de son fichier de voix ; écoutez-la d’abord sur sa page, où une phrase de 30 à 100 caractères est lue gratuitement. Ajoutez au dictionnaire les codes de n’importe laquelle des 31 langues prises en charge ; le chinois ne l’est pas encore. La vitesse se règle sur le moteur, par exemple tts.speed = 1.1, de 0.7 à 2.0.

La partager

Streamlit Community Cloud peut déployer l’appli depuis un dépôt GitHub : ajoutez un requirements.txt qui liste superclonica-cpu. Dans une appli publique, gardez max_chars bas et ne proposez que des voix que vous pouvez partager : les voix de base sont libres selon la licence du modèle, tandis que les voix du catalogue achetées sont pour vos propres projets. Si vous préférez ne pas faire tourner le modèle, appelez l’API vocale SuperClonica depuis le même bouton.