<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Il existe un fichier étonnant de mots et d'informations sur la prononciation sur L'université de Carnegie Mellon .Plus de 100 000 mots et variations.De leur site internet : " Ses entrées sont particulièrement utiles pour la reconnaissance et la synthèse de la parole, car il a des mappages des mots à leurs prononciations dans l'ensemble de phonèmes ARPAbet, une norme pour la prononciation anglaise. L'ensemble de phonèmes actuel contient 39 phonèmes, les voyelles portent un marqueur d'accentuation lexicale ".Une ligne typique dans le fichier ressemble à ceci
GUIDAGE R AH1 N AH0 R AW2 ND
Le fichier est facile à utiliser ; chaque ligne se termine par un seul caractère de saut de ligne et le mot est séparé des données par deux espaces et chaque élément de données est séparé par un seul espace.Les éléments de données sont décrits dans un autre fichier qui contient des entrées comme celle-ci
Phoneme Example Translation ------- ------- ----------- AA odd AA D AE at AE T AH hut HH AH T AO ought AO Tfor 39 phonemes.
Voici quelques JSL pour charger les mots 100K + dans un tableau associatif.
source = Load Text File( "$DESKTOP/grammar/cmudict-0.7b",charset("windows-1252") );symbols = Load Text File( "$DESKTOP/grammar/cmudict-0.7b.symbols" );symlist = Words( symbols, "\!n" );symPat = symlist; // make a copySubstitute Into( symPat, Expr( {} ), Expr( Pat Altern() ) ); // convert list to alternation patternsympat = Eval( sympat ); // build the pattern, oncelineEnding = "\!n";commentLine = ";" + Pat Break( lineEnding ) + lineEnding;dataLine = Pat Break( " " ) >> word + " " + Pat Repeat( " " + symPat ) >> pronounce[word] + lineEnding;pronounce = Associative Array();rc = Pat Match( source, Pat Pos( 0 ) + Pat Repeat( (dataLine | commentLine) + Pat Fence() ) + Pat R Pos( 0 ) );if( rc, Show( pronounce["ELEPHANTS"] ), print("failed"));prononcer["ELEPHANTS"] = " EH1 L AH0 F AH0 NT S" ;
Les lignes 1 et 2 chargent les fichiers téléchargés à partir d'un dossier sur le bureau dans des chaînes JSL.L'énorme fichier contient des entrées comme l'exemple RUNAROUND ci-dessus.Le petit fichier a un seul phonème sur chaque ligne.Ces symboles sont chargés dans une liste à la ligne 3.La fonction words() utilise la nouvelle ligne pour diviser le texte en une liste de mots individuels.symlist contient les mots, et à la ligne 4 une copie est faite en sympat.
À la ligne 5, SubstituteInto() manipule l'expression de liste JSL de chaînes séparées par des virgules, la transformant en un appel de fonction JSL à Pat Altern() avec une liste de chaînes séparées par des virgules.La ligne 6 évalue la fonction Pat Altern(), produisant une valeur de modèle réelle.Cela équivaut à peu près à construire en quelque sorte ce JSL et à l'évaluer :
sympat = "AA" | "AA0" | ... | "Z" | "ZH"; // 39 phonemes in all
La manipulation d'expressions est un sujet avancé et peut être très utile.
La ligne 7 affecte une simple chaîne de saut de ligne à une variable JSL.Il est plus facile de lire le nom de la variable que la séquence d'échappement.La ligne 8 décrit à quoi ressemble une ligne de commentaire dans l'énorme fichier.Voici le bloc de commentaires que Line 8 ignorera :
;;; # CMUdict -- Major Version: 0.07;;; # ========================================================================;;; # Copyright (C) 1993-2015 Carnegie Mellon University. All rights reserved.;;; # Redistribution and use in source and binary forms, with or without;;; # modification, are permitted provided that the following conditions;;; # are met:;;; # 1. Redistributions of source code must retain the above copyright;;; # notice, this list of conditions and the following disclaimer.;;; # The contents of this file are deemed to be source code.;;; # 2. Redistributions in binary form must reproduce the above copyright;;; # notice, this list of conditions and the following disclaimer in;;; # the documentation and/or other materials provided with the;;; # distribution.;;; # This work was supported in part by funding from the Defense Advanced;;; # Research Projects Agency, the Office of Naval Research and the National;;; # Science Foundation of the United States of America, and by member;;; # companies of the Carnegie Mellon Sphinx Speech Consortium. We acknowledge;;; # the contributions of many volunteers to the expansion and improvement of;;; # this dictionary.;;; # THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND;;; # ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,;;; # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR;;; # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY;;; # NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,;;; # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT;;; # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,;;; # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY;;; # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT;;; # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE;;; # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
La ligne 9 décrit les lignes de données dans l'énorme fichier.La ligne 9 fait beaucoup de boulot, la revoilà
dataLine = Pat Break( " " ) >> mot + " " + Pat Repeat( " " + symPat ) >> prononcer [mot] + lineEnding ;
PatBreak() fait correspondre le texte jusqu'à un blanc et stocke le texte dans mot .Il y a deux espaces après le mot ; l'un d'eux est mis en correspondance avant patRepeat et l'un d'eux est mis en correspondance par la première fois que patRepeat exécute son modèle.Le modèle patRepeat utilise le symPat pour valider chaque phonème ; si un mauvais phonème était présent, le PatMatch échouerait et seule une partie du dictionnaire de tableau associatif serait chargée.
patRepeat est GREEDY et va aussi loin qu'il le peut, engloutissant des blancs et des symPats.Lorsqu'il atteint la fin de ligne, il ne peut pas aller plus loin et l'opérateur >> d'affectation immédiate stocke la correspondance répétée dans prononce[mot].LA MAGIE! la valeur du mot utilisé pour indexer la prononciation est la valeur qui vient d'être appariée !Une entrée de dictionnaire vient d'être créée !
La ligne 10 crée le dictionnaire, un tableau associatif.Vous pouvez le créer après avoir défini le motif sur la ligne 9 ; le modèle ne s'exécutera pas avant la ligne suivante.
prononcer = tableau associatif();
Ligne 11 :
rc = Pat Match( source, Pat Pos( 0 ) + Pat Repeat( (dataLine | commentLine) + Pat Fence() ) + Pat R Pos( 0 ) );
utilise PatPos et PatRpos pour s'assurer que la chaîne entière correspond.Entre les deux se trouve un autre PatRepeat qui analyse une ligne de données ou une ligne de commentaire, encore et encore, plus de 100 000 fois.Le PatFence est une optimisation qui indique au comparateur de modèle de ne pas enregistrer les informations de retour en arrière.Si le modèle échouait, vers la fin, le retour en arrière permettrait au matcher de reculer et d'essayer différents choix.Pour ce fichier, cela n'aurait aucun sens et la mémoire nécessaire pour contenir toutes les informations de retour en arrière serait importante.L'indice PatFence l'accélère.
prononcer["ZEBRA"]
" Z IY1 BR AH0"
prononcer ["AARDVARK"]
"AA1 RDV AA2 R K"
prononcer["SUPERCALIFRAGILISTICEXPEALIDOSHUS"]
" S UW2 P ER0 K AE2 L AH0 FR AE1 JH AH0 L IH2 ST IH0 K EH2 KSP IY0 AE2 L AH0 D OW1 SH AH0 S"
Selon l'endroit où vous téléchargez les données CMU, les fins de ligne et l'espacement peuvent être désordonnés. Ce qui suit devrait mieux le gérer.
source = Load Text File( "z:/cmudict-0.7b.txt",charset("windows-1252") );
symbols = Load Text File( "z:/cmudict-0.7b.symbols.txt" );
symlist = Words( symbols, "\!n" );
symPat = symlist; // make a copy
Substitute Into( symPat, Expr( {} ), Expr( Pat Altern() ) ); // convert list to alternation pattern
sympat = Eval( sympat ); // build the pattern, once
lineEnding = "\!n\!r";
commentLine = ";;;" + Pat Break( lineEnding ) + patspan(lineEnding);
dataLine = Pat Break( " " ) >> word + " " + Pat Repeat( patspan(" ") + symPat ) >> pronounce[word] + patspan(lineEnding);
pronounce = Associative Array();
rc = Pat Match( source, Pat Pos( 0 ) + Pat Repeat( (dataLine | commentLine ) + Pat Fence() ) + Pat R Pos( 0 ) );
if( rc, Show( pronounce["ELEPHANTS"] ), print("failed"));Il devrait être un peu plus robuste car il gérera de nombreuses combinaisons de CR et LF aux extrémités des lignes (pas seulement LF) et gérera occasionnellement plus de deux espaces entre un mot et sa prononciation.