voxforge.org
VoxForge Dev

Changeset 2612

Show
Ignore:
Timestamp:
06/16/08 21:20:23 (2 months ago)
Author:
kmaclean
Message:

fixMissingWords.pl snapshot

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • Trunk/Scripts/Audio_scripts/AudioSegmentation/fixMissingWords.pl

    r2611 r2612  
    1313use Carp; 
    1414use XML::LibXML; 
    15 use Term::ReadLine; 
     15use Term::ReadLine; # using "preput" feature from Term::ReadLine::Gnu; but must use Term::ReadLine as front-end 
     16use Term::ANSIColor; 
    1617 
    1718my $xml = 'AudioBook/interim_files/MissingWords_combined.xml'; 
     
    2324my $prompt ="VoxForge>"; 
    2425my (@promptSelector, @phoneSelector); 
    25 my $firstloop = 1;  
    26 foreach my $word ($doc->findnodes('/ken/word')) { 
    27         my ($attr) = $word->attributes(); 
    28         print $word->nodeName . ":" . $attr->to_literal() . "\n";        
    29         my @childnodes = $word->childNodes; 
    30         displayChildNodes(@childnodes); 
    31         if ($firstloop) { 
    32                 print "VoxForge Missing Word processing (q to quit)\n"; 
    33                 $firstloop = 0;                  
    34         }  
    35         my $phonesSelected = 0; 
    36         while (defined(my $line=$term->readline($prompt))) { 
     26print "VoxForge Missing Word processing (q to quit)\n"; 
     27print "--------------------------------------------\n"; 
     28 
     29my @processedWordsPhones; 
     30my $wordNumber = 0; 
     31my @wordList = $doc->findnodes('/ken/word'); 
     32while (1) { 
     33        my $wordRef = $wordList[$wordNumber]; 
     34        my $command = process($wordRef,$wordNumber,\@processedWordsPhones); 
     35        if ($command eq "back") { 
     36                if ($wordNumber-1 >= 0 ) { 
     37                        $wordNumber--; 
     38                } else { 
     39                        print color("red"), "\ncan\'t go back, already at beginning\n" , color("reset");                                         
     40                } 
     41        } elsif ($command eq "next") {  
     42                if ($wordNumber < (@wordList - 1)) { 
     43                        $wordNumber++; 
     44                } else { 
     45                        exit; 
     46                } 
     47        } 
     48
     49 
     50updateDictionary(\@processedWordsPhones); 
     51print "completed!\n"; 
     52 
     53##################################################### 
     54# methods 
     55##################################################### 
     56sub process{ 
     57        my ($wordRef,$wordNumber,$processedWordsPhones)= @_; 
     58        my $phonesPreviouslySelected = 0;        
     59        my ($attrRef) = $wordRef->attributes(); 
     60        my $word = $attrRef->to_literal(); 
     61         
     62        displayChildNodes($wordRef); 
     63        while (defined(my $line=$term->readline($prompt))) { # get command from user     
    3764                if ($line eq 'q') { 
    3865                        exit; 
    39                 } 
    40                 print $word->nodeName . ":" . $attr->to_literal() . "\n";                        
    41                 displayChildNodes(@childnodes);          
    42                 if ($line =~ /^\d$/) { 
     66                } elsif ($line =~ /^\d+$/) { # digit 
     67                        displayChildNodes($wordRef); 
    4368                        if (($line > 0) and ($line < @promptSelector)) { 
    4469                                playAudio($promptSelector[$line]); 
    4570                        } else { 
    46                                 print "\nselected number \"$line\" is out of range available\n";                               
     71                                print color("red"), "\nselected number \"$line\" is out of range available\n" , color("reset");                                
    4772                        }        
    48                 } elsif ($line =~ /^\w$/) { 
     73                } elsif ($line =~ /^[A-Za-z]$/) { # one letter  
     74                        displayChildNodes($wordRef); 
    4975                        my $asciiOfFirstCharacter = ord($line); 
    50                         print "\@phoneSelector:" . scalar(@phoneSelector) . "\n"; 
    5176                        if (($asciiOfFirstCharacter >= 97 ) and ($asciiOfFirstCharacter < @phoneSelector)) { 
    52                                 print "\n$line:\t$phoneSelector[$asciiOfFirstCharacter]\n"; 
    53                                 $phonesSelected = $phoneSelector[$asciiOfFirstCharacter]; 
     77                                print "\nSelected phone set:"; 
     78                                print color("green"),"$line:\t$phoneSelector[$asciiOfFirstCharacter]\n" , color("reset");        
     79                                print "(press \"@\" then hit <enter> key to accept, and move to next word)\n"; 
     80                                print "(enter \"@\" followed by your own phone sequence, and then hit <enter> key)\n"; 
     81                                print "(enter \"^\" to go back one entry)\n"; 
     82                                $phonesPreviouslySelected = $phoneSelector[$asciiOfFirstCharacter]; 
    5483                        } else { 
    55                                 print "\nselected letter \"$line\" is out of range available\n";                               
     84                                print color("red"), "\nselected letter \"$line\" is out of range available\n" , color("reset");                                
    5685                        }        
    57                 } elsif (($line eq '@') and ($phonesSelected)) { 
    58                         print "phone selected: $phonesSelected\n"; 
    59                         last; 
     86                } elsif (($line eq '@') and ($phonesPreviouslySelected)) { # phoneme set selected by user 
     87                        $$processedWordsPhones[$wordNumber] = [$word,$phonesPreviouslySelected]; 
     88                        return "next"; 
     89                } elsif (($line =~ /^\@(.+)$/) and ($phonesPreviouslySelected)) { # phoneme set selected by user 
     90                        $$processedWordsPhones[$wordNumber] = [$word,$1]; 
     91                        return "next"; 
     92                } elsif ($line eq '^') { # back one 
     93                        if (($wordNumber -1)>0) { 
     94                                $wordNumber = $wordNumber -1; 
     95                        }        
     96                        return "back"; 
    6097                } else { 
    61                         print "only numbers or single characters permitted\n"; 
     98                        displayChildNodes($wordRef);                     
     99                        print color("red"), "\nonly numbers or single characters permitted\n" , color("reset"); 
    62100                } 
    63101        } 
    64102} 
    65 print "the end!\n"; 
     103 
     104sub displayChildNodes { 
     105        my ($wordRef)= @_; 
     106        my $promptSelector = 1; 
     107        my $phoneSelector = 97;  
     108        my ($attrRef) = $wordRef->attributes(); 
     109        my $word = $attrRef->to_literal(); 
     110        my @childNodes = $wordRef->childNodes;   
     111                 
     112        print $wordRef->nodeName . " " . ($wordNumber +1) ." of " . scalar(@wordList). ":";  
     113        print color("green"), $word . "\n" , color("reset");                     
     114        foreach my $child (@childNodes) { 
     115                if ($child->nodeName eq "prompt") { 
     116                my ($attr) = $child->attributes; 
     117                        my $promptID=$attr->to_literal; 
     118                        my $prompt=$child->to_literal; 
     119                         
     120                        print "$promptSelector:";                        
     121                print $promptID . ":" . $prompt . "\n"; 
     122                        $promptSelector[$promptSelector] = $promptID;                    
     123                        $promptSelector++;       
     124                } 
     125                if ($child->nodeName eq "g2pPhones") { 
     126                        my $phones = $child->to_literal; 
     127                         
     128                        print "  " . chr($phoneSelector) . ":g2p:\t" . $phones . "\n"; 
     129                $phoneSelector[$phoneSelector] = $phones;                                
     130                        $phoneSelector++;                                                                
     131                } 
     132                if ($child->nodeName eq "hvitePhones") { 
     133                        my ($attr) = $child->attributes; 
     134                        my $promptID=$attr->to_literal;  
     135                        my $phones = $child->to_literal;                         
     136 
     137                        print "  " . chr($phoneSelector) . ":"; 
     138                print $promptID . ":\t" . $phones . "\n"; 
     139                $phoneSelector[$phoneSelector] = $phones;                
     140                        $phoneSelector++;                        
     141                } 
     142        }        
     143
     144 
     145sub updateDictionary { 
     146        my ($word,$phonesSelected)= @_; 
     147        open(MISSINGWORDSFINAL,">AudioBook/interim_files/MissingWords_final") or confess ("cannot open AudioBook/interim_files/MissingWords_final file"); 
     148        foreach my $line (@$phonesSelected) { 
     149                print "$line\n"; 
     150                my $word = @$line[0]; 
     151                my $phonesSelected = @$line[1]; 
     152                print MISSINGWORDSFINAL "$word\t[$word]\t$phonesSelected\n"; 
     153        } 
     154        close MISSINGWORDSFINAL;         
     155
    66156 
    67157sub playAudio { 
    68158        my ($audioFile)= @_; 
    69159        my $fullpath = "AudioBook/interim_files/missingWordsFolder/" . $audioFile . "-mw.wav"; 
    70         print "\nplaying $audioFile\n"; 
    71         $command = ("aplay -q $fullpath"); system($command) == 0 or confess "fullrun $command failed: $?"; 
     160        if (-f $fullpath) { 
     161                print "\nplaying $audioFile\n"; 
     162                $command = ("aplay -q $fullpath"); system($command) == 0 or confess "fullrun $command failed: $?"; 
     163        } else { 
     164                print color("red"), "\ncan't find $fullpath\n", color("reset"); 
     165        } 
    72166} 
    73167 
    74 sub displayChildNodes { 
    75         my (@childnodes)= @_; 
    76         my $promptSelector = 1; 
    77         my $phoneSelector = 97;  
    78         foreach my $child (@childnodes) { 
    79                 if ($child->nodeName eq "prompt") { 
    80                         print "$promptSelector:";                        
    81                 my ($attr) = $child->attributes(); 
    82                 print $attr->to_literal() . ":" . $child->to_literal . "\n"; 
    83                         $promptSelector[$promptSelector] = $attr->to_literal;                    
    84                         $promptSelector++;       
    85                 } 
    86                 if ($child->nodeName eq "g2pPhones") { 
    87                         print "  " . chr($phoneSelector) . ":\t\t" . $child->to_literal . "\n"; 
    88                 $phoneSelector[$phoneSelector] = $child->to_literal;                             
    89                         $phoneSelector++;                                                                
    90                 } 
    91                 if ($child->nodeName eq "hvitePhones") { 
    92                         print "  " . chr($phoneSelector) . ":"; 
    93                 my ($attr) = $child->attributes(); 
    94                 print $attr->to_literal() . ":\t" . $child->to_literal . "\n"; 
    95                 $phoneSelector[$phoneSelector] = $child->to_literal;             
    96                         $phoneSelector++;                        
    97                 } 
    98         }        
    99 
     168 
     169 
    100170=head1 Change Log     
    101171