ガイド

無料のオフライン音声で動くStreamlitの読み上げアプリ

StreamlitはPythonスクリプトをWebアプリにしてくれます。同じプロセスで動く音声合成エンジンと組み合わせれば、外部の音声サービスもキーも料金もいらない読み上げアプリになります。このガイドでは無料のSuperClonicaエンジンで約35行のアプリをつくります。テキスト欄、声と言語の選択、プレーヤー、WAVのダウンロードがそろっています。

Streamlit自身のAppTestフレームワークで動作を確認済みです。すべてPythonのプロセス内で動くので、テキストがパソコンやサーバーの外に出ることはありません。

インストール

Python 3.10以降が必要です。2つのパッケージをインストールします:

pip install streamlit superclonica-cpu

初回起動時にSupertonic 3モデル(約400 MB)がダウンロードされます。その後は普通のCPUでオフラインで動き、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を訪問者に渡します。

声、言語、速さ

リストには標準の10音声(M1〜M5、F1〜F5)が入っています。SuperClonicaカタログの声を追加するには、その音声ファイルのパスをリストに入れます。先にその声のページで30〜100文字の文を無料で読み上げて試してください。辞書には対応する31言語のどのコードでも追加できますが、中国語にはまだ対応していません。速さはエンジンで設定でき、たとえばtts.speed = 1.1のように0.7〜2.0で指定します。

公開する

Streamlit Community CloudならGitHubのリポジトリからアプリを公開できます。superclonica-cpuと書いたrequirements.txtを追加してください。公開アプリではmax_charsを小さくし、共有してよい声だけを出しましょう。標準音声はモデルライセンスのもとで自由に使えますが、購入したカタログの声は自分のプロジェクト用です。モデルを動かしたくない場合は、同じボタンからSuperClonicaの音声APIを呼んでください。