Manual test reported the eSpeak NG dictation voice as unintelligible.
Formant synthesis is inherently mechanical; slowing it down doesn't
fix that. Switched tools/generate_dictation_audio.py to piper-tts
(fr_FR-siwis-medium neural voice, MIT/CC-BY 4.0, attribution in
assets/CREDITS.md). The voice model (~60MB) downloads once on demand
into the untracked .cache/piper-voices/, never at game runtime.
Adds piper-tts to tools/setup.sh's venv and a pyrightconfig.json
pointing pyright at .venv, needed once tools/ imports a real
third-party package (`make lint` was silently checking against the
wrong interpreter before).
Regenerated ce1_accord_adjectif_dictee_01.ogg with the new voice.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Manual testing confirmed the "La clairière de l'écho" dictée mission
was unplayable: no audio file existed yet (decisions.md point 8), so
there was nothing to listen to before transcribing the sentence.
Adds tools/generate_dictation_audio.py (offline eSpeak NG synthesis +
ffmpeg encoding to Ogg Vorbis, exposed as `make
generate-dictation-audio`) and uses it to generate
ce1_accord_adjectif_dictee_01.ogg. A new headless test
(tests/data/test_dictation_audio.gd) guards against future dictées
being added without regenerating their audio.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
export_presets.cfg is hand-written (no editor GUI available here): a
minimal preset per platform (name, platform, path, x86_64
architecture) is enough, since Godot fills every other option from
its platform defaults. tools/setup.sh now also fetches the matching
export templates (~1.2GB, cached outside the repo like the Godot
binary itself) -- note the directory it unpacks into uses a dot
before "stable" while .godot-version and the download URLs use a
hyphen, two different spellings of the same version that are easy to
conflate.
Both make export-linux and make export-windows now actually run and
produce a working package; tests/ and addons/gut/ are excluded from
the exported .pck (124KB vs 1.5MB before -- a dev-only dependency has
no business shipping to a child's machine). The Linux binary was
smoke-tested headless and boots cleanly; the Windows .exe could only
be confirmed as a valid PE32+ binary, since no Windows machine or
Wine is available in this environment -- flagged in
docs/testing/manual-checklist.md rather than claimed as verified.
This closes out every step in the launch prompt's "Ordre de
construction." README status lines updated to reflect the first
playable prototype rather than a bare skeleton.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Introduces a generic JSON-Schema-subset validator in GDScript
(scripts/data/schema_validator.gd) used both by `make validate-data`
and, later, by ExerciseEngine at load time, plus semantic_checks.gd
for cross-field constraints a schema can't express (answer index
bounds, at least one faulty token in sentence correction, word count
matching between a dictation's target_text and its annotations).
Schemas cover rule, exercise (dispatched per type: multiple_choice,
sentence_correction), dictation, curriculum, and save (save.schema.json
is not yet wired into validate-data; saves live in user://, handled
at the Profiles/Saves step).
First draft content for the CE1 "accord_adjectif" rule (one rule, two
multiple-choice exercises, one sentence correction, one dictation,
one curriculum entry) exercises the full pipeline end to end and
seeds docs/review/content-review.md, regenerated by the new
tools/generate_content_review.py (`make content-review`).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Pins Godot 4.6.3-stable and GUT 9.6.0 (9.6.1+ reference
AccessibilityServer, unavailable in 4.6.3) via tools/setup.sh. Wires
make check (gdlint + gdformat config for 4-space indent, headless
GUT run, and a JSON well-formedness check ahead of real schema
validation). Seven autoload stubs match the architecture in the
cahier des charges; real logic lands with the following steps.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>