29 using namespace kaldi;
31 "Create PLP feature files.\n" 32 "Usage: compute-plp-feats [options...] <wav-rspecifier> " 33 "<feats-wspecifier>\n";
39 bool subtract_mean =
false;
41 std::string vtln_map_rspecifier;
42 std::string utt2spk_rspecifier;
45 std::string output_format =
"kaldi";
46 std::string utt2dur_wspecifier;
49 po.Register(
"output-format", &output_format,
"Format of the output " 50 "files [kaldi, htk]");
51 po.Register(
"subtract-mean", &subtract_mean,
"Subtract mean of each " 52 "feature file [CMS]. ");
53 po.Register(
"vtln-warp", &vtln_warp,
"Vtln warp factor (only applicable " 54 "if vtln-map not specified)");
55 po.Register(
"vtln-map", &vtln_map_rspecifier,
"Map from utterance or " 56 "speaker-id to vtln warp factor (rspecifier)");
57 po.Register(
"utt2spk", &utt2spk_rspecifier,
"Utterance to speaker-id " 58 "map (if doing VTLN and you have warps per speaker)");
59 po.Register(
"channel", &channel,
"Channel to extract (-1 -> expect mono, " 60 "0 -> left, 1 -> right)");
61 po.Register(
"min-duration", &min_duration,
"Minimum duration of segments " 62 "to process (in seconds).");
63 po.Register(
"write-utt2dur", &utt2dur_wspecifier,
"Wspecifier to write " 64 "duration of each utterance in seconds, e.g. 'ark,t:utt2dur'.");
70 if (po.NumArgs() != 2) {
75 std::string wav_rspecifier = po.GetArg(1);
77 std::string output_wspecifier = po.GetArg(2);
81 if (utt2spk_rspecifier !=
"" && vtln_map_rspecifier !=
"")
82 KALDI_ERR << (
"The --utt2spk option is only needed if " 83 "the --vtln-map option is used.");
91 if (output_format ==
"kaldi") {
92 if (!kaldi_writer.
Open(output_wspecifier))
93 KALDI_ERR <<
"Could not initialize output with wspecifier " 95 }
else if (output_format ==
"htk") {
96 if (!htk_writer.
Open(output_wspecifier))
97 KALDI_ERR <<
"Could not initialize output with wspecifier " 100 KALDI_ERR <<
"Invalid output_format string " << output_format;
105 int32 num_utts = 0, num_success = 0;
106 for (; !reader.Done(); reader.Next()) {
108 std::string utt = reader.Key();
109 const WaveData &wave_data = reader.Value();
110 if (wave_data.
Duration() < min_duration) {
111 KALDI_WARN <<
"File: " << utt <<
" is too short (" 112 << wave_data.
Duration() <<
" sec): producing no output.";
122 KALDI_WARN <<
"Channel not specified but you have data with " 123 << num_chan <<
" channels; defaulting to zero";
125 if (this_chan >= num_chan) {
126 KALDI_WARN <<
"File with id " << utt <<
" has " 127 << num_chan <<
" channels but you specified channel " 128 << channel <<
", producing no output.";
134 if (vtln_map_rspecifier !=
"") {
135 if (!vtln_map_reader.HasKey(utt)) {
136 KALDI_WARN <<
"No vtln-map entry for utterance-id (or speaker-id) " 140 vtln_warp_local = vtln_map_reader.Value(utt);
142 vtln_warp_local = vtln_warp;
148 plp.ComputeFeatures(waveform, wave_data.
SampFreq(),
149 vtln_warp_local, &features);
151 KALDI_WARN <<
"Failed to compute features for utterance " << utt;
157 mean.Scale(1.0 / features.NumRows());
158 for (
size_t i = 0;
i < features.NumRows();
i++)
159 features.Row(
i).
AddVec(-1.0, mean);
161 if (output_format ==
"kaldi") {
162 kaldi_writer.
Write(utt, features);
164 std::pair<Matrix<BaseFloat>,
HtkHeader> p;
165 p.first.Resize(features.NumRows(), features.NumCols());
166 p.first.CopyFromMat(features);
170 static_cast<int16
>(
sizeof(
float)*features.NumCols()),
175 htk_writer.
Write(utt, p);
177 if (utt2dur_writer.IsOpen()) {
178 utt2dur_writer.Write(utt, wave_data.
Duration());
180 if (num_utts % 10 == 0)
181 KALDI_LOG <<
"Processed " << num_utts <<
" utterances";
182 KALDI_VLOG(2) <<
"Processed features for key " << utt;
185 KALDI_LOG <<
" Done " << num_success <<
" out of " << num_utts
187 return (num_success != 0 ? 0 : 1);
188 }
catch(
const std::exception &e) {
189 std::cerr << e.what();
This code computes Goodness of Pronunciation (GOP) and extracts phone-level pronunciation feature for...
bool Open(const std::string &wspecifier)
void AddRowSumMat(Real alpha, const MatrixBase< Real > &M, Real beta=1.0)
Does *this = alpha * (sum of rows of M) + beta * *this.
This class is for when you are reading something in random access, but it may actually be stored per-...
A templated class for writing objects to an archive or script file; see The Table concept...
BaseFloat SampFreq() const
const Matrix< BaseFloat > & Data() const
void Write(const std::string &key, const T &value) const
The class ParseOptions is for parsing command-line options; see Parsing command-line options for more...
void Register(OptionsItf *opts)
A templated class for reading objects sequentially from an archive or script file; see The Table conc...
This class's purpose is to read in Wave files.
A class representing a vector.
#define KALDI_ASSERT(cond)
MatrixIndexT NumRows() const
Returns number of rows (or zero for empty matrix).
BaseFloat Duration() const
PlpOptions contains basic options for computing PLP features.
This templated class is intended for offline feature extraction, i.e.
void AddVec(const Real alpha, const VectorBase< OtherReal > &v)
Add vector : *this = *this + alpha * rv (with casting between floats and doubles) ...
Represents a non-allocating general vector which can be defined as a sub-vector of higher-level vecto...