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
@@ -187,11 +187,11 @@ Dictionary pl_dict | |||
@- a E E~ i O O~ u | |||
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 |
@@ -115,7 +115,7 @@ _, k0m@ | |||
_- h,aIf@n | |||
_. d0t | |||
_: koUl@n | |||
_; sEmIk'oUl0n | |||
_; sEmIk'oUl@n | |||
_< ElaNg@L | |||
_= i:kw@Lz | |||
_> A@aNg@L |
@@ -39,7 +39,7 @@ j Zi | |||
k ka | |||
l El | |||
m Em | |||
n En | |||
//n En // in fr_rules | |||
ñ $accent | |||
o o | |||
ô $accent | |||
@@ -113,7 +113,7 @@ _` aks'A~_gR'av | |||
_{ uvR_akOlad | |||
_| baR | |||
_} f'ERm_akOl'ad | |||
² pw^is'A~s||d'Y | |||
// numeric |
@@ -227,7 +227,7 @@ | |||
flig) en (t_ A~ // affligent | |||
Vflig) en (t_ // infligent (verbe) | |||
Xig) en (t_ // figent, pigent | |||
oblig) en (t_ A~ // obligent, d‚sobligent | |||
oblig) en (t_ A~ // obligent, d�sobligent | |||
Voblig) en (t_ // obligent (verbe) | |||
man) en (t_ A~ // permanent | |||
@@ -730,6 +730,7 @@ _) half _^_en | |||
.group n | |||
_) n (_ En | |||
n n // une | |||
nn n | |||
ng (_ N | |||
@@ -738,7 +739,7 @@ _) half _^_en | |||
A) ng (_ N // parking meeting | |||
nn n // panne | |||
_) n (_° nymero | |||
.group o | |||
@@ -1208,6 +1209,7 @@ C) te (_ t@- // patte | |||
Â¥ i;En | |||
£ livR | |||
° d@gRe | |||
_n_) ° // n° | |||
± pl'yz_'u_mw'E~ | |||
× myltip@-lj'e_p'aR | |||
÷ diviz'e_p'aR |
@@ -62,6 +62,10 @@ _rng kYR2 | |||
_stk a:thu:za:S | |||
_tld tildE | |||
// characters | |||
_#9 tAb | |||
_#32 so:kYz | |||
// Abbreviations | |||
km kilo:me:tER2 |
@@ -111,7 +111,7 @@ _" 'abRi;'asp&||d'upl&s# | |||
// numeric | |||
//******** | |||
?1 _0 z'Eru | |||
?1 _0 z'E*u | |||
?2 _0 z'E*U | |||
?1 _1 'um | |||
?2 _1 'uN | |||
@@ -147,7 +147,7 @@ _15 k'iNzy | |||
?2_2X v'iNtSi | |||
_3X tr'iNt& | |||
?1_4X kw&r'eNt& | |||
?1_4X kw&*'eNt& | |||
?2_4X kwa*'eINt& | |||
_5X siNkw'eINt& | |||
?1_6X sys'eINt& | |||
@@ -186,6 +186,9 @@ _dpt _v'irgul& | |||
_0Z2 seNt'Ezim& // 100ths | |||
_0Z3 mil'Ezim& // 1000ths | |||
// not roman numbers | |||
vi vi | |||
// ABBREVIATIONS | |||
//************** | |||
@@ -206,7 +209,7 @@ cpuc $abbrev | |||
dpoc $abbrev | |||
ecg $abbrev | |||
edp $abbrev | |||
?1 etc ,ets'Et:r& | |||
?1 etc ,ets'Et:*& | |||
?2 etc ,ets'Ete*& | |||
hiv $abbrev | |||
(http ://) ag,atete'pe_ | |||
@@ -598,8 +601,7 @@ jogos $alt | |||
// Open [E] | |||
nela n'El& | |||
nessa n'Es& | |||
?1 era 'Er& | |||
?2 era 'E*& | |||
era 'E*& | |||
abacaxi abakaSi | |||
axé aSE | |||
@@ -628,7 +630,7 @@ roxo x'oSU | |||
?1 download d'a,wnl'oud | |||
?1 end 'end | |||
?1 escape Sk'eIpy | |||
?1 explorer ,ekspl'O:r&r- | |||
?1 explorer ,ekspl'O:*&r- | |||
?2 Explorer ekspl'O*er | |||
?1 eyes 'aiz | |||
?1 frame fr'eImy |
@@ -580,10 +580,8 @@ | |||
_) r (_ 'Exe | |||
_) r (_\$ xe'aU // currency | |||
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 | |||
C) r (A R // for "pt-pt" [R] is the same as [r] | |||
_) r x |
@@ -3,7 +3,6 @@ | |||
<head> | |||
<title>eSpeak</title> | |||
<meta name="GENERATOR" content="Quanta Plus"> | |||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | |||
</head> | |||
<body> | |||
@@ -36,11 +35,16 @@ The following markup tags and attributes are recognised:<p> | |||
</ul> | |||
<p><b><say-as></b> | |||
<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> | |||
<p><b><mark></b> name | |||
<p><b><s></b> |
@@ -16,6 +16,7 @@ volume 16 | |||
0 g- NULL 0 NULL | |||
0 @- NULL 0 NULL | |||
0 * NULL 0 r | |||
0 r* NULL 0 NULL | |||
0 I NULL 0 i | |||
0 U NULL 0 u | |||
@@ -24,8 +25,14 @@ volume 16 | |||
0 & NULL 0 a | |||
0 A NULL 0 a | |||
0 @ NULL 0 e | |||
0 @2 NULL 0 e | |||
0 aI NULL 60 a 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 dZ; NULL 0 dZ' |
@@ -0,0 +1,29 @@ | |||
// 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 | |||
@@ -0,0 +1,41 @@ | |||
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 | |||
@@ -2,7 +2,7 @@ | |||
[Setup] | |||
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). | |||
WindowVisible=yes | |||
@@ -1,7 +1,7 @@ | |||
[Setup] | |||
AppName=eSpeakEdit | |||
AppVerName=eSpeakEdit version 1.34 | |||
AppVerName=eSpeakEdit version 1.36 | |||
DefaultDirName={pf}\eSpeak | |||
DefaultGroupName=eSpeak | |||
OutputBaseFilename=setup_espeakedit |
@@ -6,7 +6,7 @@ INCDIR=$(PREFIX)/usr/include/espeak | |||
LIBDIR=$(PREFIX)/usr/lib | |||
DATADIR=$(PREFIX)/usr/share/espeak-data | |||
RELEASE = 1.35 | |||
RELEASE = 1.36 | |||
BIN_NAME = speak | |||
BIN2_NAME = espeak | |||
LIB_NAME = libespeak.so | |||
@@ -30,12 +30,14 @@ AUDIO = portaudio | |||
ifeq ($(AUDIO),pulseaudio) | |||
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 | |||
WAVE=wave.cpp | |||
LIB_AUDIO=portaudio | |||
USE_AUDIO=USE_PORTAUDIO | |||
endif | |||
speak_SOURCES = speak.cpp compiledict.cpp dictionary.cpp intonation.cpp \ | |||
@@ -51,24 +53,24 @@ libespeak_SOURCES = speak_lib.cpp compiledict.cpp dictionary.cpp intonation.cpp | |||
SRCS1=$(speak_SOURCES) | |||
OBJS1=$(patsubst %.cpp,%.o,$(SRCS1)) | |||
LIBS1=-lstdc++ -l$(LIB_AUDIO) -lpthread $(EXTRA_LIBS) | |||
LIBS1=-lstdc++ $(LIB_AUDIO) -lpthread $(EXTRA_LIBS) | |||
SRCS2=$(libespeak_SOURCES) | |||
OBJS2=$(patsubst %.cpp,x_%.o,$(SRCS2)) | |||
LIBS2=-lstdc++ -l$(LIB_AUDIO) -lpthread | |||
LIBS2=-lstdc++ $(LIB_AUDIO) -lpthread | |||
SRCS3 = espeak.cpp | |||
OBJS3=$(patsubst %.cpp,%.o,$(SRCS3)) | |||
LIBS3=-lstdc++ -L . -lespeak | |||
CXXFLAGS=-O2 -D$(USE_AUDIO) | |||
CXXFLAGS=-O2 | |||
all: $(BIN_NAME) $(LIB_NAME) $(STATIC_LIB_NAME) $(BIN2_NAME) | |||
mv $(LIB_NAME) $(LIB_NAME).$(LIBTAG) | |||
.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) | |||
$(CXX) -o $@ $(OBJS1) $(LIBS1) | |||
@@ -79,7 +81,7 @@ $(BIN2_NAME): $(OBJS3) $(LIB_NAME) | |||
x_%.o: %.cpp | |||
$(CXX) $(CXXFLAGS) -Wall -fpic -pedantic \ | |||
$(CXX) $(CXXFLAGS) $(USE_AUDIO) -Wall -fpic -pedantic \ | |||
-I. -D LIBRARY -c -fno-exceptions $< -o x_$*.o | |||
$(LIB_NAME): $(OBJS2) |
@@ -721,7 +721,7 @@ void Translator::SetSpellingStress(char *phonemes, int control, int n_chars) | |||
if(control == 4) | |||
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 | |||
else | |||
continue; // remove marker |
@@ -1979,7 +1979,7 @@ f_input = f_in; // for GetC etc | |||
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 | |||
} |
@@ -612,9 +612,20 @@ espeak_ERROR sync_espeak_Synth_Mark(unsigned int unique_identifier, const void * | |||
void sync_espeak_Key(const char *key) | |||
{//================================== | |||
// 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_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 | |||
} | |||
@@ -318,7 +318,8 @@ extern "C" | |||
#endif | |||
espeak_ERROR espeak_Key(const char *key_name); | |||
/* 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 | |||
EE_BUFFER_FULL: the command can not be buffered; |
@@ -35,7 +35,7 @@ | |||
#include "translate.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; | |||
int option_device_number = -1; |
@@ -534,7 +534,7 @@ SetLengthMods(tr,3); // all equal | |||
tr->langopts.max_initial_consonants = 7; // for example: wchrzczony :) | |||
tr->langopts.numbers=0x1009 + 0x4000; | |||
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'); | |||
} | |||
break; |
@@ -637,6 +637,7 @@ int Translator::TranslateWord(char *word1, int next_pause, WORD_TAB *wtab) | |||
int prefix_flags = 0; | |||
int confirm_prefix; | |||
int spell_word; | |||
int stress_bits; | |||
int emphasize_allcaps = 0; | |||
int wflags = wtab->flags; | |||
int wmark = wtab->wmark; | |||
@@ -684,6 +685,37 @@ int Translator::TranslateWord(char *word1, int next_pause, WORD_TAB *wtab) | |||
else | |||
{ | |||
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 | |||
@@ -33,7 +33,7 @@ | |||
/* 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_PREPAUSE 0x100 | |||
@@ -145,7 +145,7 @@ int wcmdq_tail=0; | |||
// pitch,speed, | |||
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 | |||
int current_source_index=0; |