心胸决定格局,眼界决定境界...

如何用kaldi做孤立词识别-初版

------------------------------------------------------------------------------------------------------------------------------------------------------

孤立词参考的例子就是yes/no脚本。

------------------------------------------------------------------------------------------------------------------------------------------------------

这里我们做10个词识别实验,熟悉整条链路。

后续尝试一些新的模型提高识别率;

再尝试模型语速、语调、平稳噪声的鲁棒性,尝试已有去噪处理算法的优化前端;

扩大孤立词的数量,裁剪模型,效率优化,熟悉FST解码器,将嵌入式硬件的孤立词识别能做到实用层面。

最后做连续语音识别、熟悉语言模型。

------------------------------------------------------------------------------------------------------------------------------------------------------

一、录制的语料说明

在egs/创建自己的项目coffee,再创建s5。

拷贝coffee语音库以及yes/no以下文件夹和文件。

.
├── conf
├── data
├── exp
├── input
├── local
├── mfcc
├── Nestle
├── path.sh
├── run.sh
├── steps -> ../../wsj/s5/steps
└── utils -> ../../wsj/s5/utils

Nestle语音库目录结构如下:

.
├── TestData
│   ├── 001_001.wav
│   ├── 001_002.wav
│   ├── 002_001.wav
│   ├── 002_002.wav
│   ├── 003_001.wav
│   ├── 003_002.wav
│   ├── 004_001.wav
│   ├── 004_002.wav
│   ├── 005_001.wav
│   ├── 005_002.wav
│   ├── 006_001.wav
│   ├── 006_002.wav
│   ├── 007_001.wav
│   ├── 007_02.wav
│   ├── 008_001.wav
│   ├── 008_002.wav
│   ├── 009_001.wav
│   ├── 009_002.wav
│   ├── 010_001.wav
│   └── 010_002.wav
└── TrainData
├── FastWord
│   ├── Model2_1
│   ├── Model2_10
│   ├── Model2_2
│   ├── Model2_3
│   ├── Model2_4
│   ├── Model2_5
│   ├── Model2_6
│   ├── Model2_7
│   ├── Model2_8
│   └── Model2_9
├── MiddWord
│   ├── Model1_1
│   ├── Model1_10
│   ├── Model1_2
│   ├── Model1_3
│   ├── Model1_4
│   ├── Model1_5
│   ├── Model1_6
│   ├── Model1_7
│   ├── Model1_8
│   └── Model1_9
└── SlowWord
├── Model3_1
├── Model3_10
├── Model3_2
├── Model3_3
├── Model3_4
├── Model3_5
├── Model3_6
├── Model3_7
├── Model3_8
└── Model3_9

首先,录制的语料是关于咖啡的品种,分为快速、中速、慢速

1)文件夹命名规则:  Modelx_x

 

Model1表示中速

Model2表示快速 

Model3表示慢速 

10个词,后缀表示表示发音id号

 

2)文件说明

CF_speaker-id_speed_utter-id.wav

CF  coffee,语库名缩写

 

 二、脚本修改 

由于现有的语音库,词汇表、目录结构、语音文件命名、词典、语言模型,还有对perl不是很熟悉等,所以很多脚本都得重新书写,顺便下python正则表达式。

run.sh
内容如下:
#!/bin/bash

train_cmd="utils/run.pl"
decode_cmd="utils/run.pl"

#have data, not need to download
#if [ ! -d waves_yesno ]; then
#  wget http://www.openslr.org/resources/1/waves_yesno.tar.gz || exit 1;
  # was:
  # wget http://sourceforge.net/projects/kaldi/files/waves_yesno.tar.gz || exit 1;
#  tar -xvzf waves_yesno.tar.gz || exit 1;
#fi


train_yesno=waves_train
test_base_name=waves_test

#clear  data exp  mfcc filefolder
rm -rf data exp mfcc

# Data preparation
# we need to rewrite scripts below
local/prepare_data.sh Nestle   #structure of dir and file name is  different
local/prepare_dict.sh               #dict contains 10 words, not 2.
utils/prepare_lang.sh --position-dependent-phones false data/local/dict "<SIL>" data/local/lang data/lang
local/prepare_lm.sh
echo "Data Prepraration finish!"

# Feature extraction
for x in  waves_test waves_train; do 
     steps/make_mfcc.sh --nj 1 data/$x exp/make_mfcc/$x mfcc
     steps/compute_cmvn_stats.sh data/$x exp/make_mfcc/$x mfcc
     utils/fix_data_dir.sh data/$x
done
echo "Feature extraction finish!"

# Mono training
steps/train_mono.sh --nj 1 --cmd "$train_cmd" \
  --totgauss 400 \
  data/waves_train data/lang exp/mono0 
echo "Mono training finish!"

  
# Graph compilation  
utils/mkgraph.sh data/lang_test_tg exp/mono0 exp/mono0/graph_tgpr
echo "Graph compilation finish!"


# Decoding
steps/decode.sh --nj 1 --cmd "$decode_cmd" \
    exp/mono0/graph_tgpr data/waves_test exp/mono0/decode_waves_test

for x in exp/*/decode*; do [ -d $x ] && grep WER $x/wer_* | utils/best_wer.sh; done

 

prepare_data.sh
修改如下:

#!/bin/bash


mkdir -p data/local
local=`pwd`/local
scripts=`pwd`/scripts


export PATH=$PATH:`pwd`/../../../tools/irstlm/bin


echo "Preparing train and test data"


train_base_name=waves_train
test_base_name=waves_test
root_dir=$1
train_dir=$root_dir/TrainData/MiddWord
test_dir=$root_dir/TestData


echo fix up uncorrect file name
#fix file name
for subdir in $(ls $train_dir)
do
moddir=$train_dir/$subdir
if [ -d $moddir ];then
for wav_file in $(ls $moddir)
do
#filename=$moddir/$wav_file
python ./local/FixUpName.py $moddir $wav_file
done
fi
done
echo "fix up files finish!"


#遍历各个词的文件夹
#文件列表
#注意空格
#utter_id 文件路径
for subdir in $(ls $train_dir)
do
moddir=$train_dir/$subdir
if [ -d $moddir ];then
echo "$moddir make file list and labels"
#ls -l $moddir > ${moddir}.list
#ls -l $moddir | grep -P 'CF.+\.wav' -o > ${moddir}.list
ls -l $moddir | grep -P 'CF(_[0-9]{1,3}){3}\.wav' -o >${moddir}.list
if [ -f ${moddir}_waves_train.scp ];then
rm ${moddir}_waves_train.scp
fi
python ./local/create_coffee_labels.py ${moddir}.list ${moddir} ${moddir}_waves_train.scp
fi
done



cat $train_dir/*.list > data/local/waves_train
#sort -u data/local/waves_train -o data/local/waves_train
cat $train_dir/*.scp > data/local/waves_train_wav.scp
#sort -u data/local/waves_train_wav.scp -o data/local/waves_train_wav.scp



ls -l $test_dir | grep -P '[0-9]{1,3}_[0-9]{1,3}\.wav' -o >data/local/waves_test
python ./local/create_coffee_test_labels.py data/local/waves_test $test_dir data/local/waves_test_wav.scp


#sort -u data/local/waves_test -o data/local/waves_test
#sort -u data/local/waves_test_wav.scp -o data/local/waves_test_wav.scp
echo "$moddir make file list and labels finish!"



echo "$moddir make file utter"
cd data/local
#测试数据的命名与训练数据的命名不一致
python ../../local/create_coffee_test_txt.py waves_test ../../input/trans.txt ${test_base_name}.txt
python ../../local/create_coffee_txt.py waves_train ../../input/trans.txt ${train_base_name}.txt
echo "make make file utter finish"


#sort -u ${test_base_name}.txt -o ${test_base_name}.txt
#sort -u ${train_base_name}.txt -o ${train_base_name}.txt


cp ../../input/task.arpabo lm_tg.arpa


cd ../..


#暂时不区分说话人
# This stage was copied from WSJ example
for x in waves_train waves_test; do
mkdir -p data/$x
cp data/local/${x}_wav.scp data/$x/wav.scp
echo "data/$x/wav.scp sort!"
sort -u data/$x/wav.scp -o data/$x/wav.scp
cp data/local/$x.txt data/$x/text
echo "data/$x/text sort!"
sort -u data/$x/text -o data/$x/text
cat data/$x/text | awk '{printf("%s global\n", $1);}' >data/$x/utt2spk
echo "data/$x/utt2spk sort!"
sort -u data/$x/utt2spk -o data/$x/utt2spk
#create_coffee_speaker.py
utils/utt2spk_to_spk2utt.pl <data/$x/utt2spk >data/$x/spk2utt
done

 
FixUpName.py

#coding=utf-8
import re
import sys
import os


def addzeros(matched):
    digits = matched.group('digits')
    n = len(digits)
    zeros = '0'*(3-n)  
    return (zeros+digits)

moddir=sys.argv[1]
wav_file=sys.argv[2]
filename=os.path.join(moddir,wav_file)
out_file = re.sub('(?P<digits>\d+)',addzeros,wav_file)
#print wav_file
#print out_file
outname=os.path.join(moddir,out_file)
if os.path.exists(filename):
   os.rename(filename, outname);
create_coffee_labels.py

#coding=utf-8
import re
import codecs
import sys
import os

list_file = sys.argv[1]#os.path.join(os.getcwd(),sys.argv[1])
wav_dir = sys.argv[2]
label_file = sys.argv[3]#os.path.join(os.getcwd(),sys.argv[3])
#print list_file, label_file
file_object = codecs.open(list_file, 'r', 'utf-8')
try:
    all_the_text = file_object.readlines()
finally:
    file_object.close()
pattern = r"CF_(.+)\.wav"

try:
    utf_file = codecs.open(label_file, 'w', 'utf-8')
    for each_text in all_the_text:
            print each_text
        ret = re.findall(pattern, each_text)
        #print ret[0]
        if len(ret) > 0:
        content = ret[0] + "\t" + wav_dir  +"/"+each_text
        #print content
        utf_file.write(content)
finally:
    utf_file.close()
create_coffee_test_labels.py

#coding=utf-8
import re
import codecs
import sys
import os

list_file = sys.argv[1]#os.path.join(os.getcwd(),sys.argv[1])
wav_dir = sys.argv[2]
label_file = sys.argv[3]#os.path.join(os.getcwd(),sys.argv[3])
#print list_file, label_file
file_object = codecs.open(list_file, 'r', 'utf-8')
try:
    all_the_text = file_object.readlines()
finally:
    file_object.close()
pattern = r"(.+)\.wav"

try:
    utf_file = codecs.open(label_file, 'w', 'utf-8')
    for each_text in all_the_text:
            print each_text
        ret = re.findall(pattern, each_text)
        #print ret[0]
        if len(ret) > 0:
        content = ret[0] + "\t" + wav_dir  +"/"+each_text
        #print content
        utf_file.write(content)
finally:
    utf_file.close()

 

create_coffee_txt.py

#coding=utf-8
import re
import codecs
import sys
import os

filename = sys.argv[1]
#print filename
wordfile = sys.argv[2]
#print wordfile
outname = sys.argv[3]



#print wordfile
word_object = codecs.open(wordfile, 'r', 'utf-8')
try:
    all_the_words = word_object.readlines()
        #print all_the_words[0]
finally:
    word_object.close()

#print filename
file_object = codecs.open(filename, 'r', 'utf-8')
try:
    all_the_text = file_object.readlines()
finally:
    file_object.close()

pattern = r"_(\d+)\.wav"

try:
    out_file = codecs.open(outname, 'w', 'utf-8')
    for each_text in all_the_text:
            #print each_text
        ret = re.findall(pattern, each_text)
        #print ret[0]
        if len(ret) > 0:                
                index = int(ret[0])
                #print all_the_words[index-1]
        content = each_text[3:-5]+ "\t" + all_the_words[index-1]
        #print content
        out_file.write(content)
finally:
    out_file.close()
create_coffee_test_txt.py

#coding=utf-8
import re
import codecs
import sys
import os

filename = sys.argv[1]
print filename
wordfile = sys.argv[2]
print wordfile
outname = sys.argv[3]



#print wordfile
word_object = codecs.open(wordfile, 'r', 'utf-8')
try:
    all_the_words = word_object.readlines()
        print all_the_words[0]
finally:
    word_object.close()

#print filename
file_object = codecs.open(filename, 'r', 'utf-8')
try:
    all_the_text = file_object.readlines()
finally:
    file_object.close()

pattern = r"(\d+)_.+\.wav"

try:
    out_file = codecs.open(outname, 'w', 'utf-8')
    for each_text in all_the_text:
            print each_text
        ret = re.findall(pattern, each_text)
        print ret[0]
        if len(ret) > 0:                
                index = int(ret[0])
                print "test_data"
                print all_the_words[index-1]
        content = each_text[:-5]+ "\t" + all_the_words[index-1]
        #print content
        out_file.write(content)
finally:
    out_file.close()

 

三、实验流程

1.准备好语音库

2.准备好脚本文件

local里面的所有脚本文件。

├── create_coffee_labels.py
├── create_coffee_speaker.py
├── create_coffee_test_labels.py
├── create_coffee_test_txt.py
├── create_coffee_txt.py
├── FixUpName.py
├── prepare_data.sh
├── prepare_dict.sh
├── prepare_lm.sh
└── score.sh

input里面的所有文件。

.
├── lexicon_nosil.txt
├── lexicon.txt
├── phones.txt
├── task.arpabo
└── trans.txt

conf 配置文件夹

conf
├── mfcc.conf
└── topo_orig.proto

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.数据准备阶段

prepare_data.sh 运行完,得到 text,wav.scp,utt2spk, spk2utt文件,这几个文件需要保证已排序。

  text : < uttid > < word >

  wav.scp : < uttid > < utter_file_path >

  utt2spk : < uttid > < speakid >

  spk2utt : < speakid > < uttid >

  word.txt : 同 text

2.准备好词典,生成语言模型文件

input文件夹下:

├── lexicon_nosil.txt
├── lexicon.txt
├── phones.txt
└── trans.txt

lexicon.txt: 词典,包括语料中涉及的词汇与发音。

lexicon_nosil.txt 不包含静音的词典。

phones.txt 所有发音音素

trans.txt 训练的所有词汇表

生成语言模型

task.arpabo 用 ngram-count  trans.txt生成。

四、碰到的问题

1.shell脚本输出文件名,不能有空格。

2.生成语言模型,生成arpa文件,对于孤立词来说,语言模型没有意义,这个可能是kaldi整个架构的原因,必须要有语言模型。

ngram-count

3.文件命名规范,需要进行排序,如果没有,可能报如下错误。

 echo "$0: file $1 is not in sorted order or has duplicates" && exit 1;

有时加 sort -u 就可以保证有序 ,但是如果命名不规范,依然报错,所以自己写了个脚本,对语音库文件重新命名。

FixUpName.py

五、跑完的流程

make make file utter finish
data/waves_train/wav.scp sort!
data/waves_train/text sort!
data/waves_train/utt2spk sort!
data/waves_test/wav.scp sort!
data/waves_test/text sort!
data/waves_test/utt2spk sort!
Dictionary preparation succeeded
utils/prepare_lang.sh --position-dependent-phones false data/local/dict <SIL> data/local/lang data/lang
Checking data/local/dict/silence_phones.txt ...
--> reading data/local/dict/silence_phones.txt
--> data/local/dict/silence_phones.txt is OK

Checking data/local/dict/optional_silence.txt ...
--> reading data/local/dict/optional_silence.txt
--> data/local/dict/optional_silence.txt is OK

Checking data/local/dict/nonsilence_phones.txt ...
--> reading data/local/dict/nonsilence_phones.txt
--> data/local/dict/nonsilence_phones.txt is OK

Checking disjoint: silence_phones.txt, nonsilence_phones.txt
--> disjoint property is OK.

Checking data/local/dict/lexicon.txt
--> reading data/local/dict/lexicon.txt
--> data/local/dict/lexicon.txt is OK

Checking data/local/dict/extra_questions.txt ...
--> data/local/dict/extra_questions.txt is empty (this is OK)
--> SUCCESS [validating dictionary directory data/local/dict]

**Creating data/local/dict/lexiconp.txt from data/local/dict/lexicon.txt
fstaddselfloops data/lang/phones/wdisambig_phones.int data/lang/phones/wdisambig_words.int 
prepare_lang.sh: validating output directory
utils/validate_lang.pl data/lang
Checking data/lang/phones.txt ...
--> data/lang/phones.txt is OK

Checking words.txt: #0 ...
--> data/lang/words.txt is OK

Checking disjoint: silence.txt, nonsilence.txt, disambig.txt ...
--> silence.txt and nonsilence.txt are disjoint
--> silence.txt and disambig.txt are disjoint
--> disambig.txt and nonsilence.txt are disjoint
--> disjoint property is OK

Checking sumation: silence.txt, nonsilence.txt, disambig.txt ...
--> summation property is OK

Checking data/lang/phones/context_indep.{txt, int, csl} ...
--> 1 entry/entries in data/lang/phones/context_indep.txt
--> data/lang/phones/context_indep.int corresponds to data/lang/phones/context_indep.txt
--> data/lang/phones/context_indep.csl corresponds to data/lang/phones/context_indep.txt
--> data/lang/phones/context_indep.{txt, int, csl} are OK

Checking data/lang/phones/nonsilence.{txt, int, csl} ...
--> 10 entry/entries in data/lang/phones/nonsilence.txt
--> data/lang/phones/nonsilence.int corresponds to data/lang/phones/nonsilence.txt
--> data/lang/phones/nonsilence.csl corresponds to data/lang/phones/nonsilence.txt
--> data/lang/phones/nonsilence.{txt, int, csl} are OK

Checking data/lang/phones/silence.{txt, int, csl} ...
--> 1 entry/entries in data/lang/phones/silence.txt
--> data/lang/phones/silence.int corresponds to data/lang/phones/silence.txt
--> data/lang/phones/silence.csl corresponds to data/lang/phones/silence.txt
--> data/lang/phones/silence.{txt, int, csl} are OK

Checking data/lang/phones/optional_silence.{txt, int, csl} ...
--> 1 entry/entries in data/lang/phones/optional_silence.txt
--> data/lang/phones/optional_silence.int corresponds to data/lang/phones/optional_silence.txt
--> data/lang/phones/optional_silence.csl corresponds to data/lang/phones/optional_silence.txt
--> data/lang/phones/optional_silence.{txt, int, csl} are OK

Checking data/lang/phones/disambig.{txt, int, csl} ...
--> 2 entry/entries in data/lang/phones/disambig.txt
--> data/lang/phones/disambig.int corresponds to data/lang/phones/disambig.txt
--> data/lang/phones/disambig.csl corresponds to data/lang/phones/disambig.txt
--> data/lang/phones/disambig.{txt, int, csl} are OK

Checking data/lang/phones/roots.{txt, int} ...
--> 11 entry/entries in data/lang/phones/roots.txt
--> data/lang/phones/roots.int corresponds to data/lang/phones/roots.txt
--> data/lang/phones/roots.{txt, int} are OK

Checking data/lang/phones/sets.{txt, int} ...
--> 11 entry/entries in data/lang/phones/sets.txt
--> data/lang/phones/sets.int corresponds to data/lang/phones/sets.txt
--> data/lang/phones/sets.{txt, int} are OK

Checking data/lang/phones/extra_questions.{txt, int} ...
Checking optional_silence.txt ...
--> reading data/lang/phones/optional_silence.txt
--> data/lang/phones/optional_silence.txt is OK

Checking disambiguation symbols: #0 and #1
--> data/lang/phones/disambig.txt has "#0" and "#1"
--> data/lang/phones/disambig.txt is OK

Checking topo ...

Checking word-level disambiguation symbols...
--> data/lang/phones/wdisambig.txt exists (newer prepare_lang.sh)
Checking data/lang/oov.{txt, int} ...
--> 1 entry/entries in data/lang/oov.txt
--> data/lang/oov.int corresponds to data/lang/oov.txt
--> data/lang/oov.{txt, int} are OK

--> data/lang/L.fst is olabel sorted
--> data/lang/L_disambig.fst is olabel sorted
--> SUCCESS [validating lang directory data/lang]
Preparing language models for test
arpa2fst --disambig-symbol=#0 --read-symbol-table=data/lang_test_tg/words.txt input/task.arpabo data/lang_test_tg/G.fst 
LOG (arpa2fst[5.2.124~1396-70748]:Read():arpa-file-parser.cc:98) Reading \data\ section.
LOG (arpa2fst[5.2.124~1396-70748]:Read():arpa-file-parser.cc:153) Reading \1-grams: section.
LOG (arpa2fst[5.2.124~1396-70748]:RemoveRedundantStates():arpa-lm-compiler.cc:359) Reduced num-states from 1 to 1
fstisstochastic data/lang_test_tg/G.fst 
7.27531e-08 7.27531e-08
Succeeded in formatting data.
Data Prepraration finish!
steps/make_mfcc.sh --nj 1 data/waves_test exp/make_mfcc/waves_test mfcc
utils/validate_data_dir.sh: WARNING: you have only one speaker.  This probably a bad idea.
   Search for the word 'bold' in http://kaldi-asr.org/doc/data_prep.html
   for more information.
utils/validate_data_dir.sh: Successfully validated data-directory data/waves_test
steps/make_mfcc.sh: [info]: no segments file exists: assuming wav.scp indexed by utterance.
Succeeded creating MFCC features for waves_test
steps/compute_cmvn_stats.sh data/waves_test exp/make_mfcc/waves_test mfcc
Succeeded creating CMVN stats for waves_test
fix_data_dir.sh: kept all 20 utterances.
fix_data_dir.sh: old files are kept in data/waves_test/.backup
steps/make_mfcc.sh --nj 1 data/waves_train exp/make_mfcc/waves_train mfcc
utils/validate_data_dir.sh: WARNING: you have only one speaker.  This probably a bad idea.
   Search for the word 'bold' in http://kaldi-asr.org/doc/data_prep.html
   for more information.
utils/validate_data_dir.sh: Successfully validated data-directory data/waves_train
steps/make_mfcc.sh: [info]: no segments file exists: assuming wav.scp indexed by utterance.
Succeeded creating MFCC features for waves_train
steps/compute_cmvn_stats.sh data/waves_train exp/make_mfcc/waves_train mfcc
Succeeded creating CMVN stats for waves_train
fix_data_dir.sh: kept all 680 utterances.
fix_data_dir.sh: old files are kept in data/waves_train/.backup
Feature extraction finish!
steps/train_mono.sh --nj 1 --cmd utils/run.pl --totgauss 400 data/waves_train data/lang exp/mono0
steps/train_mono.sh: Initializing monophone system.
steps/train_mono.sh: Compiling training graphs
steps/train_mono.sh: Aligning data equally (pass 0)
steps/train_mono.sh: Pass 1
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 2
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 3
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 4
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 5
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 6
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 7
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 8
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 9
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 10
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 11
steps/train_mono.sh: Pass 12
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 13
steps/train_mono.sh: Pass 14
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 15
steps/train_mono.sh: Pass 16
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 17
steps/train_mono.sh: Pass 18
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 19
steps/train_mono.sh: Pass 20
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 21
steps/train_mono.sh: Pass 22
steps/train_mono.sh: Pass 23
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 24
steps/train_mono.sh: Pass 25
steps/train_mono.sh: Pass 26
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 27
steps/train_mono.sh: Pass 28
steps/train_mono.sh: Pass 29
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 30
steps/train_mono.sh: Pass 31
steps/train_mono.sh: Pass 32
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 33
steps/train_mono.sh: Pass 34
steps/train_mono.sh: Pass 35
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 36
steps/train_mono.sh: Pass 37
steps/train_mono.sh: Pass 38
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 39
steps/diagnostic/analyze_alignments.sh --cmd utils/run.pl data/lang exp/mono0
analyze_phone_length_stats.py: WARNING: optional-silence SIL is seen only 32.6470588235% of the time at utterance begin.  This may not be optimal.
steps/diagnostic/analyze_alignments.sh: see stats in exp/mono0/log/analyze_alignments.log
1 warnings in exp/mono0/log/analyze_alignments.log
exp/mono0: nj=1 align prob=-99.75 over 0.14h [retry=0.0%, fail=0.0%] states=35 gauss=396
steps/train_mono.sh: Done training monophone system in exp/mono0
Mono training finish!
tree-info exp/mono0/tree 
tree-info exp/mono0/tree 
fstpushspecial 
fsttablecompose data/lang_test_tg/L_disambig.fst data/lang_test_tg/G.fst 
fstminimizeencoded 
fstdeterminizestar --use-log=true 
fstisstochastic data/lang_test_tg/tmp/LG.fst 
0.000133727 0.000118745
fstcomposecontext --context-size=1 --central-position=0 --read-disambig-syms=data/lang_test_tg/phones/disambig.int --write-disambig-syms=data/lang_test_tg/tmp/disambig_ilabels_1_0.int data/lang_test_tg/tmp/ilabels_1_0.30709 
fstisstochastic data/lang_test_tg/tmp/CLG_1_0.fst 
0.000133727 0.000118745
make-h-transducer --disambig-syms-out=exp/mono0/graph_tgpr/disambig_tid.int --transition-scale=1.0 data/lang_test_tg/tmp/ilabels_1_0 exp/mono0/tree exp/mono0/final.mdl 
fsttablecompose exp/mono0/graph_tgpr/Ha.fst data/lang_test_tg/tmp/CLG_1_0.fst 
fstrmepslocal 
fstrmsymbols exp/mono0/graph_tgpr/disambig_tid.int 
fstminimizeencoded 
fstdeterminizestar --use-log=true 
fstisstochastic exp/mono0/graph_tgpr/HCLGa.fst 
0.000286827 -0.000292581
add-self-loops --self-loop-scale=0.1 --reorder=true exp/mono0/final.mdl 
Graph compilation finish!
steps/decode.sh --nj 1 --cmd utils/run.pl exp/mono0/graph_tgpr data/waves_test exp/mono0/decode_waves_test
decode.sh: feature type is delta
steps/diagnostic/analyze_lats.sh --cmd utils/run.pl exp/mono0/graph_tgpr exp/mono0/decode_waves_test
analyze_phone_length_stats.py: WARNING: optional-silence SIL is seen only 55.0% of the time at utterance begin.  This may not be optimal.
steps/diagnostic/analyze_lats.sh: see stats in exp/mono0/decode_waves_test/log/analyze_alignments.log
Overall, lattice depth (10,50,90-percentile)=(3,8,31) and mean=13.9
steps/diagnostic/analyze_lats.sh: see stats in exp/mono0/decode_waves_test/log/analyze_lattice_depth_stats.log
%WER 65.00 [ 13 / 20, 11 ins, 0 del, 2 sub ] exp/mono0/decode_waves_test/wer_10

 

posted @ 2017-09-26 15:53  WELEN  阅读(5190)  评论(3编辑  收藏  举报