This is sayTimit.pl in view mode; [Download] [Up]
#! /usr/local/bin/perl # sayTimit # Paul Callaghan, may1994. # University of Durham. # instructions elsewhere (in file sayTimit.doc) %timit2ota = ( "b", "b", "d", "d", "g", "g", "p", "p", "t", "t", "k", "k", "dx", "d", "q", "t", "jh", "dZ", "ch", "tS", "s", "s", "sh", "S", "z", "z", "zh", "Z", "f", "f", "th", "T", "v", "v", "dh", "D", "m", "m", "n", "n", "ng", "N", "em", "m", "en", "n", "eng", "N", "nx", "n", "l", "l", "r", "r", "w", "w", "y", "j", "hh", "h", "hv", "h", "el", "l", "iy", "i", "ih", "I", "eh", "e", "ea", "e@", # eg bare, or air. "ey", "eI", "ae", "&", "aa", "A", "aw", "aU", "ay", "aI", "ah", "V", "oh", "0", "oy", "oI", "ow", "@U", "uh", "U", "uw", "u", "ux", "u", "er", "3", "ax", "@", "ix", "I", "axr", "R", "ax-h", "e", # forgotten what this is! # non-timit symbols for RP Vowels "ia", "I@", # as in 'beer' "ao", "O", # as in 'cord' "ua", "U@", # as in 'tour' "epi", " ", # epenthetic silence "sil", " ", # silence "pau", " ", # pause "1", "'", # primary stress "2", "," # secondary stress. ); ################################################################################ # crank up 'say'. # "say:sound <params>" needs to be changed to your installation of # rsynth, with desired parameters. open(SAY, "| say:sound +h -g 0.2") || die "Couldn't start SAY: $!\n"; # then make it flush after every write/print operation. The method is to # set it temporarily as the default output channel, then get it to flush, # then reset the old default channel. Surprisingly (for some ppl), SAY will # STILL flush as required. $oldofh = select(SAY); # make it default $| = 1; # flush after each IO op. select($oldofh); # and reset. # open input file. open(INPUT, $ARGV[0]) || die "Couldn't open pronunciations file $ARGV[0].\n"; shift; # startfrom word? $startfrom = $ARGV[0]; if ($startfrom ne "") { do { $_ = <INPUT>; @tmp = split; } until ( $tmp[0] eq $startfrom); print "startfrom " . $_ . "\n"; } else { $_ = <INPUT>; # first line expected } # main loop. START: do { $orig = $_; s/#.*//; # kill comment s/[.]//g; # kill '.' s/([a-z]*)1/1 \1/g; s/([a-z]*)2/2 \1/g; # change stress notation: OTA seems to require # marks BEFORE the syllable, not AFTER the # 'nuclear'(?) vowel. @tmp = split; $phons = ""; foreach $p (@tmp[1..$#tmp]) { if ($timit2ota{$p} eq "") { print "\nERROR: unknown symbol " . $p; } else { $phons .= $timit2ota{$p}; } } $tmp[0] =~ tr/A-Z/a-z/; # current word to lower case. $ig = 0; do { print STDOUT ">> " . $orig; print STDOUT "== " . $phons . "\n"; unless ($ig) { print SAY "[" . $phons . "]\n"; } # write result to SAY $ig = 0; $cmd = <STDIN>; chop $cmd; if ($cmd =~ /^s/) { $cmd =~ s/^s//; if ($cmd eq "") { print SAY $tmp[0] . "\n"; } else { print SAY $cmd . "\n"; } $ig = 1;} if ($cmd =~ /^t /) { $old = $_; $cmd =~ s/^t //; $_ = $cmd; goto START; } if ($cmd =~ /^p/) { $_ = $old; goto START; } } until ($cmd eq "n"); } while (<INPUT>); close(INPUT); close(SAY);
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.