Blame view

src/doc/tutorial_looking.dox 11.3 KB
8dcb6dfcb   Yannick Estève   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
  // doc/tutorial_looking.dox
  
  // Copyright 2009-2011 Microsoft Corporation
  
  // See ../../COPYING for clarification regarding multiple authors
  //
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  
  //  http://www.apache.org/licenses/LICENSE-2.0
  
  // THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  // KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
  // WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
  // MERCHANTABLITY OR NON-INFRINGEMENT.
  // See the Apache 2 License for the specific language governing permissions and
  // limitations under the License.
  
  /**
   \page tutorial_looking Kaldi tutorial: Overview of the distribution (20 minutes)
  
     \ref tutorial "Up: Kaldi tutorial" <BR>
     \ref tutorial_git "Previous: Version control with Git" <BR>
     \ref tutorial_running "Next: Running the example scripts" <BR>
  
   Before we jump into the example scripts, let us take a few minutes to look at what
   else is included in the Kaldi distribution.  Go to the kaldi-1 directory and list it.
   There are a few files and subdirectories.
   The important subdirectories are "tools/", "src/", and "egs/" which we will
   look at in the next section.
   We will give an overview of "tools/" and "src/".
  
   \section tutorial_looking_tools The tools/ directory (10 minutes)
  
   The directory "tools/' is where we install things that Kaldi depends on in
   various ways.  Change directory to tools/ and list it.  You will see various
   files and subdirectories, mostly things that have been installed by the make command. 
   Look very quickly at the file INSTALL. This file gives instructions on how to install the tools.
  
   The most important subdirectory is the one for OpenFst.  cd to openfst/.  This is a soft link
   to the actual directory which has a version number.  List the openfst directory.
   If the installation succeeded, there will be a bin/ directory with the installed
   binaries, and a lib/ directory with the library (we require both of these).
   The most important code is in the directory include/fst/.  If you ever want to
   understand Kaldi deeply you will need to understand OpenFst.  For this,
   the best starting point is http://www.openfst.org/.
  
   For now, just view the file include/fst/fst.h.  This consists of some declarations
   of an abstract FST type.  You can see that there are a lot of templates involved.
   If templates are not your thing, you will probably have trouble understanding this code.
  
   Change directory to bin/, or add it to your path.
   We will be executing some simple example instructions from
   <a href=http://www.openfst.org/twiki/bin/view/FST/FstQuickTour#CreatingFsts>here</a>.
  
  
   Paste the following command into the shell:
  \verbatim
  # arc format: src dest ilabel olabel [weight]
  # final state format: state [weight]
  # lines may occur in any order except initial state must be first line
  # unspecified weights default to 0.0 (for the library-default Weight type)
  cat >text.fst <<EOF
  0 1 a x .5
  0 1 b y 1.5
  1 2 c z 2.5
  2 3.5
  EOF
  \endverbatim
  
  The following commands create the symbol tables; paste them into the shell too.
  \verbatim
  cat >isyms.txt <<EOF
  <eps> 0
  a 1
  b 2
  c 3
  EOF
  
  cat >osyms.txt <<EOF
  <eps> 0
  x 1
  y 2
  z 3
  EOF
  \endverbatim
  Note: for the following steps to work, if you don't have the current directory on your path
  you may have to type:
  \verbatim
  export PATH=.:$PATH
  \endverbatim
  Next create a binary-format FST:
  \verbatim
  fstcompile --isymbols=isyms.txt --osymbols=osyms.txt text.fst binary.fst
  \endverbatim
  Let's execute an example command:
  \verbatim
  fstinvert binary.fst | fstcompose - binary.fst > binary2.fst
  \endverbatim
  The resulting WFST, binary2.fst, should be similar to binary.fst
  but with twice the weights.  You can print them both out to see:
  \verbatim
  fstprint --isymbols=isyms.txt --osymbols=osyms.txt binary.fst
  fstprint --isymbols=isyms.txt --osymbols=osyms.txt binary2.fst
  \endverbatim
  This example was modified from a longer tutorial available at
  <a href=www.openfst.org> www.openfst.org </a>.  After you have done
  this, clean up by typing:
  \verbatim
  rm *.fst *.txt
  \endverbatim
  
  
   \section tutorial_looking_src The src/ directory (10 minutes)
  
   Change directory back up to the top level (kaldi-1) and into src/.
   List the directory.  You will see a few files and a large number of
   subdirectories.  Look at the Makefile.  At the top it sets the variable
   SUBDIRS.  This is a list of the subdirectories containing code.
   Notice that some of them end in "bin".  These are the ones that contain
   executables (the code and executables are in the same directory).  The
   other directories contain internal code.
  
   You can see that one of the targets in the Makefile is "test".
   Type "make test".  This command goes into the various subdirectories and
   runs test programs in there.  All the tests should succeed.  If you are
   feeling lucky you can also type "make valgrind".  This runs the same
   tests with a memory checker, and takes longer, but will find more
   errors.  If this doesn't work, forget about it; it's not important
   for now.  If it is taking too long, stop it with ctrl-c.
  
   Change directory to base/.  Look at the Makefile.  Notice the line
  \verbatim
  include ../kaldi.mk
  \endverbatim
   This lines includes the file ../kaldi.mk verbatim whenever a Makefile in a
   subdirectory is invoked (just like a C \#include directive).
   Look at the file ../kaldi.mk.  It will contain
   some rules related to valgrind (for memory debugging), and then some
   system-specific configuration in the form of variables such as CXXFLAGS.
   See if there are any -O options (e.g. -O0).  The flags
   -O0 and -DKALDI_PARANOID are disabled by default as they slow things
   down (you might want to enable them for better debugging).
   Look again at base/Makefile.  The statement "all:" at the top tells Make
   that "all" is the top-level target (because there are targets in kaldi.mk
   and we don't want these to become the top-level target).  Because the
   dependencies of "all" depend on variables defined later, we have another
   statement (the target is defined in default_rules.mk) in which we define what "all" depends on.
   Look for it.  Several other targets are defined, starting with "clean".
   Look for them.  To make "clean" you would type "make clean".
   The target .valgrind is not something you would invoke from the command line;
   you would type "make valgrind" (the target is defined in kaldi.mk).
   Invoke all of these targets, i.e. type "make clean" and the same for the others,
   and notice what commands are issued when you do this.
  
   In the Makefile in the base/ directory: choose one of the binaries
  listed in TESTFILES, and run it.  Then briefly view the corresponding .cc file.
  The math one is a good example (note: this excludes the majority of math functions
  in Kaldi, which are matrix-vector related functions, and are located in
  ../matrix/).  Notice that there are a lot of assertions, with the macro
  KALDI_ASSERT.  These test programs are designed to exit with error status if
  there is a problem (they are not supposed to rely on human inspection of the
  output).
  
  Look at the header kaldi-math.h.  You will see some elements of our coding practices.
  Notice that all our local \#includes are relative to the src/ directory (so we \#include
  base/kaldi-types.h even though we are already in the base/ directory).
  Notice that all macros we \#define, except for standard ones that we are just
  making sure have their normal values, begin with KALDI_.  This is a precaution
  to avoid future conflicts with other codebases (since \#defines don't limit themselves
  to the kaldi namespace).  Notice the style of the function names: LikeThis().
  Our style is generally based on
  <a href=https://google.github.io/styleguide/cppguide.html> this one </a>,
  to conform with OpenFst, but there are some differences.
  
  To see other elements of the style, which will help you to understand Kaldi
  code, cd to ../util, and view text-utils.h.  Notice that the inputs of these
  functions are always first, and are generally const references, while the
  outputs (or inputs that are modified) are always last, and are pointer arguments.  Non-const references
  as function arguments are not allowed.  You can read more about the Kaldi-specific
  elements of the coding style \ref style "here" later if you are interested.
  For now, just be aware that there is a coding style with quite specific rules.
  
  Change directory to ../gmmbin and type
  \verbatim
  ./gmm-init-model
  \endverbatim
  It prints out the usage, which should give you a generic idea of how Kaldi programs
  are called.  Note that while there is a --config option that can be used to
  pass a configuration file, in general Kaldi is not as config-driven as HTK and these
  files are not widely used.  You will see a --binary option.  In general, Kaldi file
  formats come in both binary and text forms, and the --binary option controls how
  they are written.  However, this only controls how single objects (e.g. acoustic models)
  are written.  For whole collections of objects (e.g. collections of feature files),
  there is a different mechanism that we will come to later.
  Type
  \verbatim
  ./gmm-init-model >/dev/null
  \endverbatim
  What do you see, and what does this tell you about what Kaldi does with logging-type
  output?  The place that the usage message goes is the same place that all error and
  logging messages go, and there is a reason for this, which should become apparent
  when you start looking at the scripts.
  
  To get a little insight into the build process,  cd to ../matrix, and type
  \verbatim
  rm *.o
  make
  \endverbatim
  Look at the options that are passed to the compiler.  These are ultimately
  controlled by the variables that are set in ../kaldi.mk, which in turn is
  determined by ../configure.  Also look at the linking options, passed in when it
  creates matrix-lib-test.  You will get some idea what math libraries it is
  linking against (this is somewhat system dependent).  For more information on how
  we make use of external matrix libraries, you can read \ref matrixwrap.
  
  Change directory to one level up (to src/), and look at the "configure" file.  If you
  are familiar with the "configure" files generated by automake, you will notice that it
  is not one of those.  It is hand generated.  Search within it for "makefiles/"
  and quickly scan all the places where that string occurs (e.g. type into the shell
  "less configure", type "/makefiles[enter]" and then type "n" to see later instances).
  You will see that it makes use of some files with the suffix .mk in the subdirectory "makefiles/".
  These are essentially "prototype" versions of kaldi.mk.  Look at one of the prototypes,
  e.g. makefiles/cygwin.mk, to see the kinds of things they contain.  For systems that are more
  predictable, it just concatenates the system specific makefile together with makefiles/kaldi.mk.common
  and writes it to kaldi.mk.  For Linux, it has to
  do a little more sleuthing because there are so many distributions.  Mostly this relates
  to finding where the math libraries are installed.  If you are having problems with
  a build process, one solution is to try modifying kaldi.mk by hand.  In order to do this you should
  probably understand how Kaldi makes use of external math libraries (see \ref matrixwrap).
  
     \ref tutorial "Up: Kaldi tutorial" <BR>
     \ref tutorial_git "Previous: Version control with Git" <BR>
     \ref tutorial_running "Next: Running the example scripts" <BR>
  <P>
  */