image_service.py: Fetches thumbnail from Wikipedia REST API (free,
no account). Falls back to emoji for abstract words (40+ mapped).
Auto-enrichment: When a learning unit is created, images are
automatically fetched for all words that don't have one yet.
Manual endpoint: POST /api/vocabulary/enrich-images fills images
for existing words without images.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Text is preprocessed before TTS to expand abbreviations like
sth., sb., etc., z.B., usw. so the speaker says the full word.
40+ abbreviations covered (EN + DE). Applied to all languages.
Audio cache cleared to regenerate with correct pronunciation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
/synthesize always used the German model. /synthesize-direct uses
Edge TTS (with language-aware voice selection) and falls back to
Piper with the correct model (Thorsten DE / Lessac EN).
Also cleared audio cache to purge wrongly-generated files.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AudioButton now tries Piper TTS via /api/vocabulary/tts endpoint
first, falls back to Browser Web Speech API if unavailable.
Backend: New GET /api/vocabulary/tts?text=...&lang=de endpoint.
audio_service.py: Fixed presigned URL flow for MinIO download.
This gives the same high-quality voice as the Investor Agent
in the pitch deck (Thorsten DE / Lessac EN, MIT license).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
klausur-service: 183 shims deleted, 26 test files + 8 source files updated
backend-lehrer: 59 shims deleted, main.py + 8 source files updated
All imports now use the new package paths directly.
Zero shims remaining in the entire codebase.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>