espeak_Key(key_name) If key_name is a single character, it speaks the character name. Otherwise it speaks key_name as a text string. This is the same behaviour as <say-as interpret-as="tts:key"> Fix: SAPI5 was restricted to 360 wmp. Now the top speed (390 wpm) is allowed. Fix error in phoneme translation data for mbrola "cr1" Croation voice. *_list files: Allow word groups which have no phoneme translation, so that just attributes can be set. The words are considered as a single hyphenated word. Fix: $textmode in *_list files, allow replacement by a word which is also translated in the *_list file. lang=pl: many additions to pl_rules, pl_list git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@165 d46cf337-b52f-0410-862d-fd96e6ae7743master
@- a E E~ i O O~ u | @- a E E~ i O O~ u | ||||
y | y | ||||
* ; b c C d d; dZ | |||||
dz; f g h j k l m | |||||
n N n^ p r s S S; | |||||
t t; tS ts ts; v w x | |||||
z Z Z; | |||||
* : ; b c C d d; | |||||
dZ dz; f g h j k l | |||||
m n N n^ p r s S | |||||
s; S; t t; tS ts ts; tS; | |||||
v w x z Z Z; | |||||
Dictionary ru_dict | Dictionary ru_dict |
_- h,aIf@n | _- h,aIf@n | ||||
_. d0t | _. d0t | ||||
_: koUl@n | _: koUl@n | ||||
_; sEmIk'oUl0n | |||||
_; sEmIk'oUl@n | |||||
_< ElaNg@L | _< ElaNg@L | ||||
_= i:kw@Lz | _= i:kw@Lz | ||||
_> A@aNg@L | _> A@aNg@L |
k ka | k ka | ||||
l El | l El | ||||
m Em | m Em | ||||
n En | |||||
//n En // in fr_rules | |||||
ñ $accent | ñ $accent | ||||
o o | o o | ||||
ô $accent | ô $accent | ||||
_{ uvR_akOlad | _{ uvR_akOlad | ||||
_| baR | _| baR | ||||
_} f'ERm_akOl'ad | _} f'ERm_akOl'ad | ||||
² pw^is'A~s||d'Y | |||||
// numeric | // numeric |
flig) en (t_ A~ // affligent | flig) en (t_ A~ // affligent | ||||
Vflig) en (t_ // infligent (verbe) | Vflig) en (t_ // infligent (verbe) | ||||
Xig) en (t_ // figent, pigent | Xig) en (t_ // figent, pigent | ||||
oblig) en (t_ A~ // obligent, d‚sobligent | |||||
oblig) en (t_ A~ // obligent, d�sobligent | |||||
Voblig) en (t_ // obligent (verbe) | Voblig) en (t_ // obligent (verbe) | ||||
man) en (t_ A~ // permanent | man) en (t_ A~ // permanent | ||||
.group n | .group n | ||||
_) n (_ En | |||||
n n // une | n n // une | ||||
nn n | nn n | ||||
ng (_ N | ng (_ N | ||||
A) ng (_ N // parking meeting | A) ng (_ N // parking meeting | ||||
nn n // panne | nn n // panne | ||||
_) n (_° nymero | |||||
.group o | .group o | ||||
¥ i;En | ¥ i;En | ||||
£ livR | £ livR | ||||
° d@gRe | ° d@gRe | ||||
_n_) ° // n° | |||||
± pl'yz_'u_mw'E~ | ± pl'yz_'u_mw'E~ | ||||
× myltip@-lj'e_p'aR | × myltip@-lj'e_p'aR | ||||
÷ diviz'e_p'aR | ÷ diviz'e_p'aR |
_stk a:thu:za:S | _stk a:thu:za:S | ||||
_tld tildE | _tld tildE | ||||
// characters | |||||
_#9 tAb | |||||
_#32 so:kYz | |||||
// Abbreviations | // Abbreviations | ||||
km kilo:me:tER2 | km kilo:me:tER2 |
// numeric | // numeric | ||||
//******** | //******** | ||||
?1 _0 z'Eru | |||||
?1 _0 z'E*u | |||||
?2 _0 z'E*U | ?2 _0 z'E*U | ||||
?1 _1 'um | ?1 _1 'um | ||||
?2 _1 'uN | ?2 _1 'uN | ||||
?2_2X v'iNtSi | ?2_2X v'iNtSi | ||||
_3X tr'iNt& | _3X tr'iNt& | ||||
?1_4X kw&r'eNt& | |||||
?1_4X kw&*'eNt& | |||||
?2_4X kwa*'eINt& | ?2_4X kwa*'eINt& | ||||
_5X siNkw'eINt& | _5X siNkw'eINt& | ||||
?1_6X sys'eINt& | ?1_6X sys'eINt& | ||||
_0Z2 seNt'Ezim& // 100ths | _0Z2 seNt'Ezim& // 100ths | ||||
_0Z3 mil'Ezim& // 1000ths | _0Z3 mil'Ezim& // 1000ths | ||||
// not roman numbers | |||||
vi vi | |||||
// ABBREVIATIONS | // ABBREVIATIONS | ||||
//************** | //************** | ||||
dpoc $abbrev | dpoc $abbrev | ||||
ecg $abbrev | ecg $abbrev | ||||
edp $abbrev | edp $abbrev | ||||
?1 etc ,ets'Et:r& | |||||
?1 etc ,ets'Et:*& | |||||
?2 etc ,ets'Ete*& | ?2 etc ,ets'Ete*& | ||||
hiv $abbrev | hiv $abbrev | ||||
(http ://) ag,atete'pe_ | (http ://) ag,atete'pe_ | ||||
// Open [E] | // Open [E] | ||||
nela n'El& | nela n'El& | ||||
nessa n'Es& | nessa n'Es& | ||||
?1 era 'Er& | |||||
?2 era 'E*& | |||||
era 'E*& | |||||
abacaxi abakaSi | abacaxi abakaSi | ||||
axé aSE | axé aSE | ||||
?1 download d'a,wnl'oud | ?1 download d'a,wnl'oud | ||||
?1 end 'end | ?1 end 'end | ||||
?1 escape Sk'eIpy | ?1 escape Sk'eIpy | ||||
?1 explorer ,ekspl'O:r&r- | |||||
?1 explorer ,ekspl'O:*&r- | |||||
?2 Explorer ekspl'O*er | ?2 Explorer ekspl'O*er | ||||
?1 eyes 'aiz | ?1 eyes 'aiz | ||||
?1 frame fr'eImy | ?1 frame fr'eImy |
_) r (_ 'Exe | _) r (_ 'Exe | ||||
_) r (_\$ xe'aU // currency | _) r (_\$ xe'aU // currency | ||||
r r | r r | ||||
?1 A) r (A r | |||||
?2 A) r (A * | |||||
?1 A) r (_A r | |||||
?2 A) r (_A * | |||||
A) r (A * | |||||
A) r (_A * | |||||
rr x | rr x | ||||
C) r (A R // for "pt-pt" [R] is the same as [r] | C) r (A R // for "pt-pt" [R] is the same as [r] | ||||
_) r x | _) r x |
<head> | <head> | ||||
<title>eSpeak</title> | <title>eSpeak</title> | ||||
<meta name="GENERATOR" content="Quanta Plus"> | |||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | ||||
</head> | </head> | ||||
<body> | <body> | ||||
</ul> | </ul> | ||||
<p><b><say-as></b> | <p><b><say-as></b> | ||||
<ul> | <ul> | ||||
<li>interpret-as="characters" | |||||
<li>interpret-as="characters" format="glyphs" | |||||
<li>interpret-as="tts:key" | |||||
<li>interpret-as="tts:char" | |||||
<li>interpret-as="tts:digits" | |||||
<li>interpret-as="characters"<p> | |||||
The names of the characters are spoken. | |||||
<li>interpret-as="characters" format="glyphs"<p> | |||||
As "characters", but upper-case letters are prefixed with "Capital". | |||||
<li>interpret-as="tts:key"<p> | |||||
If the text is only one character, the name of the character is spoken, including punctuation characters. If the text is more than one character, it is spoken as words. | |||||
<li>interpret-as="tts:char"<p> | |||||
The name of the character is spoken, including punctuation characters. | |||||
<li>interpret-as="tts:digits"<p> | |||||
The digits are spoken individually. | |||||
</ul> | </ul> | ||||
<p><b><mark></b> name | <p><b><mark></b> name | ||||
<p><b><s></b> | <p><b><s></b> |
0 g- NULL 0 NULL | 0 g- NULL 0 NULL | ||||
0 @- NULL 0 NULL | 0 @- NULL 0 NULL | ||||
0 * NULL 0 r | 0 * NULL 0 r | ||||
0 r* NULL 0 NULL | |||||
0 I NULL 0 i | 0 I NULL 0 i | ||||
0 U NULL 0 u | 0 U NULL 0 u | ||||
0 & NULL 0 a | 0 & NULL 0 a | ||||
0 A NULL 0 a | 0 A NULL 0 a | ||||
0 @ NULL 0 e | 0 @ NULL 0 e | ||||
0 @2 NULL 0 e | |||||
0 aI NULL 60 a j | 0 aI NULL 60 a j | ||||
0 iI NULL 60 i j | 0 iI NULL 60 i j | ||||
0 a: NULL 0 a | |||||
0 e: NULL 0 e | |||||
0 i: NULL 0 i | |||||
0 o: NULL 0 o | |||||
0 u: NULL 0 u | |||||
0 tS; NULL 0 tS' | 0 tS; NULL 0 tS' | ||||
0 dZ; NULL 0 dZ' | 0 dZ; NULL 0 dZ' |
// use mbrola de6 German voice for "grc" (Ancient Greek) | |||||
0 i NULL 0 i: | |||||
0 e NULL 0 e: | |||||
0 E NULL 0 E: | |||||
0 a NULL 0 a: | |||||
0 a/ NULL 0 a: | |||||
0 O NULL 0 O | |||||
0 o NULL 0 o: | |||||
0 y NULL 0 Y | |||||
0 aI NULL 60 a: j | |||||
0 EI NULL 70 E: j | |||||
0 OI NULL 70 O j | |||||
0 oI NULL 60 o: j | |||||
0 yI NULL 60 Y j | |||||
0 aU NULL 0 aU | |||||
0 eU NULL 60 e: w | |||||
0 EU NULL 70 E: w | |||||
0 OU NULL 70 O w | |||||
0 l/ NULL 0 l | |||||
0 f NULL 0 pf | |||||
volume 32 | |||||
// CR1 doesn't like same phonemes twice | |||||
0 e E 5 e _ | |||||
0 s s 5 s _ | |||||
0 ? k 5 k _ | |||||
0 t t 5 t _ | |||||
0 m m 5 m _ | |||||
0 n n 5 n _ | |||||
0 p p 5 p _ | |||||
0 l/ l 5 l _ | |||||
0 l/2 NULL 0 l | |||||
0 l/ NULL 0 l | |||||
0 r/ NULL 0 r | |||||
0 r- NULL 0 r | |||||
0 l- NULL 0 l | |||||
0 w/ NULL 0 w | |||||
0 j/ NULL 0 j | |||||
2 ; i 0 NULL | |||||
0 ; NULL 0 NULL | |||||
0 - NULL 0 NULL | |||||
0 g- NULL 0 NULL | |||||
0 @- NULL 0 NULL | |||||
0 * NULL 0 r | |||||
0 a NULL 0 V | |||||
0 E NULL 0 e | |||||
0 i NULL 0 I | |||||
0 o NULL 0 Q | |||||
0 O NULL 0 Q | |||||
0 u NULL 0 U | |||||
0 n^ NULL 0 nY | |||||
0 ? NULL 0 k | |||||
0 S NULL 60 s j | |||||
0 v NULL 0 f | |||||
0 R NULL 0 r | |||||
0 x NULL 0 h | |||||
[Setup] | [Setup] | ||||
AppName=eSpeak | AppName=eSpeak | ||||
AppVerName=eSpeak version 1.34 | |||||
AppVerName=eSpeak version 1.36 | |||||
AppCopyright=Licensed under GNU General Public License version 3. (See file License.txt for details). | AppCopyright=Licensed under GNU General Public License version 3. (See file License.txt for details). | ||||
WindowVisible=yes | WindowVisible=yes | ||||
[Setup] | [Setup] | ||||
AppName=eSpeakEdit | AppName=eSpeakEdit | ||||
AppVerName=eSpeakEdit version 1.34 | |||||
AppVerName=eSpeakEdit version 1.36 | |||||
DefaultDirName={pf}\eSpeak | DefaultDirName={pf}\eSpeak | ||||
DefaultGroupName=eSpeak | DefaultGroupName=eSpeak | ||||
OutputBaseFilename=setup_espeakedit | OutputBaseFilename=setup_espeakedit |
LIBDIR=$(PREFIX)/usr/lib | LIBDIR=$(PREFIX)/usr/lib | ||||
DATADIR=$(PREFIX)/usr/share/espeak-data | DATADIR=$(PREFIX)/usr/share/espeak-data | ||||
RELEASE = 1.35 | |||||
RELEASE = 1.36 | |||||
BIN_NAME = speak | BIN_NAME = speak | ||||
BIN2_NAME = espeak | BIN2_NAME = espeak | ||||
LIB_NAME = libespeak.so | LIB_NAME = libespeak.so | ||||
ifeq ($(AUDIO),pulseaudio) | ifeq ($(AUDIO),pulseaudio) | ||||
WAVE=wave_pulse.cpp | WAVE=wave_pulse.cpp | ||||
LIB_AUDIO=pulse | |||||
USE_AUDIO=USE_PULSEAUDIO | |||||
LIB_AUDIO=-lpulse | |||||
USE_AUDIO=-DUSE_PULSEAUDIO | |||||
else ifeq ($(AUDIO),portaudio) | |||||
WAVE=wave.cpp | |||||
LIB_AUDIO=-lportaudio | |||||
USE_AUDIO=-DUSE_PORTAUDIO | |||||
else | else | ||||
WAVE=wave.cpp | WAVE=wave.cpp | ||||
LIB_AUDIO=portaudio | |||||
USE_AUDIO=USE_PORTAUDIO | |||||
endif | endif | ||||
speak_SOURCES = speak.cpp compiledict.cpp dictionary.cpp intonation.cpp \ | speak_SOURCES = speak.cpp compiledict.cpp dictionary.cpp intonation.cpp \ | ||||
SRCS1=$(speak_SOURCES) | SRCS1=$(speak_SOURCES) | ||||
OBJS1=$(patsubst %.cpp,%.o,$(SRCS1)) | OBJS1=$(patsubst %.cpp,%.o,$(SRCS1)) | ||||
LIBS1=-lstdc++ -l$(LIB_AUDIO) -lpthread $(EXTRA_LIBS) | |||||
LIBS1=-lstdc++ $(LIB_AUDIO) -lpthread $(EXTRA_LIBS) | |||||
SRCS2=$(libespeak_SOURCES) | SRCS2=$(libespeak_SOURCES) | ||||
OBJS2=$(patsubst %.cpp,x_%.o,$(SRCS2)) | OBJS2=$(patsubst %.cpp,x_%.o,$(SRCS2)) | ||||
LIBS2=-lstdc++ -l$(LIB_AUDIO) -lpthread | |||||
LIBS2=-lstdc++ $(LIB_AUDIO) -lpthread | |||||
SRCS3 = espeak.cpp | SRCS3 = espeak.cpp | ||||
OBJS3=$(patsubst %.cpp,%.o,$(SRCS3)) | OBJS3=$(patsubst %.cpp,%.o,$(SRCS3)) | ||||
LIBS3=-lstdc++ -L . -lespeak | LIBS3=-lstdc++ -L . -lespeak | ||||
CXXFLAGS=-O2 -D$(USE_AUDIO) | |||||
CXXFLAGS=-O2 | |||||
all: $(BIN_NAME) $(LIB_NAME) $(STATIC_LIB_NAME) $(BIN2_NAME) | all: $(BIN_NAME) $(LIB_NAME) $(STATIC_LIB_NAME) $(BIN2_NAME) | ||||
mv $(LIB_NAME) $(LIB_NAME).$(LIBTAG) | mv $(LIB_NAME) $(LIB_NAME).$(LIBTAG) | ||||
.cpp.o: | .cpp.o: | ||||
$(CXX) $(CXXFLAGS) -D PATH_ESPEAK_DATA=\"$(DATADIR)\" -Wall -pedantic -I. -c -fno-exceptions $< | |||||
$(CXX) $(CXXFLAGS) $(USE_AUDIO) -D PATH_ESPEAK_DATA=\"$(DATADIR)\" -Wall -pedantic -I. -c -fno-exceptions $< | |||||
$(BIN_NAME): $(OBJS1) | $(BIN_NAME): $(OBJS1) | ||||
$(CXX) -o $@ $(OBJS1) $(LIBS1) | $(CXX) -o $@ $(OBJS1) $(LIBS1) | ||||
x_%.o: %.cpp | x_%.o: %.cpp | ||||
$(CXX) $(CXXFLAGS) -Wall -fpic -pedantic \ | |||||
$(CXX) $(CXXFLAGS) $(USE_AUDIO) -Wall -fpic -pedantic \ | |||||
-I. -D LIBRARY -c -fno-exceptions $< -o x_$*.o | -I. -D LIBRARY -c -fno-exceptions $< -o x_$*.o | ||||
$(LIB_NAME): $(OBJS2) | $(LIB_NAME): $(OBJS2) |
if(control == 4) | if(control == 4) | ||||
c = phonPAUSE; // pause after each character | c = phonPAUSE; // pause after each character | ||||
if(((count % 3) == 0) || (control == 4)) | |||||
if(((count % 3) == 0) || (control > 2)) | |||||
c = phonPAUSE_SHORT; // pause following a primary stress | c = phonPAUSE_SHORT; // pause following a primary stress | ||||
else | else | ||||
continue; // remove marker | continue; // remove marker |
c2 = ' '; | c2 = ' '; | ||||
} | } | ||||
if((sayas_mode == 0x14) && (c1 <= 0x20)) | |||||
if((c1 <= 0x20) && ((sayas_mode == SAYAS_SINGLE_CHARS) || (sayas_mode == SAYAS_KEY))) | |||||
{ | { | ||||
c1 += 0xe000; // move into unicode private usage area | c1 += 0xe000; // move into unicode private usage area | ||||
} | } |
void sync_espeak_Key(const char *key) | void sync_espeak_Key(const char *key) | ||||
{//================================== | {//================================== | ||||
// symbolic name, symbolicname_character - is there a system resource of symbolic names per language? | // symbolic name, symbolicname_character - is there a system resource of symbolic names per language? | ||||
int letter; | |||||
int ix; | |||||
ix = utf8_in(&letter,key,0); | |||||
if(key[ix] == 0) | |||||
{ | |||||
// a single character | |||||
sync_espeak_Char(letter); | |||||
return; | |||||
} | |||||
my_unique_identifier = 0; | my_unique_identifier = 0; | ||||
my_user_data = NULL; | my_user_data = NULL; | ||||
Synthesize(0, key,0); // for now, just say the key name as passed | |||||
Synthesize(0, key,0); // speak key as a text string | |||||
} | } | ||||
#endif | #endif | ||||
espeak_ERROR espeak_Key(const char *key_name); | espeak_ERROR espeak_Key(const char *key_name); | ||||
/* Speak the name of a keyboard key. | /* Speak the name of a keyboard key. | ||||
Currently this just speaks the "key_name" as given | |||||
If key_name is a single character, it speaks the name of the character. | |||||
Otherwise, it speaks key_name as a text string. | |||||
Return: EE_OK: operation achieved | Return: EE_OK: operation achieved | ||||
EE_BUFFER_FULL: the command can not be buffered; | EE_BUFFER_FULL: the command can not be buffered; |
#include "translate.h" | #include "translate.h" | ||||
#include "wave.h" | #include "wave.h" | ||||
const char *version_string = "1.35 07.Mar.08"; | |||||
const char *version_string = "1.36 09.Mar.08"; | |||||
const int version_phdata = 0x013400; | const int version_phdata = 0x013400; | ||||
int option_device_number = -1; | int option_device_number = -1; |
tr->langopts.max_initial_consonants = 7; // for example: wchrzczony :) | tr->langopts.max_initial_consonants = 7; // for example: wchrzczony :) | ||||
tr->langopts.numbers=0x1009 + 0x4000; | tr->langopts.numbers=0x1009 + 0x4000; | ||||
tr->langopts.numbers2=0x40; | tr->langopts.numbers2=0x40; | ||||
tr->langopts.param[LOPT_COMBINE_WORDS] = 2 + 0x100; // combine 'nie' (marked with $alt2) with some 1-syllable words (marked with $alt) | |||||
tr->langopts.param[LOPT_COMBINE_WORDS] = 4 + 0x100; // combine 'nie' (marked with $alt2) with some 1-syllable (and 2-syllable) words (marked with $alt) | |||||
SetLetterVowel(tr,'y'); | SetLetterVowel(tr,'y'); | ||||
} | } | ||||
break; | break; |
int prefix_flags = 0; | int prefix_flags = 0; | ||||
int confirm_prefix; | int confirm_prefix; | ||||
int spell_word; | int spell_word; | ||||
int stress_bits; | |||||
int emphasize_allcaps = 0; | int emphasize_allcaps = 0; | ||||
int wflags = wtab->flags; | int wflags = wtab->flags; | ||||
int wmark = wtab->wmark; | int wmark = wtab->wmark; | ||||
else | else | ||||
{ | { | ||||
found = LookupDictList(&word1, phonemes, dictionary_flags, FLAG_ALLOW_TEXTMODE, wtab); // the original word | found = LookupDictList(&word1, phonemes, dictionary_flags, FLAG_ALLOW_TEXTMODE, wtab); // the original word | ||||
if(dictionary_flags[0] & FLAG_TEXTMODE) | |||||
{ | |||||
stress_bits = dictionary_flags[0] & 0x7f; | |||||
found = LookupDictList(&word1, phonemes, dictionary_flags2, 0, wtab); // the text replacement | |||||
if(dictionary_flags2[0]!=0) | |||||
{ | |||||
dictionary_flags[0] = dictionary_flags2[0]; | |||||
dictionary_flags[1] = dictionary_flags2[1]; | |||||
if(stress_bits != 0) | |||||
{ | |||||
// keep any stress information from the original word | |||||
dictionary_flags[0] = (dictionary_flags[0] & ~0x7f) | stress_bits; | |||||
} | |||||
} | |||||
} | |||||
else | |||||
if((found==0) && (dictionary_flags[0] & FLAG_SKIPWORDS)) | |||||
{ | |||||
// grouped words, but no translation. Join the words with hyphens. | |||||
wordx = word1; | |||||
ix = 0; | |||||
while(ix < dictionary_skipwords) | |||||
{ | |||||
if(*wordx == ' ') | |||||
{ | |||||
*wordx = '-'; | |||||
ix++; | |||||
} | |||||
wordx++; | |||||
} | |||||
} | |||||
// if textmode, LookupDictList() replaces word1 by the new text and returns found=0 | // if textmode, LookupDictList() replaces word1 by the new text and returns found=0 | ||||
/* dictionary flags, word 1 */ | /* dictionary flags, word 1 */ | ||||
// bits 0-3 stressed syllable, 7=unstressed | |||||
// bits 0-3 stressed syllable, bit 6=unstressed | |||||
#define FLAG_SKIPWORDS 0x80 | #define FLAG_SKIPWORDS 0x80 | ||||
#define FLAG_PREPAUSE 0x100 | #define FLAG_PREPAUSE 0x100 | ||||
// pitch,speed, | // pitch,speed, | ||||
int embedded_default[N_EMBEDDED_VALUES] = {0,50,170,100,50, 0,0, 0,170,0,0,0,0,0}; | int embedded_default[N_EMBEDDED_VALUES] = {0,50,170,100,50, 0,0, 0,170,0,0,0,0,0}; | ||||
static int embedded_max[N_EMBEDDED_VALUES] = {0,0x7fff,360,300,99,99,99, 0,360,0,0,0,0,4}; | |||||
static int embedded_max[N_EMBEDDED_VALUES] = {0,0x7fff,400,300,99,99,99, 0,360,0,0,0,0,4}; | |||||
#define N_CALLBACK_IX N_WAV_BUF-2 // adjust this delay to match display with the currently spoken word | #define N_CALLBACK_IX N_WAV_BUF-2 // adjust this delay to match display with the currently spoken word | ||||
int current_source_index=0; | int current_source_index=0; |