summaryrefslogtreecommitdiff
path: root/htk_io
diff options
context:
space:
mode:
authorDeterminant <[email protected]>2016-03-13 16:18:36 +0800
committerDeterminant <[email protected]>2016-03-13 16:18:36 +0800
commit93eb84aca23526959b76401fd6509f151a589e9a (patch)
treef9abef4f3bc9b49190ec2ec775344d5cdb52388c /htk_io
parentddc4545050b41d12cfdc19cea9ba31c940d3d537 (diff)
add TNet tutorial; support converting global transf from TNet format
Diffstat (limited to 'htk_io')
-rw-r--r--htk_io/tools/tnet_to_nerv.c57
-rw-r--r--htk_io/tools/tnet_to_nerv.cpp47
2 files changed, 45 insertions, 59 deletions
diff --git a/htk_io/tools/tnet_to_nerv.c b/htk_io/tools/tnet_to_nerv.c
deleted file mode 100644
index 5774819..0000000
--- a/htk_io/tools/tnet_to_nerv.c
+++ /dev/null
@@ -1,57 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-char token[1024];
-double mat[4096][4096];
-int main() {
- FILE *fout = fopen("converted.nerv", "w");
- int cnt = 0;
- while (scanf("%s", token) != EOF)
- {
- int nrow, ncol;
- int i, j;
- if (strcmp(token, "<biasedlinearity>") == 0)
- {
- scanf("%d %d", &ncol, &nrow);
- scanf("%s %d %d", token, &ncol, &nrow);
- printf("%d %d\n", nrow, ncol);
- for (j = 0; j < ncol; j++)
- for (i = 0; i < nrow; i++)
- scanf("%lf", mat[i] + j);
- off_t base = ftello(fout);
- fprintf(fout, "%16d", 0);
- fprintf(fout, "{type=\"nerv.LinearTransParam\",id=\"affine%d_ltp\"}\n",
- cnt);
- fprintf(fout, "%d %d\n", nrow, ncol);
- for (i = 0; i < nrow; i++)
- {
- for (j = 0; j < ncol; j++)
- fprintf(fout, "%.8f ", mat[i][j]);
- fprintf(fout, "\n");
- }
- size_t length = ftello(fout) - base;
- fseeko(fout, base, SEEK_SET);
- fprintf(fout, "[%13lu]\n", length);
- fseeko(fout, 0, SEEK_END);
- if (scanf("%s %d", token, &ncol) == 2 && *token == 'v')
- {
- base = ftello(fout);
- for (j = 0; j < ncol; j++)
- scanf("%lf", mat[0] + j);
- fprintf(fout, "%16d", 0);
- fprintf(fout, "{type=\"nerv.BiasParam\",id=\"affine%d_bp\"}\n",
- cnt);
- fprintf(fout, "1 %d\n", ncol);
- for (j = 0; j < ncol; j++)
- fprintf(fout, "%.8f ", mat[0][j]);
- fprintf(fout, "\n");
- length = ftello(fout) - base;
- fseeko(fout, base, SEEK_SET);
- fprintf(fout, "[%13lu]\n", length);
- cnt++;
- fseeko(fout, 0, SEEK_END);
- }
- }
- }
- return 0;
-}
diff --git a/htk_io/tools/tnet_to_nerv.cpp b/htk_io/tools/tnet_to_nerv.cpp
index 63a104d..067097e 100644
--- a/htk_io/tools/tnet_to_nerv.cpp
+++ b/htk_io/tools/tnet_to_nerv.cpp
@@ -4,6 +4,7 @@
#include <cstring>
#include <cassert>
#include <cstdlib>
+#include <map>
char token[1024];
char output[1024];
@@ -23,6 +24,18 @@ void free_matrix(double **mat, int nrow, int ncol) {
delete [] mat;
}
+int cnt0;
+std::map<std::string, int> param_cnt;
+int get_param_cnt(const std::string &key) {
+ std::map<std::string, int>::iterator it = param_cnt.find(key);
+ if (it == param_cnt.end())
+ {
+ param_cnt[key] = cnt0 + 1;
+ return cnt0;
+ }
+ return it->second++;
+}
+
int main(int argc, char **argv) {
FILE *fin;
std::ofstream fout;
@@ -30,12 +43,14 @@ int main(int argc, char **argv) {
fin = fopen(argv[1], "r");
fout.open(argv[2]);
assert(fin != NULL);
- int cnt = argc > 3 ? atoi(argv[3]) : 0;
+ cnt0 = argc > 3 ? atoi(argv[3]) : 0;
+ bool shift;
while (fscanf(fin, "%s", token) != EOF)
{
int nrow, ncol;
int i, j;
double **mat;
+ int cnt = get_param_cnt(token);
if (strcmp(token, "<biasedlinearity>") == 0)
{
fscanf(fin, "%d %d", &ncol, &nrow);
@@ -84,10 +99,38 @@ int main(int argc, char **argv) {
sprintf(output, "[%13lu]\n", length);
fout << output;
fout.seekp(0, std::ios_base::end);
- cnt++;
}
free_matrix(mat, nrow, ncol);
}
+ else if ((shift = (strcmp(token, "<bias>") == 0)) ||
+ strcmp(token, "<window>") == 0)
+ {
+ fscanf(fin, "%d %d", &ncol, &nrow);
+ printf("%d %d\n", nrow, ncol);
+ assert(nrow == ncol);
+ mat = new_matrix(1, ncol);
+ assert(fscanf(fin, "%s %d", token, &ncol) == 2 && *token == 'v');
+ for (j = 0; j < ncol; j++)
+ fscanf(fin, "%lf", mat[0] + j);
+ long base = fout.tellp();
+ sprintf(output, "%16d", 0);
+ fout << output;
+ sprintf(output, "{type=\"nerv.BiasParam\",id=\"%s%d\"}\n",
+ shift ? "bias" : "window",
+ cnt);
+ fout << output;
+ sprintf(output, "%d %d\n", 1, ncol);
+ fout << output;
+ for (j = 0; j < ncol; j++)
+ fout << mat[0][j] << " ";
+ fout << std::endl;
+ long length = fout.tellp() - base;
+ fout.seekp(base);
+ sprintf(output, "[%13lu]\n", length);
+ fout << output;
+ fout.seekp(0, std::ios_base::end);
+ free_matrix(mat, 1, ncol);
+ }
}
return 0;
}