@mostajs/prononciation 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
  **Auteur** : Dr Hamid MADANI <drmdh@msn.com>
4
4
  Format : Keep a Changelog ; versions : SemVer.
5
5
 
6
+ ## [0.2.1] — 2026-10-26
7
+
8
+ ### Corrigé
9
+ - `service/installer.sh` accepte **`PRONONCIATION_VENV`**. L'environnement Python peut vivre hors de `node_modules/`, que `npm ci` efface à chaque déploiement.
10
+ - `lexiqueCmudict` ignore le **commentaire de fin de ligne**. Le CMUdict de référence (cmusphinx/cmudict, `cmudict.dict`) en porte sur 22 lignes (« aalborg AO1 L B AO0 R G # place, danish »). Les mots du commentaire devenaient des sons. Essai T-PRO-24.
11
+
6
12
  ## [0.2.0] — 2026-10-25
7
13
 
8
14
  ### Ajouté
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mostajs/prononciation",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Compare une voix à un texte connu : sons attendus par un lexique injecté, sons entendus par un reconnaisseur injecté, alignement, note par son, mot et phrase (note apprise ou simple), verdict, et les sons qui résistent. Avec son service de reconnaissance (Python, wav2vec2), local.",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "author": "Dr Hamid MADANI <drmdh@msn.com>",
package/service/README.md CHANGED
@@ -12,6 +12,12 @@ bash node_modules/@mostajs/prononciation/service/installer.sh
12
12
  PRONONCIATION_HF_HOME=/srv/modeles bash node_modules/@mostajs/prononciation/service/installer.sh
13
13
  ```
14
14
 
15
+ Installé depuis npm, le service vit dans `node_modules/`, que `npm ci` efface à chaque déploiement : posez `PRONONCIATION_VENV` (et `PRONONCIATION_HF_HOME`) **hors du projet**, pour n'installer qu'une fois :
16
+
17
+ ```bash
18
+ PRONONCIATION_VENV=/srv/prononciation-venv PRONONCIATION_HF_HOME=/srv/modeles bash node_modules/@mostajs/prononciation/service/installer.sh
19
+ ```
20
+
15
21
  L'installeur fait trois choses :
16
22
  - il crée `service/.venv` et y installe les dépendances **figées** (`requirements.txt` : torch 2.4.1 CPU, transformers 4.44.2…) ;
17
23
  - il télécharge `facebook/wav2vec2-lv-60-espeak-cv-ft` à sa **révision figée** (`ae45363b`) ;
@@ -5,6 +5,10 @@
5
5
  #
6
6
  # bash service/installer.sh
7
7
  # PRONONCIATION_HF_HOME=/srv/modeles bash service/installer.sh # où ranger le modèle (≈ 1,2 Go)
8
+ # PRONONCIATION_VENV=/srv/prononciation-venv bash service/installer.sh # l'environnement Python HORS de node_modules
9
+ #
10
+ # 0.2.1 — installé depuis npm, le service vit dans node_modules/, que `npm ci` efface à chaque déploiement : poser
11
+ # PRONONCIATION_VENV (et PRONONCIATION_HF_HOME) hors du projet, pour n'installer qu'une fois.
8
12
  #
9
13
  # Crée service/.venv (Python ≥ 3.10), y installe les dépendances figées, télécharge le modèle à sa révision figée,
10
14
  # puis vérifie qu'il se charge sans réseau. Rien d'autre n'est écrit.
@@ -12,12 +16,13 @@ set -euo pipefail
12
16
  ICI="$(cd "$(dirname "$0")" && pwd)"
13
17
  PY="${PYTHON:-python3}"
14
18
  "$PY" -c 'import sys; sys.exit(0 if sys.version_info >= (3, 10) else 1)' || { echo "✗ Python ≥ 3.10 requis ($PY)"; exit 1; }
15
- [ -x "$ICI/.venv/bin/python" ] || "$PY" -m venv "$ICI/.venv"
16
- "$ICI/.venv/bin/pip" install -q --upgrade pip
17
- "$ICI/.venv/bin/pip" install -q -r "$ICI/requirements.txt"
19
+ VENV="${PRONONCIATION_VENV:-$ICI/.venv}"
20
+ [ -x "$VENV/bin/python" ] || "$PY" -m venv "$VENV"
21
+ "$VENV/bin/pip" install -q --upgrade pip
22
+ "$VENV/bin/pip" install -q -r "$ICI/requirements.txt"
18
23
  [ -n "${PRONONCIATION_HF_HOME:-}" ] && export HF_HOME="$PRONONCIATION_HF_HOME"
19
24
  cd "$ICI"
20
- .venv/bin/python - <<'PY'
25
+ "$VENV/bin/python" - <<'PY'
21
26
  from huggingface_hub import hf_hub_download
22
27
  import moteur
23
28
  for f in moteur.FICHIERS:
@@ -26,4 +31,4 @@ assert moteur.modele_installe(), 'modèle absent après téléchargement'
26
31
  m = moteur.Moteur(local_seulement=True)
27
32
  print(f'✓ modèle {moteur.MODELE}@{moteur.REVISION[:8]} chargé : {m.classes} classes de sons, règle {m.regle}')
28
33
  PY
29
- echo "✓ installé. Lancer : ${PRONONCIATION_HF_HOME:+HF_HOME=$PRONONCIATION_HF_HOME }$ICI/.venv/bin/python $ICI/serveur.py --local-seulement"
34
+ echo "✓ installé. Lancer : ${PRONONCIATION_HF_HOME:+HF_HOME=$PRONONCIATION_HF_HOME }$VENV/bin/python $ICI/serveur.py --local-seulement"
@@ -23,12 +23,14 @@ export function creerLexique(table = {}) {
23
23
  export function lexiqueCmudict(texte) {
24
24
  if (typeof texte !== 'string') refus('CONFIGURATION', 'lexiqueCmudict : le texte du fichier est attendu');
25
25
  const table = {};
26
- for (const ligne of texte.split(/\r?\n/)) {
27
- if (!ligne.trim() || ligne.startsWith(';;;')) continue;
26
+ for (const brute of texte.split(/\r?\n/)) {
27
+ if (brute.startsWith(';;;')) continue;
28
+ const ligne = brute.split('#')[0]; // 0.2.1 : « … R G # place, danish » → commentaire
29
+ if (!ligne.trim()) continue;
28
30
  const [mot, ...sons] = ligne.trim().split(/\s+/);
29
31
  if (!sons.length || /\(\d+\)$/.test(mot)) continue; // variante : TOMATO(2)
30
32
  const cle = mot.toUpperCase();
31
- if (!(cle in table)) table[cle] = sons.map((s) => s.toUpperCase()).filter((s) => !s.startsWith('#'));
33
+ if (!(cle in table)) table[cle] = sons.map((s) => s.toUpperCase());
32
34
  }
33
35
  return creerLexique(table);
34
36
  }