chore(cleanup): purge des traces legacy résiduelles (audit post-bascule)
Audit complet : 0 référence de CODE aux classes/libs supprimées (vérifié). Nettoyage des résidus : - code mort : vars locales inutilisées (wavPath dans setVoiceId, sentenceCounter) + bindings JNI TTS-Talker Qwen3-TTS de EngineJni (nEmbd/nVocab/resetEmbeds/ prefillEmbeds/decodeEmbed, 0 caller). - commentaires périmés recalés : docstring ttsEngine (ConfigStore) + défaut field ttsEngine "lib"→"cosyvoice" ; commentaire cascade (ExecuTorchLlmEngine→UnifiedLlmAdapter, Guard-0.6B→Guard-4B) ; ttsStreamer (Qwen3→CosyVoice) ; AudioVisualizer SPECTRUM_BANDS. Build app+admin vert. Restent uniquement des notes historiques exactes (« X retiré 2026-06-18 ») — documentation, pas du code. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
a2fc01987b
commit
a1c785bdf8
|
|
@ -71,16 +71,11 @@ class ConfigStore private constructor(private val file: File) {
|
||||||
* modèle effectif est choisi par `speaker.modelId` (ModelRegistry). Champ
|
* modèle effectif est choisi par `speaker.modelId` (ModelRegistry). Champ
|
||||||
* conservé pour compat config/télémétrie. */
|
* conservé pour compat config/télémétrie. */
|
||||||
val llmEngine: String = "lib",
|
val llmEngine: String = "lib",
|
||||||
/** Backend TTS : "lib" = libkazeia_tts unifié (SEUL compatible avec le
|
/** Backend TTS : "cosyvoice" = CosyVoiceTtsEngine (clonage vocal 9 langues,
|
||||||
* libllama.so fork ql embarqué depuis 2026-06-02), "prod" = Qwen3TtsEngine
|
* CPU-only) = SEUL moteur depuis la bascule 2026-06-18 (legacy Qwen3-TTS/lib
|
||||||
* legacy — CRASHE (SIGSEGV nativeInit, dérive ABI llama_context_params) tant
|
* retirés). Champ conservé pour compat config ; KazeiaService ne charge que
|
||||||
* que les .so legacy ne sont pas recompilés contre les headers fork ql.
|
* CosyVoice. */
|
||||||
* "cosyvoice" = CosyVoiceTtsEngine (clonage vocal 9 langues, CPU-only) —
|
val ttsEngine: String = "cosyvoice",
|
||||||
* câblé mais NON activable tant que la collision libggml des libs livrées
|
|
||||||
* n'est pas levée côté engine (cf CosyVoiceTtsEngine.kt).
|
|
||||||
* Default "lib" depuis 2026-06-11 : l'ancien défaut "prod" mettait toute
|
|
||||||
* install fraîche en crash-loop au démarrage du service. */
|
|
||||||
val ttsEngine: String = "lib",
|
|
||||||
/** RAG (récupération de contexte injecté au prompt). Default OFF : tant que
|
/** RAG (récupération de contexte injecté au prompt). Default OFF : tant que
|
||||||
* kazeia-engine n'expose pas embedText + qu'aucun corpus n'est ingéré,
|
* kazeia-engine n'expose pas embedText + qu'aucun corpus n'est ingéré,
|
||||||
* l'activer est inerte (l'embedder n'est pas prêt). Pilotable via admin. */
|
* l'activer est inerte (l'embedder n'est pas prêt). Pilotable via admin. */
|
||||||
|
|
|
||||||
|
|
@ -22,15 +22,7 @@ class EngineJni {
|
||||||
external fun sessionReset(h: Long) // repart du checkpoint système
|
external fun sessionReset(h: Long) // repart du checkpoint système
|
||||||
external fun getLastStats(h: Long): LongArray // [prefill_ms, decode_ms, n_tokens]
|
external fun getLastStats(h: Long): LongArray // [prefill_ms, decode_ms, n_tokens]
|
||||||
|
|
||||||
// -- TTS Talker (Qwen3-TTS) : I/O en embeddings, pas en tokens (vocab=3072 codes audio, pas de BPE).
|
// (Bindings TTS-Talker Qwen3-TTS retirés 2026-06-18 : TTS = CosyVoice, lib dédiée.)
|
||||||
// Le caller (cf. TalkerEngine.kt) construit les embeds de prefill (text+x-vector) et de step
|
|
||||||
// (sum 16 codecs + tts_pad + trailing_text_hidden), fait l'échantillonnage, et compose le
|
|
||||||
// pipeline Talker→CP→Decoder. Retours conventionnels : 0 = OK, négatif = erreur.
|
|
||||||
external fun nEmbd(h: Long): Int // taille d'un embed (1024 pour Talker-0.6B)
|
|
||||||
external fun nVocab(h: Long): Int // 3072 pour le Talker
|
|
||||||
external fun resetEmbeds(h: Long) // KV clear + pos=0, à appeler en début de génération TTS
|
|
||||||
external fun prefillEmbeds(h: Long, embdFlat: FloatArray, t: Int, outHidden: FloatArray): Int
|
|
||||||
external fun decodeEmbed(h: Long, embd: FloatArray, outLogits: FloatArray, outHidden: FloatArray): Int
|
|
||||||
|
|
||||||
// -- Embeddings (RAG) : modèle dédié BERT-like (e5/bge), handle SÉPARÉ du LLM/TTS, CPU pur.
|
// -- Embeddings (RAG) : modèle dédié BERT-like (e5/bge), handle SÉPARÉ du LLM/TTS, CPU pur.
|
||||||
// pooling: -1 = défaut du modèle (recommandé) ; 1 = MEAN (e5) ; 2 = CLS (bge).
|
// pooling: -1 = défaut du modèle (recommandé) ; 1 = MEAN (e5) ; 2 = CLS (bge).
|
||||||
|
|
|
||||||
|
|
@ -54,14 +54,9 @@ class KazeiaService : Service() {
|
||||||
Pas d'introduction, pas d'explication. Juste les 4 lignes en francais. /no_think"""
|
Pas d'introduction, pas d'explication. Juste les 4 lignes en francais. /no_think"""
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var llm: LlmEngine
|
private lateinit var llm: LlmEngine // Speaker (UnifiedLlmAdapter : GGUF défaut ou .pte)
|
||||||
// Cascade Option E v2 : 2 ExecuTorchLlmEngine cohabitants in-process.
|
// Cascade (off par défaut) : 2ᵉ moteur Thinker via UnifiedLlmAdapter,
|
||||||
// - llm = Speaker Qwen3-4B (.pte ~3.3 GB ION, ~4.4 GB total)
|
// lazy au 1er tour (défaut Guard-4B .pte). nThreads réduit pour le Speaker.
|
||||||
// - thinkerEngine = Guard-0.6B (.pte ~700 MB ION) lazy-loaded au 1er PTT
|
|
||||||
// Total ION ~5.1 GB, marge OK pour TTS pic. QnnBackendUnifiedRegistry
|
|
||||||
// singleton partage le QnnBackendBundle (handle fastrpc DSP) entre les 2
|
|
||||||
// contextes — pas de collision DSP, pas de subprocess. Cf
|
|
||||||
// project_kazeia_cascade_option_e dans la mémoire persistante.
|
|
||||||
private var thinkerEngine: com.kazeia.llm.UnifiedLlmAdapter? = null
|
private var thinkerEngine: com.kazeia.llm.UnifiedLlmAdapter? = null
|
||||||
private val thinkerLock = Object()
|
private val thinkerLock = Object()
|
||||||
|
|
||||||
|
|
@ -208,10 +203,9 @@ Pas d'introduction, pas d'explication. Juste les 4 lignes en francais. /no_think
|
||||||
val loadingState: StateFlow<LoadingState> = _loadingState
|
val loadingState: StateFlow<LoadingState> = _loadingState
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cascade E v2 : crée la 2ᵉ ExecuTorchLlmEngine (Thinker = Guard-0.6B) dans
|
* Cascade : crée le 2ᵉ moteur (Thinker, défaut Guard-4B .pte NPU) via
|
||||||
* le MÊME process app. Lazy au 1er PTT (~1-2 s de load 0.6B). Le
|
* UnifiedLlmAdapter dans le même process, lazy au 1er tour. Off par défaut
|
||||||
* QnnBackendUnifiedRegistry singleton réutilise le QnnBackendBundle du
|
* (cascadeEnabled=false). nThreads réduit pour laisser des cœurs au Speaker.
|
||||||
* Speaker → un seul handle fastrpc DSP, 2 contextes/graphes coexistent.
|
|
||||||
*/
|
*/
|
||||||
private fun ensureThinkerEngine() {
|
private fun ensureThinkerEngine() {
|
||||||
synchronized(thinkerLock) {
|
synchronized(thinkerLock) {
|
||||||
|
|
@ -699,7 +693,6 @@ Pas d'introduction, pas d'explication. Juste les 4 lignes en francais. /no_think
|
||||||
* ../voix/<id>.wav. Hot-swap : effet au prochain segment synthétisé. */
|
* ../voix/<id>.wav. Hot-swap : effet au prochain segment synthétisé. */
|
||||||
fun setVoiceId(voiceId: String) {
|
fun setVoiceId(voiceId: String) {
|
||||||
currentVoiceName = voiceId
|
currentVoiceName = voiceId
|
||||||
val wavPath = "${KazeiaApplication.MODELS_DIR}/../voix/$voiceId.wav"
|
|
||||||
when (val e = tts) {
|
when (val e = tts) {
|
||||||
is com.kazeia.tts.CosyVoiceTtsEngine -> { e.setVoice(voiceId); log("Voix (cosyvoice): $voiceId") }
|
is com.kazeia.tts.CosyVoiceTtsEngine -> { e.setVoice(voiceId); log("Voix (cosyvoice): $voiceId") }
|
||||||
else -> log("setVoiceId: moteur TTS inconnu — voix '$voiceId' ignorée")
|
else -> log("setVoiceId: moteur TTS inconnu — voix '$voiceId' ignorée")
|
||||||
|
|
@ -1526,11 +1519,7 @@ Pas d'introduction, pas d'explication. Juste les 4 lignes en francais. /no_think
|
||||||
// as soon as the user finishes speaking, covering the LLM's TTFT.
|
// as soon as the user finishes speaking, covering the LLM's TTFT.
|
||||||
addMessage(bubble)
|
addMessage(bubble)
|
||||||
val llmStreamStart = System.currentTimeMillis()
|
val llmStreamStart = System.currentTimeMillis()
|
||||||
val sentenceCounter = java.util.concurrent.atomic.AtomicInteger(0)
|
// TTS coupé (llmOnly) → pas de session ; la bulle se remplit token par token.
|
||||||
// TTS coupé (llmOnly) → pas de session de synthèse ouverte ; la bulle
|
|
||||||
// se remplit token par token dans onToken (voir plus bas).
|
|
||||||
// Streaming LLM→TTS réservé à Qwen3 (NPU/Hexagon : pas de contention CPU avec
|
|
||||||
// le LLM). CosyVoice (CPU) passe par le chemin batch (voir note plus haut).
|
|
||||||
// CosyVoice (CPU) : pas de streaming LLM→TTS (contention CPU). Le LLM décode
|
// CosyVoice (CPU) : pas de streaming LLM→TTS (contention CPU). Le LLM décode
|
||||||
// vite, puis synthèse batch via pipeline.speakText (qui streame déjà
|
// vite, puis synthèse batch via pipeline.speakText (qui streame déjà
|
||||||
// phrase-par-phrase EN INTERNE). ttsStreamer reste donc null.
|
// phrase-par-phrase EN INTERNE). ttsStreamer reste donc null.
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ class AudioVisualizerView @JvmOverloads constructor(
|
||||||
) : View(context, attrs, defStyleAttr), Choreographer.FrameCallback {
|
) : View(context, attrs, defStyleAttr), Choreographer.FrameCallback {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
/** Must match Qwen3TtsEngine.SPECTRUM_BANDS. Asserted at setSpeaking. */
|
/** Nombre de bandes de spectre de l'orbe (visualiseur). */
|
||||||
private const val SPECTRUM_BANDS = 12
|
private const val SPECTRUM_BANDS = 12
|
||||||
/** Listening-mode outline deformation modes (even = smooth blobs). */
|
/** Listening-mode outline deformation modes (even = smooth blobs). */
|
||||||
private const val BLOB_MODES = 8
|
private const val BLOB_MODES = 8
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue