<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Es gibt eine erstaunliche Datei mit Wörtern und Ausspracheinformationen unter Carnegie Mellon Universität .Über 100.000 Wörter und Variationen.Von ihrer Website: " Seine Einträge sind besonders nützlich für die Spracherkennung und -synthese, da es Zuordnungen von Wörtern zu ihren Aussprachen im ARPAbet-Phonemsatz, einem Standard für die englische Aussprache, enthält. Der aktuelle Phonemsatz enthält 39 Phoneme, Vokale tragen einen lexikalischen Stressmarker ".Eine typische Zeile in der Datei sieht so aus
UMLAUF R AH1 N AH0 R AW2 ND
Die Datei ist einfach zu bearbeiten; Jede Zeile endet mit einem einzelnen Zeilenumbruchzeichen, und das Wort wird durch zwei Leerzeichen von den Daten getrennt, und jedes Datenelement wird durch ein einzelnes Leerzeichen getrennt.Die Datenelemente sind in einer anderen Datei beschrieben, die solche Einträge enthält
Phoneme Example Translation ------- ------- ----------- AA odd AA D AE at AE T AH hut HH AH T AO ought AO Tfor 39 phonemes.
Hier ist etwas JSL, um die über 100.000 Wörter in ein assoziatives Array zu laden.
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"));pronounce["ELEFANTS"] = "EH1 L AH0 F AH0 NT S";
Die Zeilen 1 und 2 laden die heruntergeladenen Dateien aus einem Ordner auf dem Desktop in JSL-Strings.Die riesige Datei hat Einträge wie das obige RUNAROUND-Beispiel.Die winzige Datei hat in jeder Zeile ein einzelnes Phonem.Diese Symbole werden in Zeile 3 in eine Liste geladen.Die Funktion words() verwendet den Zeilenumbruch, um den Text in eine Liste einzelner Wörter aufzuteilen.symlist enthält die Wörter, und in Zeile 4 wird eine Kopie in sympat erstellt.
In Zeile 5 manipuliert SubstituteInto() den JSL-Listenausdruck von kommagetrennten Strings und verwandelt ihn in einen JSL-Funktionsaufruf von Pat Altern() mit einer Liste von kommagetrennten Strings.Zeile 6 wertet die Funktion Pat Altern() aus und erzeugt einen tatsächlichen Musterwert.Dies ist ungefähr gleichbedeutend damit, diese JSL irgendwie zu konstruieren und auszuwerten:
sympat = "AA" | "AA0" | ... | "Z" | "ZH"; // 39 phonemes in all
Das Bearbeiten von Ausdrücken ist ein Thema für Fortgeschrittene und kann sehr nützlich sein.
Zeile 7 weist einer JSL-Variablen einen einfachen Newline-String zu.Der Variablenname ist leichter zu lesen als die Escape-Sequenz.Zeile 8 beschreibt, wie eine Kommentarzeile in der riesigen Datei aussieht.Hier ist der Kommentarblock, den Zeile 8 überspringen wird:
;;; # 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.
Zeile 9 beschreibt die Datenzeilen in der riesigen Datei.Linie 9 macht viel Arbeit, hier ist sie wieder
dataLine = Pat Break( " " ) >> word + " " + Pat Repeat( " " + symPat ) >> pronounce[word] + lineEnding;
PatBreak() gleicht Text bis auf ein Leerzeichen ab und speichert den Text in Wort .Es gibt zwei Leerzeichen nach dem Wort; Einer von ihnen wird vor patRepeat abgeglichen, und einer von ihnen wird abgeglichen, wenn patRepeat sein Muster zum ersten Mal ausführt.Das patRepeat-Muster verwendet symPat, um jedes Phonem zu validieren; Wenn ein schlechtes Phonem vorhanden wäre, würde PatMatch fehlschlagen und nur ein Teil des assoziativen Array-Wörterbuchs würde geladen werden.
patRepeat ist GREEDY und geht so weit wie es kann, indem es Leerzeichen und SymPats verschlingt.Wenn es auf lineEnding trifft, kann es nicht weiter gehen und der >> Direktzuweisungsoperator speichert die wiederholte Übereinstimmung in pronounce[word].MAGIE! Der Wert des Wortes, das für die Indexaussprache verwendet wird, ist der gerade abgeglichene Wert!Ein Wörterbucheintrag wurde gerade erstellt!
Zeile 10 erstellt das Dictionary, ein assoziatives Array.Es ist in Ordnung, es zu erstellen, nachdem Sie das Muster in Zeile 9 definiert haben; das Muster wird nicht bis zur nächsten Zeile ausgeführt.
aussprechen = Assoziatives Array();
Zeile 11:
rc = Pat Match( source, Pat Pos( 0 ) + Pat Repeat( (dataLine | commentLine) + Pat Fence() ) + Pat R Pos( 0 ) );
verwendet PatPos und PatRpos, um sicherzustellen, dass die gesamte Zeichenfolge übereinstimmt.Dazwischen befindet sich ein weiterer PatRepeat, der entweder eine Datenzeile oder eine Kommentarzeile über 100.000 Mal analysiert.Der PatFence ist eine Optimierung, die dem Musterabgleicher mitteilt, keine Backtracking-Informationen zu speichern.Wenn das Muster gegen Ende fehlschlug, würde Backtracking es dem Matcher ermöglichen, zurückzugehen und verschiedene Möglichkeiten auszuprobieren.Für diese Datei wäre das sinnlos, und der zum Speichern aller Backtracking-Informationen erforderliche Speicher wäre groß.Der PatFence-Hinweis beschleunigt es.
aussprechen["ZEBRA"]
"Z IY1 BR AH0"
aussprechen["ERDFERKEL"]
"AA1 RDV AA2 R K"
aussprechen["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"
Je nachdem, wo Sie die CMU-Daten herunterladen, können die Zeilenenden und Abstände unordentlich sein. Das Folgende sollte es besser handhaben.
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"));Es sollte etwas robuster sein, da es viele Kombinationen von CR und LF an den Enden von Zeilen verarbeiten kann (nicht nur LF) und gelegentlich mehr als zwei Leerzeichen zwischen einem Wort und der Aussprache verarbeiten kann.