!join, !join texte ou !join text : transcriptions et réponses écrites.!join audio : écoute et réponses parlées ; pas de transcription ni de réponse de conversation dans le salon texte. Les confirmations de commandes restent textuelles.!quit : annule les traitements et la lecture, puis déconnecte le bot.!quit, puis la commande de connexion souhaitée.Les transcriptions écrites sont modifiées : ⚪ en attente, 🟠 traitement du lot, 🟢 réponse envoyée, 🔴 échec. Chaque phrase conserve sa référence de message, y compris les phrases identiques ou regroupées pendant une réponse.
Le service TTS est interchangeable via TTS_URL (défaut
http://kokoro-tts:8000/v1/audio/speech) et TTS_VOICE (ff_siwis).
Contrat : POST JSON input, voice, réponse WAV PCM16 mono/stéréo ;
GET /healthz pour vérifier le service avant connexion audio.
La réponse complète du LLM est découpée en phrases de 240 caractères maximum.
Les emojis Unicode, emojis Discord et alias comme :hap: sont retirés uniquement
du texte envoyé au TTS. Une réponse contenant seulement des emojis reste silencieuse.
Le bot commence à lire la première phrase sans attendre la synthèse des suivantes.
Une phrase est préchargée pendant la lecture. Il ne s'agit pas de streaming des
tokens du LLM. Le TTS CPU ne traite qu'une requête à la fois.
Le modèle/voix Kokoro-82M ff_siwis est chargé dans un pod séparé sur bureau, avec 2 CPU réservés, limite de 4 CPU et 4 GiB RAM ; aucun GPU demandé. Les poids sont inclus dans l'image pour un démarrage sans accès à Hugging Face.
Tests : python -m unittest test_voice_stt test_voice_tts.
Les tests ne connectent pas le bot à Discord et ne publient aucun message réel.