Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .github/workflows/generate-tts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,12 @@ jobs:
env:
MISTRAL_API_KEY: ${{ secrets.MISTRAL_API_KEY }}

# if: always() — on commit même si la génération a échoué sur quelques
# fichiers (ex. rate limit résiduel). Le script est idempotent : un
# re-run ne régénère que les manquants, donc la progression n'est jamais
# perdue entre deux exécutions.
- name: Commit and push new MP3s
if: always()
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
Expand Down
17 changes: 16 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,19 @@ App d'apprentissage des tables de multiplication (PWA, sans backend).
reste en `waiting` jusqu'à ce que la page envoie `SKIP_WAITING` via
`pwa-register.js`/`setBusy` quand `App` est sur un écran "safe"
(`home` uniquement). Évite tout reload mid-séance.
- **i18n (fr/en)** : langue d'interface **globale** (pas par profil),
persistée dans `localStorage` sous `multiplix-lang`, défaut = langue du
navigateur. Cœur dans `src/i18n/lang.ts` (`useLang`, `useStrings` pour React ;
`getLang`/`pickStrings` pour le code hors-React comme `lib/badges`,
`lib/strategies`, `lib/changelog`) ; le `LangProvider` est dans
`src/i18n/LangProvider.tsx`. Chaque domaine a son
module de strings (`src/i18n/*.ts`) exposant un hook `useXStrings()` basé sur
une table `{ fr, en }` typée. La landing statique de `index.html` est
bilingue via des `<span data-lang>` togglés par CSS sur `html[lang]` (langue
fixée avant le 1er paint par l'inline script du `<head>`). Voix : MP3 par
langue sous `public/audio/tts/<lang>/` (cf. `useTTS`), reconnaissance vocale
et parsing des nombres parlés branchés sur la langue (`lib/parseSpokenNumber`).
Les specs publiques et le guide utilisateur restent FR pour l'instant.
- localStorage pour la persistance (pas de backend).
- Déploiement : GitHub Pages via GitHub Actions (`BASE=/`).
- Node minimum : 22.12+ (CI utilise Node 22).
Expand Down Expand Up @@ -79,7 +92,9 @@ Un guide HTML avec captures d'écran est généré par `npm run user-guide` (scr

Les voix sont pré-générées via `scripts/generate-tts.mjs` (Mistral Voxtral) et checked-in dans `public/audio/tts/`. Le script est idempotent : il ne régénère que les fichiers manquants.

**Quand ajouter un MP3** : ajouter une entrée dans `scripts/generate-tts.mjs` avec une nouvelle `key` et le `text` correspondant, puis générer.
**Multilingue** : un sous-dossier par langue — `public/audio/tts/fr/` et `public/audio/tts/en/` (mêmes clés, chemin `audio/tts/<lang>/<key>.mp3` résolu par `useTTS` selon la langue). `generate-tts.mjs` génère les deux langues par défaut ; restreindre avec `TTS_LANGS=en`. Chaque langue a sa voix Voxtral (constantes `VOICE_ID_FR`/`VOICE_ID_EN` dans le script) ; la voix anglaise est surchargeable par `MISTRAL_VOICE_ID_EN`.

**Quand ajouter un MP3** : ajouter une entrée dans `buildEntriesFr()` ET `buildEntriesEn()` de `scripts/generate-tts.mjs` avec la même `key`, puis générer.

**Comment générer** (la clé API n'est jamais en clair dans le repo) :

Expand Down
130 changes: 107 additions & 23 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@
déjà cliqué : l'app va monter directement sur Home/Welcome, pas la
landing. On masque la landing statique pour éviter qu'elle flash. */
html.skip-static-landing #static-landing { display: none; }
/* Texte bilingue de la landing : chaque chaîne existe en deux éléments
(data-lang fr/en). On affiche celui de la langue de <html lang>, fixée
avant le 1er paint par le script inline du <head> — donc pas de flash.
`revert` rend à l'élément son display naturel (span inline, li
list-item), pour pouvoir taguer aussi bien des spans que des <li>. */
[data-lang="en"] { display: none; }
html[lang="en"] [data-lang="fr"] { display: none; }
html[lang="en"] [data-lang="en"] { display: revert; }
</style>

<!-- Décide AVANT le 1er paint si la landing statique doit être affichée
Expand All @@ -55,6 +63,23 @@
if (standalone || profile || skipped || hasImport) {
document.documentElement.classList.add('skip-static-landing');
}
// Langue de l'interface (globale) : préférence explicite stockée,
// sinon langue du navigateur. ⚠ Même clé/logique que detectLang() dans
// src/i18n/lang.ts — garder les deux en phase. Fixé AVANT le 1er paint
// pour que la landing statique (texte dual fr/en piloté par CSS sur
// html[lang]) s'affiche directement dans la bonne langue, sans flash.
var lang = 'fr';
try {
var stored = localStorage.getItem('multiplix-lang');
if (stored === 'fr' || stored === 'en') lang = stored;
else if ((navigator.language || '').toLowerCase().indexOf('en') === 0) lang = 'en';
} catch (e) {}
document.documentElement.lang = lang;
if (lang === 'en') {
document.title = 'Tablito — Practise the times tables (free, no ads)';
var desc = document.querySelector('meta[name="description"]');
if (desc) desc.setAttribute('content', 'Free, ad-free app to learn the multiplication tables gently, from age 7. Leitner method, no grades or rankings, works offline. Data stays on the device.');
}
var ua = navigator.userAgent;
var isIOS = /iPhone|iPod|iPad/.test(ua)
|| (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);
Expand Down Expand Up @@ -176,11 +201,23 @@
</div>
</div>
<h1 class="landing-title">Tablito</h1>
<p class="landing-tagline">Apprendre les tables de multiplication, en douceur.</p>
<p class="landing-tagline">
<span data-lang="fr">Apprendre les tables de multiplication, en douceur.</span>
<span data-lang="en">Learn the times tables, gently.</span>
</p>
<ul class="landing-badges">
<li class="landing-badge">100&nbsp;% gratuit</li>
<li class="landing-badge">dès le CE1&nbsp;· 7–11 ans</li>
<li class="landing-badge">tables &amp; division</li>
<li class="landing-badge">
<span data-lang="fr">100&nbsp;% gratuit</span>
<span data-lang="en">100&nbsp;% free</span>
</li>
<li class="landing-badge">
<span data-lang="fr">dès le CE1&nbsp;· 7–11 ans</span>
<span data-lang="en">ages 7–11</span>
</li>
<li class="landing-badge">
<span data-lang="fr">tables &amp; division</span>
<span data-lang="en">tables &amp; division</span>
</li>
</ul>
</div>

Expand All @@ -189,27 +226,42 @@ <h1 class="landing-title">Tablito</h1>
<span class="landing-principle-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" width="22" height="22"><path d="M3 12a9 9 0 1 0 3-6.7M3 4v5h5" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" /></svg>
</span>
<span><strong>Méthode Leitner.</strong> Chaque multiplication revient juste avant que l'enfant l'oublie — la mémoire s'ancre durablement.</span>
<span data-lang="fr"><strong>Méthode Leitner.</strong> Chaque multiplication revient juste avant que l'enfant l'oublie — la mémoire s'ancre durablement.</span>
<span data-lang="en"><strong>Leitner method.</strong> Each multiplication comes back right before your child forgets it — memory sticks for good.</span>
</li>
<li>
<span class="landing-principle-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" width="22" height="22"><path d="M12 21s-7-4.5-7-11a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 6.5-7 11-7 11z" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" /></svg>
</span>
<span><strong>Pas de notes, pas de classement.</strong> On célèbre le progrès, pas la performance. Aucun message négatif.</span>
<span data-lang="fr"><strong>Pas de notes, pas de classement.</strong> On célèbre le progrès, pas la performance. Aucun message négatif.</span>
<span data-lang="en"><strong>No grades, no rankings.</strong> We celebrate progress, not performance. Never a negative message.</span>
</li>
<li>
<span class="landing-principle-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" width="22" height="22"><circle cx="12" cy="12" r="9" fill="none" stroke="currentColor" stroke-width="1.8" /><path d="M8 12l3 3 5-6" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" /></svg>
</span>
<span><strong>Hors-ligne, sans pub, sans compte.</strong> Une fois installé, plus besoin de connexion. Les données restent sur l'appareil.</span>
<span data-lang="fr"><strong>Hors-ligne, sans pub, sans compte.</strong> Une fois installé, plus besoin de connexion. Les données restent sur l'appareil.</span>
<span data-lang="en"><strong>Offline, no ads, no account.</strong> Once installed, no connection needed. Data stays on the device.</span>
</li>
</ul>

<div class="landing-cta">
<button type="button" class="landing-install-btn">Installer Tablito</button>
<p class="landing-install-hint">L'app s'installera comme n'importe quelle autre application.</p>
<button type="button" class="landing-skip-btn">Essayer dans le navigateur</button>
<p class="landing-skip-warning">Attention&nbsp;: si tu installes Tablito plus tard sur iPhone ou iPad, la progression du navigateur ne sera pas conservée.</p>
<button type="button" class="landing-install-btn">
<span data-lang="fr">Installer Tablito</span>
<span data-lang="en">Install Tablito</span>
</button>
<p class="landing-install-hint">
<span data-lang="fr">L'app s'installera comme n'importe quelle autre application.</span>
<span data-lang="en">The app installs just like any other app.</span>
</p>
<button type="button" class="landing-skip-btn">
<span data-lang="fr">Essayer dans le navigateur</span>
<span data-lang="en">Try it in the browser</span>
</button>
<p class="landing-skip-warning">
<span data-lang="fr">Attention&nbsp;: si tu installes Tablito plus tard sur iPhone ou iPad, la progression du navigateur ne sera pas conservée.</span>
<span data-lang="en">Heads up: if you install Tablito later on an iPhone or iPad, your browser progress won't carry over.</span>
</p>
</div>

<!-- Instructions iOS, montrées au clic "Installer" si pas de prompt natif.
Expand All @@ -219,20 +271,37 @@ <h1 class="landing-title">Tablito</h1>
tout ça n'est détectable côté web. Un repli ••• couvre le cas où le
partage est replié dans le menu (Safari compact). -->
<div id="ios-install-help" class="install-help">
<h2>Installer sur iPhone / iPad</h2>
<h2>
<span data-lang="fr">Installer sur iPhone / iPad</span>
<span data-lang="en">Install on iPhone / iPad</span>
</h2>
<!-- Préambule montré uniquement hors Safari (cf. html.ios-other-browser) :
en Safari, inutile de dire au visiteur d'ouvrir Safari. -->
<p class="ios-open-in-safari">Tu es dans Chrome ou Firefox&nbsp;? Ouvre d'abord cette page dans <strong>Safari</strong> (le menu de ton navigateur propose <strong>« Ouvrir dans Safari »</strong>), puis&nbsp;:</p>
<p class="ios-intro">Ajoute l'app à ton écran d'accueil en 3 touches&nbsp;:</p>
<p class="ios-open-in-safari">
<span data-lang="fr">Tu es dans Chrome ou Firefox ? Ouvre d'abord cette page dans <strong>Safari</strong> (le menu de ton navigateur propose <strong>« Ouvrir dans Safari »</strong>), puis :</span>
<span data-lang="en">In Chrome or Firefox? First open this page in <strong>Safari</strong> (your browser menu has <strong>“Open in Safari”</strong>), then:</span>
</p>
<p class="ios-intro">
<span data-lang="fr">Ajoute l'app à ton écran d'accueil en 3 touches :</span>
<span data-lang="en">Add the app to your Home Screen in 3 taps:</span>
</p>
<ol>
<li>
<li data-lang="fr">
Touche l'icône <strong>Partager</strong>
<span class="ios-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 14V4"/><path d="M8.5 7.5 12 4l3.5 3.5"/><path d="M7 11H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2h-1"/></svg></span>
dans la barre d'outils de Safari (<strong>en bas</strong> sur iPhone, <strong>en haut</strong> sur iPad).
<span class="ios-step-hint">Tu ne la vois pas&nbsp;? Touche d'abord <strong>•••</strong>, puis <strong>« Partager »</strong>.</span>
<span class="ios-step-hint">Tu ne la vois pas ? Touche d'abord <strong>•••</strong>, puis <strong>« Partager »</strong>.</span>
</li>
<li>Fais défiler, puis choisis <strong>« Sur l'écran d'accueil »</strong> <span class="ios-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="4" y="4" width="16" height="16" rx="4.5"/><path d="M12 8.5v7M8.5 12h7"/></svg></span>.</li>
<li>Touche <strong>« Ajouter »</strong> en haut à droite. L'icône Tablito apparaît sur ton écran&nbsp;!</li>
<li data-lang="en">
Tap the <strong>Share</strong> icon
<span class="ios-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 14V4"/><path d="M8.5 7.5 12 4l3.5 3.5"/><path d="M7 11H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-6a2 2 0 0 0-2-2h-1"/></svg></span>
in Safari's toolbar (<strong>at the bottom</strong> on iPhone, <strong>at the top</strong> on iPad).
<span class="ios-step-hint">Can't see it? Tap <strong>•••</strong> first, then <strong>“Share”</strong>.</span>
</li>
<li data-lang="fr">Fais défiler, puis choisis <strong>« Sur l'écran d'accueil »</strong> <span class="ios-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="4" y="4" width="16" height="16" rx="4.5"/><path d="M12 8.5v7M8.5 12h7"/></svg></span>.</li>
<li data-lang="en">Scroll down, then choose <strong>“Add to Home Screen”</strong> <span class="ios-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="4" y="4" width="16" height="16" rx="4.5"/><path d="M12 8.5v7M8.5 12h7"/></svg></span>.</li>
<li data-lang="fr">Touche <strong>« Ajouter »</strong> en haut à droite. L'icône Tablito apparaît sur ton écran !</li>
<li data-lang="en">Tap <strong>“Add”</strong> at the top right. The Tablito icon appears on your screen!</li>
</ol>
</div>

Expand All @@ -241,13 +310,28 @@ <h2>Installer sur iPhone / iPad</h2>
iOS. Volontairement court et honnête : sur ordinateur l'install est
un bonus, le vrai CTA utile est "Essayer dans le navigateur". -->
<div id="desktop-install-help" class="install-help">
<h2>Installer sur ordinateur</h2>
<p>Selon ton navigateur&nbsp;:</p>
<h2>
<span data-lang="fr">Installer sur ordinateur</span>
<span data-lang="en">Install on desktop</span>
</h2>
<p>
<span data-lang="fr">Selon ton navigateur&nbsp;:</span>
<span data-lang="en">Depending on your browser:</span>
</p>
<ol>
<li>Avec <strong>Chrome</strong> ou <strong>Edge</strong>, une icône d'installation apparaît à droite de la barre d'adresse — clique dessus.</li>
<li>Sur <strong>Safari (Mac)</strong>, ouvre le menu <strong>Fichier</strong> puis <strong>« Ajouter au Dock »</strong>.</li>
<li>
<span data-lang="fr">Avec <strong>Chrome</strong> ou <strong>Edge</strong>, une icône d'installation apparaît à droite de la barre d'adresse — clique dessus.</span>
<span data-lang="en">In <strong>Chrome</strong> or <strong>Edge</strong>, an install icon appears at the right of the address bar — click it.</span>
</li>
<li>
<span data-lang="fr">Sur <strong>Safari (Mac)</strong>, ouvre le menu <strong>Fichier</strong> puis <strong>« Ajouter au Dock »</strong>.</span>
<span data-lang="en">In <strong>Safari (Mac)</strong>, open the <strong>File</strong> menu, then <strong>“Add to Dock”</strong>.</span>
</li>
</ol>
<p class="install-note">Pas d'installation possible&nbsp;? Clique sur <strong>« Essayer dans le navigateur »</strong> ci-dessus pour commencer tout de suite.</p>
<p class="install-note">
<span data-lang="fr">Pas d'installation possible&nbsp;? Clique sur <strong>« Essayer dans le navigateur »</strong> ci-dessus pour commencer tout de suite.</span>
<span data-lang="en">Can't install? Click <strong>“Try it in the browser”</strong> above to start right away.</span>
</p>
</div>
</div>
</div>
Expand Down
Binary file added public/audio/tts/en/comm-2-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-2-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-2-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-2-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-2-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-2-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-2-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-3-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-3-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-3-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-3-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-3-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-3-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-4-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-4-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-4-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-4-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-4-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-5-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-5-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-5-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-5-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-6-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-6-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-6-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-7-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-7-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/comm-8-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-2-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-2-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-2-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-2-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-2-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-2-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-2-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-2-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-3-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-3-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-3-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-3-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-3-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-3-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-3-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-4-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-4-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-4-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-4-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-4-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-4-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-5-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-5-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-5-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-5-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-5-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-6-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-6-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-6-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-6-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-7-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-7-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-7-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-8-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-8-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/intro-9-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-10-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-10-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-12-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-12-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-12-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-12-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-14-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-14-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-15-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-15-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-16-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-16-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-16-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-18-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-18-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-18-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-18-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-20-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-20-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-21-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-21-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-24-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-24-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-24-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-24-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-25-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-27-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-27-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-28-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-28-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-30-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-30-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-32-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-32-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-35-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-35-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-36-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-36-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-36-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-4-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-40-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-40-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-42-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-42-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-45-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-45-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-48-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-48-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-49-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-54-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-54-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-56-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-56-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-6-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-6-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-63-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-63-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-64-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-72-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-72-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-8-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-8-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-81-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/introd-9-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/placement-intro.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-2-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-2-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-2-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-2-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-2-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-2-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-2-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-2-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-3-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-3-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-3-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-3-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-3-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-3-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-3-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-3-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-4-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-4-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-4-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-4-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-4-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-4-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-4-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-4-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-5-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-5-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-5-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-5-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-5-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-5-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-5-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-5-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-6-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-6-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-6-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-6-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-6-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-6-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-6-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-6-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-7-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-7-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-7-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-7-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-7-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-7-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-7-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-7-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-8-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-8-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-8-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-8-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-8-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-8-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-8-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-8-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-9-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-9-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-9-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-9-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-9-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-9-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-9-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/q-9-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-10-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-10-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-12-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-12-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-12-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-12-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-14-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-14-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-15-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-15-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-16-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-16-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-16-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-18-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-18-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-18-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-18-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-20-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-20-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-21-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-21-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-24-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-24-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-24-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-24-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-25-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-27-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-27-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-28-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-28-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-30-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-30-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-32-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-32-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-35-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-35-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-36-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-36-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-36-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-4-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-40-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-40-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-42-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-42-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-45-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-45-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-48-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-48-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-49-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-54-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-54-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-56-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-56-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-6-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-6-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-63-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-63-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-64-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-72-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-72-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-8-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-8-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-81-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/qd-9-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/recap-done.mp3
Binary file not shown.
Binary file added public/audio/tts/en/rules-intro-welcome.mp3
Binary file not shown.
Binary file added public/audio/tts/en/rules-intro-x1.mp3
Binary file not shown.
Binary file added public/audio/tts/en/rules-intro-x10.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-3-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-3-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-3-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-3-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-3-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-3-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-4-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-4-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-4-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-4-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-4-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-4-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-5-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-5-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-5-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-5-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-5-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-6-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-6-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-6-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-6-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-7-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-7-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-7-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-8-8.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-8-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategy-9-9.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategyd-10-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategyd-10-5.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategyd-12-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategyd-12-3.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategyd-12-4.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategyd-12-6.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategyd-14-2.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategyd-14-7.mp3
Binary file not shown.
Binary file added public/audio/tts/en/strategyd-15-3.mp3
Binary file not shown.
Loading
Loading