The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Lingua::PT::Speaker::Prosody;

use Text::RewriteRules;

use strict;
our %dur;
our %durac;
our %tra;
our ($vg,$con,$translateit);

BEGIN{
%dur = (
	#Vogais e semivogais

        'a', '100',
        '6', '80', # mim
        '6~', '108',

        'e', '100',
        'e~', '100',
        'E', '100',
        '@', '30',

        'i', '60',
        'i~', '80',
        'j', '40',
        'j~', '40', # = i~ mais curto

        'o', '70',
        'ô', '70',
        'o~', '80',
        'O', '90',

        'U', '50',  # = u mais curto...
        'U~', '50', # = u~ mas mais curto...
        'u', '70',
        'u~', '80',
        'w','30',
        'w~', '50',

	#consoantes

        'J', '60',
        'L', '105',
        'Q', '10',
        'R', '120',
        'S', '60',
        'Z', '60',
        'b', '60',
        'd', '60',
        'f', '100',
        'g', '50',
        'k', '100',
        'l', '80',
        'm', '70',
        'n', '80',
        'p', '100',
        'r', '50',
        's', '110',
        't', '85',
        'v', '60',
        'z', '60',
       );

%durac = (
	  'a', '108',
	  '6~', '108',
	  '6', '108',

	  'e', '108',
	  'e~', '108',
	  'E', '108',
	  '@', '30',

	  'i', '66',
	  'i~', '100',

	  'o', '88',
	  'ô', '88',
	  'o~', '88',
	  'O', '108',

	  'u', '96',
	  'u~', '100',
	 );

%tra=(
      'U~' => 'u~',
      'w~' => 'u~',
      'j~' => 'i~',
      'U' => 'u',
      'ô' => 'o',
     );

$vg = '[6AEOIQUaeiouwáéíóúãõâêôàj\@]~?'  ;
$con = '[SJLRZdrstpsfgklzcvbnm]' ; # consoante menos h
$translateit = join('|',(map {quotemeta($_)} keys %tra));

}

RULES a

=b=> $_ = "=Arranque$_ "; s/  / /g;

($vg|$con)=Sub=Sup==>\n$1-dur=$durac{$1}-30-80-80-190!! defined $durac{$1}
($vg|$con)=Sup==>\n$1-dur=$durac{$1}-80-190!!           defined $durac{$1}
($vg|$con)=Sub==>\n$1-dur=$durac{$1}-10-100-30-80!!     defined $durac{$1}

($vg|$con)=Sub=Sup==>\n$1-dur=100-30-80-80-190!!      ! defined $durac{$1}
($vg|$con)=Sup==>\n$1-dur=100-80-190!!                ! defined $durac{$1}
($vg|$con)=Sub==>\n$1-dur=100-10-100-30-80!!          ! defined $durac{$1}


($vg): \? ==>$1=Sub=Sup=Pausa500
($vg): ($vg) \? ==>$1=Sub $2=Sup=Pausa500
($vg): ($con) ($vg) \? ==>$1=Sub $2 $3=Sup=Pausa500
($vg): ($con) ($vg) ($con) \? ==>$1=Sub $2 $3=Sup $4 =Pausa500
($vg): ($vg) ($con) ($vg) \? ==>$1=Sub $2 $3 $4=Sup=Pausa500
($vg): ($vg) ($con) ($con) ($vg) \? ==>$1=Sub $2 $3 $4 $5=Sup=Pausa500
($vg): ($vg) ($vg) ($con) \? ==>$1=Sub $2 $3=Sup $4 =Pausa500
($vg) ($con) \? ==>$1=Sup $2 =Pausa500

\? ==> =Pausa500

($vg)=Acen==>\n$1-dur=$durac{$1}-30-130!! defined $durac{$1}
($vg)=Acen==>\n$1-dur=100-30-130!! ! defined $durac{$1}

($vg): ==>$1=Acen

/ ($con|$vg) ==>\n$1-dur=$dur{$1}-0-100!! defined $dur{$1}
/ ($con|$vg) ==>\n$1-dur=100-0-100!! ! defined $dur{$1}

($con|$vg) ==>\n$1-dur=$dur{$1} !! defined $dur{$1}
($con|$vg) ==>\n$1-dur=100 !! ! defined $dur{$1}

\.==>-80-90=Pausa450
\;==>-80-90=Pausa350
\,==>-90-100=Pausa300
\!==>-50-100=Pausa500
\?==>=Sup=Pausa500
=Arranque==>\n_	100	20   100

($translateit)-==>$tra{$1}	!! defined $tra{$1}

=Sub==>-31-80
=Sup==>-81-190

\n($vg|$con|_)\s+(\d+)(.*?)=Pausa\s*(\d+)=e=>"\n$1	" .(100+$2). "$3\n_ $4	90 90"

-==>	
dur===>
/==>

=Pausa\s*(\d+)==>"\n_ $1	90 90"

ENDRULES

1;