feat(pinokio): clean one-click launcher for multi-tts-server
- install: clone app source, create venv, install deps + torch + models - start: daemon uvicorn on 127.0.0.1 with auto-captured URL - reset: remove venv/cache/models but keep source - update: pull both launcher and app, then re-install - sanitized: no local env details, no TODO/DONE - icon.png included
This commit is contained in:
+10
@@ -0,0 +1,10 @@
|
|||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
app/venv/
|
||||||
|
app/cache/
|
||||||
|
app/models/
|
||||||
|
app/__pycache__/
|
||||||
|
app/*.pyc
|
||||||
|
app/.env
|
||||||
|
logs/
|
||||||
|
pinokio/logs/
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# Multi-TTS-Server Pinokio Launcher
|
||||||
|
|
||||||
|
One-click Pinokio launcher for [hermes/multi-tts-server](https://gitea.amakusa.ru/hermes/multi-tts-server).
|
||||||
|
|
||||||
|
## What it installs
|
||||||
|
|
||||||
|
This launcher downloads the TTS server source code, creates a Python virtual environment, installs dependencies, installs the correct PyTorch build for your GPU, and downloads the required voice models.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Windows, macOS, or Linux
|
||||||
|
- NVIDIA GPU with CUDA 12.8, AMD GPU with DirectML (Windows only), or CPU
|
||||||
|
- At least 16 GB of system RAM
|
||||||
|
- ~8 GB of free disk space (venv + models)
|
||||||
|
|
||||||
|
## Included engines
|
||||||
|
|
||||||
|
- **F5-TTS** — Russian model `Misha24-10/F5-TTS_RUSSIAN` (~1.3 GB)
|
||||||
|
- **XTTS-v2** — Russian model `NeuroDonu/RU-XTTS-DonuModel` (~5.3 GB)
|
||||||
|
- **CPU fallback** for machines without a compatible GPU
|
||||||
|
|
||||||
|
## One-click usage
|
||||||
|
|
||||||
|
1. Open Pinokio.
|
||||||
|
2. Install this launcher.
|
||||||
|
3. Click **Install**.
|
||||||
|
4. When install completes, click **Start**.
|
||||||
|
5. The Gradio Web UI and FastAPI docs will open automatically.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- OpenAI-compatible speech endpoint: `POST /v1/audio/speech`
|
||||||
|
- MultiTTS Android-compatible endpoint: `GET /tts?text=...&voice=...&engine=f5-tts`
|
||||||
|
- Engine load/unload controls: `POST /engines/{name}/load` and `/engines/{name}/unload`
|
||||||
|
- MultiTTS Android export: `GET /export/multitts`
|
||||||
|
|
||||||
|
## Reset
|
||||||
|
|
||||||
|
Click **Reset** to remove the virtual environment, cached files, and downloaded models. The source code in `app/` is kept so the next install only recreates the venv and re-downloads models.
|
||||||
|
|
||||||
|
## Update
|
||||||
|
|
||||||
|
Click **Update** to pull the latest launcher and app source code, then re-run the install steps.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This launcher wraps the multi-tts-server project. Use in accordance with the licenses of F5-TTS, XTTS-v2, and the upstream project.
|
||||||
+74
@@ -0,0 +1,74 @@
|
|||||||
|
// Multi-TTS-Server installer
|
||||||
|
// 1. Clone app source code into app/
|
||||||
|
// 2. Create venv under app/ and install Python deps
|
||||||
|
// 3. Install platform-specific torch (CUDA 12.8 / DirectML / CPU)
|
||||||
|
// 4. Pre-download the minimal TTS model set (~6.7 GB):
|
||||||
|
// - NeuroDonu/RU-XTTS-DonuModel (5.3 GB)
|
||||||
|
// - Misha24-10/F5-TTS_RUSSIAN/F5TTS_v1_Base_v2 (1.3 GB)
|
||||||
|
// - pavolgebciar/vocos-mel-24khz (52 MB)
|
||||||
|
module.exports = {
|
||||||
|
requires: {
|
||||||
|
bundle: "ai",
|
||||||
|
},
|
||||||
|
run: [
|
||||||
|
// 1. Clone the app source code
|
||||||
|
{
|
||||||
|
method: "shell.run",
|
||||||
|
params: {
|
||||||
|
message: [
|
||||||
|
"git clone https://gitea.amakusa.ru/hermes/multi-tts-server.git app"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 2. Create venv under app/ and install Python deps
|
||||||
|
{
|
||||||
|
method: "shell.run",
|
||||||
|
params: {
|
||||||
|
venv: "venv",
|
||||||
|
path: "app",
|
||||||
|
message: [
|
||||||
|
"uv venv --python 3.11",
|
||||||
|
"uv pip install --upgrade pip wheel setuptools==80.9.0",
|
||||||
|
"uv pip install -r requirements.txt",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 3. Platform-specific torch install (CUDA 12.8 for NVIDIA, DirectML for AMD, CPU fallback)
|
||||||
|
{
|
||||||
|
method: "script.start",
|
||||||
|
params: {
|
||||||
|
uri: "torch.js",
|
||||||
|
params: { venv: "venv", path: "app" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 4. Download only the required TTS models (~6.7 GB total):
|
||||||
|
// - NeuroDonu/RU-XTTS-DonuModel ~5.3 GB
|
||||||
|
// - Misha24-10/F5-TTS_RUSSIAN ~1.3 GB
|
||||||
|
// - pavolgebciar/vocos-mel-24khz ~52 MB
|
||||||
|
{
|
||||||
|
method: "shell.run",
|
||||||
|
params: {
|
||||||
|
venv: "venv",
|
||||||
|
path: "app",
|
||||||
|
message: [
|
||||||
|
"python -c \"from huggingface_hub import snapshot_download; snapshot_download('NeuroDonu/RU-XTTS-DonuModel', local_dir='models/xtts-v2/NeuroDonu__RU-XTTS-DonuModel')\"",
|
||||||
|
"python -c \"from huggingface_hub import snapshot_download; repo='Misha24-10/F5-TTS_RUSSIAN'; base='models/f5-tts/Misha24-10__F5-TTS_RUSSIAN'; snapshot_download(repo, local_dir=base, ignore_patterns=['**/F5TTS_v1_Base_v4_winter/**','**/F5TTS_v1_Base_accent_tune/**','**/F5TTS_v1_Base/**/model_last.pt','**/F5TTS_v1_Base/**/model_last.safetensors','**/F5TTS_v1_Base_v2/**/model_last.pt'])\"",
|
||||||
|
"python -c \"from huggingface_hub import snapshot_download; snapshot_download('pavolgebciar/vocos-mel-24khz', local_dir='models/vocos/pavolgebciar__vocos-mel-24khz')\"",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 5. Install Done modal
|
||||||
|
{
|
||||||
|
id: "end",
|
||||||
|
method: "input",
|
||||||
|
params: {
|
||||||
|
title: "Install Complete",
|
||||||
|
description: "Multi-TTS-Server is ready. Click Start to launch the API + Gradio Web UI."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+94
@@ -0,0 +1,94 @@
|
|||||||
|
// Multi-TTS-Server Pinokio launcher
|
||||||
|
// One-click install/start for hermes/multi-tts-server
|
||||||
|
module.exports = {
|
||||||
|
version: "1.0.0",
|
||||||
|
title: "Multi-TTS-Server",
|
||||||
|
description: "XTTS + F5-TTS server with OpenAI-compatible API, Gradio Web UI, and MultiTTS Android export.",
|
||||||
|
icon: "icon.png",
|
||||||
|
menu: async (kernel, info) => {
|
||||||
|
// Marker: app/venv exists after install
|
||||||
|
let installed = info.exists("app/venv/Scripts/python.exe") ||
|
||||||
|
info.exists("app/venv/bin/python")
|
||||||
|
|
||||||
|
let running = {
|
||||||
|
install: info.running("install.js"),
|
||||||
|
start: info.running("start.js"),
|
||||||
|
update: info.running("update.js"),
|
||||||
|
reset: info.running("reset.js"),
|
||||||
|
}
|
||||||
|
|
||||||
|
if (running.install) {
|
||||||
|
return [{
|
||||||
|
default: true,
|
||||||
|
icon: "fa-solid fa-plug",
|
||||||
|
text: "Installing",
|
||||||
|
href: "install.js",
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (running.start) {
|
||||||
|
let local = info.local("start.js")
|
||||||
|
if (local && local.url) {
|
||||||
|
return [{
|
||||||
|
default: true,
|
||||||
|
icon: "fa-solid fa-rocket",
|
||||||
|
text: "Open Web UI",
|
||||||
|
href: local.url,
|
||||||
|
}, {
|
||||||
|
icon: "fa-solid fa-terminal",
|
||||||
|
text: "Terminal",
|
||||||
|
href: "start.js",
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
return [{
|
||||||
|
default: true,
|
||||||
|
icon: "fa-solid fa-terminal",
|
||||||
|
text: "Starting",
|
||||||
|
href: "start.js",
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (running.update) {
|
||||||
|
return [{
|
||||||
|
default: true,
|
||||||
|
icon: "fa-solid fa-terminal",
|
||||||
|
text: "Updating",
|
||||||
|
href: "update.js",
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (running.reset) {
|
||||||
|
return [{
|
||||||
|
default: true,
|
||||||
|
icon: "fa-solid fa-terminal",
|
||||||
|
text: "Resetting",
|
||||||
|
href: "reset.js",
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (installed) {
|
||||||
|
return [{
|
||||||
|
default: true,
|
||||||
|
icon: "fa-solid fa-power-off",
|
||||||
|
text: "Start",
|
||||||
|
href: "start.js",
|
||||||
|
}, {
|
||||||
|
icon: "fa-solid fa-plug",
|
||||||
|
text: "Update",
|
||||||
|
href: "update.js",
|
||||||
|
}, {
|
||||||
|
icon: "fa-regular fa-circle-xmark",
|
||||||
|
text: "<div><strong>Reset</strong><div>Revert to pre-install state</div></div>",
|
||||||
|
href: "reset.js",
|
||||||
|
confirm: "Are you sure you wish to reset the app? This deletes the venv and any downloaded models.",
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
return [{
|
||||||
|
default: true,
|
||||||
|
icon: "fa-solid fa-plug",
|
||||||
|
text: "Install",
|
||||||
|
href: "install.js",
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "multi-tts-server-launcher",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Pinokio one-click launcher for Multi-TTS-Server (XTTS + F5-TTS + OpenAI-compatible API + MultiTTS Android export)",
|
||||||
|
"repository": "https://gitea.amakusa.ru/hermes/multi-tts-server-launcher",
|
||||||
|
"icon": "icon.png",
|
||||||
|
"license": "MIT"
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
// Reset Multi-TTS-Server to pre-install state.
|
||||||
|
// Removes the venv, downloaded caches, and downloaded models.
|
||||||
|
// Keeps the cloned app/ source code so the next install is just venv + models.
|
||||||
|
module.exports = {
|
||||||
|
run: [
|
||||||
|
{
|
||||||
|
method: "fs.rm",
|
||||||
|
params: { path: "app/venv" }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
method: "fs.rm",
|
||||||
|
params: { path: "app/cache" }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
method: "fs.rm",
|
||||||
|
params: { path: "app/models" }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
// Multi-TTS-Server launcher daemon.
|
||||||
|
// Runs uvicorn in the background and exposes the URL via local.set so the
|
||||||
|
// menu can render an "Open Web UI" button.
|
||||||
|
module.exports = {
|
||||||
|
requires: { bundle: "ai" },
|
||||||
|
daemon: true,
|
||||||
|
run: [
|
||||||
|
{
|
||||||
|
method: "shell.run",
|
||||||
|
params: {
|
||||||
|
venv: "venv",
|
||||||
|
path: "app",
|
||||||
|
env: {
|
||||||
|
// Workaround for Coqui TTS on Windows when no system Local AppData is available
|
||||||
|
TTS_HOME: "{{cwd}}\\app\\cache\\tts_home",
|
||||||
|
HF_HOME: "{{cwd}}\\app\\cache\\hf",
|
||||||
|
XDG_DATA_HOME: "{{cwd}}\\app\\cache\\appdata",
|
||||||
|
LOCALAPPDATA: "{{cwd}}\\app\\cache\\appdata",
|
||||||
|
TRANSFORMERS_CACHE: "{{cwd}}\\app\\cache\\hf",
|
||||||
|
HF_HUB_CACHE: "{{cwd}}\\app\\cache\\hf",
|
||||||
|
PYTHONUTF8: "1",
|
||||||
|
},
|
||||||
|
message: [
|
||||||
|
"python -m uvicorn app.main:app --host 127.0.0.1 --port {{port}}"
|
||||||
|
],
|
||||||
|
on: [
|
||||||
|
// Watch stdout for uvicorn's "Uvicorn running on..." line and capture URL.
|
||||||
|
// The single capture group is fed to local.set.url below via input.event[1].
|
||||||
|
{
|
||||||
|
"event": "/Uvicorn running on (https?:\\/\\/[^\\s]+)/",
|
||||||
|
"done": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"event": "/error:/i",
|
||||||
|
"break": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
method: "local.set",
|
||||||
|
params: {
|
||||||
|
// input.event[1] is the first capture group from the regex (the URL).
|
||||||
|
url: "{{input.event && input.event[1] ? input.event[1] : ''}}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
// Platform-aware PyTorch installer.
|
||||||
|
// CUDA 12.8 wheels for NVIDIA, DirectML for AMD, CPU fallback.
|
||||||
|
module.exports = {
|
||||||
|
run: [
|
||||||
|
// Windows + NVIDIA
|
||||||
|
{
|
||||||
|
"when": "{{platform === 'win32' && gpu === 'nvidia'}}",
|
||||||
|
method: "shell.run",
|
||||||
|
params: {
|
||||||
|
venv: "{{args.venv}}",
|
||||||
|
path: "{{args.path}}",
|
||||||
|
message: [
|
||||||
|
"uv pip install torch==2.11.0 torchvision==0.21.0 torchaudio==2.11.0 --index-url https://download.pytorch.org/whl/cu128 --force-reinstall"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
next: null
|
||||||
|
},
|
||||||
|
// Windows + AMD (DirectML)
|
||||||
|
{
|
||||||
|
"when": "{{platform === 'win32' && gpu === 'amd'}}",
|
||||||
|
method: "shell.run",
|
||||||
|
params: {
|
||||||
|
venv: "{{args.venv}}",
|
||||||
|
path: "{{args.path}}",
|
||||||
|
message: "uv pip install torch-directml torchaudio torchvision --force-reinstall"
|
||||||
|
},
|
||||||
|
next: null
|
||||||
|
},
|
||||||
|
// Windows CPU
|
||||||
|
{
|
||||||
|
"when": "{{platform === 'win32' && (gpu !== 'nvidia' && gpu !== 'amd')}}",
|
||||||
|
method: "shell.run",
|
||||||
|
params: {
|
||||||
|
venv: "{{args.venv}}",
|
||||||
|
path: "{{args.path}}",
|
||||||
|
message: "uv pip install torch==2.11.0 torchvision==0.21.0 torchaudio==2.11.0 --index-url https://download.pytorch.org/whl/cpu --force-reinstall"
|
||||||
|
},
|
||||||
|
next: null
|
||||||
|
},
|
||||||
|
// macOS (CPU only — Apple Silicon uses MPS automatically)
|
||||||
|
{
|
||||||
|
"when": "{{platform === 'darwin'}}",
|
||||||
|
method: "shell.run",
|
||||||
|
params: {
|
||||||
|
venv: "{{args.venv}}",
|
||||||
|
path: "{{args.path}}",
|
||||||
|
message: "uv pip install torch==2.11.0 torchvision==0.21.0 torchaudio==2.11.0 --index-url https://download.pytorch.org/whl/cpu --force-reinstall"
|
||||||
|
},
|
||||||
|
next: null
|
||||||
|
},
|
||||||
|
// Linux + NVIDIA
|
||||||
|
{
|
||||||
|
"when": "{{platform === 'linux' && gpu === 'nvidia'}}",
|
||||||
|
method: "shell.run",
|
||||||
|
params: {
|
||||||
|
venv: "{{args.venv}}",
|
||||||
|
path: "{{args.path}}",
|
||||||
|
message: [
|
||||||
|
"uv pip install torch==2.11.0 torchvision==0.21.0 torchaudio==2.11.0 --index-url https://download.pytorch.org/whl/cu128 --force-reinstall"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
next: null
|
||||||
|
},
|
||||||
|
// Linux + AMD (ROCm 6.4)
|
||||||
|
{
|
||||||
|
"when": "{{platform === 'linux' && gpu === 'amd'}}",
|
||||||
|
method: "shell.run",
|
||||||
|
params: {
|
||||||
|
venv: "{{args.venv}}",
|
||||||
|
path: "{{args.path}}",
|
||||||
|
message: "uv pip install torch==2.11.0 torchvision==0.21.0 torchaudio==2.11.0 --index-url https://download.pytorch.org/whl/rocm6.4 --force-reinstall"
|
||||||
|
},
|
||||||
|
next: null
|
||||||
|
},
|
||||||
|
// Linux CPU
|
||||||
|
{
|
||||||
|
"when": "{{platform === 'linux' && (gpu !== 'amd' && gpu !== 'nvidia')}}",
|
||||||
|
method: "shell.run",
|
||||||
|
params: {
|
||||||
|
venv: "{{args.venv}}",
|
||||||
|
path: "{{args.path}}",
|
||||||
|
message: "uv pip install torch==2.11.0 torchvision==0.21.0 torchaudio==2.11.0 --index-url https://download.pytorch.org/whl/cpu --force-reinstall"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// Pull latest launcher scripts and app source code, then re-run install.
|
||||||
|
module.exports = {
|
||||||
|
run: [
|
||||||
|
{
|
||||||
|
method: "shell.run",
|
||||||
|
params: { message: "git pull" }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
method: "shell.run",
|
||||||
|
params: { path: "app", message: "git pull" }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
method: "script.start",
|
||||||
|
params: { uri: "install.js" }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user