指南

用免费离线声音构建 Streamlit 文字转语音应用

请注意:Supertonic 3 目前不支持中文,文中的 SuperClonica 声音可朗读其支持的 31 种语言。Streamlit 能把 Python 脚本变成网页应用,配合在同一进程中运行的语音引擎,就能得到无需外部语音服务、密钥或账单的语音应用。本指南用免费的 SuperClonica 引擎,以约 35 行代码构建:文本框、声音和语言选择、播放器以及 WAV 下载。

我们用 Streamlit 自带的 AppTest 框架测试过该应用。一切都在你的 Python 进程中运行,文字永远不会离开你的电脑或服务器。

安装

需要 Python 3.10 或更高版本。安装这两个包:

pip install streamlit superclonica-cpu

首次运行时引擎会下载约 400 MB 的 Supertonic 3 模型;之后在普通处理器上离线运行,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 仓库部署该应用:添加一个写有 superclonica-cpu 的 requirements.txt。公开应用中请把 max_chars 设得小一些,并且只提供可以共享的声音:标准声音可依据模型许可自由使用,而购买的目录声音仅供你自己的项目使用。如果不想运行模型,可以在同一个按钮里调用 SuperClonica 语音 API。