<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
에 놀라운 단어 및 발음 정보 파일이 있습니다. 카네기 멜론 대학 .100,000개 이상의 단어 및 변형.웹사이트에서: " 이 항목은 영어 발음의 표준인 ARPAbet 음소 집합의 단어에서 해당 발음으로의 매핑이 있기 때문에 음성 인식 및 합성에 특히 유용합니다. 현재 음소 세트에는 39개의 음소가 포함되어 있으며 모음에는 어휘 강세 표시가 있습니다. ".파일의 일반적인 줄은 다음과 같습니다.
런어라운드 R AH1 N AH0 R AW2 ND
이 파일은 작업하기 쉽습니다. 모든 행은 단일 개행 문자로 끝나고 단어는 두 개의 공백으로 데이터와 구분되며 각 데이터 항목은 단일 공백으로 구분됩니다.데이터 항목은 다음과 같은 항목이 있는 다른 파일에 설명되어 있습니다.
Phoneme Example Translation ------- ------- ----------- AA odd AA D AE at AE T AH hut HH AH T AO ought AO Tfor 39 phonemes.
다음은 연관 배열에 100,000개 이상의 단어를 로드하는 JSL입니다.
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"));발음["코끼리"] = " EH1 L AH0 F AH0 NT S";
1행과 2행은 데스크탑의 폴더에서 다운로드한 파일을 JSL 문자열로 로드합니다.대용량 파일에는 위의 RUNAROUND 예와 같은 항목이 있습니다.작은 파일에는 각 줄에 하나의 음소가 있습니다.이러한 기호는 3행의 목록에 로드됩니다.words() 함수는 개행 문자를 사용하여 텍스트를 개별 단어 목록으로 분할합니다.symlist는 단어를 보유하고 4행에서 sympat에서 사본이 작성됩니다.
5행에서 SubstituteInto()는 쉼표로 구분된 문자열의 JSL 목록 표현식을 조작하여 쉼표로 구분된 문자열 목록이 있는 Pat Altern()에 대한 JSL 함수 호출로 전환합니다.6행은 Pat Altern() 함수를 평가하여 실제 패턴 값을 생성합니다.이것은 어떻게든 이 JSL을 구성하고 평가하는 것과 대략 동일합니다.
sympat = "AA" | "AA0" | ... | "Z" | "ZH"; // 39 phonemes in all
표현식 조작은 고급 주제이며 매우 유용할 수 있습니다.
7행은 간단한 개행 문자열을 JSL 변수에 지정합니다.이스케이프 시퀀스보다 변수 이름을 읽는 것이 더 쉽습니다.8행은 거대한 파일에서 주석 행이 어떻게 보이는지 설명합니다.다음은 8행에서 건너뛸 주석 블록입니다.
;;; # 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.
9행은 거대한 파일의 데이터 행을 설명합니다.라인 9는 많은 작업을 수행합니다. 여기 다시 있습니다.
dataLine = 팻 Break( " " ) >> 단어 + " " + 팻 반복( " " + symPat ) >> 발음[단어] + lineEnding;
PatBreak()는 텍스트를 공백까지 일치시키고 텍스트를 다음에 저장합니다. 단어 .단어 뒤에 두 개의 공백이 있습니다. 그 중 하나는 patRepeat 전에 일치되고 그 중 하나는 patRepeat가 패턴을 처음 실행할 때 일치됩니다.patRepeat 패턴은 symPat를 사용하여 모든 음소를 검증합니다. 잘못된 음소가 있으면 PatMatch가 실패하고 연관 배열 사전의 일부만 로드됩니다.
patRepeat는 GREEDY이며 가능한 한 멀리 이동하여 공백과 symPats를 먹어 치웁니다.lineEnding에 도달하면 더 이상 이동할 수 없으며 >> 즉시 할당 연산자는 반복된 일치를 발음[단어]에 저장합니다.마법! 발음을 색인화하는 데 사용되는 단어의 값은 방금 일치한 값입니다!사전 항목이 방금 생성되었습니다!
10행은 연관 배열인 사전을 작성합니다.9행에서 패턴을 정의한 후 생성해도 괜찮습니다. 패턴은 다음 줄까지 실행되지 않습니다.
발음 = 연관 배열();
11행:
rc = Pat Match( 소스, Pat Pos( 0 ) + Pat Repeat( (dataLine | commentLine) + Pat Fence() ) + Pat R Pos( 0 ) );
PatPos 및 PatRpos를 사용하여 전체 문자열이 일치하는지 확인합니다.그 사이에는 데이터 줄이나 주석 줄을 10만 번 이상 구문 분석하는 또 다른 PatRepeat가 있습니다.PatFence는 역추적 정보를 저장하지 않도록 패턴 매처에 알리는 최적화입니다.패턴이 실패하면 마지막에 역추적을 통해 일치자가 백업하고 다른 선택을 시도할 수 있습니다.이 파일의 경우 이는 무의미하며 모든 역추적 정보를 저장하는 데 필요한 메모리가 클 것입니다.PatFence 힌트는 속도를 높입니다.
발음["제브라"]
" Z IY1 BR AH0"
발음["AARDVARK"]
" AA1 RDV AA2 RK"
["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"
CMU 데이터를 다운로드하는 위치에 따라 줄 끝과 간격이 지저분할 수 있습니다. 다음은 더 잘 처리해야 합니다.
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"));줄 끝에 있는 CR과 LF의 많은 조합(LF뿐만 아니라)을 처리하고 가끔 단어와 발음 사이에 2개 이상의 공백을 처리하기 때문에 조금 더 강력해야 합니다.