Eleos is an offline-first Android assistant for dementia visits. It helps a caregiver notice, rephrase, and remember the small moments that determine whether a conversation stays calm or escalates.
The app is built for the Gemma 4 Good Hackathon around a simple premise: dementia communication support should not require a cloud microphone. Eleos runs session processing on device, uses Gemma 4 only when a turn deserves deeper reasoning, and turns each visit into practical caregiver guidance, a grounded summary, and preserved "precious moments."
During a visit, the caregiver records short turns with two explicit hold-to-record buttons:
- Patient: captures the person living with dementia.
- Caregiver: captures the family member, volunteer, or aide speaking with them.
Eleos then decides whether that turn needs intervention. Most neutral turns are archived quietly. When a turn suggests confusion, distress, correction, testing, invalidation, or caregiver friction, Eleos can surface a short live suggestion such as a gentler rephrase or grounding cue.
After the visit, Eleos generates:
- a concise visit summary grounded in observed turn evidence,
- patient emotional-arc notes,
- caregiver pattern insights,
- precious moments worth preserving,
- memory-book context for future visits.
The target user is not a hospital clinician watching a dashboard. It is the person sitting beside a parent, spouse, or grandparent, trying to say the next sentence better.
Dementia escalation is often shaped by ordinary conversational details: correcting a false belief too directly, asking test-like memory questions, rushing past emotional cues, or missing a familiar memory anchor. A useful assistant must therefore listen to both sides of the exchange.
Eleos focuses on the proximate interaction: what the patient may be experiencing, what the caregiver just said, and what can be changed in the next sentence. The product goal is not diagnosis. It is better communication in the moment and better reflection after the visit.
- The app checks whether the required model pack is installed.
- The caregiver starts a visit from the home screen.
- The caregiver records patient and caregiver turns with separate hold buttons.
- Each turn enters a queued audio pipeline.
- Lightweight triage decides whether full Gemma reasoning is worth spending.
- Fresh live guidance appears only when it is still useful.
- At the end of the visit, Eleos drains pending work and generates a grounded summary.
ELEOS VISIT PIPELINE
App launch
|
+-- ModelRegistry checks required artifacts
| |
| +-- demoOnline: download manifest -> verify bytes/SHA-256 -> install to app files/
| +-- offline: use manually staged developer model paths
|
+-- Home -> Start visit -> foreground microphone service
|
+-- Session coordinator creates/reattaches session
|
+-- Caregiver records a short turn
|
+-- [Patient button] or [Caregiver button]
|
+-- WAV bytes enter queued turn worker
|
+-- MathAudioGate
| +-- reject silence / invalid audio early
|
+-- SenseVoice pass
| +-- transcript-like evidence
| +-- coarse event / emotion signals
|
+-- Wav2Vec2 dimensional affect
| +-- arousal
| +-- dominance
| +-- valence
|
+-- Fused triage packet
|
+-- Mini-Gemma router
|
+-- ROUTE = NO
| |
| +-- skip full live inference
| +-- keep archival evidence for reflection
|
+-- ROUTE = YES
|
+-- Full Gemma 4 audio reasoning
|
+-- parse structured guidance
+-- freshness gate checks timing
+-- show live caregiver cue if still useful
End visit
|
+-- stop accepting new turns
+-- drain queued turn work
+-- run audio-first post-session reflection
+-- generate grounded visit summary
+-- update Summary, Insights, Memory, and Precious Moments surfaces
Eleos uses a budgeted local inference stack:
| Layer | Runtime | Purpose |
|---|---|---|
| Math audio gate | Kotlin/WAV checks | Rejects silence or invalid captures before model work. |
| SenseVoice | sherpa-onnx | Produces transcript-like evidence and coarse speech/event signals. |
| Wav2Vec2 dimensional affect | ONNX Runtime Android | Adds arousal, dominance, and valence evidence for emotional context. |
| Mini Gemma router | LiteRT-LM / Gemma 4 E2B | Decides whether the turn deserves full reasoning. |
| Full Gemma 4 inference | LiteRT-LM / Gemma 4 E2B | Generates live guidance, post-session reflection, and summaries. |
This architecture is deliberately budgeted. Full multimodal reasoning is valuable, but it is not needed for every captured turn. The router keeps neutral turns cheap while preserving Gemma 4 for the moments where language, affect, and caregiver phrasing need a more careful interpretation.
- On-device Gemma 4: Gemma 4 E2B runs through LiteRT-LM from an app-owned
.litertlmartifact. - Selective inference: Fused triage plus a Mini-Gemma router prevents every turn from becoming a full Gemma call.
- Audio-first reflection: Post-session reflection prefers saved turn audio and falls back to text or heuristics when needed.
- Queued turn processing: Turns are processed sequentially and drained before summary finalization, avoiding dropped work at session end.
- Freshness gate: Live guidance is shown only within a short usefulness window, so stale advice does not interrupt later conversation.
- Grounded summaries: Summary prompts explicitly forbid adding memory-book details unless they appeared in the visit evidence.
- Lifecycle hardening: Session start is idempotent and reattach-safe, with lazy Gemma initialization to reduce startup contention.
- Model delivery: Demo builds install model artifacts from a manifest flow with size and SHA-256 verification.
Recent routed-live instrumentation validated the intended path: neutral caregiver clips stayed router-only, while correcting, invalidating, and testing clips routed to full Gemma audio inference with zero parser failures in that run.
Eleos is designed so visit sessions run offline after model setup.
- Session audio processing runs on device.
- Live guidance and generated visit insights run on device.
demoOnlineuses network only for explicit model setup or model update.- Models are installed into app-owned storage.
- Android backup is disabled in the manifest.
- The foreground service is microphone-scoped and not exported.
The app still declares INTERNET for the demoOnline model-pack setup flow. That permission is not required for the live session inference path once models are installed.
Eleos has two distribution flavors:
| Flavor | Purpose | Model source |
|---|---|---|
demoOnline |
Judge/demo flow | Downloads a manifest and required artifacts from the configured Hugging Face model pack URL. |
offline |
Developer/testing flow | Allows manually staged local model files and legacy model paths. |
The judge-oriented release APK is:
.\gradlew.bat :app:assembleDemoOnlineReleaseOutput:
app/build/outputs/apk/demoOnline/release/app-demoOnline-release.apk
For local debug builds:
.\gradlew.bat :app:assembleDemoOnlineDebug
.\gradlew.bat :app:assembleOfflineDebugThe app expects a manifest-driven model pack. The current pack contains:
gemma-4-E2B-it.litertlmsensevoice/model.int8.onnxsensevoice/tokens.txtwav2vec2_dim/model_int8.onnx
The demoOnline flavor reads BuildConfig.MODEL_MANIFEST_URL, downloads required artifacts, verifies size and SHA-256, then promotes them to final internal paths:
files/gemma-4-E2B-it.litertlm
files/sensevoice/model.int8.onnx
files/sensevoice/tokens.txt
files/wav2vec2_dim/model_int8.onnx
See THIRD_PARTY_MODELS.md for model artifact attribution.
app/src/main/java/com/example/eleos/
audio/triage/ SenseVoice, Wav2Vec2, math gate, fusion models
engine/ LiteRT-LM Gemma engine manager
modeldelivery/ Manifest download, verification, model readiness
prompt/ Router, live guidance, and summary prompt contracts
service/ Foreground inference service and session coordinator
session/reflection/ Turn packet spool and post-session reflection
ui/ Compose screens for home, session, summary, insights, memory, moments
data/ DAO contracts, entities, mock runtime database, demo seeding
Complete app module structure
Generated build output under app/build/ is intentionally excluded.
app/
+-- libs
| +-- sherpa-onnx-static-link-onnxruntime-1.12.39.aar
+-- src
| +-- androidTest
| | +-- java
| | +-- com
| | +-- example
| | +-- eleos
| | +-- audio
| | | +-- triage
| | | +-- LiveMiniGemmaRouterSyntheticClipTest.kt
| | | +-- LiveRouterRealClipTest.kt
| | | +-- SenseVoiceLatencyBenchmarkTest.kt
| | | +-- SenseVoiceModelSmokeTest.kt
| | | +-- SenseVoiceRouterRealClipTest.kt
| | | +-- Wav2Vec2LatencyBenchmarkTest.kt
| | | +-- Wav2Vec2ModelSmokeTest.kt
| | +-- ui
| | | +-- home
| | | | +-- HomeScreenTest.kt
| | | +-- insights
| | | | +-- InsightsScreenTest.kt
| | | +-- memory
| | | | +-- MemoryBookScreenTest.kt
| | | +-- moments
| | | | +-- PreciousMomentsScreenTest.kt
| | | +-- onboarding
| | | | +-- OnboardingScreenTest.kt
| | | +-- privacy
| | | | +-- PrivacyDataScreenTest.kt
| | | +-- session
| | | | +-- SessionScreenTest.kt
| | | +-- summary
| | | +-- SessionSummaryScreenTest.kt
| | +-- ExampleInstrumentedTest.kt
| +-- main
| | +-- java
| | | +-- com
| | | +-- example
| | | +-- eleos
| | | +-- audio
| | | | +-- triage
| | | | | +-- AudioTriage.kt
| | | | | +-- AudioTriageAnalyzer.kt
| | | | | +-- AudioTriageLogger.kt
| | | | | +-- DimensionalAffect.kt
| | | | | +-- DimensionalAffectRecognizer.kt
| | | | | +-- MathAudioGate.kt
| | | | | +-- MiniGemmaRouterDecision.kt
| | | | | +-- OrtWav2Vec2DimensionalAffectRecognizer.kt
| | | | | +-- SenseVoiceAudioTriageAnalyzer.kt
| | | | | +-- SenseVoiceModelManager.kt
| | | | | +-- SenseVoiceRecognizer.kt
| | | | | +-- Wav2Vec2DimModelManager.kt
| | | | | +-- WavFloatDecoder.kt
| | | | +-- CaretakerRecorder.kt
| | | | +-- EleosAudioRecorder.kt
| | | | +-- PatientRecorder.kt
| | | | +-- WavUtils.kt
| | | +-- config
| | | | +-- EleosConfig.kt
| | | +-- data
| | | | +-- demo
| | | | | +-- DemoDataSeeder.kt
| | | | +-- mock
| | | | | +-- MockEleosDatabase.kt
| | | | +-- Daos.kt
| | | | +-- EleosDatabase.kt
| | | | +-- Entities.kt
| | | +-- di
| | | | +-- InferenceModule.kt
| | | | +-- MockDataModule.kt
| | | | +-- ModelDeliveryModule.kt
| | | | +-- ServiceBindingModule.kt
| | | | +-- TriageModule.kt
| | | | +-- TtsModule.kt
| | | +-- domain
| | | | +-- ClinicalEnums.kt
| | | +-- engine
| | | | +-- EleosEngineManager.kt
| | | +-- insights
| | | | +-- DetailedInsightsContract.kt
| | | | +-- DetailedInsightsContractMapper.kt
| | | +-- modeldelivery
| | | | +-- ModelArtifact.kt
| | | | +-- ModelDeliveryLogger.kt
| | | | +-- ModelDeliveryState.kt
| | | | +-- ModelDownloadManager.kt
| | | | +-- ModelDownloadWorker.kt
| | | | +-- ModelInstallStore.kt
| | | | +-- ModelPackManifest.kt
| | | | +-- ModelPathResolver.kt
| | | | +-- ModelReadiness.kt
| | | | +-- ModelReadinessReport.kt
| | | | +-- ModelRegistry.kt
| | | | +-- Sha256Verifier.kt
| | | +-- prompt
| | | | +-- LiveRouterEvidence.kt
| | | | +-- LiveRouterSystemPrompts.kt
| | | | +-- ModelOutputParser.kt
| | | | +-- PromptBuilder.kt
| | | +-- service
| | | | +-- ConversationEngine.kt
| | | | +-- EleosInferenceService.kt
| | | | +-- EleosSessionCoordinator.kt
| | | | +-- LiveInterventionRouter.kt
| | | | +-- ServiceEvents.kt
| | | | +-- SessionState.kt
| | | +-- session
| | | | +-- reflection
| | | | +-- PostSessionReflectionProcessor.kt
| | | | +-- PostSessionReflectionResult.kt
| | | | +-- TurnPacket.kt
| | | | +-- TurnPacketSpool.kt
| | | | +-- VisitFinalizationEstimator.kt
| | | +-- tts
| | | | +-- EleosTtsEngine.kt
| | | | +-- MockEleosTtsEngine.kt
| | | +-- ui
| | | | +-- components
| | | | | +-- EleosConfirmationDialog.kt
| | | | | +-- EleosEmptyState.kt
| | | | | +-- EleosIllustration.kt
| | | | | +-- EleosMotion.kt
| | | | | +-- EleosPatientAvatar.kt
| | | | | +-- EleosPressableCard.kt
| | | | | +-- EleosPrimaryButton.kt
| | | | | +-- EleosPrivacyPromise.kt
| | | | | +-- EleosSectionHeader.kt
| | | | | +-- EleosTopBar.kt
| | | | +-- demo
| | | | | +-- DemoEleosContent.kt
| | | | +-- home
| | | | | +-- components
| | | | | | +-- HomeLastVisitCard.kt
| | | | | | +-- HomeMemoryHero.kt
| | | | | | +-- HomeMemoryPreview.kt
| | | | | | +-- HomePatientHeader.kt
| | | | | | +-- HomePreciousMomentPreview.kt
| | | | | | +-- HomeQuickActions.kt
| | | | | | +-- StartVisitCard.kt
| | | | | +-- HomeRoute.kt
| | | | | +-- HomeScreen.kt
| | | | | +-- HomeUiState.kt
| | | | | +-- HomeViewModel.kt
| | | | +-- insights
| | | | | +-- components
| | | | | | +-- CaretakerPatternsPanel.kt
| | | | | | +-- EmotionalArcChart.kt
| | | | | | +-- InsightsTabBar.kt
| | | | | | +-- InsightTrendLine.kt
| | | | | | +-- JourneyInsightsPanel.kt
| | | | | | +-- WhatHelpsPanel.kt
| | | | | +-- InsightsPreviews.kt
| | | | | +-- InsightsRoute.kt
| | | | | +-- InsightsScreen.kt
| | | | | +-- InsightsUiState.kt
| | | | | +-- InsightsViewModel.kt
| | | | +-- memory
| | | | | +-- components
| | | | | | +-- MemoryBookHero.kt
| | | | | | +-- MemoryEntryCard.kt
| | | | | | +-- MemoryEntryEditorSheet.kt
| | | | | | +-- MemorySuggestionCard.kt
| | | | | | +-- PatientProfileCard.kt
| | | | | | +-- SensitivitySelector.kt
| | | | | +-- MemoryBookPreviews.kt
| | | | | +-- MemoryBookRoute.kt
| | | | | +-- MemoryBookScreen.kt
| | | | | +-- MemoryBookUiState.kt
| | | | | +-- MemoryBookViewModel.kt
| | | | +-- model
| | | | | +-- EmotionalArcPointUiState.kt
| | | | | +-- MemoryEntryUiState.kt
| | | | | +-- PatientHeaderUiState.kt
| | | | | +-- PreciousMomentUiState.kt
| | | | | +-- VisitSummaryUiState.kt
| | | | +-- modelsetup
| | | | | +-- ModelSetupRoute.kt
| | | | | +-- ModelSetupScreen.kt
| | | | | +-- ModelSetupUiState.kt
| | | | | +-- ModelSetupViewModel.kt
| | | | +-- moments
| | | | | +-- components
| | | | | | +-- PreciousMomentCard.kt
| | | | | +-- HumanTimestampFormatter.kt
| | | | | +-- PreciousMomentsPreviews.kt
| | | | | +-- PreciousMomentsRoute.kt
| | | | | +-- PreciousMomentsScreen.kt
| | | | | +-- PreciousMomentsUiState.kt
| | | | | +-- PreciousMomentsViewModel.kt
| | | | +-- navigation
| | | | | +-- EleosApp.kt
| | | | | +-- EleosAppViewModel.kt
| | | | | +-- EleosDestination.kt
| | | | | +-- EleosNavHost.kt
| | | | | +-- EleosRouteDecider.kt
| | | | +-- onboarding
| | | | | +-- components
| | | | | | +-- OnboardingProgressDots.kt
| | | | | | +-- OnboardingTwoButtonIllustration.kt
| | | | | +-- OnboardingPreviews.kt
| | | | | +-- OnboardingRoute.kt
| | | | | +-- OnboardingScreen.kt
| | | | | +-- OnboardingUiState.kt
| | | | | +-- OnboardingViewModel.kt
| | | | +-- privacy
| | | | | +-- PrivacyDataRoute.kt
| | | | | +-- PrivacyDataScreen.kt
| | | | | +-- PrivacyDataUiState.kt
| | | | | +-- PrivacyDataViewModel.kt
| | | | +-- reflow
| | | | +-- session
| | | | | +-- components
| | | | | | +-- DistressBanner.kt
| | | | | | +-- EndVisitDialog.kt
| | | | | | +-- GuidanceCard.kt
| | | | | | +-- HoldButton.kt
| | | | | | +-- PreciousMomentOverlay.kt
| | | | | | +-- SavingOverlay.kt
| | | | | | +-- StatusDot.kt
| | | | | +-- GuidanceFreshnessPolicy.kt
| | | | | +-- SessionRoute.kt
| | | | | +-- SessionScreen.kt
| | | | | +-- SessionScreenPreviews.kt
| | | | | +-- SessionUiState.kt
| | | | | +-- SessionViewModel.kt
| | | | +-- settings
| | | | +-- slideshow
| | | | +-- summary
| | | | | +-- components
| | | | | | +-- SummaryCaretakerSection.kt
| | | | | | +-- SummaryOpeningLine.kt
| | | | | | +-- SummaryPatientNarrativeSection.kt
| | | | | | +-- SummaryPreciousMomentsSection.kt
| | | | | | +-- SummaryRetryBanner.kt
| | | | | | +-- SummaryVisitShape.kt
| | | | | +-- SessionSummaryPreviews.kt
| | | | | +-- SessionSummaryRoute.kt
| | | | | +-- SessionSummaryScreen.kt
| | | | | +-- SessionSummaryUiState.kt
| | | | | +-- SessionSummaryViewModel.kt
| | | | +-- theme
| | | | | +-- Color.kt
| | | | | +-- Theme.kt
| | | | | +-- Type.kt
| | | | +-- transform
| | | +-- EleosApplication.kt
| | | +-- MainActivity.kt
| | +-- res
| | | +-- drawable
| | | | +-- avatar_1.xml
| | | | +-- avatar_10.xml
| | | | +-- avatar_11.xml
| | | | +-- avatar_12.xml
| | | | +-- avatar_13.xml
| | | | +-- avatar_14.xml
| | | | +-- avatar_15.xml
| | | | +-- avatar_16.xml
| | | | +-- avatar_2.xml
| | | | +-- avatar_3.xml
| | | | +-- avatar_4.xml
| | | | +-- avatar_5.xml
| | | | +-- avatar_6.xml
| | | | +-- avatar_7.xml
| | | | +-- avatar_8.xml
| | | | +-- avatar_9.xml
| | | | +-- ic_camera_black_24dp.xml
| | | | +-- ic_gallery_black_24dp.xml
| | | | +-- ic_launcher_background.xml
| | | | +-- ic_launcher_foreground_brand.png
| | | | +-- ic_launcher_foreground_launcher.png
| | | | +-- ic_launcher_foreground.xml
| | | | +-- ic_settings_black_24dp.xml
| | | | +-- ic_slideshow_black_24dp.xml
| | | | +-- side_nav_bar.xml
| | | +-- drawable-nodpi
| | | | +-- illus_brand_eleos_mark.png
| | | | +-- illus_home_memory_shelf.png
| | | | +-- illus_home_precious_moment_photo.png
| | | | +-- illus_home_start_visit_table_phone.png
| | | | +-- illus_onboarding_final.png
| | | | +-- illus_onboarding_initial.png
| | | | +-- illus_onboarding_mic.png
| | | | +-- illus_onboarding_privacy.png
| | | +-- font
| | | | +-- lora_italic.ttf
| | | | +-- lora_regular.ttf
| | | | +-- nunito_medium.ttf
| | | | +-- nunito_regular.ttf
| | | | +-- nunito_semibold.ttf
| | | +-- layout
| | | +-- layout-w1240dp
| | | +-- layout-w600dp
| | | +-- menu
| | | +-- mipmap-anydpi
| | | | +-- ic_launcher_round.xml
| | | | +-- ic_launcher.xml
| | | +-- mipmap-hdpi
| | | | +-- ic_launcher_round.webp
| | | | +-- ic_launcher.webp
| | | +-- mipmap-mdpi
| | | | +-- ic_launcher_round.webp
| | | | +-- ic_launcher.webp
| | | +-- mipmap-xhdpi
| | | | +-- ic_launcher_round.webp
| | | | +-- ic_launcher.webp
| | | +-- mipmap-xxhdpi
| | | | +-- ic_launcher_round.webp
| | | | +-- ic_launcher.webp
| | | +-- mipmap-xxxhdpi
| | | | +-- ic_launcher_round.webp
| | | | +-- ic_launcher.webp
| | | +-- navigation
| | | +-- values
| | | | +-- colors.xml
| | | | +-- strings.xml
| | | | +-- themes.xml
| | | +-- values-night
| | | | +-- themes.xml
| | | +-- values-w600dp
| | | +-- values-w936dp
| | | +-- xml
| | | +-- backup_rules.xml
| | | +-- data_extraction_rules.xml
| | +-- AndroidManifest.xml
| +-- test
| +-- java
| +-- com
| +-- example
| +-- eleos
| +-- audio
| | +-- triage
| | | +-- AudioTriageMappingTest.kt
| | | +-- DimensionalAffectOutputOrderTest.kt
| | | +-- MathAudioGateTest.kt
| | | +-- SenseVoiceAudioTriageAnalyzerTest.kt
| | | +-- WavFloatDecoderTest.kt
| | +-- WavUtilsTest.kt
| +-- data
| | +-- demo
| | +-- DemoDataSeederTest.kt
| +-- insights
| | +-- DetailedInsightsContractMapperTest.kt
| +-- prompt
| | +-- ModelOutputParserTest.kt
| | +-- PromptBuilderTriageTest.kt
| +-- service
| | +-- EleosSessionCoordinatorTest.kt
| | +-- SessionFinalizedEventTest.kt
| +-- session
| | +-- reflection
| | +-- PostSessionReflectionProcessorTest.kt
| | +-- TurnPacketSpoolTest.kt
| | +-- VisitFinalizationEstimatorTest.kt
| +-- ui
| | +-- demo
| | | +-- DemoEleosContentTest.kt
| | +-- insights
| | | +-- InsightsViewModelTest.kt
| | +-- memory
| | | +-- MemoryBookViewModelTest.kt
| | +-- moments
| | | +-- HumanTimestampFormatterTest.kt
| | +-- navigation
| | | +-- EleosDestinationTest.kt
| | | +-- EleosRouteDeciderTest.kt
| | +-- session
| | +-- GuidanceFreshnessPolicyTest.kt
| +-- ExampleUnitTest.kt
+-- .gitignore
+-- build.gradle.kts
+-- proguard-rules.pro
Useful build check:
.\gradlew.bat :app:assembleDemoOnlineDebugCore unit test pass:
.\gradlew.bat :app:testDemoOnlineDebugUnitTestRepresentative on-device model smoke tests:
adb shell am instrument -w -e class com.example.eleos.audio.triage.SenseVoiceModelSmokeTest com.example.eleos.test/androidx.test.runner.AndroidJUnitRunner
adb shell am instrument -w -e class com.example.eleos.audio.triage.Wav2Vec2ModelSmokeTest com.example.eleos.test/androidx.test.runner.AndroidJUnitRunner
adb shell am instrument -w -e class com.example.eleos.audio.triage.LiveMiniGemmaRouterSyntheticClipTest com.example.eleos.test/androidx.test.runner.AndroidJUnitRunnerRelevant test coverage includes:
- router output parsing,
- prompt grounding,
- audio triage mapping,
- Wav2Vec2 output-order validation,
- guidance freshness,
- session coordinator behavior,
- post-session reflection,
- turn-packet spooling,
- demo data seeding,
- home, session, summary, insights, memory, moments, privacy, and onboarding screens.
Implemented:
- foreground microphone inference service,
- dual patient/caregiver audio capture,
- SenseVoice plus Wav2Vec2 triage fusion,
- Mini-Gemma live router,
- full Gemma audio inference on routed turns,
- turn queue and drain-before-finalize behavior,
- audio-first post-session reflection with fallback paths,
- summary, insights, memory book, and precious moments surfaces,
- manifest-based demo model installation.
Known boundaries:
- The current app runtime is backed by
MockEleosDatabasethrough DAO-shaped interfaces; production persistence should swap in encrypted Room/SQLCipher storage. - TTS is mock-backed in this phase; offline Piper-style TTS is planned.
- Prompt thresholds still need final calibration on more real dementia-care audio.
- Long repeated-session stress testing remains part of final demo hardening.
This project README and competition submission materials are licensed under the Creative Commons Attribution 4.0 International License (CC BY 4.0).