French - kinyarwanda conversation app
# Tuganire — French ↔ Kinyarwanda Voice Translator
> **Tuganire** is a conversational translation app for French ↔ Kinyarwanda, designed by a native Rwandan speaker who understands the cultural and linguistic nuances that Google Translate ignores.
**"Tuganire"** means *"Let's talk"* in Kinyarwanda.
## Why Tuganire?
When a French-speaking traveller visits Rwanda, existing tools fall short:
- Google Translate Live Conversation does not support Kinyarwanda in real time
- Mainstream TTS synthesis for Kinyarwanda is absent or unusable
- GPT-4o and Claude produce structurally flawed translations across 5 documented grammatical error categories
- No tool respects Rwandan cultural codes (politeness registers, market negotiation, code-switching)
Tuganire combines a GPT-4o LLM for base translation, a native post-processing layer (5 correction rules + a golden dictionary), and purpose-built voice models (Whisper STT + Proto.cx / MMS-TTS for Kinyarwanda audio).
## Architecture
Three components work together:
| Component | Technology | Role |
|-----------|-----------|------|
| **Backend** | Spring Boot 4.0 + Java 21 + Spring AI 2.0 | REST/WebSocket API, translation pipeline, TTS/STT orchestration |
| **TTS server** | Python FastAPI + `facebook/mms-tts-kin` / `facebook/mms-tts-fra` | Kinyarwanda and French voice synthesis on a GPU |
| **Web POC** | Thymeleaf + Tailwind CSS v4 + HTMX + Alpine.js | Browser demo, community validation |
| **Android** (Phase 2) | Kotlin Jetpack Compose | Mobile app (not in this repo) |
The backend is the single source of truth: it serves the web POC and the future Android app from the same REST/WebSocket endpoints.
Full architecture details: docs/ARCHI.md
Product requirements: docs/PRD.md
### Backend package structure
```
com.tuganire/
├── conversation/ ConversationService, WebSocket handler, ConversationEvent (sealed interface)
├── translation/ TranslationService, FrenchNormalizer, GoldenDictionaryService
├── llm/ LlmP …