diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2020-07-11 10:05:40 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2020-07-11 15:01:33 +0000 |
commit | aad57ea1cc59144475cc80538523121d97b293d4 (patch) | |
tree | 9796bef0b640976808a9243166070e2edcba58c4 | |
parent | 185d2bbb6a967ad5fb72363677c9b14d1011c949 (diff) | |
download | rockbox-aad57ea1cc59144475cc80538523121d97b293d4.tar.gz rockbox-aad57ea1cc59144475cc80538523121d97b293d4.zip |
voice: Further enhancements for multi-lingual voice generation
* configure: allow use of full tts engine names when making selection
* voice.pl: fixes for espeak-ng
* build.pm: Add a list of "standard" voices for tooling use
The latter will be used by the nightly builder infrastructure to
determine what voices to generate.
Change-Id: Iff55288f94a30fbe08d8345b730969b7264b5e0f
-rw-r--r-- | tools/builds.pm | 125 | ||||
-rwxr-xr-x | tools/configure | 20 | ||||
-rwxr-xr-x | tools/voice.pl | 5 |
3 files changed, 139 insertions, 11 deletions
diff --git a/tools/builds.pm b/tools/builds.pm index fe400b6777..a69300cd3f 100644 --- a/tools/builds.pm +++ b/tools/builds.pm | |||
@@ -2,12 +2,15 @@ $publicrelease="3.15"; | |||
2 | $releasedate="15 Nov 2019"; | 2 | $releasedate="15 Nov 2019"; |
3 | $releasenotes="/wiki/ReleaseNotes315"; | 3 | $releasenotes="/wiki/ReleaseNotes315"; |
4 | 4 | ||
5 | # { 'modelname' => { | 5 | ################################################################ |
6 | |||
7 | # 'modelname' => { | ||
6 | # name => 'Full Name', | 8 | # name => 'Full Name', |
7 | # status => 1, # 0=retired, 1=unusable, 2=unstable, 3=stable | 9 | # status => 1, # 0=retired, 1=unusable, 2=unstable, 3=stable |
8 | # ram => 2, # optional (used?) | 10 | # ram => 2, # optional (used?) |
9 | # manual => 'modelname2', # optional (uses modelname2's manual) | 11 | # manual => 'modelname2', # optional (uses modelname2's manual) |
10 | # icon => 'modelname3', # optional (uses modelname3's icon) | 12 | # icon => 'modelname3', # optional (uses modelname3's icon) |
13 | # voice => 'modelname4' # optional (uses modelname4's voice) | ||
11 | # release => '3.14', # optional (final release version, if different from above) | 14 | # release => '3.14', # optional (final release version, if different from above) |
12 | # } | 15 | # } |
13 | 16 | ||
@@ -493,4 +496,124 @@ sub allbuilds { | |||
493 | return @list; | 496 | return @list; |
494 | } | 497 | } |
495 | 498 | ||
499 | ################################################################ | ||
500 | |||
501 | # 'voicename' => { | ||
502 | # lang => 'langname', # source rockbox .lang file | ||
503 | # name => 'Native Name ( English Name )', # descriptive text | ||
504 | # short => 'sss', # short iso-ish text | ||
505 | # defengine => 'enginename', # which engine to prefer | ||
506 | # engines => { # supported engines | ||
507 | # enginea = '-opt1=x -opt2=y', # options for enginea | ||
508 | # engineb = '-lang=xx', # options for engineb | ||
509 | # }, | ||
510 | # } | ||
511 | |||
512 | # A single source language file can have many voice variants. | ||
513 | # For example, Mandarin and Cantonese use the same "Chinese" script. | ||
514 | # Also, different genders or regional accents for the same language | ||
515 | |||
516 | %voices = ( | ||
517 | # UK English always comes first | ||
518 | 'english' => { | ||
519 | 'lang' => 'english', | ||
520 | 'name' => 'UK English', | ||
521 | 'short' => 'en-uk', | ||
522 | 'defengine' => 'espeak', | ||
523 | 'engines' => { | ||
524 | 'festival' => '--language english', | ||
525 | 'espeak' => '-ven-gb', | ||
526 | 'gtts' => '-l en-gb', | ||
527 | }, | ||
528 | }, | ||
529 | # Everything else in alphabetical order | ||
530 | 'english-us' => { | ||
531 | 'lang' => 'english-us', | ||
532 | 'name' => 'American English', | ||
533 | 'short' => 'en-us', | ||
534 | 'defengine' => 'espeak', | ||
535 | 'engines' => { | ||
536 | 'festival' => '--language english', | ||
537 | 'espeak' => '-ven-us', | ||
538 | 'gtts' => '-l en-us', | ||
539 | }, | ||
540 | }, | ||
541 | 'greek' => { | ||
542 | 'lang' => 'greek', | ||
543 | 'name' => 'Ελληνικά (Greek)', | ||
544 | 'short' => 'el', | ||
545 | 'defengine' => 'espeak', | ||
546 | 'engines' => { | ||
547 | 'espeak' => '-vel', | ||
548 | 'gtts' => '-l el', | ||
549 | }, | ||
550 | }, | ||
551 | 'polski' => { | ||
552 | 'lang' => 'polski', | ||
553 | 'name' => 'Polski (Polish)', | ||
554 | 'short' => 'pl', | ||
555 | 'defengine' => 'espeak', | ||
556 | 'engines' => { | ||
557 | 'espeak' => '-vpl', | ||
558 | 'gtts' => '-l pl', | ||
559 | }, | ||
560 | }, | ||
561 | 'russian' => { | ||
562 | 'lang' => 'russian', | ||
563 | 'name' => 'Русский (Russian)', | ||
564 | 'short' => 'ru', | ||
565 | 'defengine' => 'espeak', | ||
566 | 'engines' => { | ||
567 | 'espeak' => '-vru', | ||
568 | 'gtts' => '-l ru', | ||
569 | }, | ||
570 | }, | ||
571 | 'slovak' => { | ||
572 | 'lang' => 'slovak', | ||
573 | 'name' => 'Slovenský (Slovak)', | ||
574 | 'short' => 'sk', | ||
575 | 'defengine' => 'espeak', | ||
576 | 'engines' => { | ||
577 | 'espeak' => '-vsk', | ||
578 | 'gtts' => '-l sk', | ||
579 | }, | ||
580 | }, | ||
581 | 'srpski' => { | ||
582 | 'lang' => 'srpski', | ||
583 | 'name' => 'српски (Serbian)', | ||
584 | 'short' => 'sr', | ||
585 | 'defengine' => 'espeak', | ||
586 | 'engines' => { | ||
587 | 'espeak' => '-vsr', | ||
588 | 'gtts' => '-l sr', | ||
589 | }, | ||
590 | }, | ||
591 | ); | ||
592 | |||
593 | sub bylang { | ||
594 | return uc $voices{$a}{lang} cmp uc $voices{$b}{lang}; | ||
595 | } | ||
596 | |||
597 | sub allvoices { | ||
598 | my @list; | ||
599 | |||
600 | for my $b (sort bylang keys %voices) { | ||
601 | push @list, $b; | ||
602 | } | ||
603 | |||
604 | return @list; | ||
605 | } | ||
606 | |||
607 | sub voicesforlang($) { | ||
608 | my $l = shift @_; | ||
609 | my @list; | ||
610 | |||
611 | for my $b (sort bylang keys %voices) { | ||
612 | push @list, $b if ($voices{$b}{lang} eq $b); | ||
613 | } | ||
614 | |||
615 | return @list; | ||
616 | } | ||
617 | |||
618 | |||
496 | 1; | 619 | 1; |
diff --git a/tools/configure b/tools/configure index aab3e59dfb..96d45a9173 100755 --- a/tools/configure +++ b/tools/configure | |||
@@ -1167,8 +1167,8 @@ voiceconfig () { | |||
1167 | DEFAULT_CHOICE="O" | 1167 | DEFAULT_CHOICE="O" |
1168 | fi | 1168 | fi |
1169 | 1169 | ||
1170 | if [ "$FESTIVAL" = "$FLITE" ] && [ "$FLITE" = "$ESPEAK" ] && [ "$ESPEAK" = "$SAPI" ] && [ "$SAPI" = "$MIMIC"] && [ "$MIMIC" = "$SWIFT" ] && [ "$SWIFT" = "$RBSPEAK" ] && [ "$RBSPEAK" = "$GTTS" ] ; then | 1170 | if [ "$FESTIVAL" = "$FLITE" ] && [ "$FLITE" = "$ESPEAK" ] && [ "$ESPEAK" = "$SAPI" ] && [ "$SAPI" = "$MIMIC"] && [ "$MIMIC" = "$SWIFT" ] && [ "$SWIFT" = "$GTTS" ] && [ "$GTTS" = "$RBSPEAK" ] ; then |
1171 | echo "You need Festival, eSpeak, Mimic, Flite, or rbspeak in your path, or SAPI available to build voice files" | 1171 | echo "You need Festival, eSpeak, Mimic, Flite, gtts, or rbspeak in your path, or SAPI available to build voice files" |
1172 | exit 3 | 1172 | exit 3 |
1173 | fi | 1173 | fi |
1174 | 1174 | ||
@@ -1181,42 +1181,42 @@ voiceconfig () { | |||
1181 | advopts="$advopts --tts=$option" | 1181 | advopts="$advopts --tts=$option" |
1182 | fi | 1182 | fi |
1183 | case "$option" in | 1183 | case "$option" in |
1184 | [Ll]) | 1184 | [Ll]|flite) |
1185 | TTS_ENGINE="flite" | 1185 | TTS_ENGINE="flite" |
1186 | NOISEFLOOR="500" # TODO: check this value | 1186 | NOISEFLOOR="500" # TODO: check this value |
1187 | TTS_OPTS=$FLITE_OPTS | 1187 | TTS_OPTS=$FLITE_OPTS |
1188 | ;; | 1188 | ;; |
1189 | [Ee]) | 1189 | [Ee]|espeak) |
1190 | TTS_ENGINE="espeak" | 1190 | TTS_ENGINE="espeak" |
1191 | NOISEFLOOR="500" | 1191 | NOISEFLOOR="500" |
1192 | TTS_OPTS=$ESPEAK_OPTS | 1192 | TTS_OPTS=$ESPEAK_OPTS |
1193 | ;; | 1193 | ;; |
1194 | [Ff]) | 1194 | [Ff]|festival) |
1195 | TTS_ENGINE="festival" | 1195 | TTS_ENGINE="festival" |
1196 | NOISEFLOOR="500" | 1196 | NOISEFLOOR="500" |
1197 | TTS_OPTS=$FESTIVAL_OPTS | 1197 | TTS_OPTS=$FESTIVAL_OPTS |
1198 | ;; | 1198 | ;; |
1199 | [Mm]) | 1199 | [Mm]|mimic) |
1200 | TTS_ENGINE="mimic" | 1200 | TTS_ENGINE="mimic" |
1201 | NOISEFLOOR="500" | 1201 | NOISEFLOOR="500" |
1202 | TTS_OPTS=$MIMIC_OPTS | 1202 | TTS_OPTS=$MIMIC_OPTS |
1203 | ;; | 1203 | ;; |
1204 | [Ss]) | 1204 | [Ss]|sapi) |
1205 | TTS_ENGINE="sapi" | 1205 | TTS_ENGINE="sapi" |
1206 | NOISEFLOOR="500" | 1206 | NOISEFLOOR="500" |
1207 | TTS_OPTS=$SAPI_OPTS | 1207 | TTS_OPTS=$SAPI_OPTS |
1208 | ;; | 1208 | ;; |
1209 | [Ww]) | 1209 | [Ww]|swift) |
1210 | TTS_ENGINE="swift" | 1210 | TTS_ENGINE="swift" |
1211 | NOISEFLOOR="500" | 1211 | NOISEFLOOR="500" |
1212 | TTS_OPTS=$SWIFT_OPTS | 1212 | TTS_OPTS=$SWIFT_OPTS |
1213 | ;; | 1213 | ;; |
1214 | [Gg) | 1214 | [Gg]|gtts) |
1215 | TTS_ENGINE="gtts" | 1215 | TTS_ENGINE="gtts" |
1216 | NOISEFLOOR="500" | 1216 | NOISEFLOOR="500" |
1217 | TTS_OPTS=$GTTS_OPTS | 1217 | TTS_OPTS=$GTTS_OPTS |
1218 | ;; | 1218 | ;; |
1219 | [Oo]) | 1219 | [Oo]|rbspeak) |
1220 | TTS_ENGINE="rbspeak" | 1220 | TTS_ENGINE="rbspeak" |
1221 | NOISEFLOOR="500" | 1221 | NOISEFLOOR="500" |
1222 | TTS_OPTS=$RBSPEAK_OPTS | 1222 | TTS_OPTS=$RBSPEAK_OPTS |
diff --git a/tools/voice.pl b/tools/voice.pl index 05ced3a6d9..0b49ddff04 100755 --- a/tools/voice.pl +++ b/tools/voice.pl | |||
@@ -244,6 +244,11 @@ sub voicestring { | |||
244 | print("> $cmd\n") if $verbose; | 244 | print("> $cmd\n") if $verbose; |
245 | system($cmd); | 245 | system($cmd); |
246 | } | 246 | } |
247 | elsif ($name eq 'espeak-ng') { | ||
248 | $cmd = "espeak-ng $tts_engine_opts -w \"$output\" \"$string\""; | ||
249 | print("> $cmd\n") if $verbose; | ||
250 | system($cmd); | ||
251 | } | ||
247 | elsif ($name eq 'sapi') { | 252 | elsif ($name eq 'sapi') { |
248 | print({$$tts_object{"stdin"}} "SPEAK\t$output\t$string\r\n"); | 253 | print({$$tts_object{"stdin"}} "SPEAK\t$output\t$string\r\n"); |
249 | } | 254 | } |