mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-16 19:59:56 +02:00
La façade sert /api/transcribe et /api/dictate/* quand LOKI_DICTATE=rust (expérimental ; le Go reste le défaut) et supervise elle-même le serveur de transcription sherpa-onnx : lancé à la demande sur la boucle locale, GPU masqués et sans le jeton interne, prêt dès que sa socket répond, mort au démarrage expliquée, éteint après dix minutes d'inactivité ou quand les réglages changent. Modèles Parakeet téléchargés et décompressés au fil de l'eau (tar.bz2, entrées hors du dossier refusées, liens ignorés), protocole WebSocket identique (en-tête de 8 octets, trames de 10 Kio). Côté Go, facade_dictate.go remet ces routes à la façade quand elles arrivent par le tunnel du relais, et asrShutdownVite (libération de la VRAM, optimiseur) lui demande l'arrêt par l'API interne. Parité : parity_dictate_test.go tire du Go la lecture de treize WAV, les chemins d'archive, réglages, catalogue, arguments et treize appels de route, rejoués par tests/dictate.rs ; supervision testée contre un faux sherpa-onnx qui parle le protocole. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
53 lines
1.9 KiB
Go
53 lines
1.9 KiB
Go
package loki
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// facade_dictate.go — dictée vocale tenue par la façade Rust (LOKI_DICTATE=rust,
|
|
// lot 9 de la migration ; expérimental, le Go reste le défaut).
|
|
//
|
|
// La façade sert elle-même /api/transcribe et /api/dictate/* sur le port
|
|
// public, et supervise le serveur de transcription. Deux choses restent à
|
|
// régler ici :
|
|
//
|
|
// - le tunnel du relais et sa redistribution E2E arrivent dans ce process :
|
|
// ces routes sont remises à la façade (withFacadeChat) ;
|
|
// - libérer la VRAM (web_vram.go) et l'optimiseur (backend_tune_run.go)
|
|
// arrêtent la dictée : c'est alors à la façade qu'on le demande, son
|
|
// serveur n'étant pas un enfant de ce process.
|
|
|
|
const facadeDictateEnv = "LOKI_DICTATE"
|
|
|
|
// facadeDictate : la façade tient-elle la dictée ? Il faut aussi son adresse
|
|
// et le jeton interne, sans lesquels rien ne peut lui être remis.
|
|
func facadeDictate() bool {
|
|
return strings.EqualFold(strings.TrimSpace(os.Getenv(facadeDictateEnv)), "rust") &&
|
|
facadeAddr() != "" && internalToken() != ""
|
|
}
|
|
|
|
// facadeDictateRoutes : les routes que la façade sert alors (dictate.rs).
|
|
var facadeDictateRoutes = map[string]bool{
|
|
"/api/transcribe": true,
|
|
"/api/dictate/config": true,
|
|
"/api/dictate/models": true,
|
|
"/api/dictate/models/download": true,
|
|
"/api/dictate/state": true,
|
|
}
|
|
|
|
// facadeDictateStop demande à la façade d'arrêter son serveur de dictée, sans
|
|
// attendre derrière un démarrage (elle tue le processus qui démarre). Rend
|
|
// false quand la façade ne tient pas la dictée : l'appelant arrête alors le
|
|
// serveur de ce process.
|
|
func facadeDictateStop() bool {
|
|
if !facadeDictate() {
|
|
return false
|
|
}
|
|
if err := facadePost("/internal/facade/v1/dictate/stop", map[string]any{}); err != nil {
|
|
fmt.Printf("[dictée] arrêt demandé à la façade : %v\n", err)
|
|
}
|
|
return true
|
|
}
|