@mostajs/prononciation
v0.3.0
Published
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
Maintainers
Readme
@mostajs/prononciation
Auteur : Dr Hamid MADANI [email protected] · AGPL-3.0-or-later · zéro dépendance · Node ≥ 18
Ce module dit si une voix a prononcé un texte connu, et où elle s'en écarte, son par son. Il fournit :
- une note par son, par mot et par phrase ;
- un verdict au seuil ;
- la liste des sons qui résistent dans une classe.
Installer
npm install @mostajs/prononciation
bash node_modules/@mostajs/prononciation/service/installer.sh # le service de reconnaissance (0.2.0), voir service/README.mdLe service de reconnaissance (Python, wav2vec2) est livré avec le module, dans service/. Il écoute en local, et reconnaisseurHttp en est le client.
Exemple minimal
import { createPrononciation, lexiqueCmudict, combinerLexiques, creerLexique,
reconnaisseurHttp, NOTE_APPRISE_1, resistances } from '@mostajs/prononciation';
import { readFileSync } from 'node:fs';
const p = createPrononciation({
lexique: combinerLexiques(creerLexique({ BOUMERDES: 'b u m ɛ ɹ d ɛ s' }),
lexiqueCmudict(readFileSync('cmudict.dict', 'utf8'))),
reconnaisseur: reconnaisseurHttp({ url: 'http://127.0.0.1:8762/reconnaitre', type: 'audio/wav' }),
note: NOTE_APPRISE_1,
});
const r = await p.evaluer({ texte: 'I would like a cup of tea.', audio }); // audio : Uint8Array
r.verdict; // 'accepte' | 'a-reprendre'
r.mots.filter((m) => m.etat === 'a-reprendre'); // les mots à reprendre, avec leurs sons
resistances(resultatsDeLaClasse, { minEssais: 3 }); // [{ phoneme: 'θ', essais, echecs, taux }, …]Sans note, le module emploie la note simple, c'est-à-dire la part des sons retrouvés. Le résultat dit toujours le mode utilisé.
Ce qu'on injecte
| port | forme | fourni par |
|---|---|---|
| lexique | { phonemes(mot) → string[] \| null } | creerLexique, lexiqueCmudict (fichier BSD-2 fourni par l'application ; { accent: 'en-GB' } le ramène au RP, 0.3), lexiqueBritfone (Britfone, MIT, RP, 0.3), combinerLexiques |
| reconnaisseur | { reconnaitre({ audio, attendus }) → { entendus, traits?, duree? } } | reconnaisseurHttp (service de reconnaissance local), reconnaisseurFixe (essais) |
Ce que vaut la note
Mesures sur la partie test de speechocean762, faite de 2 500 phrases et de locuteurs absents de l'apprentissage (Pearson avec la note des juges) :
| | note simple | note apprise | GOPT (ICASSP 2022) | |---|---|---|---| | phrase | 0,54 | 0,72 | 0,714 | | mot | — | 0,54 | 0,533 | | son | 0,35 | 0,56 | 0,612 |
Les poids sont appris sur des voix d'apprenants chinois. Il faut les remesurer sur la population servie.
Vérifier
npm test # 23 essais (mjs-unit) + 9 essais du service (Python), parités comprises
node examples/verifier.mjs # trois vraies phrases, par le vrai adaptateur HTTPAttribution
Les poids note-apprise-1 sont appris sur speechocean762 (Zhang et al., 2021), sous licence CC BY 4.0 : https://www.openslr.org/101. Le modèle acoustique visé est facebook/wav2vec2-lv-60-espeak-cv-ft (Apache-2.0).
Référence
L'API complète est dans llms.txt.
