Um app de texto para fala no Streamlit com vozes grátis offline
O Streamlit transforma um script Python num app web, e com um motor de voz no mesmo processo você tem um app de voz sem serviço externo, chave ou conta. Este guia monta um em cerca de 35 linhas com o motor gratuito da SuperClonica: uma caixa de texto, escolha de voz e idioma, um player e download em WAV.
Testamos o app com o próprio framework AppTest do Streamlit. Tudo roda dentro do seu processo Python, então os textos nunca saem do seu computador ou servidor.
Instalação
Você precisa do Python 3.10 ou mais novo. Instale os dois pacotes:
pip install streamlit superclonica-cpu
Na primeira execução o motor baixa o modelo Supertonic 3, cerca de 400 MB; depois funciona offline num processador comum, e uma placa de vídeo NVIDIA só o deixa mais rápido.
O app
Salve isto 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")Inicie e abra o endereço que ele mostrar:
streamlit run app.py
st.cache_resource cria o motor uma vez para todos os visitantes em vez de a cada execução, e o lock faz os pedidos de várias pessoas esperarem a vez. O botão fica desativado até haver texto, e st.download_button entrega ao visitante o mesmo WAV.
Vozes, idiomas e velocidade
A lista traz as dez vozes padrão, M1 a M5 e F1 a F5. Para adicionar uma voz do catálogo da SuperClonica, coloque na lista o caminho do arquivo de voz; ouça antes na página dela, onde uma frase de 30 a 100 caracteres é gerada grátis. Adicione ao dicionário códigos de qualquer um dos 31 idiomas suportados; chinês ainda não é suportado. A velocidade é ajustada no motor, por exemplo tts.speed = 1.1, de 0.7 a 2.0.
Compartilhe
O Streamlit Community Cloud pode publicar o app a partir de um repositório do GitHub: adicione um requirements.txt com superclonica-cpu. Num app público mantenha max_chars baixo e ofereça só vozes que você pode compartilhar: as vozes padrão são livres pela licença do modelo, e as vozes do catálogo compradas são para os seus próprios projetos. Se preferir não rodar o modelo, chame a API de voz da SuperClonica no mesmo botão.