28 int main(
int argc,
char *argv[]) {
29 using namespace kaldi;
31 typedef kaldi::int64 int64;
34 "Computes dot-products between iVectors; useful in application of an\n" 35 "iVector-based system. The 'trials-file' has lines of the form\n" 37 "and the output will have the form\n" 38 "<key1> <key2> [<dot-product>]\n" 39 "(if either key could not be found, the dot-product field in the output\n" 40 "will be absent, and this program will print a warning)\n" 42 "Usage: ivector-compute-dot-products [options] <trials-in> " 43 "<ivector1-rspecifier> <ivector2-rspecifier> <scores-out>\n" 45 " ivector-compute-dot-products trials ark:train_ivectors.scp ark:test_ivectors.scp trials.scored\n" 46 "See also: ivector-plda-scoring\n";
57 std::string trials_rxfilename = po.
GetArg(1),
58 ivector1_rspecifier = po.
GetArg(2),
59 ivector2_rspecifier = po.
GetArg(3),
60 scores_wxfilename = po.
GetArg(4);
63 int64 num_done = 0, num_err = 0;
68 Input ki(trials_rxfilename);
71 Output ko(scores_wxfilename, binary);
72 double sum = 0.0, sumsq = 0.0;
75 while (std::getline(ki.
Stream(), line)) {
76 std::vector<std::string> fields;
78 if (fields.size() != 2) {
79 KALDI_ERR <<
"Bad line " << (num_done + num_err) <<
" in input " 80 <<
"(expected two fields: key1 key2): " << line;
82 std::string key1 = fields[0], key2 = fields[1];
83 if (!ivector1_reader.
HasKey(key1)) {
84 KALDI_WARN <<
"Key " << key1 <<
" not present in 1st table of ivectors.";
88 if (!ivector2_reader.
HasKey(key2)) {
89 KALDI_WARN <<
"Key " << key2 <<
" not present in 2nd table of ivectors.";
94 &ivector2 = ivector2_reader.
Value(key2);
100 sumsq += dot_prod * dot_prod;
102 ko.
Stream() << key1 <<
' ' << key2 <<
' ' << dot_prod << std::endl;
106 BaseFloat mean = sum / num_done, scatter = sumsq / num_done,
107 variance = scatter - mean * mean, stddev = sqrt(variance);
108 KALDI_LOG <<
"Mean dot-product was " << mean <<
", standard deviation was " 111 KALDI_LOG <<
"Processed " << num_done <<
" trials " << num_err
113 return (num_done != 0 ? 0 : 1);
114 }
catch(
const std::exception &e) {
115 std::cerr << e.what();
This code computes Goodness of Pronunciation (GOP) and extracts phone-level pronunciation feature for...
void PrintUsage(bool print_command_line=false)
Prints the usage documentation [provided in the constructor].
Allows random access to a collection of objects in an archive or script file; see The Table concept...
The class ParseOptions is for parsing command-line options; see Parsing command-line options for more...
const T & Value(const std::string &key)
void SplitStringToVector(const std::string &full, const char *delim, bool omit_empty_strings, std::vector< std::string > *out)
Split a string using any of the single character delimiters.
int Read(int argc, const char *const *argv)
Parses the command line options and fills the ParseOptions-registered variables.
std::string GetArg(int param) const
Returns one of the positional parameters; 1-based indexing for argc/argv compatibility.
bool HasKey(const std::string &key)
int NumArgs() const
Number of positional parameters (c.f. argc-1).
A class representing a vector.
Real VecVec(const VectorBase< Real > &a, const VectorBase< Real > &b)
Returns dot product between v1 and v2.
int main(int argc, char *argv[])