Una app de texto a voz en Streamlit con voces gratis sin conexión
Streamlit convierte un script de Python en una app web, y con un motor de voz en el mismo proceso tienes una app de voz sin servicio externo, clave ni factura. Esta guía la crea en unas 35 líneas con el motor gratuito de SuperClonica: un cuadro de texto, elección de voz e idioma, un reproductor y una descarga en WAV.
Probamos la app con el propio framework AppTest de Streamlit. Todo funciona dentro de tu proceso de Python, así que los textos nunca salen de tu ordenador o servidor.
Instalación
Necesitas Python 3.10 o posterior. Instala ambos paquetes:
pip install streamlit superclonica-cpu
En el primer arranque el motor descarga el modelo Supertonic 3, unos 400 MB; después funciona sin conexión en un procesador normal, y una tarjeta gráfica NVIDIA solo lo acelera.
La app
Guarda esto como 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")Arráncala y abre la dirección que muestra:
streamlit run app.py
st.cache_resource crea el motor una sola vez para todos los visitantes en lugar de en cada ejecución, y el bloqueo hace que las peticiones de varias personas vayan por turnos. El botón está desactivado hasta que hay texto, y st.download_button entrega al visitante el mismo WAV.
Voces, idiomas y velocidad
La lista contiene las diez voces de serie, de M1 a M5 y de F1 a F5. Para añadir una voz del catálogo de SuperClonica, pon en la lista la ruta de su archivo de voz; escúchala antes en su página, donde una frase de 30 a 100 caracteres se genera gratis. Añade al diccionario los códigos de cualquiera de los 31 idiomas compatibles; el chino aún no está disponible. La velocidad se ajusta en el motor, por ejemplo tts.speed = 1.1, de 0.7 a 2.0.
Compártela
Streamlit Community Cloud puede desplegar la app desde un repositorio de GitHub: añade un requirements.txt con superclonica-cpu. En una app pública mantén max_chars bajo y ofrece solo voces que puedas compartir: las voces de serie son libres según la licencia del modelo, y las voces del catálogo que compraste son para tus propios proyectos. Si prefieres no ejecutar el modelo, llama desde el mismo botón a la API de voz de SuperClonica.