Приложение озвучки текста на Streamlit с бесплатными офлайн-голосами
Streamlit превращает Python-скрипт в веб-приложение, а с движком озвучки в том же процессе получается голосовое приложение без сервиса речи, ключа и счёта. В этом руководстве такое приложение собирается примерно в 35 строк на бесплатном движке SuperClonica: поле текста, выбор голоса и языка, плеер и скачивание WAV.
Мы проверили приложение собственным фреймворком Streamlit AppTest. Всё работает внутри вашего процесса Python, поэтому тексты не покидают ваш компьютер или сервер.
Установка
Нужен Python 3.10 или новее. Установите оба пакета:
pip install streamlit superclonica-cpu
При первом запуске движок скачивает модель Supertonic 3, около 400 МБ; дальше он работает офлайн на обычном процессоре, а видеокарта NVIDIA только ускоряет его.
Приложение
Сохраните это как 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")Запустите и откройте адрес, который он напечатает:
streamlit run app.py
st.cache_resource создаёт движок один раз для всех посетителей, а не при каждом перезапуске скрипта, а блокировка заставляет запросы нескольких людей идти по очереди. Кнопка неактивна, пока нет текста, а st.download_button отдаёт посетителю тот же WAV.
Голоса, языки и скорость
В списке — десять встроенных голосов, M1–M5 и F1–F5. Чтобы добавить голос из каталога SuperClonica, впишите в список путь к его файлу голоса; сначала послушайте его на странице голоса, где фраза от 30 до 100 символов озвучивается бесплатно. Добавьте в словарь коды любых из 31 поддерживаемого языка; китайский пока не поддерживается. Скорость задаётся на движке, например tts.speed = 1.1, от 0.7 до 2.0.
Поделиться
Streamlit Community Cloud может развернуть приложение из репозитория GitHub: добавьте requirements.txt со строкой superclonica-cpu. В публичном приложении держите max_chars небольшим и предлагайте только голоса, которыми можно делиться: встроенные голоса свободны по лицензии модели, а купленные голоса каталога — для ваших собственных проектов. Если не хотите запускать модель вовсе, вызывайте из той же кнопки API озвучки SuperClonica.