kazeia/kazeia-android
Kazeia Team 39babcb158 TTS+audio+memory: ColorOS playback fixes + kill-background reclaim
Three unrelated fixes rolled into one so testing on the tablet stayed
coherent. All were driven by what the user was observing during live
audio tests, not by pre-planned refactors.

1. **Audio playback actually audible.** ColorOS's AudioFlinger
   silently muted our AudioTrack ~600 ms after play() every time
   (dumpsys audio showed `event:muted updated source:clientVolume`
   and playbackHeadPosition stuck at 0), regardless of USAGE_MEDIA /
   USAGE_ASSISTANT / USAGE_VOICE_COMMUNICATION, regardless of audio
   focus grant, regardless of FGS type including mediaPlayback. A
   MediaPlayer path using the SAME usage attributes works because it
   routes through a different AudioFlinger thread that isn't under
   the same background-hardening policy. `USE_MEDIAPLAYER_FALLBACK`
   in Qwen3TtsEngine.kt flips playback to a WAV-per-segment pipeline.
   Two MediaPlayer instances are chained via `setNextMediaPlayer()`
   so segments transition without re-arming the DAC (that re-arm was
   audible as "beg beg" pops between sentences). Synth of seg N+1
   runs in parallel with playback of seg N via a capacity-2 Channel,
   hiding synthesis latency behind playback for all but the first seg.

2. **Mic no longer loops TTS back into STT.** The continuous-
   listening VAD in KazeiaService already had a guard to drop frames
   while `pipelineState is Speaking`, but that state was never set by
   any caller — so the mic kept recording during playback and fed our
   own speaker output back to Whisper, creating the infinite
   "Kazeia talks to Kazeia" loop the user observed. Both the
   stream_llm intent path and the main `processLlmResponse` TTS path
   now wrap the TTS call with `Speaking → Idle/Listening`.

3. **Free 1.6 GB of RAM at service start.** The OnePlus Pad 3 with
   ColorOS keeps ~7 GB of Google + OPLUS background services
   resident at idle. With Qwen3-4B (3.2 GB) + Qwen3-TTS (1 GB) +
   Whisper (0.5 GB) on top, most of our model weights were going to
   ZRAM swap — "the NPU is stuck" reports were actually page faults
   paging 3 GB of LLM weights back in before each inference. New
   `MemoryOptimizer` kills 30-ish non-essential background packages
   (Google optional: YouTube, Wallet, Chromecast, Messaging, AICore,
   Quicksearchbox; OPLUS optional: smartsidebar, cosa, pantanal,
   nhs, midas, …) via `ActivityManager.killBackgroundProcesses`.
   Measured reclaim on first run: **avail RAM 8468 MB → 10112 MB,
   +1644 MB**. Uses KILL_BACKGROUND_PROCESSES (normal perm, no user
   prompt); system-critical packages and the launcher/systemui are
   explicitly excluded from the target list.

Collateral changes:
- Added FOREGROUND_SERVICE_MEDIA_PLAYBACK permission + fgsType flag
  (didn't fix the mute on its own, but it's correct per Android 14
  policy and leaving it without would be a latent compliance risk).
- Kept `USE_STREAMING_DECODE` + CP↔BigVGAN overlap code intact
  behind the MediaPlayer-fallback branch so reverting to the
  AudioTrack streaming path is a single-const flip if ColorOS ever
  lifts the hardening (or we move to a device without it).
- New AudioTrack path has a keep-alive silence watchdog and a
  playback-head drain wait on stop. Both were attempts to fix the
  mute that didn't pan out on their own; leaving them in so the
  streaming path stays usable on non-hardened devices.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 22:37:20 +02:00
..
app TTS+audio+memory: ColorOS playback fixes + kill-background reclaim 2026-04-14 22:37:20 +02:00
gradle/wrapper Initial commit: Kazeia TTS pipeline on NPU via ExecuTorch 2026-04-09 08:42:11 +02:00
COMPILE_WHISPER_NPU.md Initial commit: Kazeia TTS pipeline on NPU via ExecuTorch 2026-04-09 08:42:11 +02:00
RAPPORT_TTS_NPU.md Initial commit: Kazeia TTS pipeline on NPU via ExecuTorch 2026-04-09 08:42:11 +02:00
RAPPORT_TTS_QWEN3_TESTS.md Initial commit: Kazeia TTS pipeline on NPU via ExecuTorch 2026-04-09 08:42:11 +02:00
build.gradle.kts Initial commit: Kazeia TTS pipeline on NPU via ExecuTorch 2026-04-09 08:42:11 +02:00
gradle.properties Initial commit: Kazeia TTS pipeline on NPU via ExecuTorch 2026-04-09 08:42:11 +02:00
gradlew Initial commit: Kazeia TTS pipeline on NPU via ExecuTorch 2026-04-09 08:42:11 +02:00
gradlew.bat Initial commit: Kazeia TTS pipeline on NPU via ExecuTorch 2026-04-09 08:42:11 +02:00
settings.gradle.kts Initial commit: Kazeia TTS pipeline on NPU via ExecuTorch 2026-04-09 08:42:11 +02:00