#!/usr/bin/perl
#
# HTKのHviteコマンドに下記の"option"を設定し、出力した場合の 'labファイル 'を、Praatの 'textgrid' 形式に変換します。
#   -a [Perform alignment]
#   -m [During recognition keep track of model boundaries]
# ※ smpPeriod period, fsize sample, fshift sample の値はjuliusのデフォルト設定に準じます。
# ※ データの5列目（単語ラベル）が UTT-START で始まり UTT-END で終わっている必要があります。
#
# 実行例（第一引数：入力するファイルのパス　第二引数：出力するファイルのパス）
# > perl transalignHTK2textgrid.pl sample_1.lab sample_1.Textgrid
#
# 2013/04/03 宮澤幸希（m-kouki@moegi.waseda.jp）　協力：早大GITI 鍔木様
# 詳細説明は http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/24.html#e7a18792 および
#            http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/92.html#wf331b9e をご覧ください。

######################################################################

#はじめに音素の総数を調べ、最終音素(UTT-END)の終了時間も計算しておく
$segmentCount = 1;
$segmentSwitch = 1;
$finalSegEndtime = 0;
#入力ファイル読み込み
open(IN1, $ARGV[0]);
while ($line = <IN1>) { 
	if ($line =~ /UTT-START/) {
		$segmentSwitch = 1;
	} elsif (($segmentSwitch == 1)&&($line =~ /UTT-END/)) {
		$segmentSwitch = 0;
		#最終音素(UTT-ENDを含む行)の終了時間の計算
		@str = split(/ /, $line);
		$finalSegEndtime = $str[1] * 0.0000001; # 単位を[s]に変換する
	}
	if ($segmentSwitch == 1) {
		$segmentCount++;
	}
}
close(IN1);

#続いて音素を読み込んで、時間情報を計算して、TextGrid形式で出力する
#出力ファイル初期化
open(OUT, "> $ARGV[1]");
print(OUT "File type = \"ooTextFile\"\n");
print(OUT "Object class = \"TextGrid\"\n");
print(OUT "\n");
print(OUT "xmin = 0\n");
print(OUT "xmax = $finalSegEndtime \n");
print(OUT "tiers? <exists>\n");
print(OUT "size = 1\n");
print(OUT "item []: \n");
print(OUT "    item [1]:\n");
print(OUT "        class = \"IntervalTier\" \n");
print(OUT "        name = \"seg\" \n");
print(OUT "        xmin = 0 \n");
print(OUT "        xmax = $finalSegEndtime \n");
print(OUT "        intervals: size = $segmentCount \n");
close(OUT);
#入力ファイル読み込み
$segmentCount = 1;
$segmentSwitch = 0;
open(IN2, $ARGV[0]);
while ($line = <IN2>) {
	#print $line;
	if ($line =~ /UTT-START/) {
		$segmentSwitch = 1;
	}
	if ($segmentSwitch == 1) {
		#開始時間・終了時間を取得／計算
		@str = split(/ /, $line);
		#開始時間
		$segBegintime = $str[0] * 0.0000001;
		#終了時間
		$segEndtime = $str[1] * 0.0000001;
		#音素名
		$segmentName = $str[2];

		#出力ファイル書き込み
		open(OUT, ">> $ARGV[1]");
		print(OUT "        intervals [$segmentCount]:\n");
		print(OUT "            xmin = $segBegintime \n");
		print(OUT "            xmax = $segEndtime \n");
		print(OUT "            text = \"$segmentName\" \n");
		close(OUT);
		$segmentCount++;
	}
	if (($segmentSwitch == 1)&&($line =~ /UTT-END/)) {
		$segmentSwitch = 0;
	}
}
close(IN2);


