Kazeia-engine/dist
Richard Loyer 9ef5e11b53 chantier B TTS #6: P3.4+P3.5 = pipeline complet 100% tablette bout-en-bout
tts_pipeline.cpp : binaire unique qui orchestre TOUT en un seul process :
  input_ids + x_vector (fixtures)
    -> text_projection + lookups + spéciaux (P3.2) -> prefill_embeds [T, 1024]
    -> Talker engine (libllama, M-RoPE IMROPE, Patch 1+2) -> logits + hidden
    -> sampling top_k+temp sur CB0 (le greedy pur tombe dans un attracteur :
       cb0 répété -> decoder produit du silence. temp=0.9 top_k=50 = défauts
       Python, débloquent l'attracteur)
    -> CP runner (cp_inference, recompute bit-exact) -> CB1..15
    -> sum 16 codecs + tts_pad -> next embed (orchestration ggml-side, bit-exact)
    -> codes [N, 16] -> decoder ggml (libqwen3tts-decoder rebuilt vs ql/ggml,
       evite conflit double-ggml) -> WAV PCM 24kHz

Sortie : Bonjour je m'appelle Kazeia, 32 frames -> 2.56s audio audible
(rms=0.040, range [-0.26, 0.29]). 100% tablette : pas de Python, pas de root,
pas de QNN. Stack unifiee ggml.

Bench tablette CPU 6 threads (sweet spot, 8 = contention scheduler) :
  load total       :  1.12 s  (talker f32 + cp + decoder + fixtures)
  Talker prefill   :  0.10 s
  Loop (N=32)      :  8.57 s   talker_decode=1.01 cp=7.55 (talker 31ms/step, cp 236ms/step)
  Decoder          :  5.32 s   (RTF dec 2.00)
  TOTAL            : 14.00 s pour 2.67s audio -> RTF 5.25

Gros leviers perf restants pour RTF<1 (P3.5 itératif, dehors session) :
- KV cache CP : 15 passes/step recompute O(L^2) -> incremental O(L). Estimation
  gain x5-8 sur CP. Tentative cette session = abandonnee (risque casser bit-exact).
- Decoder ggml : histo chraac 0.96 prouve realisable, faut tuner.
- Threads big cores via taskset (Pad3 SD8Elite 8 cores big, scheduler ne route
  pas tjrs au mieux).

Q8_0 CP teste -> perd la precision (76% codes match vs 100% f16) ; sampling et
CP en f16 reste necessaire (confirme observation rapport TTS avril : modeles RVQ
incompatibles avec quantization).

Decoder ggml rebuilte au passage avec ggml engine : kazeia-tts-decoder-ggml/
build-android-engine/ -> libqwen3tts-decoder.a sans conflit symboles. Patch
mineur build-time, pas de modif source decoder.

P3.4 (libkazeia_tts.so JNI assemblage Kotlin) : reporte en session future, le
code de tts_pipeline.cpp est l'implementation reference a wrapper en JNI.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 15:25:00 +02:00
..
include Engine sur fork qualcomm: decode dense 15.5>pte, 3.5 ~11, KVq8+t4+fa+lm_head-Q4; prefill 93/285; RAG cross 24-28k 2026-05-26 15:53:14 +02:00
jni chantier B TTS #6: P3.4+P3.5 = pipeline complet 100% tablette bout-en-bout 2026-05-28 15:25:00 +02:00
lib chantier B TTS #2: fix M-RoPE positions en embeds-mode + validation bit-exact 2026-05-28 13:54:03 +02:00
CMakeLists.txt JNI bridge complet: generate() prefill+decode, build arm64 OK (libkazeia_engine.so 209K) 2026-05-24 21:58:00 +02:00
HANDOFF.md dist: audit intégrabilité HANDOFF — corrige passages périmés 2026-05-27 18:55:16 +02:00
INTEGRATION.md dist: bandeau HANDOFF source de vérité sur README/INTEGRATION (9B historique) 2026-05-26 23:34:15 +02:00
MODELS.md dist: handoff intégration aligné décisions 26/05 (modèle q35-lmq4, perf, prompt) 2026-05-26 23:33:41 +02:00
PERF.md dist: prefill HTP corrigé (SSM_CONV gate backend), JNI option C sans OPFILTER 2026-05-27 10:39:08 +02:00
PITFALLS.md Doc complete: README+MODELS+PERF+PITFALLS, build nettoye 2026-05-24 21:59:56 +02:00
README.md dist: bandeau HANDOFF source de vérité sur README/INTEGRATION (9B historique) 2026-05-26 23:34:15 +02:00
STATUS.md dist: audit intégrabilité HANDOFF — corrige passages périmés 2026-05-27 18:55:16 +02:00
TTS.md Dist Kazeia-Engine: libs arm64+headers+JNI bridge+INTEGRATION/TTS doc; STT reste ORT 2026-05-24 21:55:01 +02:00
llama-cli Dist Kazeia-Engine: libs arm64+headers+JNI bridge+INTEGRATION/TTS doc; STT reste ORT 2026-05-24 21:55:01 +02:00
package.sh dist: handoff intégration aligné décisions 26/05 (modèle q35-lmq4, perf, prompt) 2026-05-26 23:33:41 +02:00
system_fr.txt dist: handoff intégration aligné décisions 26/05 (modèle q35-lmq4, perf, prompt) 2026-05-26 23:33:41 +02:00
test_native Engine sur fork qualcomm: decode dense 15.5>pte, 3.5 ~11, KVq8+t4+fa+lm_head-Q4; prefill 93/285; RAG cross 24-28k 2026-05-26 15:53:14 +02:00

README.md

Source de vérité à jour = HANDOFF.md (26/05). Modèle tranché = q35-lmq4 (Qwen3.5-4B), 9B écarté. Les mentions de 9B/cascade ci-dessous sont historiques.

Kazeia-Engine — intégration kazeia-android

Moteur LLM (+ TTS) GGUF, sans .pte, fork llama.cpp upstream + backend Hexagon. Remplace ExecuTorch/Genie pour le LLM. STT reste ORT-QAIRT (inchangé). Prefill NPU / decode CPU. Modèle dense (Qwen3) plein NPU ; hybride (Qwen3.5 DDDA) GDN sur NPU corrigé.

0. Périmètre

Brique Avant Après
LLM Speaker/Thinker ExecuTorch .pte Kazeia-Engine GGUF
TTS Talker/CP ggml-cpu engine (Talker prefill HTP option.)
TTS Decoder libtts_decoder_ggml inchangé
STT Whisper ORT-QAIRT inchangé

1. Contenu du paquet

  • lib/ : libkazeia_engine.so (bridge JNI) + libllama.so + libggml{,-base,-cpu,-hexagon}.so + libggml-htp-v68/69/73/75/79/81.so (sélection auto = V79 sur Pad3). 168 MB.
  • jni/ : kazeia_engine_jni.cpp, EngineLlmEngine.kt. include/, CMakeLists.txt.
  • INTEGRATION.md (steps), TTS.md, MODELS.md, PERF.md, PITFALLS.md.

2. Build (5 étapes)

  1. lib/*.sokazeia-android/app/src/main/jniLibs/arm64-v8a/
  2. jni/kazeia_engine_jni.cppapp/src/main/jni/, include/*.h à côté
  3. EngineLlmEngine.ktcom/kazeia/llm/, System.loadLibrary("kazeia_engine")
  4. CMake: lib avec libllama+libggml+libggml-base, -march=armv8.6-a+dotprod+fp16+i8mm+bf16
  5. GGUF → external storage, paths via KazeiaApplication.LLM_DIR

3. Cascade — remplace LlmProcessor cascade

Thinker Guard-4B → 4 bullets ; Speaker 9B = SYS_KAZEIA+bullets. Mono-moteur, reset() entre tours. Prompts: voir RAPPORT_KAZEIA §8. --reasoning-budget 0 impératif (sinon ramble anglais) : EngineLlmEngine met thinking off. Mesuré: 9B>4B qualité, Speaker=9B.

→ MODELS.md (choix), PERF.md (chiffres), PITFALLS.md (params_fit, no tty, OOM 30B+), INTEGRATION.md (détail API). API: load/generate/reset/free.

VALIDÉ DEVICE 24/05

test_native (=logique generate bridge) sur Pad3: load 4B HTP+decode CPU+detok = OUT propre, exit0. Pipeline prefill-NPU/decode-CPU prouve end-to-end. dist/jni/test_native.cpp = harness reproductible. Bridge so: 4 symboles JNI + deps ok. Reste app: gradle+jniLibs+template chat.

v2 STATIC (collision libllama TTS resolue)

TTS Talker/CP linke vs son libllama.so -> conflit ABI. FIX: libkazeia_engine.so STATIC (llama+ggml+ggml-cpu+hexagon en .a, --whole-archive hexagon). NEEDED= libm/log/dl/c only, 42MB. Coexiste avec libllama TTS. Drop: libkazeia_engine.so + libggml-htp-v79.so. Valide device 4B HTP. Build: bstatic BUILD_SHARED_LIBS=OFF.

v3 utilisable: thinking-off bridge

generate(sys,usr,max): wrap ChatML + vide = stop reasoning, decode 4B 15tok/s ~5s/tour. test 4B: "Je suis desole..." 40s(load)+gen. signature 2-arg. cap maxTok 64. dist=libkazeia_engine.so static + htp-v79. #277 fix livre.

v4 USABLE: ngl0 CPU decode (vrai fix #277)

Hang in-app=0.21tok/s: ngl99 -> decode ping-pong NPU/GDN-CPU. FIX: n_gpu_layers=0 decode CPU pur 14tok/s. test 4B: reponse FR 4s/tour. dev avait raison: pas thinking. cap64 garde. Speaker=4B CPU ngl0. RAM 4.5G. dist=libkazeia_engine.so. utilisable, #277 debloque.