2015-11-14 3 views
0

Я ищу простую процедуру генерации FST (конечного преобразователя) из cmudict-0.7b или cmudict-0.7b.dict, который будет использоваться с фонетизауром.Как преобразовать cmudict-0.7b или cmudict-0.7b.dict в формат FST, чтобы использовать его с фонетизауром?

Я пробовал следующий набор команд (phonetisaurus Aligner, Google NGramLibrary и phonetisaurus arpa2wfst) и мог генерировать FST, но это не сработало. Я не знаю, где я совершил ошибку или пропустил любой шаг. Я думаю, что первая команда, то есть phonetisaurus-align, неверна.

phonetisaurus-align --input=cmudict.dict --ofile=cmudict/cmudict.corpus --seq1_del=false 

ngramsymbols <cmudict/cmudict.corpus> cmudict/cmudict.syms 

/usr/local/bin/farcompilestrings --symbols=cmudict/cmudict.syms --keep_symbols=1 cmudict/cmudict.corpus > cmudict/cmudict.far 

ngramcount --order=8 cmudict/cmudict.far > cmudict/cmudict.cnts 

ngrammake --v=2 --bins=3 --method=kneser_ney cmudict/cmudict.cnts > cmudict/cmudict.mod 

ngramprint --ARPA cmudict/cmudict.mod > cmudict/cmudict.arpa 

phonetisaurus-arpa2wfst-omega --lm=cmudict/cmudict.arpa > cmudict/cmudict.fst 

Я попытался FST с phonetisaurus-G2P следующим образом:

phonetisaurus-g2p --model=cmudict/cmudict.fst --nbest=3 --input=HELLO --words 

Но это ничего не вернуть .... Цените любую помощь по этому вопросу.

ответ

2

Очень важно поддерживать словарь в правильном формате. Фонетизавр очень чувствителен к этому, он требует, чтобы слова и фонемы были разделены на вкладку, тогда пробелы не работали. Он также не позволяет использовать варианты произношения чисел CMUSphinx, например (2) или (3). Вам нужно очистить словарь с помощью простого скрипта python, например, перед подачей его в фонетизавр. Вот тот, который я использую:

#!/usr/bin/python 

import sys 

if len(sys.argv) != 3: 
    print "Split the list on train and test sets" 
    print 
    print "Usage: traintest.py file split_count" 
    exit() 

infile = open(sys.argv[1], "r") 
outtrain = open(sys.argv[1] + ".train", "w") 
outtest = open(sys.argv[1] + ".test", "w") 

cnt = 0 
split_count = int(sys.argv[2]) 

for line in infile: 
    items = line.split() 
    if items[0][-1] == ')': 
     items[0] = items[0][:-3] 
    if items[0].find("_") > 0: 
     continue 
    line = items[0] + '\t' + " ".join(items[1:]) + '\n' 
    if cnt % split_count == 3: 
     outtest.write(line) 
    else: 
     outtrain.write(line) 
    cnt = cnt + 1 
+0

Это должен быть принятый ответ. Большое спасибо, Николай. –