⚡ Bun.js High-Performance Media Platform
Host TTS Audio with Millisecond Word Timing
Instant playback with live synchronized karaoke animation. Missing clips are automatically enqueued in Bun SQLite and synthesized by powerful distributed Whisper workers.
Interactive TTS Request & Karaoke Engine
Public API • No Auth Required
Audio en cours de génération dans la base SQLite...
Ce texte n'était pas encore synthétisé. Il a été automatiquement placé dans la file d'attente (Hash: ). Le worker distribué Whisper est en train de le traiter.
00:00
00:00
FR
siwis
5 mots
Page 1
Bun SQLite Missing TTS Queue
Toutes les requêtes audio non encore disponibles sont enregistrées dans la table missing_queue de Bun SQLite. Les workers externes s'authentifient pour les dépiler.
| Statut | Texte | Langue | Voix | Requêtes | Date |
|---|---|---|---|---|---|
| Aucune tâche en attente. | |||||
Worker Script & Architecture
Distributed Pipeline
1. Lancer le Worker sur un Hôte Puissant (GPU / M1-M3)
Le script worker interroge https://media.edukids.ovh avec un token d'authentification, génère l'audio TTS et extrait l'alignement précis des mots grâce au modèle Whisper (faster-whisper ou mlx-whisper), puis uploade le MP3 et le JSON.
# Exécution directe avec UV (Python 3.10+ avec PyTorch / CUDA ou Apple Silicon MLX)
uv run worker/worker.py --server https://media.edukids.ovh --token media-worker-secret-token-2026 --whisper-model large-v3
uv run worker/worker.py --server https://media.edukids.ovh --token media-worker-secret-token-2026 --whisper-model large-v3
# Alternative TypeScript avec Bun.js (utilise Sherpa-ONNX + Whisper)
SERVER_URL=https://media.edukids.ovh WORKER_AUTH_TOKEN=media-worker-secret-token-2026 bun run worker/worker.ts
SERVER_URL=https://media.edukids.ovh WORKER_AUTH_TOKEN=media-worker-secret-token-2026 bun run worker/worker.ts
2. Spécification des Endpoints HTTP
| Méthode & Route | Auth Requise | Description |
|---|---|---|
GET /api/tts/:voice?text=...ou /api/tts?voice=:voice&text=... |
Non (Public) | Demande un TTS avec la voix spécifiée. Si disponible : renvoie les URLs /audio/:voice/:hash.mp3 et les timings. Si indisponible : l'enregistre dans la file SQLite (HTTP 202). |
GET /audio/:voice/:hash.mp3 |
Non (Public) | Stream du fichier audio MP3 pour la voix donnée (stocké sous storage/audio/:voice/:hash.mp3), avec support HTTP Range (code 206) et cache immuable. |
GET /timings/:voice/:hash.json |
Non (Public) | Renvoie le JSON des timings mot par mot pour la voix demandée (stocké sous storage/timings/:voice/:hash.json). |
GET /api/worker/missing |
Oui (Bearer Token) | Permet au worker de récupérer la liste des tâches en attente de génération. |
POST /api/worker/upload |
Oui (Bearer Token) | Upload du fichier MP3 généré avec son tableau de timings JSON. |