| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| use strict; |
| use Getopt::Long; |
| use Data::Dumper; |
|
|
| my $VERSION = "3"; |
|
|
| my $USAGE = "\n\n$0 [-l <language>] [-h] -i <CTM file>\n\n". |
| "Version: $VERSION\n". |
| "Description: This Perl program (version $VERSION) validates a given CTM file.\n". |
| "\tNote that the program will exit after it finds all the syntax errors.\n". |
| "Options:\n". |
| " -l <language> : check regarding the laguage (default: english)\n". |
| " -h : print this help message\n". |
| "Input:\n". |
| " -i <CTM file>: a CTM file\n\n"; |
|
|
| |
| my %TYPES; |
| $TYPES{"lex"} = 1; |
| $TYPES{"frag"} = 1; |
| $TYPES{"fp"} = 1; |
| $TYPES{"un-lex"} = 1; |
| $TYPES{"for-lex"} = 1; |
| $TYPES{"non-lex"} = 1; |
| $TYPES{"misc"} = 1; |
| $TYPES{"noscore"} = 1; |
|
|
| |
| my $NUM_FIELDS = 8; |
| my $MIN_FIELDS = 5; |
|
|
| my $inputfile = ""; |
| my $language = "english"; |
|
|
| GetOptions |
| ( |
| 'i=s' => \$inputfile, |
| 'l=s' => \$language, |
| 'h' => sub { print $USAGE; exit }, |
| ); |
|
|
| if($inputfile eq "") |
| { |
| print $USAGE; |
| exit; |
| } |
|
|
| open(CTMFILE, $inputfile) or die "Unable to open for read ctm file '$inputfile'"; |
|
|
| my $errors = 0; |
| my $line = 0; |
|
|
| while(<CTMFILE>) |
| { |
| chomp; |
| $line++; |
| |
| |
| |
| next if($_ =~ /^;;/); |
| |
| my @ctm_record = split(/\s+/, $_); |
| |
| if(scalar(@ctm_record) < $MIN_FIELDS){ |
| print "ERROR: [line $line] ctm record must have at least $MIN_FIELDS fields and no whitespace at the beginning\n"; |
| $errors++; |
| } |
| elsif(scalar(@ctm_record) > $NUM_FIELDS) |
| { |
| print "ERROR: [line $line] ctm record must have no more than $NUM_FIELDS fields and no whitespace at the beginning\n"; |
| $errors++; |
| } |
| else |
| { |
|
|
| my $source = $ctm_record[0]; |
| my $channel = $ctm_record[1]; |
| my $beg_time = $ctm_record[2]; |
| my $duration = $ctm_record[3]; |
| my $token = $ctm_record[4]; |
| my $conf = (defined($ctm_record[5]) ? $ctm_record[5] : 0.0); |
| my $type = (defined($ctm_record[6]) ? $ctm_record[6] : "lex"); |
| my $speaker = (defined($ctm_record[7]) ? $ctm_record[7] : "spkr"); |
| |
| if($source !~ /^[A-Za-z0-9_-]+$/) |
| { |
| print "ERROR: [line $line] source '$source' must have alphanumeric, hyphens (-) and underscore (_) characters only\n"; |
| $errors++; |
| } |
| |
| if($channel !~ /^(\d+|[AB])$/) |
| { |
| print "ERROR: [line $line] channel '$channel' must be numeric only\n"; |
| $errors++; |
| } |
| |
| if ($token =~ /(<ALT>|<ALT_BEGIN>|<ALT_END>)/){ |
| if($beg_time !~ /^\*$/) |
| { |
| print "ERROR: [line $line] begin '$beg_time' time for ALT Tag must be an asterisk /*/\n"; |
| $errors++; |
| } |
| if($duration !~ /^\*$/) |
| { |
| print "ERROR: [line $line] duration '$duration' time for ALT Tag must be an asterisk /*/\n"; |
| $errors++; |
| } |
| } else { |
| if($beg_time !~ /^(\d+(\.\d+)?)$/) |
| { |
| print "ERROR: [line $line] begin '$beg_time' time must floating point value\n"; |
| $errors++; |
| } |
| |
| if($duration !~ /^(\d+(\.\d+)?)$/) |
| { |
| print "ERROR: [line $line] duration '$duration' time must floating point value\n"; |
| $errors++; |
| } |
| if( (lc($language) eq "english") && ($type eq "lex") ) |
| { |
| if( ($token !~ /^[A-Za-z-\']+$/) && ($token !~ /^[A-Za-z]\./) && ($token !~ /@/) && ($token !~ /%(BCN?ACK|HESITATION)/i)) |
| { |
| print "ERROR: [line $line] token '$token' must have alphabetic, hyphens (-) and apostrophes (') characters only\n"; |
| $errors++; |
| } |
| } |
| } |
|
|
| if($conf !~ /^(\d+(\.\d+)?)$/) |
| { |
| print "ERROR: [line $line] confidence '$conf' time must floating point value\n"; |
| $errors++; |
| } |
| |
| if(!defined($TYPES{$type})) |
| { |
| print "ERROR: [line $line] type '$type' is not a known type\n"; |
| $errors++; |
| } |
| |
| if($speaker !~ /^[A-Za-z0-9_-]+$/) |
| { |
| print "ERROR: [line $line] speaker '$speaker' must have alphanumeric, hyphens (-) and underscore (_) characters only\n"; |
| $errors++; |
| } |
| } |
| } |
|
|
| close(CTMFILE); |
|
|
| if($errors > 0){ |
| print "FATAL: Validation '$inputfile' failed due to the $errors previous error(s)\n"; |
| exit 1; |
| } else { |
| print "Validated $inputfile\n"; |
| exit 0; |
| } |
|
|