@@ -66,11 +66,13 @@ depcomp | |||
install-sh | |||
libtool | |||
ltmain.sh | |||
m4/ | |||
missing | |||
stamp-h1 | |||
.dirstamp | |||
m4/* | |||
!m4/ax_check_compile_flag.m4 | |||
# libraries | |||
docs/speak_lib.h | |||
@@ -96,6 +98,7 @@ src/speak-ng | |||
tests/*.test | |||
!tests/languages.test | |||
!tests/phoneme-output.test | |||
espeak-ng.pc | |||
@@ -7,7 +7,21 @@ | |||
The espeak-ng project is a fork of the espeak project. | |||
### 1.49.2 - (In Development) | |||
### 1.49.3 - (In Development) | |||
bug fixes: | |||
* Fix several issues with the emoji support. | |||
updated languages: | |||
* af (Afrikaans) -- Christo de Klerk | |||
* fi (Finnish) -- Juho Hiltunen | |||
* it (Italian) -- chrislm | |||
* lv (Latvian) -- Valdis Vitolins | |||
* ur (Urdu) -- Ejaz Shah | |||
### 1.49.2 - 2017-09-24 | |||
* Provide more validation when reading phoneme tables and voice/language files. | |||
* Removed support for phoneme equivalence tables. These were disabled in the | |||
@@ -25,6 +39,7 @@ bug fixes: | |||
* Fix running `make clean ; make`. | |||
* Fix reading stdin buffers larger than 1000. | |||
* Fixed various language and parent BCP 47 codes (`jp` is now `ja`). | |||
* Fixed several crashes and bugs in `espeak_SetVoiceByName/Properties`. | |||
new languages: | |||
@@ -32,7 +47,7 @@ new languages: | |||
* fr-CH (French (Switzerland)) -- Claude Beazley | |||
* kok (Konkani) -- Vardhan | |||
* mi (Māori) -- Graham Oliver | |||
* sd (Sindhi, Arabic script) -- Vardhan | |||
* sd (Sindhi, Arabic script) -- Vardhan, Ejaz Shah | |||
updated languages: | |||
@@ -90,10 +105,14 @@ Unicode Emoji support (from the Unicode Emoji 5.0, and CLDR 31.0.1 data files): | |||
* lt (Lithuanian) | |||
* lv (Latvian) | |||
* mk (Macedonian) | |||
* ml (Malayalam) | |||
* mr (Marathi) | |||
* ms (Malay) | |||
* my (Myanmar/Burmese) | |||
* ne (Nepali) | |||
* nl (Dutch) | |||
* or (Oriya) | |||
* pa (Punjabi) | |||
* pl (Polish) | |||
* pt (Portuguese) -- Brazil | |||
* ro (Romanian) | |||
@@ -105,6 +124,7 @@ Unicode Emoji support (from the Unicode Emoji 5.0, and CLDR 31.0.1 data files): | |||
* sr (Serbian) | |||
* sv (Swedish) | |||
* sw (Swahili) | |||
* ta (Tamil) | |||
* te (Telugu) | |||
* tr (Turkish) | |||
* ur (Urdu) |
@@ -131,8 +131,7 @@ espeak_ng_includedir = $(includedir)/espeak-ng | |||
espeak_ng_include_HEADERS = \ | |||
src/include/espeak-ng/encoding.h \ | |||
src/include/espeak-ng/espeak_ng.h \ | |||
src/include/espeak-ng/speak_lib.h \ | |||
src/include/espeak-ng/tokenizer.h | |||
src/include/espeak-ng/speak_lib.h | |||
lib_LTLIBRARIES += src/libespeak-ng.la | |||
@@ -171,7 +170,6 @@ src_libespeak_ng_la_SOURCES = \ | |||
src/libespeak-ng/synthdata.c \ | |||
src/libespeak-ng/synthesize.c \ | |||
src/libespeak-ng/synth_mbrola.c \ | |||
src/libespeak-ng/tokenizer.c \ | |||
src/libespeak-ng/translate.c \ | |||
src/libespeak-ng/tr_languages.c \ | |||
src/libespeak-ng/voices.c \ | |||
@@ -233,12 +231,6 @@ noinst_bin_PROGRAMS += tests/encoding.test | |||
tests_encoding_test_LDADD = src/libespeak-ng.la | |||
tests_encoding_test_SOURCES = tests/encoding.c | |||
noinst_bin_PROGRAMS += tests/tokenizer.test | |||
tests_tokenizer_test_CFLAGS = -Isrc/libespeak-ng ${AM_CFLAGS} | |||
tests_tokenizer_test_LDADD = src/libespeak-ng.la | |||
tests_tokenizer_test_SOURCES = tests/tokenizer.c | |||
noinst_bin_PROGRAMS += tests/readclause.test | |||
tests_readclause_test_CFLAGS = -Isrc/libespeak-ng ${AM_CFLAGS} | |||
@@ -256,9 +248,9 @@ tests_api_test_SOURCES = tests/api.c | |||
@ESPEAK_DATA_PATH=$(PWD) $< && echo " PASSED $<" | |||
check: tests/encoding.check \ | |||
tests/tokenizer.check \ | |||
tests/readclause.check \ | |||
tests/api.check \ | |||
tests/phoneme-output.check \ | |||
tests/languages.check | |||
##### phoneme data: | |||
@@ -398,6 +390,7 @@ android/res/raw/espeakdata.zip: espeak-ng-data/phontab dictionaries | |||
rm -f $@ | |||
find espeak-ng-data/{intonations,phondata,phonindex,phontab} | zip -@ $@ | |||
find espeak-ng-data/*_dict | zip -@ $@ | |||
find espeak-ng-data/lang -type f | zip -@ $@ | |||
find espeak-ng-data/voices -type f | grep -vF "/mb/" | zip -@ $@ | |||
android/res/raw/espeakdata_version: android/res/raw/espeakdata.zip | |||
@@ -672,7 +665,7 @@ mk: espeak-ng-data/mk_dict | |||
espeak-ng-data/mk_dict: dictsource/mk_list dictsource/mk_rules dictsource/mk_extra dictsource/mk_emoji | |||
ml: espeak-ng-data/ml_dict | |||
espeak-ng-data/ml_dict: dictsource/ml_list dictsource/ml_rules dictsource/ml_extra | |||
espeak-ng-data/ml_dict: dictsource/ml_list dictsource/ml_rules dictsource/ml_extra dictsource/ml_emoji | |||
mr: espeak-ng-data/mr_dict | |||
espeak-ng-data/mr_dict: dictsource/mr_list dictsource/mr_rules dictsource/mr_extra dictsource/mr_emoji | |||
@@ -684,13 +677,13 @@ mt: espeak-ng-data/mt_dict | |||
espeak-ng-data/mt_dict: dictsource/mt_list dictsource/mt_rules dictsource/mt_extra | |||
my: espeak-ng-data/my_dict | |||
espeak-ng-data/my_dict: dictsource/my_list dictsource/my_rules dictsource/my_extra | |||
espeak-ng-data/my_dict: dictsource/my_list dictsource/my_rules dictsource/my_extra dictsource/my_emoji | |||
nci: espeak-ng-data/nci_dict | |||
espeak-ng-data/nci_dict: dictsource/nci_list dictsource/nci_rules dictsource/nci_extra | |||
ne: espeak-ng-data/ne_dict | |||
espeak-ng-data/ne_dict: dictsource/ne_list dictsource/ne_rules dictsource/ne_extra | |||
espeak-ng-data/ne_dict: dictsource/ne_list dictsource/ne_rules dictsource/ne_extra dictsource/ne_emoji | |||
nl: espeak-ng-data/nl_dict | |||
espeak-ng-data/nl_dict: dictsource/nl_list dictsource/nl_rules dictsource/nl_extra dictsource/nl_emoji | |||
@@ -705,7 +698,7 @@ or: espeak-ng-data/or_dict | |||
espeak-ng-data/or_dict: dictsource/or_list dictsource/or_rules dictsource/or_extra dictsource/or_emoji | |||
pa: espeak-ng-data/pa_dict | |||
espeak-ng-data/pa_dict: dictsource/pa_list dictsource/pa_rules dictsource/pa_extra | |||
espeak-ng-data/pa_dict: dictsource/pa_list dictsource/pa_rules dictsource/pa_extra dictsource/pa_emoji | |||
pap: espeak-ng-data/pap_dict | |||
espeak-ng-data/pap_dict: dictsource/pap_list dictsource/pap_rules dictsource/pap_extra | |||
@@ -761,7 +754,7 @@ sw: espeak-ng-data/sw_dict | |||
espeak-ng-data/sw_dict: dictsource/sw_list dictsource/sw_rules dictsource/sw_extra dictsource/sw_emoji | |||
ta: espeak-ng-data/ta_dict | |||
espeak-ng-data/ta_dict: dictsource/ta_list dictsource/ta_rules dictsource/ta_extra | |||
espeak-ng-data/ta_dict: dictsource/ta_list dictsource/ta_rules dictsource/ta_extra dictsource/ta_emoji | |||
te: espeak-ng-data/te_dict | |||
espeak-ng-data/te_dict: dictsource/te_list dictsource/te_rules dictsource/te_extra dictsource/te_emoji |
@@ -49,11 +49,11 @@ The following platforms are supported: | |||
### Binaries | |||
The Windows version of eSpeak NG 1.49.1 is available as: | |||
The Windows version of eSpeak NG 1.49.2 is available as: | |||
* [espeak-ng-x64.msi](https://github.com/espeak-ng/espeak-ng/releases/download/1.49.1/espeak-ng-x64.msi) -- | |||
* [espeak-ng-x64.msi](https://github.com/espeak-ng/espeak-ng/releases/download/1.49.2/espeak-ng-x64.msi) -- | |||
64-bit Windows installer | |||
* [espeak-ng-x86.msi](https://github.com/espeak-ng/espeak-ng/releases/download/1.49.1/espeak-ng-x86.msi) -- | |||
* [espeak-ng-x86.msi](https://github.com/espeak-ng/espeak-ng/releases/download/1.49.2/espeak-ng-x86.msi) -- | |||
32-bit Windows installer | |||
You also need to install the [Visual C++ Redistributable for Visual Studio 2015](https://www.microsoft.com/en-us/download/details.aspx?id=48145). | |||
@@ -69,7 +69,7 @@ To build eSpeak NG on Windows, you will need: | |||
1. a copy of Visual Studio 2013 or later, such as the Community Edition; | |||
2. the Windows 8.1 SDK; | |||
3. the [WiX installer](http://wixtoolset.org) plugin; | |||
4. the [pcaudiolib](http://github.com/rhdunn/pcaudiolib) project checked out to | |||
4. the [pcaudiolib](https://github.com/espeak-ng/pcaudiolib) project checked out to | |||
`src` (as `src/pcaudiolib`). | |||
You can then open and build the `src/windows/espeak-ng.sln` solution in Visual | |||
@@ -104,9 +104,9 @@ In order to build eSpeak NG, you need: | |||
Optionally, you need: | |||
1. the [pcaudiolib](https://github.com/rhdunn/pcaudiolib) development library | |||
1. the [pcaudiolib](https://github.com/espeak-ng/pcaudiolib) development library | |||
to enable audio output; | |||
3. the [sonic](https://github.com/waywardgeek/sonic) development library to | |||
3. the [sonic](https://github.com/espeak-ng/sonic) development library to | |||
enable sonic audio speed up support; | |||
4. the `ronn` man-page markdown processor to build the man pages. | |||
@@ -391,8 +391,8 @@ The `ieee80.c` implementation is taken directly from | |||
[ToFromIEEE.c.txt](http://www.realitypixels.com/turk/opensource/ToFromIEEE.c.txt) | |||
which has been made available for use in Open Source applications per the | |||
[license statement](COPYING.IEEE) on http://www.realitypixels.com/turk/opensource/. | |||
The only modification made to the code is to comment out the `TEST_FP` define | |||
to make it useable in the eSpeak NG library. | |||
The only modifications made to the code is to comment out the `TEST_FP` define | |||
to make it useable in the eSpeak NG library, and to fix compiler warnings. | |||
The `getopt.c` compatibility implementation for getopt support on Windows is | |||
taken from the NetBSD `getopt_long` implementation, which is licensed under a |
@@ -3,7 +3,7 @@ buildscript { | |||
mavenCentral() | |||
} | |||
dependencies { | |||
classpath 'com.android.tools.build:gradle:1.2.3' | |||
classpath 'com.android.tools.build:gradle:2.3.3' | |||
} | |||
} | |||
@@ -18,12 +18,12 @@ dependencies { | |||
} | |||
android { | |||
buildToolsVersion '19.1' | |||
compileSdkVersion 23 | |||
buildToolsVersion '25.0.3' | |||
compileSdkVersion 26 | |||
defaultConfig { | |||
minSdkVersion 14 | |||
targetSdkVersion 23 | |||
targetSdkVersion 26 | |||
versionCode 20 | |||
versionName "1.48.15" | |||
} | |||
@@ -33,6 +33,7 @@ android { | |||
manifest.srcFile 'AndroidManifest.xml' | |||
java.srcDirs = ['src'] | |||
res.srcDirs = ['res'] | |||
jniLibs.srcDir 'libs' | |||
} | |||
androidTest.setRoot('eSpeakTests') | |||
androidTest { | |||
@@ -44,8 +45,3 @@ android { | |||
abortOnError false | |||
} | |||
} | |||
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { | |||
pkgTask -> pkgTask.jniFolders = new HashSet<File>() | |||
pkgTask.jniFolders.add(new File(projectDir, 'libs')) | |||
} |
@@ -260,7 +260,7 @@ public class SpeechSynthesisTest extends TextToSpeechTestCase | |||
public void testMatchVoiceWithLanguageAndCountry() | |||
{ | |||
final Voice voice = getVoice("fr-fr"); // language="fr" country="fr" variant="" | |||
final Voice voice = getVoice("fr-be"); // language="fr" country="BE" variant="" | |||
assertThat(voice, is(notNullValue())); | |||
assertThat(voice.match(de), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); | |||
@@ -269,23 +269,23 @@ public class SpeechSynthesisTest extends TextToSpeechTestCase | |||
assertThat(voice.match(de_CH_1901), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); | |||
assertThat(voice.match(fr), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fr_FR), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
assertThat(voice.match(fr_BE), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fr_FR), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fr_BE), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
assertThat(voice.match(fr_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fr_FR_1694acad), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE)); | |||
assertThat(voice.match(fr_BE_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fr_FR_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fr_BE_1694acad), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE)); | |||
assertThat(voice.match(fra), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fra_FRA), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
assertThat(voice.match(fra_BEL), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fra_FRA), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fra_BEL), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
assertThat(voice.match(fra_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fra_FRA_1694acad), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE)); | |||
assertThat(voice.match(fra_BEL_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fra_FRA_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
assertThat(voice.match(fra_BEL_1694acad), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE)); | |||
} | |||
public void testMatchVoiceWithLanguageCountryAndVariant() | |||
{ | |||
final Voice voice = getVoice("en-sc"); // language="en" country="GB" variant="scotland" | |||
final Voice voice = getVoice("en-gb-scotland"); // language="en" country="GB" variant="scotland" | |||
assertThat(voice, is(notNullValue())); | |||
assertThat(voice.match(de), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); |
@@ -99,10 +99,10 @@ public class TextToSpeechServiceTest extends AndroidTestCase | |||
} | |||
public void testOnLoadLanguage() { | |||
assertThat(mService.onLoadLanguage("eng", "", ""), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "eng", "", ""); | |||
assertThat(mService.onLoadLanguage("eng", "", ""), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "eng", "GBR", ""); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("en")); | |||
assertThat(mService.getActiveVoice().name, is("en-gb")); | |||
assertThat(mService.onLoadLanguage("eng", "USA", ""), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "eng", "USA", ""); | |||
@@ -112,120 +112,120 @@ public class TextToSpeechServiceTest extends AndroidTestCase | |||
assertThat(mService.onLoadLanguage("eng", "GBR", "scotland"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "eng", "GBR", "scotland"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("en-sc")); | |||
assertThat(mService.getActiveVoice().name, is("en-gb-scotland")); | |||
assertThat(mService.onLoadLanguage("eng", "USA", "rp"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "eng", "USA", ""); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("en-us")); | |||
assertThat(mService.onLoadLanguage("eng", "", "scotland"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "eng", "", ""); | |||
assertThat(mService.onLoadLanguage("eng", "", "scotland"), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "eng", "GBR", ""); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("en")); | |||
assertThat(mService.getActiveVoice().name, is("en-gb")); | |||
assertThat(mService.onLoadLanguage("eng", "FRA", "rp"), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "eng", "", ""); | |||
checkLanguage(mService.onGetLanguage(), "eng", "GBR", ""); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("en")); | |||
assertThat(mService.getActiveVoice().name, is("en-gb")); | |||
assertThat(mService.onLoadLanguage("eng", "FRA", ""), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "eng", "", ""); | |||
checkLanguage(mService.onGetLanguage(), "eng", "GBR", ""); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("en")); | |||
assertThat(mService.getActiveVoice().name, is("en-gb")); | |||
assertThat(mService.onLoadLanguage("ine", "", ""), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); | |||
checkLanguage(mService.onGetLanguage(), "eng", "", ""); | |||
checkLanguage(mService.onGetLanguage(), "eng", "GBR", ""); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("en")); | |||
assertThat(mService.getActiveVoice().name, is("en-gb")); | |||
} | |||
public void testOnIsLanguageAvailable() { | |||
assertThat(mService.onLoadLanguage("vie", "VNM", "saigon"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
assertThat(mService.onLoadLanguage("vie", "VNM", "central"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
assertThat(mService.onIsLanguageAvailable("eng", "", ""), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
assertThat(mService.onIsLanguageAvailable("eng", "", ""), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onIsLanguageAvailable("eng", "USA", ""), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onIsLanguageAvailable("eng", "GBR", "scotland"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onIsLanguageAvailable("eng", "USA", "rp"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onIsLanguageAvailable("eng", "", "scotland"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
assertThat(mService.onIsLanguageAvailable("eng", "", "scotland"), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onIsLanguageAvailable("eng", "FRA", "rp"), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onIsLanguageAvailable("eng", "FRA", ""), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onIsLanguageAvailable("ine", "", ""), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
} | |||
public void testOnGetDefaultVoiceNameFor() { | |||
assertThat(mService.onLoadLanguage("vie", "VNM", "saigon"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
assertThat(mService.onLoadLanguage("vie", "VNM", "central"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "", ""), is("en")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "", ""), is("en-gb")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "USA", ""), is("en-us")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "GBR", "scotland"), is("en-sc")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "GBR", "scotland"), is("en-gb-scotland")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "USA", "rp"), is("en-us")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "", "scotland"), is("en")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "", "scotland"), is("en-gb")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "FRA", "rp"), is("en")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "FRA", "rp"), is("en-gb")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "FRA", ""), is("en")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
assertThat(mService.onGetDefaultVoiceNameFor("eng", "FRA", ""), is("en-gb")); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
assertThat(mService.onGetDefaultVoiceNameFor("ine", "", ""), is(nullValue())); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon"); | |||
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central"); | |||
assertThat(mService.getActiveVoice(), is(notNullValue())); | |||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||
} | |||
public void testLanguages() { |
@@ -72,7 +72,7 @@ public class TextToSpeechTestCase extends AndroidTestCase | |||
Log.d("TextToSpeechTestCase", "setUp: available = " + available); | |||
} | |||
assertThat(available, isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||
assertThat(available, isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||
} | |||
catch (Exception e) | |||
{ |
@@ -75,90 +75,101 @@ public class VoiceData | |||
} | |||
public static final Voice[] voices = new Voice[] { | |||
new Voice("af", "other/af", "af", "afr", "", "", "", SpeechSynthesis.GENDER_MALE, "Afrikaans", "afr", "Hierdie is 'n voorbeeld van gesproke teks in Afrikaans"), | |||
new Voice("am", "test/am", "am", "amh", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Amharic", "amh", "ይሄ በአማርኛ ላይ የተነገረ ጽሑፍ ናሙና ነው።", "ይሄ በAmharic ላይ የተነገረ ጽሑፍ ናሙና ነው።"), | |||
new Voice("an", "europe/an", "an", "arg", "", "", "", SpeechSynthesis.GENDER_MALE, "Aragonese", "arg", "This is a sample of text spoken in Aragonese"), | |||
new Voice("as", "test/as", "as", "asm", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Assamese", "asm", "This is a sample of text spoken in Assamese", "This is a sample of text spoken in অসমীয়া"), | |||
new Voice("az", "test/az", "az", "aze", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Azerbaijani", "aze", "This is a sample of text spoken in Azerbaijani", "This is a sample of text spoken in azərbaycan"), | |||
new Voice("bg", "europe/bg", "bg", "bul", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Bulgarian", "bul", "Това е откъс от изговорен текст на български"), | |||
new Voice("bn", "asia/bn", "bn", "ben", "", "", "", SpeechSynthesis.GENDER_MALE, "Bengali", "ben", "This is a sample of text spoken in বাংলা", "This is a sample of text spoken in Bengali"), | |||
new Voice("bs", "europe/bs", "bs", "bos", "", "", "", SpeechSynthesis.GENDER_MALE, "Bosnian", "bos", "This is a sample of text spoken in Bosnian", "This is a sample of text spoken in bosanski"), | |||
new Voice("ca", "europe/ca", "ca", "cat", "", "", "", SpeechSynthesis.GENDER_MALE, "Catalan", "cat", "Aquesta és una mostra de text llegit en veu alta en català"), | |||
new Voice("cs", "europe/cs", "cs", "ces", "", "", "", SpeechSynthesis.GENDER_MALE, "Czech", "ces", "Toto je ukázkový text namluvený v jazyce čeština"), | |||
new Voice("cy", "europe/cy", "cy", "cym", "", "", "", SpeechSynthesis.GENDER_MALE, "Welsh", "cym", "This is a sample of text spoken in Welsh", "This is a sample of text spoken in Cymraeg"), | |||
new Voice("da", "europe/da", "da", "dan", "", "", "", SpeechSynthesis.GENDER_MALE, "Danish", "dan", "Dette er et eksempel på talt tekst på dansk"), | |||
new Voice("de", "de", "de", "deu", "", "", "", SpeechSynthesis.GENDER_MALE, "German", "deu", "Dies ist ein Beispieltext auf Deutsch"), | |||
new Voice("el", "europe/el", "el", "ell", "", "", "", SpeechSynthesis.GENDER_MALE, "Greek (Modern)", "ell", "Αυτό είναι ένα δείγμα κειμένου που εκφέρεται στα Ελληνικά"), | |||
new Voice("en", "default", "en", "eng", "", "", "", SpeechSynthesis.GENDER_MALE, "English", "eng", "This is a sample of text spoken in English"), | |||
new Voice("en-sc", "other/en-sc", "en", "eng", "GB", "GBR", "scotland", SpeechSynthesis.GENDER_MALE, "English (Scotland)", "eng-GBR-scotland", "This is a sample of text spoken in English (United Kingdom,Scottish Standard English)"), | |||
new Voice("en-gb", "en", "en", "eng", "GB", "GBR", "", SpeechSynthesis.GENDER_MALE, "English (UK)", "eng-GBR", "This is a sample of text spoken in English (United Kingdom)"), | |||
new Voice("en-uk-north", "other/en-n", "en", "eng", "GB", "GBR", "north", SpeechSynthesis.GENDER_MALE, "English (Lancashire)", "eng-GBR-north", "This is a sample of text spoken in English (United Kingdom,NORTH)"), | |||
new Voice("en-uk-rp", "other/en-rp", "en", "eng", "GB", "GBR", "rp", SpeechSynthesis.GENDER_MALE, "English (Received Pronunciation)", "eng-GBR-rp", "This is a sample of text spoken in English (United Kingdom,RP)", "This is a sample of text spoken in English (United Kingdom,rp)"), | |||
new Voice("en-uk-wmids", "other/en-wm", "en", "eng", "GB", "GBR", "wmids", SpeechSynthesis.GENDER_MALE, "English (West Midlands)", "eng-GBR-wmids", "This is a sample of text spoken in English (United Kingdom,WMIDS)"), | |||
new Voice("en-us", "en-us", "en", "eng", "US", "USA", "", SpeechSynthesis.GENDER_MALE, "English (US)", "eng-USA", "This is a sample of text spoken in English (United States)"), | |||
new Voice("en-wi", "other/en-wi", "en", "eng", "JM", "JAM", "", SpeechSynthesis.GENDER_MALE, "English (Caribbean)", "eng-JAM", "This is a sample of text spoken in English (Jamaica)"), | |||
new Voice("eo", "other/eo", "eo", "epo", "", "", "", SpeechSynthesis.GENDER_MALE, "Esperanto", "epo", "This is a sample of text spoken in Esperanto", "This is a sample of text spoken in esperanto"), | |||
new Voice("es", "europe/es", "es", "spa", "", "", "", SpeechSynthesis.GENDER_MALE, "Spanish", "spa", "Esto es un ejemplo de texto hablado en español."), | |||
new Voice("es-la", "es-la", "es", "spa", "MX", "MEX", "", SpeechSynthesis.GENDER_MALE, "Spanish (Latin America)", "spa-MEX", "Esto es un ejemplo de texto hablado en español (México)."), | |||
new Voice("et", "europe/et", "et", "est", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Estonian", "est", "This is a sample of text spoken in eesti", "This is a sample of text spoken in Estonian"), | |||
new Voice("eu", "europe/eu", "eu", "eus", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Basque", "eus", "This is a sample of text spoken in Basque", "This is a sample of text spoken in euskara"), | |||
new Voice("fa", "asia/fa", "fa", "fas", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Farsi (Persian)", "fas", "این یک نمونه از نوشتار گفته شده در فارسی است"), | |||
new Voice("fi", "europe/fi", "fi", "fin", "", "", "", SpeechSynthesis.GENDER_MALE, "Finnish", "fin", "Tämä on näyte puhutusta tekstistä kielellä suomi"), | |||
new Voice("fr-be", "europe/fr-be", "fr", "fra", "BE", "BEL", "", SpeechSynthesis.GENDER_MALE, "French (Belgium)", "fra-BEL", "Voici un exemple de texte énoncé en français (Belgique)."), | |||
new Voice("fr-fr", "fr", "fr", "fra", "FR", "FRA", "", SpeechSynthesis.GENDER_MALE, "French (France)", "fra-FRA", "Voici un exemple de texte énoncé en français (France)."), | |||
new Voice("ga", "europe/ga", "ga", "gle", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Irish", "gle", "This is a sample of text spoken in Irish", "This is a sample of text spoken in Gaeilge"), | |||
new Voice("gd", "test/gd", "gd", "gla", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Scottish Gaelic", "gla", "This is a sample of text spoken in Scottish Gaelic", "This is a sample of text spoken in Gàidhlig"), | |||
new Voice("grc", "other/grc", "grc", "grc", "", "", "", SpeechSynthesis.GENDER_MALE, "Greek (Ancient)", "grc", "This is a sample of text spoken in Ancient Greek"), | |||
new Voice("gu", "asia/gu", "gu", "guj", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Gujarati", "guj", "This is a sample of text spoken in Gujarati", "This is a sample of text spoken in ગુજરાતી"), | |||
new Voice("hi", "asia/hi", "hi", "hin", "", "", "", SpeechSynthesis.GENDER_MALE, "Hindi", "hin", "यह हिन्दी में बोले गए पाठ का नमूना है"), | |||
new Voice("hr", "europe/hr", "hr", "hrv", "", "", "", SpeechSynthesis.GENDER_MALE, "Croatian", "hrv", "Ovo je primjer teksta izgovorenog na hrvatski"), | |||
new Voice("hu", "europe/hu", "hu", "hun", "", "", "", SpeechSynthesis.GENDER_MALE, "Hungarian", "hun", "Ez egy magyar nyelven felolvasott szöveg mintája."), | |||
new Voice("hy", "asia/hy", "hy", "hye", "", "", "", SpeechSynthesis.GENDER_MALE, "Armenian", "hye", "This is a sample of text spoken in Armenian", "This is a sample of text spoken in հայերեն"), | |||
new Voice("hy-west", "asia/hy-west", "hy", "hye", "AM", "ARM", "arevmda", SpeechSynthesis.GENDER_MALE, "Armenian (Western)", "hye-ARM-arevmda", "This is a sample of text spoken in Armenian (Armenia,Western Armenian)", "This is a sample of text spoken in հայերեն (Հայաստան,AREVMDA)", "This is a sample of text spoken in հայերեն (Հայաստան,արեւմտահայերէն)"), | |||
new Voice("ia", "other/ia", "ia", "ina", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Interlingua", "ina", "This is a sample of text spoken in Interlingua"), | |||
new Voice("id", "asia/id", "in", "ind", "", "", "", SpeechSynthesis.GENDER_MALE, "Indonesia", "ind", "Ini adalah sebuah contoh teks yang diucapkan di Bahasa Indonesia"), // NOTE: 'id' is the correct ISO 639-1 code, but Android/Java uses 'in'. | |||
new Voice("is", "europe/is", "is", "isl", "", "", "", SpeechSynthesis.GENDER_MALE, "Icelandic", "isl", "This is a sample of text spoken in íslenska", "This is a sample of text spoken in Icelandic"), | |||
new Voice("it", "europe/it", "it", "ita", "", "", "", SpeechSynthesis.GENDER_MALE, "Italian", "ita", "Questo è un esempio di testo parlato in italiano"), | |||
new Voice("jbo", "other/jbo", "jbo", "jbo", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Lojban", "jbo", "This is a sample of text spoken in Lojban"), | |||
new Voice("ka", "asia/ka", "ka", "kat", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Georgian", "kat", "This is a sample of text spoken in Georgian", "This is a sample of text spoken in ქართული"), | |||
new Voice("kl", "test/kl", "kl", "kal", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Greenlandic", "kal", "This is a sample of text spoken in Kalaallisut", "This is a sample of text spoken in kalaallisut"), | |||
new Voice("kn", "asia/kn", "kn", "kan", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Kannada", "kan", "This is a sample of text spoken in Kannada", "This is a sample of text spoken in ಕನ್ನಡ"), | |||
new Voice("ko", "asia/ko", "ko", "kor", "", "", "", SpeechSynthesis.GENDER_MALE, "Korean", "kor", "한국어로 읽은 텍스트 샘플입니다."), | |||
new Voice("ku", "asia/ku", "ku", "kur", "", "", "", SpeechSynthesis.GENDER_MALE, "Kurdish", "kur", "This is a sample of text spoken in Kurdish"), | |||
new Voice("la", "other/la", "la", "lat", "", "", "", SpeechSynthesis.GENDER_MALE, "Latin", "lat", "This is a sample of text spoken in Latin"), | |||
new Voice("lt", "europe/lt", "lt", "lit", "", "", "", SpeechSynthesis.GENDER_MALE, "Lithuanian", "lit", "Tai teksto, sakomo lietuvių, pavyzdys"), | |||
new Voice("lv", "europe/lv", "lv", "lav", "", "", "", SpeechSynthesis.GENDER_MALE, "Latvian", "lav", "Šis ir izrunāta teksta paraugs šādā valodā: latviešu."), | |||
new Voice("mk", "europe/mk", "mk", "mkd", "", "", "", SpeechSynthesis.GENDER_MALE, "Macedonian", "mkd", "This is a sample of text spoken in Macedonian", "This is a sample of text spoken in македонски"), | |||
new Voice("ml", "asia/ml", "ml", "mal", "", "", "", SpeechSynthesis.GENDER_MALE, "Malayalam", "mal", "This is a sample of text spoken in Malayalam", "This is a sample of text spoken in മലയാളം"), | |||
new Voice("mr", "test/mr", "mr", "mar", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Marathi", "mar", "This is a sample of text spoken in Marathi", "This is a sample of text spoken in मराठी"), | |||
new Voice("ms", "asia/ms", "ms", "msa", "", "", "", SpeechSynthesis.GENDER_MALE, "Malay", "msa", "Ini adalah sampel teks yang dilafazkan dalam Bahasa Melayu", "Ini adalah sampel teks yang dilafazkan dalam Malay"), | |||
new Voice("ne", "asia/ne", "ne", "nep", "", "", "", SpeechSynthesis.GENDER_MALE, "Nepali", "nep", "This is a sample of text spoken in Nepali", "This is a sample of text spoken in नेपाली"), | |||
new Voice("nl", "europe/nl", "nl", "nld", "", "", "", SpeechSynthesis.GENDER_MALE, "Dutch", "nld", "Dit is een voorbeeld van tekst die is uitgesproken in het Nederlands"), | |||
new Voice("no", "europe/no", "nb", "nob", "", "", "", SpeechSynthesis.GENDER_MALE, "Norwegian (Bokmål)", "nob", "Dette er et teksteksempel lest opp på norsk bokmål"), | |||
new Voice("om", "test/om", "om", "orm", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Oromoo", "orm", "This is a sample of text spoken in Oromo", "This is a sample of text spoken in Oromoo"), | |||
new Voice("or", "test/or", "or", "ori", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Oriya", "ori", "This is a sample of text spoken in Oriya", "This is a sample of text spoken in ଓଡ଼ିଆ"), | |||
new Voice("pa", "asia/pa", "pa", "pan", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Panjabi", "pan", "This is a sample of text spoken in Punjabi", "This is a sample of text spoken in ਪੰਜਾਬੀ"), | |||
new Voice("pap", "test/pap", "pap", "pap", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Papiamento", "pap", "This is a sample of text spoken in Papiamento"), | |||
new Voice("pl", "europe/pl", "pl", "pol", "", "", "", SpeechSynthesis.GENDER_MALE, "Polish", "pol", "To jest przykład tekstu mówionego przy ustawieniu polski"), | |||
new Voice("pt-br", "pt", "pt", "por", "BR", "BRA", "", SpeechSynthesis.GENDER_MALE, "Portuguese (Brazil)", "por-BRA", "Esta é uma amostra de texto falado em português (Brasil)"), | |||
new Voice("pt-pt", "europe/pt-pt", "pt", "por", "PT", "PRT", "", SpeechSynthesis.GENDER_MALE, "Portuguese (Portugal)", "por-PRT", "Este é um exemplo de texto falado em português (Portugal)"), | |||
new Voice("ro", "europe/ro", "ro", "ron", "", "", "", SpeechSynthesis.GENDER_MALE, "Romanian", "ron", "Aceasta este o mostră de text vorbit în română"), | |||
new Voice("ru", "europe/ru", "ru", "rus", "", "", "", SpeechSynthesis.GENDER_MALE, "Russian", "rus", "Так синтезатор речи озвучивает русский текст"), | |||
new Voice("si", "test/si", "si", "sin", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Sinhalese", "sin", "This is a sample of text spoken in Sinhala", "This is a sample of text spoken in සිංහල"), | |||
new Voice("sk", "europe/sk", "sk", "slk", "", "", "", SpeechSynthesis.GENDER_MALE, "Slovak", "slk", "Toto je ukážkový text nahovorený v jazyku slovenčina"), | |||
new Voice("sl", "test/sl", "sl", "slv", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Slovenian", "slv", "To je vzorec besedila, izgovorjen v slovenščina"), | |||
new Voice("sq", "europe/sq", "sq", "sqi", "", "", "", SpeechSynthesis.GENDER_MALE, "Albanian", "sqi", "This is a sample of text spoken in Albanian", "This is a sample of text spoken in Shqip", "This is a sample of text spoken in shqip"), | |||
new Voice("sr", "europe/sr", "sr", "srp", "", "", "", SpeechSynthesis.GENDER_MALE, "Serbian", "srp", "Ово је пример текста који је изговорен на језику Српски", "Ово је пример текста који је изговорен на језику српски"), | |||
new Voice("sv", "europe/sv", "sv", "swe", "", "", "", SpeechSynthesis.GENDER_MALE, "Swedish", "swe", "Detta är ett textexempel som läses på svenska"), | |||
new Voice("sw", "other/sw", "sw", "swa", "", "", "", SpeechSynthesis.GENDER_MALE, "Swahili", "swa", "Hii ni sampuli ya maandishi yaliyonenwa katika Kiswahili", "Hii ni sampuli ya maandishi yaliyonenwa katika Swahili"), | |||
new Voice("ta", "asia/ta", "ta", "tam", "", "", "", SpeechSynthesis.GENDER_MALE, "Tamil", "tam", "This is a sample of text spoken in தமிழ்", "This is a sample of text spoken in Tamil"), | |||
new Voice("te", "asia/te", "te", "tel", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Telugu", "tel", "This is a sample of text spoken in Telugu", "This is a sample of text spoken in తెలుగు"), | |||
new Voice("tr", "asia/tr", "tr", "tur", "", "", "", SpeechSynthesis.GENDER_MALE, "Turkish", "tur", "Bu, Türkçe dilinde seslendirilen örnek bir metindir"), | |||
new Voice("ur", "test/ur", "ur", "urd", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Urdu", "urd", "This is a sample of text spoken in Urdu", "This is a sample of text spoken in اردو"), | |||
new Voice("vi", "asia/vi", "vi", "vie", "", "", "", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie", "Đây là mẫu văn bản được đọc bằng Tiếng Việt"), | |||
new Voice("vi-hue", "asia/vi-hue", "vi", "vie", "VN", "VNM", "hue", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie-VNM-hue", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,HUE)", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,hue)"), | |||
new Voice("vi-sgn", "asia/vi-sgn", "vi", "vie", "VN", "VNM", "saigon", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie-VNM-saigon", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,SAIGON)"), | |||
new Voice("zh", "asia/zh", "zh", "zho", "", "", "", SpeechSynthesis.GENDER_MALE, "Chinese (Mandarin)", "zho", "This is a sample of text spoken in 中文"), | |||
new Voice("zh-yue", "asia/zh-yue", "zh", "zho", "HK", "HKG", "", SpeechSynthesis.GENDER_MALE, "Chinese (Cantonese)", "zho-HKG", "This is a sample of text spoken in 中文 (中華人民共和國香港特別行政區)", "This is a sample of text spoken in 中文 (香港)"), | |||
new Voice("af", "gmw/af", "af", "afr", "", "", "", SpeechSynthesis.GENDER_MALE, "Afrikaans", "afr", "Hierdie is 'n voorbeeld van gesproke teks in Afrikaans"), | |||
new Voice("am", "sem/am", "am", "amh", "", "", "", SpeechSynthesis.GENDER_MALE, "Amharic", "amh", "ይሄ በአማርኛ ላይ የተነገረ ጽሑፍ ናሙና ነው።", "ይሄ በAmharic ላይ የተነገረ ጽሑፍ ናሙና ነው።"), | |||
new Voice("an", "roa/an", "an", "arg", "", "", "", SpeechSynthesis.GENDER_MALE, "Aragonese", "arg", "This is a sample of text spoken in Aragonese"), | |||
new Voice("ar", "sem/ar", "ar", "ara", "", "", "", SpeechSynthesis.GENDER_MALE, "Arabic", "ara", "هذه عينة من النص الذي تم نطقه في العربية"), | |||
new Voice("as", "inc/as", "as", "asm", "", "", "", SpeechSynthesis.GENDER_MALE, "Assamese", "asm", "This is a sample of text spoken in Assamese", "This is a sample of text spoken in অসমীয়া"), | |||
new Voice("az", "trk/az", "az", "aze", "", "", "", SpeechSynthesis.GENDER_MALE, "Azerbaijani", "aze", "This is a sample of text spoken in Azerbaijani", "This is a sample of text spoken in azərbaycan"), | |||
new Voice("bg", "zls/bg", "bg", "bul", "", "", "", SpeechSynthesis.GENDER_MALE, "Bulgarian", "bul", "Това е откъс от изговорен текст на български"), | |||
new Voice("bn", "inc/bn", "bn", "ben", "", "", "", SpeechSynthesis.GENDER_MALE, "Bengali", "ben", "This is a sample of text spoken in বাংলা", "This is a sample of text spoken in Bengali"), | |||
new Voice("bs", "zls/bs", "bs", "bos", "", "", "", SpeechSynthesis.GENDER_MALE, "Bosnian", "bos", "This is a sample of text spoken in Bosnian", "This is a sample of text spoken in bosanski"), | |||
new Voice("ca", "roa/ca", "ca", "cat", "", "", "", SpeechSynthesis.GENDER_MALE, "Catalan", "cat", "Aquesta és una mostra de text llegit en veu alta en català"), | |||
new Voice("cs", "zlw/cs", "cs", "ces", "", "", "", SpeechSynthesis.GENDER_MALE, "Czech", "ces", "Toto je ukázkový text namluvený v jazyce čeština"), | |||
new Voice("cy", "cel/cy", "cy", "cym", "", "", "", SpeechSynthesis.GENDER_MALE, "Welsh", "cym", "This is a sample of text spoken in Welsh", "This is a sample of text spoken in Cymraeg"), | |||
new Voice("da", "gmq/da", "da", "dan", "", "", "", SpeechSynthesis.GENDER_MALE, "Danish", "dan", "Dette er et eksempel på talt tekst på dansk"), | |||
new Voice("de", "gmw/de", "de", "deu", "", "", "", SpeechSynthesis.GENDER_MALE, "German", "deu", "Dies ist ein Beispieltext auf Deutsch"), | |||
new Voice("el", "grk/el", "el", "ell", "", "", "", SpeechSynthesis.GENDER_MALE, "Greek (Modern)", "ell", "Αυτό είναι ένα δείγμα κειμένου που εκφέρεται στα Ελληνικά"), | |||
new Voice("en-gb-scotland", "gmw/en-GB-scotland", "en", "eng", "GB", "GBR", "scotland", SpeechSynthesis.GENDER_MALE, "English (Scotland)", "eng-GBR-scotland", "This is a sample of text spoken in English (United Kingdom,Scottish Standard English)"), | |||
new Voice("en-gb", "gmw/en", "en", "eng", "GB", "GBR", "", SpeechSynthesis.GENDER_MALE, "English (UK)", "eng-GBR", "This is a sample of text spoken in English (United Kingdom)"), | |||
new Voice("en-gb-x-gbclan", "gmw/en-GB-x-gbclan", "en", "eng", "GB", "GBR", "gbclan", SpeechSynthesis.GENDER_MALE, "English (Lancashire)", "eng-GBR-gbclan", "This is a sample of text spoken in English (United Kingdom,GBCLAN)"), | |||
new Voice("en-gb-x-rp", "gmw/en-GB-x-rp", "en", "eng", "GB", "GBR", "rp", SpeechSynthesis.GENDER_MALE, "English (Received Pronunciation)", "eng-GBR-rp", "This is a sample of text spoken in English (United Kingdom,RP)", "This is a sample of text spoken in English (United Kingdom,rp)"), | |||
new Voice("en-gb-x-gbcwmd", "gmw/en-GB-x-gbcwmd", "en", "eng", "GB", "GBR", "gbcwmd", SpeechSynthesis.GENDER_MALE, "English (West Midlands)", "eng-GBR-gbcwmd", "This is a sample of text spoken in English (United Kingdom,GBCWMD)"), | |||
new Voice("en-us", "gmw/en-US", "en", "eng", "US", "USA", "", SpeechSynthesis.GENDER_MALE, "English (US)", "eng-USA", "This is a sample of text spoken in English (United States)"), | |||
new Voice("en-029", "gmw/en-029", "en", "eng", "JM", "JAM", "", SpeechSynthesis.GENDER_MALE, "English (Caribbean)", "eng-JAM", "This is a sample of text spoken in English (Jamaica)"), | |||
new Voice("eo", "art/eo", "eo", "epo", "", "", "", SpeechSynthesis.GENDER_MALE, "Esperanto", "epo", "This is a sample of text spoken in Esperanto", "This is a sample of text spoken in esperanto"), | |||
new Voice("es", "roa/es", "es", "spa", "", "", "", SpeechSynthesis.GENDER_MALE, "Spanish", "spa", "Esto es un ejemplo de texto hablado en español."), | |||
new Voice("es-419", "roa/es-419", "es", "spa", "MX", "MEX", "", SpeechSynthesis.GENDER_MALE, "Spanish (Latin America)", "spa-MEX", "Esto es un ejemplo de texto hablado en español (México)."), | |||
new Voice("et", "urj/et", "et", "est", "", "", "", SpeechSynthesis.GENDER_MALE, "Estonian", "est", "This is a sample of text spoken in eesti", "This is a sample of text spoken in Estonian"), | |||
new Voice("eu", "eu", "eu", "eus", "", "", "", SpeechSynthesis.GENDER_MALE, "Basque", "eus", "This is a sample of text spoken in Basque", "This is a sample of text spoken in euskara"), | |||
new Voice("fa", "ira/fa", "fa", "fas", "", "", "", SpeechSynthesis.GENDER_MALE, "Farsi (Persian)", "fas", "این یک نمونه از نوشتار گفته شده در فارسی است"), | |||
new Voice("fi", "urj/fi", "fi", "fin", "", "", "", SpeechSynthesis.GENDER_MALE, "Finnish", "fin", "Tämä on näyte puhutusta tekstistä kielellä suomi"), | |||
new Voice("fr-be", "roa/fr-BE", "fr", "fra", "BE", "BEL", "", SpeechSynthesis.GENDER_MALE, "French (Belgium)", "fra-BEL", "Voici un exemple de texte énoncé en français (Belgique)."), | |||
new Voice("fr-ch", "roa/fr-CH", "fr", "fra", "CH", "CHE", "", SpeechSynthesis.GENDER_MALE, "French (Switzerland)", "fra-CHE", "Voici un exemple de texte énoncé en français (Suisse)."), | |||
new Voice("fr-fr", "roa/fr", "fr", "fra", "FR", "FRA", "", SpeechSynthesis.GENDER_MALE, "French (France)", "fra-FRA", "Voici un exemple de texte énoncé en français (France)."), | |||
new Voice("ga", "cel/ga", "ga", "gle", "", "", "", SpeechSynthesis.GENDER_MALE, "Irish", "gle", "This is a sample of text spoken in Irish", "This is a sample of text spoken in Gaeilge"), | |||
new Voice("gd", "cel/gd", "gd", "gla", "", "", "", SpeechSynthesis.GENDER_MALE, "Scottish Gaelic", "gla", "This is a sample of text spoken in Scottish Gaelic", "This is a sample of text spoken in Gàidhlig"), | |||
new Voice("gn", "sai/gn", "gn", "grn", "", "", "", SpeechSynthesis.GENDER_MALE, "Guarani", "grn", "This is a sample of text spoken in Guarani"), | |||
new Voice("grc", "grk/grc", "grc", "grc", "", "", "", SpeechSynthesis.GENDER_MALE, "Greek (Ancient)", "grc", "This is a sample of text spoken in Ancient Greek"), | |||
new Voice("gu", "inc/gu", "gu", "guj", "", "", "", SpeechSynthesis.GENDER_MALE, "Gujarati", "guj", "This is a sample of text spoken in Gujarati", "This is a sample of text spoken in ગુજરાતી"), | |||
new Voice("hi", "inc/hi", "hi", "hin", "", "", "", SpeechSynthesis.GENDER_MALE, "Hindi", "hin", "यह हिन्दी में बोले गए पाठ का नमूना है"), | |||
new Voice("hr", "zls/hr", "hr", "hrv", "", "", "", SpeechSynthesis.GENDER_MALE, "Croatian", "hrv", "Ovo je primjer teksta izgovorenog na hrvatski"), | |||
new Voice("hu", "urj/hu", "hu", "hun", "", "", "", SpeechSynthesis.GENDER_MALE, "Hungarian", "hun", "Ez egy magyar nyelven felolvasott szöveg mintája."), | |||
new Voice("hy", "ine/hy", "hy", "hye", "", "", "", SpeechSynthesis.GENDER_MALE, "Armenian", "hye", "This is a sample of text spoken in Armenian", "This is a sample of text spoken in հայերեն"), | |||
new Voice("hy-arevmda", "ine/hy-arevmda", "hy", "hye", "AM", "ARM", "arevmda", SpeechSynthesis.GENDER_MALE, "Armenian (Western)", "hye-ARM-arevmda", "This is a sample of text spoken in Armenian (Armenia,Western Armenian)", "This is a sample of text spoken in հայերեն (Հայաստան,AREVMDA)", "This is a sample of text spoken in հայերեն (Հայաստան,արեւմտահայերէն)"), | |||
new Voice("ia", "art/ia", "ia", "ina", "", "", "", SpeechSynthesis.GENDER_MALE, "Interlingua", "ina", "This is a sample of text spoken in Interlingua"), | |||
new Voice("id", "poz/id", "in", "ind", "", "", "", SpeechSynthesis.GENDER_MALE, "Indonesia", "ind", "Ini adalah sebuah contoh teks yang diucapkan di Bahasa Indonesia"), // NOTE: 'id' is the correct ISO 639-1 code, but Android/Java uses 'in'. | |||
new Voice("is", "gmq/is", "is", "isl", "", "", "", SpeechSynthesis.GENDER_MALE, "Icelandic", "isl", "This is a sample of text spoken in íslenska", "This is a sample of text spoken in Icelandic"), | |||
new Voice("it", "roa/it", "it", "ita", "", "", "", SpeechSynthesis.GENDER_MALE, "Italian", "ita", "Questo è un esempio di testo parlato in italiano"), | |||
new Voice("ja", "jpx/ja", "ja", "jpn", "", "", "", SpeechSynthesis.GENDER_MALE, "Japanese", "jpn", "日本語で話すテキストサンプルです。"), | |||
new Voice("jbo", "art/jbo", "jbo", "jbo", "", "", "", SpeechSynthesis.GENDER_MALE, "Lojban", "jbo", "This is a sample of text spoken in Lojban"), | |||
new Voice("ka", "ccs/ka", "ka", "kat", "", "", "", SpeechSynthesis.GENDER_MALE, "Georgian", "kat", "This is a sample of text spoken in Georgian", "This is a sample of text spoken in ქართული"), | |||
new Voice("kl", "esx/kl", "kl", "kal", "", "", "", SpeechSynthesis.GENDER_MALE, "Greenlandic", "kal", "This is a sample of text spoken in Kalaallisut", "This is a sample of text spoken in kalaallisut"), | |||
new Voice("kn", "dra/kn", "kn", "kan", "", "", "", SpeechSynthesis.GENDER_MALE, "Kannada", "kan", "This is a sample of text spoken in Kannada", "This is a sample of text spoken in ಕನ್ನಡ"), | |||
new Voice("ko", "ko", "ko", "kor", "", "", "", SpeechSynthesis.GENDER_MALE, "Korean", "kor", "한국어로 읽은 텍스트 샘플입니다."), | |||
new Voice("kok", "inc/kok", "kok", "kok", "", "", "", SpeechSynthesis.GENDER_MALE, "Konkani", "kok", "This is a sample of text spoken in कोंकणी"), | |||
new Voice("ku", "ira/ku", "ku", "kur", "", "", "", SpeechSynthesis.GENDER_MALE, "Kurdish", "kur", "This is a sample of text spoken in Kurdish"), | |||
new Voice("ky", "trk/ky", "ky", "kir", "", "", "", SpeechSynthesis.GENDER_MALE, "Kyrgyz", "kir", "This is a sample of text spoken in кыргызча"), | |||
new Voice("la", "itc/la", "la", "lat", "", "", "", SpeechSynthesis.GENDER_MALE, "Latin", "lat", "This is a sample of text spoken in Latin"), | |||
new Voice("lt", "bat/lt", "lt", "lit", "", "", "", SpeechSynthesis.GENDER_MALE, "Lithuanian", "lit", "Tai teksto, sakomo lietuvių, pavyzdys"), | |||
new Voice("lv", "bat/lv", "lv", "lav", "", "", "", SpeechSynthesis.GENDER_MALE, "Latvian", "lav", "Šis ir izrunāta teksta paraugs šādā valodā: latviešu."), | |||
new Voice("mi", "poz/mi", "mi", "mri", "", "", "", SpeechSynthesis.GENDER_MALE, "Māori", "mri", "This is a sample of text spoken in Maori"), | |||
new Voice("mk", "zls/mk", "mk", "mkd", "", "", "", SpeechSynthesis.GENDER_MALE, "Macedonian", "mkd", "This is a sample of text spoken in Macedonian", "This is a sample of text spoken in македонски"), | |||
new Voice("ml", "dra/ml", "ml", "mal", "", "", "", SpeechSynthesis.GENDER_MALE, "Malayalam", "mal", "This is a sample of text spoken in Malayalam", "This is a sample of text spoken in മലയാളം"), | |||
new Voice("mr", "inc/mr", "mr", "mar", "", "", "", SpeechSynthesis.GENDER_MALE, "Marathi", "mar", "This is a sample of text spoken in Marathi", "This is a sample of text spoken in मराठी"), | |||
new Voice("ms", "poz/ms", "ms", "msa", "", "", "", SpeechSynthesis.GENDER_MALE, "Malay", "msa", "Ini adalah sampel teks yang dilafazkan dalam Bahasa Melayu", "Ini adalah sampel teks yang dilafazkan dalam Malay"), | |||
new Voice("mt", "sem/mt", "mt", "mlt", "", "", "", SpeechSynthesis.GENDER_MALE, "Maltese", "mlt", "This is a sample of text spoken in Malti"), | |||
new Voice("my", "sit/my", "my", "mya", "", "", "", SpeechSynthesis.GENDER_MALE, "Myanmar", "mya", "This is a sample of text spoken in Telugu", "This is a sample of text spoken in ဗမာ"), | |||
new Voice("ne", "inc/ne", "ne", "nep", "", "", "", SpeechSynthesis.GENDER_MALE, "Nepali", "nep", "This is a sample of text spoken in Nepali", "This is a sample of text spoken in नेपाली"), | |||
new Voice("nl", "gmw/nl", "nl", "nld", "", "", "", SpeechSynthesis.GENDER_MALE, "Dutch", "nld", "Dit is een voorbeeld van tekst die is uitgesproken in het Nederlands"), | |||
new Voice("nb", "gmq/nb", "nb", "nob", "", "", "", SpeechSynthesis.GENDER_MALE, "Norwegian (Bokmål)", "nob", "Dette er et teksteksempel lest opp på norsk bokmål"), | |||
new Voice("om", "cus/om", "om", "orm", "", "", "", SpeechSynthesis.GENDER_MALE, "Oromoo", "orm", "This is a sample of text spoken in Oromo", "This is a sample of text spoken in Oromoo"), | |||
new Voice("or", "inc/or", "or", "ori", "", "", "", SpeechSynthesis.GENDER_MALE, "Oriya", "ori", "This is a sample of text spoken in Oriya", "This is a sample of text spoken in ଓଡ଼ିଆ"), | |||
new Voice("pa", "inc/pa", "pa", "pan", "", "", "", SpeechSynthesis.GENDER_MALE, "Panjabi", "pan", "This is a sample of text spoken in Punjabi", "This is a sample of text spoken in ਪੰਜਾਬੀ"), | |||
new Voice("pap", "roa/pap", "pap", "pap", "", "", "", SpeechSynthesis.GENDER_MALE, "Papiamento", "pap", "This is a sample of text spoken in Papiamento"), | |||
new Voice("pl", "zlw/pl", "pl", "pol", "", "", "", SpeechSynthesis.GENDER_MALE, "Polish", "pol", "To jest przykład tekstu mówionego przy ustawieniu polski"), | |||
new Voice("pt", "roa/pt", "pt", "por", "", "", "", SpeechSynthesis.GENDER_MALE, "Portuguese", "por", "Este é um exemplo de texto falado em português"), | |||
new Voice("pt-br", "roa/pt-BR", "pt", "por", "BR", "BRA", "", SpeechSynthesis.GENDER_MALE, "Portuguese (Brazil)", "por-BRA", "Esta é uma amostra de texto falado em português (Brasil)"), | |||
new Voice("ro", "roa/ro", "ro", "ron", "", "", "", SpeechSynthesis.GENDER_MALE, "Romanian", "ron", "Aceasta este o mostră de text vorbit în română"), | |||
new Voice("ru", "zle/ru", "ru", "rus", "", "", "", SpeechSynthesis.GENDER_MALE, "Russian", "rus", "Так синтезатор речи озвучивает русский текст"), | |||
new Voice("sd", "inc/sd", "sd", "snd", "", "", "", SpeechSynthesis.GENDER_MALE, "Sindhi", "snd", "This is a sample of text spoken in Sindhi"), | |||
new Voice("si", "inc/si", "si", "sin", "", "", "", SpeechSynthesis.GENDER_MALE, "Sinhalese", "sin", "This is a sample of text spoken in Sinhala", "This is a sample of text spoken in සිංහල"), | |||
new Voice("sk", "zlw/sk", "sk", "slk", "", "", "", SpeechSynthesis.GENDER_MALE, "Slovak", "slk", "Toto je ukážkový text nahovorený v jazyku slovenčina"), | |||
new Voice("sl", "zls/sl", "sl", "slv", "", "", "", SpeechSynthesis.GENDER_MALE, "Slovenian", "slv", "To je vzorec besedila, izgovorjen v slovenščina"), | |||
new Voice("sq", "ine/sq", "sq", "sqi", "", "", "", SpeechSynthesis.GENDER_MALE, "Albanian", "sqi", "This is a sample of text spoken in Albanian", "This is a sample of text spoken in Shqip", "This is a sample of text spoken in shqip"), | |||
new Voice("sr", "zls/sr", "sr", "srp", "", "", "", SpeechSynthesis.GENDER_MALE, "Serbian", "srp", "Ово је пример текста који је изговорен на језику Српски", "Ово је пример текста који је изговорен на језику српски"), | |||
new Voice("sv", "gmq/sv", "sv", "swe", "", "", "", SpeechSynthesis.GENDER_MALE, "Swedish", "swe", "Detta är ett textexempel som läses på svenska"), | |||
new Voice("sw", "bnt/sw", "sw", "swa", "", "", "", SpeechSynthesis.GENDER_MALE, "Swahili", "swa", "Hii ni sampuli ya maandishi yaliyonenwa katika Kiswahili", "Hii ni sampuli ya maandishi yaliyonenwa katika Swahili"), | |||
new Voice("ta", "dra/ta", "ta", "tam", "", "", "", SpeechSynthesis.GENDER_MALE, "Tamil", "tam", "This is a sample of text spoken in தமிழ்", "This is a sample of text spoken in Tamil"), | |||
new Voice("te", "dra/te", "te", "tel", "", "", "", SpeechSynthesis.GENDER_MALE, "Telugu", "tel", "This is a sample of text spoken in Telugu", "This is a sample of text spoken in తెలుగు"), | |||
new Voice("tn", "bnt/tn", "tn", "tsn", "", "", "", SpeechSynthesis.GENDER_MALE, "Setswana", "tsn", "This is a sample of text spoken in Tswana"), | |||
new Voice("tr", "trk/tr", "tr", "tur", "", "", "", SpeechSynthesis.GENDER_MALE, "Turkish", "tur", "Bu, Türkçe dilinde seslendirilen örnek bir metindir"), | |||
new Voice("tt", "trk/tt", "tt", "tat", "", "", "", SpeechSynthesis.GENDER_MALE, "Tatar", "tat", "This is a sample of text spoken in Tatar"), | |||
new Voice("ur", "inc/ur", "ur", "urd", "", "", "", SpeechSynthesis.GENDER_MALE, "Urdu", "urd", "This is a sample of text spoken in Urdu", "This is a sample of text spoken in اردو"), | |||
new Voice("vi", "aav/vi", "vi", "vie", "", "", "", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie", "Đây là mẫu văn bản được đọc bằng Tiếng Việt"), | |||
new Voice("vi-vn-x-central", "aav/vi-VN-x-central", "vi", "vie", "VN", "VNM", "central", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie-VNM-central", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,CENTRAL)", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,central)"), | |||
new Voice("vi-vn-x-south", "aav/vi-VN-x-south", "vi", "vie", "VN", "VNM", "south", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie-VNM-south", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,SOUTH)"), | |||
new Voice("cmn", "sit/cmn", "zh", "zho", "", "", "", SpeechSynthesis.GENDER_MALE, "Chinese (Mandarin)", "zho", "This is a sample of text spoken in 中文"), | |||
new Voice("yue", "sit/yue", "zh", "zho", "HK", "HKG", "", SpeechSynthesis.GENDER_MALE, "Chinese (Cantonese)", "zho-HKG", "This is a sample of text spoken in 中文 (中華人民共和國香港特別行政區)", "This is a sample of text spoken in 中文 (香港)"), | |||
}; | |||
} |
@@ -5,7 +5,7 @@ LOCAL_CFLAGS = -std=c11 | |||
# ucd-tools wide-character compatibility support: | |||
UCDTOOLS_SRC_PATH := ../../ucd-tools/src | |||
UCDTOOLS_SRC_PATH := ../../src/ucd-tools/src | |||
UCDTOOLS_SRC_FILES := \ | |||
$(subst $(LOCAL_PATH)/$(UCDTOOLS_SRC_PATH),$(UCDTOOLS_SRC_PATH),$(wildcard $(LOCAL_PATH)/$(UCDTOOLS_SRC_PATH)/*.c*)) | |||
@@ -33,7 +33,6 @@ ESPEAK_SOURCES := \ | |||
src/libespeak-ng/synthdata.c \ | |||
src/libespeak-ng/synthesize.c \ | |||
src/libespeak-ng/synth_mbrola.c \ | |||
src/libespeak-ng/tokenizer.c \ | |||
src/libespeak-ng/translate.c \ | |||
src/libespeak-ng/tr_languages.c \ | |||
src/libespeak-ng/voices.c \ |
@@ -1,4 +1,4 @@ | |||
APP_OPTIM := release | |||
APP_PLATFORM := android-8 | |||
APP_PLATFORM := android-14 | |||
APP_TOOLCHAIN_VERSION := 4.6.3 | |||
APP_ABI := mips armeabi armeabi-v7a x86 |
@@ -1,2 +1,2 @@ | |||
// This is created by autoconf on POSIX-compatibe build environments. | |||
#define PACKAGE_VERSION "1.49.2-dev" | |||
#define PACKAGE_VERSION "1.49.3-dev" |
@@ -114,6 +114,8 @@ public class SpeechSynthesis { | |||
return new Locale(parts[0], parts[1]); | |||
case 3: // language-country-variant | |||
return new Locale(parts[0], parts[1], parts[2]); | |||
case 4: // language-country-x-privateuse | |||
return new Locale(parts[0], parts[1], parts[3]); | |||
default: | |||
return null; | |||
} | |||
@@ -355,6 +357,7 @@ public class SpeechSynthesis { | |||
static { | |||
mJavaToIanaLanguageCode.put("afr", "af"); | |||
mJavaToIanaLanguageCode.put("amh", "am"); | |||
mJavaToIanaLanguageCode.put("ara", "ar"); | |||
mJavaToIanaLanguageCode.put("arg", "an"); | |||
mJavaToIanaLanguageCode.put("asm", "as"); | |||
mJavaToIanaLanguageCode.put("aze", "az"); | |||
@@ -377,6 +380,7 @@ public class SpeechSynthesis { | |||
mJavaToIanaLanguageCode.put("fra", "fr"); | |||
mJavaToIanaLanguageCode.put("gle", "ga"); | |||
mJavaToIanaLanguageCode.put("gla", "gd"); | |||
mJavaToIanaLanguageCode.put("grn", "gn"); | |||
mJavaToIanaLanguageCode.put("guj", "gu"); | |||
mJavaToIanaLanguageCode.put("hin", "hi"); | |||
mJavaToIanaLanguageCode.put("hrv", "hr"); | |||
@@ -386,9 +390,11 @@ public class SpeechSynthesis { | |||
mJavaToIanaLanguageCode.put("ind", "in"); // NOTE: The deprecated 'in' code is used by Java/Android. | |||
mJavaToIanaLanguageCode.put("isl", "is"); | |||
mJavaToIanaLanguageCode.put("ita", "it"); | |||
mJavaToIanaLanguageCode.put("jpn", "ja"); | |||
mJavaToIanaLanguageCode.put("kat", "ka"); | |||
mJavaToIanaLanguageCode.put("kal", "kl"); | |||
mJavaToIanaLanguageCode.put("kan", "kn"); | |||
mJavaToIanaLanguageCode.put("kir", "ky"); | |||
mJavaToIanaLanguageCode.put("kor", "ko"); | |||
mJavaToIanaLanguageCode.put("kur", "ku"); | |||
mJavaToIanaLanguageCode.put("lat", "la"); | |||
@@ -397,7 +403,10 @@ public class SpeechSynthesis { | |||
mJavaToIanaLanguageCode.put("mkd", "mk"); | |||
mJavaToIanaLanguageCode.put("mal", "ml"); | |||
mJavaToIanaLanguageCode.put("mar", "mr"); | |||
mJavaToIanaLanguageCode.put("mlt", "mt"); | |||
mJavaToIanaLanguageCode.put("mri", "mi"); | |||
mJavaToIanaLanguageCode.put("msa", "ms"); | |||
mJavaToIanaLanguageCode.put("mya", "my"); | |||
mJavaToIanaLanguageCode.put("nep", "ne"); | |||
mJavaToIanaLanguageCode.put("nld", "nl"); | |||
mJavaToIanaLanguageCode.put("nob", "nb"); | |||
@@ -412,12 +421,15 @@ public class SpeechSynthesis { | |||
mJavaToIanaLanguageCode.put("sin", "si"); | |||
mJavaToIanaLanguageCode.put("slk", "sk"); | |||
mJavaToIanaLanguageCode.put("slv", "sl"); | |||
mJavaToIanaLanguageCode.put("snd", "sd"); | |||
mJavaToIanaLanguageCode.put("sqi", "sq"); | |||
mJavaToIanaLanguageCode.put("srp", "sr"); | |||
mJavaToIanaLanguageCode.put("swe", "sv"); | |||
mJavaToIanaLanguageCode.put("swa", "sw"); | |||
mJavaToIanaLanguageCode.put("tam", "ta"); | |||
mJavaToIanaLanguageCode.put("tel", "te"); | |||
mJavaToIanaLanguageCode.put("tat", "tt"); | |||
mJavaToIanaLanguageCode.put("tsn", "tn"); | |||
mJavaToIanaLanguageCode.put("tur", "tr"); | |||
mJavaToIanaLanguageCode.put("urd", "ur"); | |||
mJavaToIanaLanguageCode.put("vie", "vi"); | |||
@@ -426,6 +438,7 @@ public class SpeechSynthesis { | |||
mJavaToIanaCountryCode.put("ARM", "AM"); | |||
mJavaToIanaCountryCode.put("BEL", "BE"); | |||
mJavaToIanaCountryCode.put("BRA", "BR"); | |||
mJavaToIanaCountryCode.put("CHE", "CH"); | |||
mJavaToIanaCountryCode.put("FRA", "FR"); | |||
mJavaToIanaCountryCode.put("GBR", "GB"); | |||
mJavaToIanaCountryCode.put("HKG", "HK"); | |||
@@ -435,18 +448,11 @@ public class SpeechSynthesis { | |||
mJavaToIanaCountryCode.put("USA", "US"); | |||
mJavaToIanaCountryCode.put("VNM", "VN"); | |||
// Map eSpeak locales to their correct BCP47 locales supported by Android: | |||
mLocaleFixes.put("en-sc", new Locale("en", "GB", "scotland")); | |||
mLocaleFixes.put("en-uk-north", new Locale("en", "GB", "north")); | |||
mLocaleFixes.put("en-uk-rp", new Locale("en", "GB", "rp")); | |||
mLocaleFixes.put("en-uk-wmids", new Locale("en", "GB", "wmids")); | |||
mLocaleFixes.put("en-wi", new Locale("en", "JM")); | |||
mLocaleFixes.put("es-la", new Locale("es", "MX")); | |||
mLocaleFixes.put("fa-pin", null); // Script tags not supported. | |||
mLocaleFixes.put("hy-west", new Locale("hy", "AM", "arevmda")); // hy-arevmda crashes on Android 5.0 | |||
mLocaleFixes.put("no", new Locale("nb")); // 'no' is valid, but the system uses the more specific 'nb' and 'nn' | |||
mLocaleFixes.put("vi-hue", new Locale("vi", "VN", "hue")); | |||
mLocaleFixes.put("vi-sgn", new Locale("vi", "VN", "saigon")); | |||
mLocaleFixes.put("zh-yue", new Locale("zh", "HK")); | |||
// Fix up BCP47 locales not handled correctly by Android: | |||
mLocaleFixes.put("cmn", new Locale("zh")); | |||
mLocaleFixes.put("en-029", new Locale("en", "JM")); | |||
mLocaleFixes.put("es-419", new Locale("es", "MX")); | |||
mLocaleFixes.put("hy-arevmda", new Locale("hy", "AM", "arevmda")); // hy-arevmda crashes on Android 5.0 | |||
mLocaleFixes.put("yue", new Locale("zh", "HK")); | |||
} | |||
} |
@@ -1,5 +1,5 @@ | |||
AC_PREREQ([2.63]) | |||
AC_INIT([eSpeak NG], [1.49.2-dev], [https://github.com/espeak-ng/espeak-ng/issues], [espeak-ng], [https://github.com/espeak-ng/espeak-ng]) | |||
AC_INIT([eSpeak NG], [1.49.3-dev], [https://github.com/espeak-ng/espeak-ng/issues], [espeak-ng], [https://github.com/espeak-ng/espeak-ng]) | |||
AM_INIT_AUTOMAKE() | |||
LT_INIT | |||
@@ -83,6 +83,23 @@ else | |||
AC_MSG_ERROR([C99 is not supported by $CC.]) | |||
fi | |||
dnl ================================================================ | |||
dnl FreeBSD check. | |||
dnl ================================================================ | |||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ | |||
#if ! defined(__FreeBSD__) | |||
#error macro not defined | |||
#endif | |||
]])], [FREEBSD_FOUND="yes"], [FREEBSD_FOUND="no"]) | |||
AC_MSG_CHECKING([if targeting FreeBSD]) | |||
if test "$FREEBSD_FOUND" = "yes" ; then | |||
AC_MSG_RESULT([-D__BSD_VISIBLE]) | |||
CFLAGS="$CFLAGS -D__BSD_VISIBLE" | |||
else | |||
AC_MSG_RESULT([no]) | |||
fi | |||
dnl ================================================================ | |||
dnl library checks. | |||
dnl ================================================================ | |||
@@ -252,6 +269,19 @@ AM_CONDITIONAL(HAVE_RU_EXTENDED_DICTIONARY, [test x"$have_extdict_ru" = xyes]) | |||
AM_CONDITIONAL(HAVE_ZH_EXTENDED_DICTIONARY, [test x"$have_extdict_zh" = xyes]) | |||
AM_CONDITIONAL(HAVE_ZHY_EXTENDED_DICTIONARY, [test x"$have_extdict_zhy" = xyes]) | |||
dnl ================================================================ | |||
dnl Compiler warnings. | |||
dnl | |||
dnl Reference: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html | |||
dnl ================================================================ | |||
AX_CHECK_COMPILE_FLAG([-Wimplicit], [CFLAGS="-Wimplicit $CFLAGS"]) | |||
AX_CHECK_COMPILE_FLAG([-Wmissing-prototypes], [CFLAGS="-Wmissing-prototypes $CFLAGS"]) | |||
AX_CHECK_COMPILE_FLAG([-Wreturn-type], [CFLAGS="-Wreturn-type $CFLAGS"]) | |||
AX_CHECK_COMPILE_FLAG([-Wuninitialized], [CFLAGS="-Wuninitialized $CFLAGS"]) | |||
AX_CHECK_COMPILE_FLAG([-Wunused], [CFLAGS="-Wunused $CFLAGS"]) | |||
AX_CHECK_COMPILE_FLAG([-Wunused-parameter], [CFLAGS="-Wunused-parameter $CFLAGS"]) | |||
dnl ================================================================ | |||
dnl Generate output. | |||
dnl ================================================================ |
@@ -218,7 +218,9 @@ afganistan afg'anistan | |||
alaska al'aska | |||
albanië alb'A:ne@:@- | |||
algerië alx2'e@re@:@- | |||
alhambra al'ambra | |||
amanzimtoti $4 | |||
amstel amst@l | |||
antwerpen antv&rp@n | |||
avignon _^_FR | |||
babilon babilOn | |||
@@ -333,6 +335,7 @@ oberammergau o@b@r'am@rgaU | |||
oklahoma @Ukl@h'@Uma | |||
outeniekwa @Ut@n'ikwa | |||
oxford _^_EN | |||
paardeneiland pA:rd@n_'eIlant | |||
palermo pal'&rmu | |||
pelindaba p&l@nd'A:ba | |||
perú p@ru | |||
@@ -342,6 +345,7 @@ portugal pOrtyx2al | |||
potchefstroom pOtSIfstr'o@m | |||
rhône _^_FR | |||
richardsbaai ritS@dsb'AI | |||
riversdal r@v@rsdal | |||
riviersonderend r@fi:rsOn@r_'Ent | |||
robertson _^_EN | |||
salvador salvadO:r | |||
@@ -380,7 +384,7 @@ uruguay urugwaI | |||
wakloof vA:klo@f | |||
zimbabwe zI:mb'ab_wE | |||
zulu zulu // Kwazulu-Natal | |||
zürich _^_DE | |||
// People names | |||
abdullah abd'ula | |||
@@ -585,6 +589,7 @@ james _^_EN | |||
jane _^_EN | |||
janine dZ@ni:n | |||
Jean ZA~n $capital | |||
jeff _^_EN | |||
jesebel je@s@b&l | |||
jessica _^_EN | |||
jimmy _^_EN | |||
@@ -603,6 +608,7 @@ julia _^_EN | |||
jung juN | |||
khayyam kaj'am | |||
kelvin _^_EN | |||
kennedy _^_EN | |||
kim _^_EN $capital | |||
kleopatra kliu:p'A:tra | |||
krige krix2@ | |||
@@ -769,9 +775,11 @@ stockenström stOk@nstro@m | |||
stuart _^_EN | |||
suzanne suz'A:n | |||
suzette suz'Et | |||
sylvia _^_EN | |||
tania tanja | |||
telemann te@l@man | |||
terblanche t@rblA:nS | |||
thelma _^_EN | |||
theo tiu | |||
theron tr'On | |||
thessalonicense tEsalo@nis'E:ns@ | |||
@@ -816,6 +824,7 @@ vivaldi viv'aldi | |||
viviers v@v@je@ | |||
wilhelm v@lh&l@-m | |||
williston _^_EN | |||
woltemade vOlt@mA:d@ | |||
khumalo kum'A:lu | |||
zuma zu:ma | |||
@@ -825,6 +834,7 @@ alibama $3 | |||
antares $2 | |||
beatles _^_EN | |||
boeing _^_EN | |||
cadillac _^_EN | |||
checkers tSEk@rs | |||
chevrolet _^_FR | |||
chrysler kraIsl@r | |||
@@ -1044,7 +1054,8 @@ fides _^_LA | |||
forma _^_LA | |||
grata _^_LA | |||
habitatio _^_LA | |||
inclusio _^_LA | |||
inclusio _^_LA | |||
(in camera) @n||kam@ra | |||
(in debiti) _^_LA | |||
(in absentia) _^_LA | |||
(in extremis) _^_LA | |||
@@ -1075,7 +1086,9 @@ vivos _^_LA | |||
// main word list | |||
aangaande $2 | |||
aanmerklik $2 | |||
aanstaande $2 | |||
aanswel A:nsw&l | |||
(a cappella) a||kap'&la | |||
adagio ad'A:dZi;%@U | |||
afgaanse afg'A:ns@ | |||
@@ -1091,6 +1104,7 @@ algaande $2 | |||
alge alx2@ | |||
algehele alx2@h,e@l@ | |||
allegro al'Egru | |||
allengs alENs | |||
allergene $3 | |||
almiskie $3 | |||
alom al_'Om | |||
@@ -1116,11 +1130,13 @@ aversie av'&rsi | |||
babelaas bab@lA:s | |||
barrikade $3 | |||
beaming b@_A:m@N | |||
bedewete be@d@ve@t@ | |||
beide beId@ | |||
bekaf b&kaf | |||
belangriker b@laNr@k,Ir | |||
bene be@n@ | |||
beringde b@rINd@ | |||
beswil bEsv@l | |||
besnedene b@sne@d@n@ | |||
bestes bEst@s | |||
@@ -1130,6 +1146,7 @@ bewe be@v@ | |||
bewebeen be@v@be@n | |||
bewend be@v@nt | |||
bewering b@ve@rIN | |||
bilharzia b@lharsia | |||
biopsie bi'Opsi | |||
bomaat bo@mA:t | |||
bordegoed bO:rd@x2ut | |||
@@ -1155,6 +1172,7 @@ cedille s@dIl@ | |||
charisma kar'Isma | |||
cinsaut s@nso@ | |||
cliché kliS'eI: | |||
clientèle _^_FR | |||
clivia klIvija | |||
cognac kOn^ak | |||
confetti $2 | |||
@@ -1173,6 +1191,7 @@ dawidster dA:v@tst&r | |||
déjà _^_FR | |||
dekade dEk'A:d@ | |||
dekreling dEkre@l@N | |||
demensie d@me~nsi | |||
deurentyd dy@r@nteIt | |||
deurgaans $1 | |||
deurkruis $2 | |||
@@ -1183,6 +1202,7 @@ diffuus d@fy:s | |||
dikwels dIkv@ls | |||
diplomasie d@plo@mas'i | |||
disleksie $2 | |||
dissiplinering d@s@plin'e@r@N | |||
divan div'an | |||
doktore $2 | |||
doyen dO:j'En | |||
@@ -1219,12 +1239,14 @@ ewentwil e@v@ntv@l | |||
exodus Eks'o@dWs | |||
factotum $2 | |||
faktotum $2 | |||
fakture $2 | |||
fetakaas fEtakA:s | |||
figuur f@x2yr | |||
filippense f@l@pEns@ | |||
finalis $3 | |||
finaliste $3 | |||
fluktuasie $3 | |||
fort fOrt | |||
forte fOrt@ | |||
@@ -1269,6 +1291,7 @@ hekke h&k@ | |||
helaas he@l'A:s | |||
here he@r@ | |||
herero hEr'E:ru | |||
herontmoeting h&r_Ontmut@N | |||
herrysenis h&r'eIs@n@s | |||
hierso hi:rsO | |||
hippie _^_EN | |||
@@ -1294,8 +1317,10 @@ inkatha iNk'A:ta | |||
inkluis $2 | |||
innestel InnEst@l | |||
insomnia @nsOmnija | |||
inteling Inte@l@N | |||
intens @nt'Ens | |||
intensiteit $4 | |||
inwegery Inve@x2@reI | |||
ironieë irun'i:@ | |||
jantwak jantw'ak | |||
@@ -1306,12 +1331,14 @@ kafee kaf'e@ | |||
kaliefa kal'ifa | |||
kameraderie kam@rA:d@r'i | |||
kapittel kap'It@l | |||
karolie kar_o@li | |||
kateter kat'e@t@r | |||
katswink katsv@nk | |||
kaviaar kavi'A:r | |||
kennisvaardig $1 | |||
kimono $2 | |||
klaasvakie $2 | |||
kliënteel $3 | |||
klimeid klImeIt | |||
knapsekêrel knaps@k&:r@l | |||
kolossense kOl@s'e~ns@ | |||
@@ -1325,11 +1352,13 @@ kopiereg kup'ir&x2 | |||
korswel kOrsv@l | |||
kotiljons kOt@lj'o~ns | |||
kritiek krIt'ik | |||
kruisteling krYyste@l@N | |||
kulture $2 | |||
kunsmatige kWnsm'A:t@x2@ | |||
kwansuis $2 | |||
kweekwal kwe@kval | |||
landswye lantsveI@ | |||
lasagne las'anj@ | |||
legaat l@x2A:t | |||
legate l@x2A:t@ | |||
@@ -1337,6 +1366,7 @@ libido l@bidu | |||
liefdespel lifd@sp&l | |||
lipstiek lIpstik | |||
lisensiaat l@se~nsi;'A:t | |||
logieserwys lo@x2is@rveIs | |||
lokaas lOk_A:s | |||
londense lOnd@ns@ | |||
lord _^_EN | |||
@@ -1448,6 +1478,7 @@ oorsee $2 | |||
oorsese $2 | |||
oorval $2 $verb | |||
opend Op_Ent | |||
opwindends Opv'Ind@nts | |||
oraal o@r'A:l | |||
orale o@r'A:l@ | |||
oranjepers o@r'anj@p&:rs | |||
@@ -1472,6 +1503,7 @@ pinotage pinut'A:Z | |||
pirouette p@ru:'Et | |||
plaasjaap plA:sjA:p | |||
plasenta plas'Enta | |||
platwaai platvAI | |||
poinsettia pOIns'Etia | |||
pond po~nt | |||
poniepers po@nip&rs | |||
@@ -1504,6 +1536,7 @@ salute sal'yt@ | |||
samelewing sA:m@l,e@v@N | |||
sanhedrin sanh'e@dr@n | |||
sangemeenskap sanx2@me@nskap | |||
sedeles se@d@lEs | |||
sedertdien $3 | |||
sektore $2 | |||
sinagoge s@n@x2o@x2@ | |||
@@ -1532,6 +1565,7 @@ sonore sun'o@r@ | |||
sonure sOn_yr@ | |||
sover so@f&r | |||
staccato $2 | |||
steekhoudendheid $2 | |||
sterwens st&rv@ns | |||
stilswye $1 | |||
strydros streIt_rOs | |||
@@ -1554,7 +1588,10 @@ tesourus t@s@UrWs | |||
tevrede t@fre@d@ | |||
thula tu:la | |||
toegee tux2e@ | |||
toegeklik tux2@klIk | |||
toemessel tumEs@l | |||
toereken ture@k@n | |||
toleransie tOl@r'ansi | |||
tornado $2 | |||
totale tut'A:l@ | |||
totsiens $2 | |||
@@ -1566,6 +1603,7 @@ tsoenami tsun'A:mi | |||
uitdaging YydA:x2@N | |||
uiteraard Yyt@r_'A:rt | |||
uitermate $3 | |||
uitgeslotene Yytx2@slo@t@n@ | |||
uniforme $3 | |||
vaarwel fA:rv'&l | |||
@@ -1622,6 +1660,7 @@ voëlent fo@@l_Ent | |||
vraprys frA:preIs | |||
vrek fr&k | |||
vroeërig fru:@r@x2 | |||
vrygelatene freIx2@lA:t@n@ | |||
vu _^_FR | |||
waarskynlik $2 | |||
@@ -1638,6 +1677,7 @@ welaf v&l_af | |||
weleer v&l_'e@r | |||
wentaktiek $1 | |||
willens vIl@ns | |||
wydoog veIt_o@x2 | |||
wysgere veIsx2e@r@ | |||
êrenster &:r@nst@r |
@@ -73,6 +73,7 @@ | |||
@@@smokkel) ary %ar%eI // default stress: diamant-/drank-/dwelm-/goud-/kokaïensmokkelary, etc. | |||
amarula %am%arul%a // fix stress and a sounds: amarula and compounds | |||
a (ment %a // shorten a sound: perkament/testament and compounds | |||
_) arendag (CAC %A:r@ntax2 // fix e sound: arendagtig/-e/-heid | |||
arends A:r@nts_ // fix e sound: arendsoog/-kloue/-nes | |||
argen (tA %arx2@n // move default stress: Argentinië/Argentyns/-e | |||
a (riA 'A: // akwarium/barium/estuarium/herbarium/seminaria | |||
@@ -310,7 +311,7 @@ | |||
attaché _%at%aSe@ // correct pronunciation: (handels-/inligtings-)attaché | |||
attrib (u %atr@b // move default stress: attribuut/bute/attributêr | |||
K) au @U // trauma/-ties/Aucamp/Paul/-a/-us | |||
auer aU@r //Sauer etc. fixed au and e sounds in compounds. | |||
auer aU@r //Sauer etc. fix au and e sounds in compounds. | |||
augustus %Ox2WstWs | |||
avokado %af%ukA:du // stress and o sounds | |||
avokade %af%ukA:d@ // variant form of avokado | |||
@@ -431,7 +432,8 @@ | |||
bo (grond bo@ // fix 1st o sound: bogronds/-e | |||
_) bo (kle bo@ // fix o sound: bokleed/boklere | |||
bokma (kier b%Okm%a // fix stress and a sound: bokmakierie/-s/-tjie | |||
bom (AA bOm_ // fix a sound, pause: bomaanval/-aanslag/-aard/-eenheid and compounds | |||
bom (AA bOm_ // fix a sound, pause: bomaanval/-aard/-eenheid and compounds | |||
bomaans (la bOm_A:ns // fix o sound: bomaanslag/-aanslae | |||
bomaans bo@mA:ns // but fix O sound: bomaans/-e | |||
bonde (C bOnd@ // verbondenheid/bondeldraer/gebondene/saambondelend | |||
boos (aardig b%o@s_ // move default stress: boosaardig/-e/-heid | |||
@@ -526,6 +528,7 @@ | |||
bakate (l b%ak@t& // fix stress and vowel sounds: bakatel/-le/-letjie | |||
baken bA:k@n // fix e sound: afbakening and compounds | |||
bakte (ri b%akte@ // fix stress and e sound: bakterie/-ë | |||
balalaika b%al%alaIk%a // fix a sounds and stress: balalaika/-s/-musiek | |||
_) bam (boes b%am // move default stress: bamboes/-e/bamboesfluit... | |||
ba (nalA b%a // fix stress and 1st a sound: banale/banaliteit | |||
band (Alier b,and // fix stress and d sound: band(e/o)lier/-e | |||
@@ -547,6 +550,7 @@ | |||
ba (sieli b%a // fix stress and 1st a sound: basielie/-kruit, etc. | |||
basotho b%asut%u // fix stress and vowel sounds: Basotho/-0ponie and similar | |||
basi (s bA:s@ // basis and compounds | |||
basilie b%asil%i // fix a sound and stress: basilie/-kruid, etc. | |||
bastille b%asti:l // Bastille and compounds like Bastilledag | |||
batal (jon b%at%al // shorten 1st a sound, moved stress: bataljon and compounds | |||
ba (tik b%a // fix stress and a sound: batik/-doek/-kuns/-werk | |||
@@ -646,6 +650,8 @@ | |||
bere (_ be@r@ //tediebere pandabere etc. | |||
_) ber (C b&r // fix e sound: Bert/Berta/Bertie/Bertus/berke/-boom | |||
beste (_ bEst@ // fix e sound: beste/allerbeste/naasbeste/-s | |||
beton (C@ b@tOn // split ng sounds: betongebou/-gietsel/-gruis | |||
beton (inC@ b@t'On // fix O sound: betoninrigting/-ingenieur | |||
be (weging b@ // draaibeweging/swaaibeweging | |||
bewende be@v@nd@ // first e pronounced long | |||
bewe (rig be@v@ // fix e sound and stress: bewerig/-e/-heid | |||
@@ -749,6 +755,7 @@ | |||
dia (C d%i%a // diabeet/diafragma/diagnose/dialek/dialoog/diamant | |||
diaken d%iA:k@n // diaken and compounds | |||
diako (nie d%i%ak%u // fix stress and o sound: diakonie/-ë | |||
diende dind@ // fix last e sound in many compounds of bediende: bediendekamer | |||
diens (willi d%ins // move default stress: dienswillig/-e/-heid | |||
dieper (@ dip@r // fix e sound: diepere/dieperliggend/-e | |||
digi (ta d%ix2%i // move default stress: digitaal/digitale | |||
@@ -983,6 +990,7 @@ | |||
@C) e (reekK @ // fix e sound: duine-/rotsereeks | |||
aai) e (C @ // fix e sound: baaierd/waaierstert/paaiement/compounds starting with baaiers- | |||
lat) eres @r@s //lateres | |||
@C) erm (K &r@-m // a catch-all for words ending in -erm(s) | |||
fp) ers (_ &rs // fix e sound: dof-/gif-/olyf-/tydskrifpers, etc. | |||
bloup) ers &:rs // fix e sound: bloupers | |||
iew) ers (ter @rs // fix e sound: (l)iewerster | |||
@@ -1074,6 +1082,7 @@ | |||
p) e (talje @ // fix stress and 1st e sound: petalje and compounds | |||
l) e (moen @ //fix lemoen and compounds | |||
Cy) e (C+ @ // fix connecting e sound in compounds like byekorf/skilderyemuseum, etc. | |||
effe (kleur Ef@ // fix stress and 2nd e sound: effekleur(ig/-e) | |||
eier eI@r // eiergeel/eierwit/leierfiguur/leiergroep | |||
@C) ei (land _,eI // insert short pause: skiereiland and many -eiland compounds | |||
@) ei (sen _'eI // (on)veeleisend/spoedeisend | |||
@@ -1451,6 +1460,7 @@ | |||
een (Cjie e@:iN // eendjie/Leentjie/steentjies | |||
een (vorm %e@n // move default stress: eenvormig/-e/-heid | |||
_) een (voud@ %e@n // stress on 2nd slb: eenvoudig, but on 1st: eenvoud | |||
eend (agtig %e@nt_ // fix d sound, insert pause: eendagtig/-e/-heid | |||
eerbied (A e@rb'id // eerbiedig/ing | |||
eerbiedw %e@rb%itv // eerbiedwaardig/eerbiedwekkend | |||
_) eerw %e@rv // stress: eerwaarde | |||
@@ -1589,6 +1599,7 @@ | |||
flu (we fl%y // move default stress: fluweel/fluwele and compounds | |||
_) fok (o fOk_ // fix o sound, insert short break: fokop/fokof | |||
folio fo@li_u // fix o sounds: folio and compounds | |||
fondsw fOntsv // fix v sound: fondswerwing & compounds/-waardes | |||
fondue f%Ondy // fix stress and ue sound: fondue and compounds | |||
fone (tiek f%o@n@ // fix e sound: fonetiek and compounds | |||
fone (tie f%une@ // fix stress and o sound: foneties/-e | |||
@@ -1602,6 +1613,7 @@ | |||
formi (da f%Orm%i // move default stress: formidabel/-e | |||
formu (lier f%Orm%y // move default stress: formulier/-e/-boek | |||
_) for (se_ f'Or // stress back to 1st slb; se rule: _) for (C | |||
forse (nd fOrs@ // fix e sound: forsend/-e | |||
fos (fa f%Os // move default stress: fosfaat/fosfate | |||
fo (ssiel f%O // move default stress: fossiel/-e and compounds | |||
foto fo@tu | |||
@@ -1694,6 +1706,7 @@ | |||
_) gra (na x2r@ // granaat(boom)/granate | |||
grandi (o x2r%and%i // move default stress: grandioos/-ose | |||
_) gra (vA x2r%a // fix stress and a sound: gravin/-ne/gravure | |||
grenadella gr@n@d&la // fix stress and vowels: grenadella and compounds like -heining | |||
griekwa x2rikwa // fix w sound and a sound in compounds: Griekwa/-land, etc. | |||
ouCa) gr (ootjie x2r' // move default stress: ouma/oupagrootjie/-s | |||
_) graad (e x2r%A:t_ // fix stress and d sound: graadeen(tjies)/-elfs | |||
@@ -1726,6 +1739,7 @@ | |||
gegesel x2@x2e@s@l // fix middle e sound | |||
K) gele (_ x2e@l@ // fix stress and e sound: (eier)gele | |||
_) geler x2e@l@r // stress and 1st e sound: geler/gelerig | |||
_) gell x2&l | |||
gemel (d x2@m&l // fix e sound: bo-/bowe-/laas-/meergemeld/-e | |||
gems x2Ems // fix e sound: (baster)gemsbok/-bul/-ooi, etc. | |||
gene (_ x2e@n@ // gene/diegene | |||
@@ -1741,7 +1755,7 @@ | |||
_) ge (ossP2 x2@ // but ge- prefix: geossilleer/geossifiseer, etc. | |||
ni) ge (ri x2'e@ //nigeriese etc. | |||
gese (_ x2'e@s@ //Portugese, and others | |||
gesp (etjie x2Esp // fix e sounds: gespetjie/-s | |||
gespe (_ x2Esp@ // gespe and compounds | |||
gespes (_ x2Esp@s // gespes and compounds | |||
gewens (g x2e@v@ns // (on)vergewensgesind/-e/-heid | |||
@@ -1847,6 +1861,7 @@ | |||
hart (stogte_ h%art // move default stress: hartstogtelik | |||
hart (stogte_N hart // restore default stress: hartstogte | |||
ha (we hA: // fix stress and a sound: hawearbeider/lewendehaweafdeling | |||
_) hef (a hEf_ // fix e sound, insert break: hefapparaat/-arm(s) | |||
hia (sint h%ij%a // fix stress: hiasint/-e and compounds | |||
_) hi (bis h%i // move default stress: hibiskus/-se and compounds | |||
hierna (maal h%i:rnA: // fix stress and a sound: hiernamaals/-e | |||
@@ -1984,6 +1999,7 @@ | |||
_) idi (o %id%i // idioom/idiome/idioot | |||
_) id (A %id // idille/idillies/ideëryk | |||
&l) iker (C @k@r // fix i sound: menslikerwys/redelikerwyse, etc. | |||
&l) iker (_ @k@r // fix i sound: afstootliker/(ge)redeliker/onberispeliker | |||
illumi (nA %il%um%i // fix stress and vowel sounds: illuminasie/illumineer/illuminati | |||
illu (si %ily // illusie/-s/illusief | |||
illu (strA %il%W // fix i sound: illustreer/illustrering/illustrasie | |||
@@ -2114,6 +2130,7 @@ | |||
_) in (a@P2 In // inakkuraat/inaktief/inaktiwiteit | |||
_) inbe (lC Inb%& // fix e sound in compounds like inbelprogram | |||
indone (si @nd%uni: // fix stress and vowel sounds: Indonesië/Indonesiese | |||
s) in (gestel @n // split n g: compounds with ingesteldheid/winsingestelde | |||
_) in (oe In_ // fix i sound, pause: inoefen/-oes and derivatives | |||
invest (eer @nv%Est // fix stress, v and e sounds: investeer/-der | |||
investe (r@ @nv%Este@ // fix e sound: (kapitaal)investering/investerende | |||
@@ -2269,7 +2286,7 @@ | |||
klaarblyklik klA:rbl'eIkl@k // klaarblyklik/e | |||
kla (kous klA: // fix stress and long a sound: klakous/-e | |||
klande (sti kl%and@ // move default stress: klandestien/-e | |||
_) kla (sA@@ kla // klasaantekeninge/klasonderwyser and other compounds | |||
_) klas (A@ klas_ // klasaantekeninge/klasonderwyser/-opdrag(te)/-ure and other compounds | |||
kla (ssiek kl%a // move default stress: klassiek/-e | |||
klavesimbel klA:v@s@mb@l // fix v and e sounds: klavesimbel and compounds | |||
kla (vier kl%a // klavier and many compounds | |||
@@ -2324,10 +2341,11 @@ | |||
krieketw krik@tv //krieket followed by w in compounds always v | |||
krokodi (l kr%Ok@dI // (wyfie)krokodil/-le | |||
kro (niek kr%u // fix stress and o sound: kroniek and many compounds | |||
kruger kr'Y@@r | |||
ku (ba@ k%y // move default stress: kubaan/kubane | |||
ku (biek k%y // move default stress: kubiek/-e/-getal | |||
_) kuber kyb@r // fixed e sound: kuberruim(te) | |||
_) kuber kyb@r // fix e sound: kuberruim(te) | |||
kulin k%Wl%in // Move default stress and fix u sound: kulinër/-e | |||
@) kundi (g k'Wnd@ // wiskundige/onoordeelkundigheid and many similar | |||
kurwe kWrv@ // fix e sound: kurwes/skurwebas/skurwebek/skurwepadda | |||
@@ -2359,11 +2377,13 @@ | |||
kabine (t k%ab%inE // kabinet/drankkabinet/-te/kabinetsvergadering | |||
_) ka (d@ k%a // stress and 1st a: kadawer-/kadet-/kado/kadot(jie)/kadriel,etc. | |||
kadet (A k%adEt_ // fix e sound, insert pause: kadetorkes/-offisier/-oefening, etc. | |||
ka (der kA: // restore stress on long a: kader/-s and compounds | |||
kad (mium kad // fix stress and d sound: kadmium and compounds | |||
kafe (te k%af@ // fix stress and vowel sounds: kafeteria and compounds | |||
kafe (ï k%af%i // fix stress and vowel sounds: kafeïene and compounds | |||
ka (jak k%a // fix stress and 1st a sound: kajak/-ke/-vaarder | |||
kakao k%akA:w // fix stress and vowel sounds: kakao and many compounds | |||
kake (C kA:k@ // kakebeen/skakelaar/skakelbord/skakelfunksie | |||
kalahari kalah'A:ri // stress: Kalahari/-sand/-woestyn | |||
_) ka (lAnC k%a // kalender and compounds/kalant/kalander and compounds | |||
@@ -2544,6 +2564,7 @@ | |||
kontrasep k%Ontr%asEp // fix stress and e sound: kontrasepsie and derivatives | |||
kontrover (s k%Ontr%uv&r // o and v sounds: kontroversie/kontroversieel | |||
kop (o kOp? // fix o sound: koponderstebo/kopomdraai/kopoperasie/gryskoponderwyser/poenskopolifant | |||
kop (agtig k%Op_ // fix o sound, insert break: hamer-/spinnekop-/penkopagtig(e(s)) | |||
kopu (lA k%Op%y // fix o sound: kopulasie/kopuleer and derivatives | |||
_) kor (dA k%Or // kordaat/kordon | |||
ko (rint k%u // fix stress and o sound: korint/-e and compounds | |||
@@ -2656,6 +2677,7 @@ | |||
loboto (mie l%ub%Ot%u // fix stress and o sounds: lobotomie | |||
lo (ja l%u // fix stress and o sound: lojale/lojaliteit | |||
lo (kalA l%u // fix stress and o sound: lokale/ontvangslokale, etc. | |||
loke (t l%ukE // fix stress and vowel sounds: many compounds with loket | |||
lom (bardA l%Om // move default stress: Lombardies/-e/Lombarde | |||
_) lore (C@ lo@r@ // fix e sound: verloregaan/verloregoederekantoor/Verlorerivier | |||
_) losge (@P5 l'Osx2@ | |||
@@ -2738,6 +2760,7 @@ | |||
mando (lien m%and%u // fix stress and o sound: mandolien and compounds | |||
mane (l m%an& // fix stress and e sound: (kerk)manel(le)punte, etc. | |||
mane (wale m%an@ // fix stress and shorten a sound: manewale/-s and compounds | |||
maneuvers m%anY@f@rs // fix last e sound: (krygs)maneuvers, etc. | |||
_) mango maNg%u // fix g and o sounds: mangoboord/-sap/-'s | |||
man (haft m%an // move default stress: manhaftig/-e/-heid | |||
mani (akK mA:n%i // fix stress and 1st a sound: maniak/-ke and compounds | |||
@@ -2805,6 +2828,7 @@ | |||
medisyne m@d@seIn@ //medisyne and compounds | |||
meganies m@x2'A:nis | |||
_) meege (@P5 m'e@x2@ | |||
_) meegewe (nd me@x2e@v@ // fix e sounds and stress: meegewend(e) | |||
me (juf m@ // move default stress and shorten e sound | |||
me (laats m@ // fix stress and e sound: melaats/-e/-heid | |||
melancholie (_N m%El%aNk%o@li // fix stress and 1st e sound: melancholie | |||
@@ -2946,6 +2970,7 @@ | |||
morf (otomie m%Orf // move default stress: morfotomie | |||
_) morr (i mOr // restore default stress: morrig/morrie/-doring | |||
_) mors (@ mOrs // restore default stress: morsaf/morsdood/morsig | |||
mos (agtig mOs_ // fix o sound, insert break: (kos)mosagtig(e) | |||
mosam (biek m%o@s%am // move default stress: Mosambiek/-er/-se | |||
mosa (ïek m%o@s%a // move default stress: mosaïek and compounds | |||
mo (skee m%O // move default stress: moskee/-s and compounds | |||
@@ -3035,7 +3060,8 @@ | |||
ne (anderCa n%i // move default stress: Neander(d/t)al/-ler | |||
neger (in n%e@x2@r // move default stress: negerin/-ne | |||
ne (gosie n@ // fix stress and e sound: negosie/-ware, etc. | |||
nek (om n&k_ // fix e sound, insert pause: nekom(ge)draai | |||
nek (_ n&k // catch-all for words ending in -nek: koedoe-/swaannek | |||
_) nek (A n&k_ // fix e sound, insert pause: nekom(ge)draai/-operasie | |||
nekta (rien n%Ekt%a // fix stress and a sound: nektarien/-perske, etc. | |||
neo (li n%i%u // fix stress and vowel sounds: neolities/-e/neolitikum | |||
ner (veu n%&r // move default stress: nerveus/-e | |||
@@ -3080,6 +3106,7 @@ | |||
nood (lotti n%o@t // move default stress: noodlottig/-e | |||
nood (saak n%o@t // move default stress: noodsaaklik/-e/-heid, vs. noodsaak | |||
nood (saak_N no@t // restore default stress: (ge)noodsaak | |||
nooien (tjie noIN // remove the e sound: nooientjie(s) and compounds | |||
noord (oos n%o@rt_ // move default stress: noordoos/-te/-telik/-e | |||
nor (ma@ n%Or // normaal/normaalweg/normale/abnormaal/-ale | |||
nostal (gie_N n%Ost%al // stress on last slb.: nostalgie | |||
@@ -3196,6 +3223,7 @@ | |||
ofoon uf'o@n // mikrofoon/sakso(saxo)foon | |||
ofone uf'o@n@ // mikrofone/sakso(saxo)fone | |||
ograaf ux2r'A:f // biograaf/demograaf/fotograaf | |||
ografeer ux2raf'e@r // fix o sound: (ge)fotografeer | |||
ografie ux2raf'i // biografie/demografie/fotografie | |||
ografies ux2r'A:fis // biografies/demografies/fotografies | |||
ograwe ux2r'A:v@ // biograwe/demograwe/fotograwe | |||
@@ -3417,6 +3445,7 @@ | |||
ooi oI | |||
ooy oI | |||
oodjie oIci | |||
CC) ool (A o@l_ // insert break: skooluur/-ure, steenkooluitvoer, but not: Karoolug | |||
ootjie oIci | |||
oontjie oINki | |||
oondjie oINki | |||
@@ -3483,6 +3512,7 @@ | |||
oot (moedig %o@t // move default stress: ootmoedig/-e/-heid | |||
.group op | |||
_) opaal %o@pA:l // fix o sound, remove break: opaal and compounds | |||
opaat up'A:t // homeopaat/psigopaat and similar | |||
opatie upat'i // homeopatie/neuropatie and similar | |||
opaties up'A:tis // psigopaties/osteopaties and similar | |||
@@ -3578,6 +3608,7 @@ | |||
pol (vy p%Ol // move default stress: polvy/-e and compounds | |||
pomelo p%ume@l%u // fix stress and o sounds: pomelo(sap/-drankie...) | |||
_) pon (dok p%On // move default stress: pondok/-ke/-kie | |||
pop (agtig p%Op_ // fix o sound, insert break: popagtig(e) and compounds | |||
popu ,pOpy | |||
_) por (C %pOr //portret portaal etc. | |||
por (ie p%o@r // move default stress: porie/-ë | |||
@@ -4101,6 +4132,7 @@ | |||
sirene s@re@n@ // move default stress and fix vowel sounds: sirene/-s/-lied/-sang | |||
si (troen s@ // move default stress: sitroen and compounds | |||
sitronella s@tr%un&l%a // fix stress and vowel sounds: sitronella and compounds | |||
s (juffrou s // fix s sound: kuns-/kos-/geselskapsjuffrou, etc. | |||
skade skA:d@ // elik suffix rule breaks a sound of (on)skadelik | |||
skadu skA:dy // skaduagtig/skadutjie | |||
skaker (ing sk%ake@r // skakering/-s/kleurskakering | |||
@@ -4118,6 +4150,7 @@ | |||
sker (muts sk%&r // move default stress: (ge)skermutsel/skermutseling/-e | |||
skerpi (oen sk%&rp%i // move default stress: skerpioen/-e and compounds | |||
skilder (y sk@ld@r // move stress to y: skildery and compounds like skilderymuseum | |||
skim (agtig sk@m_ // fix i sound, insert break: skimagtig(e) | |||
skisofr (e sk%is%ufr // fix stress and o sound: skisofreen/skisofrene | |||
skle (rose skl@ // fix stress and e sound: sklerose and compounds | |||
_) skok (AP4 sk''Ok_ // fix o sound and stress: skokaankondiging/-effek/-insluiting/-onthulling... | |||
@@ -4252,6 +4285,7 @@ | |||
_) su (meri s%u // fix stress and u sound: sumeries/-e | |||
su (mmier s%W // move default stress: sumier/-e | |||
super (A s''yp@r_ // fix stress, break in compounds like superintelligent | |||
superi (A s%up%e@r%i // fix stress and vowel sounds: superieur/superioriteit | |||
superintendent s,upr@nt%EndEnt // fix stress and vowel sounds: superintendent and compounds | |||
surro (ga s%Wr%u // fix stress and o sound: surrogaat/surrogate and compounds | |||
su (saC s%u // fix stress and u sound: susan/-na/susara | |||
@@ -4271,6 +4305,7 @@ | |||
swepe swe@p@ // fix w sound: rubberswepe | |||
sw (erm sw // fix e sound: naderswerm | |||
switser swIts@r // fix e sound: Switserland/Switserse | |||
sypel (end seIp@l // fix e sound: sypelend/-e | |||
.group se | |||
se (_ s@ //the word se and some ending in se | |||
@@ -4411,6 +4446,7 @@ | |||
stede (_ ste@d@ //voorstede, hoofstede etc. | |||
stele (_ ste@l@ //kastele lepelstele etc. | |||
stema (_ ste@ma // fix e sound: doods-/gespreks/-herhalingstema and many similar | |||
stene (_ ste@n@ //skoorstene, bakstene etc. | |||
sten (sil stEn // fix e sound in compounds like wolbaalstensil | |||
chri) stene (_ st@n@ //fix christene and compounds | |||
@@ -4561,7 +4597,7 @@ | |||
toe (riste@ t%u // move default stress: toeristebedryf/-sentrum and similar | |||
toer (n t%ur // move default stress: compounds of toernooi | |||
toere (_ tu:r@ // restore default stress | |||
toi (let t%OI // move default stress: toilet and compounds | |||
toilet t%OIlEt // move default stress: toilet and compounds: toiletartikel/-emmer/-opsigter | |||
tokke (lo t%Ok@ // move default stress: tokkelos/-sie/tokkelok and compounds | |||
tok (tokk t%Ok // move default stress: toktokkie/-s/-spelery, etc. | |||
tombola t%Ombo@l%a // move default stress: tombola and compounds | |||
@@ -4574,6 +4610,7 @@ | |||
@) toris (_ t'o@r@s // fix stress: pectoris/klitoris | |||
_) tor (nyn t%Or // move default stress: tornyn/-e and compounds | |||
_) tos (ka t%Os // move default stress: Toskaanse/Toskane | |||
tser (tjie ts@r // fix e sound: (skoen)poetsertjie/weerkaatsertjie | |||
ttel t@l // many compounds of bottel/skottelgoed | |||
tuberkulose t%yb@rk%ylo@s@ // fix stress; e sound in compounds: tuberkulose/-behandeling | |||
tug (A tWx2_ // fix u sound: (on)tugondersoek/-oortreding/-ordonnansie | |||
@@ -4875,6 +4912,7 @@ | |||
_) vanklik faNkl@k // (on)ontvanklik/-e/-er/-heid | |||
vanself (spr f%ans%&lf // move default stress: vanselfsprekend/-e/-heid | |||
vari (A v%ar%i // fix v sound and stress: variasie/-s/varieer | |||
va (sal v%a // fix stress and v and a sounds: vasal/-le | |||
vaseline v%as@lin // fix stress, v and vowel sounds: vaseline/-bottel, etc. | |||
vasste (l fast& // fix e sound: vasstel(ling/-lende) | |||
_) vat (A@ fat_ // fix a sound: vatafstand/-orgaan | |||
@@ -4943,9 +4981,11 @@ | |||
ve (l f& // maagvel, stress on 1st slb | |||
@) vel (A fe@l // aanbeveling/aanbevelingsbrief | |||
vel (djie f&l // fix -djie sound: veldjie(s) and compounds | |||
veld (C f< // fix d sound: veldreuk/-radio/-rantsoen, etc. | |||
veld (eks f<_ // fix d sound, pause: veldekskursie/-ekspedisie/-s | |||
veld (o f<_ // fix d sound, pause: veldorgideë/-opsigter/-oppervlakte/-opname, etc. | |||
veld (t f&l // eliminate double t sound: veldtog and many compounds, Langeveldt, Springveldt | |||
vele f'e@l@ | |||
ven (detta v%En // fix stress and v sound: vendatta and compounds | |||
ven (dusie f@n // fix stress and e sound: vendusie and compounds | |||
@@ -5048,7 +5088,7 @@ | |||
vol (kome f%Ol | |||
vo (llA_ fO // volle/vollê/Volla - exception to: vo (lC f%O | |||
volle (dig f%Ole@ // fix stress and e sound: (on)volledig/-e/-heid... | |||
voll (engte fOlE | |||
volle (ngte fOlE | |||
vo (ller fO // exception to: vo (lC f%O | |||
volles (_ fOl@s // fix stress and e sound: volles/passievolles, etc. | |||
vol (hou_ fOl // exception to: vo (lC f%O | |||
@@ -5204,6 +5244,7 @@ | |||
waardeer vard'e@r // waardeer/waardeerder | |||
waarder (@ vard'e@r // waarderend/e/waardering | |||
&) waardig v'A:rd@x2 // stress on -waardig: merkwaardig/besienswaardigheid, etc. | |||
waar (din v%A:r // fix stress: waardin/-ne | |||
waar (neemba v%A:r // move default stress: waarneembaar/-bare | |||
C) waarts vA:rts // fix w sound: dakwaarts/huiswaarts/kerkwaarts/noordwaarts/weswaarts | |||
wêrel (djie v&:r@l // fix -djie in wêreldjie and compounds |
@@ -251,11 +251,12 @@ $ duulaar | |||
كغم kiluu||gHraam | |||
طن t[un | |||
كم kiiluu||mitar | |||
سا saaAa | |||
م mitar | |||
س su?aal | |||
ج dZawaab | |||
ص s[afHah | |||
سا saaAa | |||
// Units below conflict with single letter name | |||
// م mitar | |||
// س su?aal | |||
// ج dZawaab | |||
// ص s[afHah | |||
// العملات | |||
د.ج diinaar||dZazaa?irij | |||
$ duulaar |
@@ -1047,6 +1047,7 @@ autocracy O:t'0kr@si | |||
automobile O:t@m@bi@l | |||
automaton O:t'0m@t@n | |||
autopsy O:t20psi | |||
?3 aurora $2 | |||
avalanche av@laanS | |||
avast $alt3 | |||
avatar ava#tA@ | |||
@@ -1668,7 +1669,7 @@ derogative $2 | |||
descant dEskant | |||
descry dI#skreI | |||
desert dI#z3:t | |||
desert dEz3t $only | |||
desert dEz3t $onlys | |||
desert dI#z3:t $verb | |||
desi deIsi | |||
desolate dEs@l@t $only | |||
@@ -2228,7 +2229,7 @@ idevice $alt6 | |||
idly aIdlI | |||
idiocy IdI@si | |||
ifrog $alt6 | |||
ignoramus Igno@r'eIm@s | |||
ignoramus IgnO@r'eIm@s | |||
illiterate $alt2 | |||
illumine $alt2 | |||
imagery ImIdZri | |||
@@ -2716,6 +2717,7 @@ nonsense n0ns@ns | |||
nonetheless nVnD@l'Es | |||
nosedive noUzdaIv | |||
nosir noUs3: | |||
?5 nosir noUsIR | |||
not noUt // for noted, notable, etc | |||
nots n0ts | |||
(nôtre dame) noUtr@'dA:m | |||
@@ -3420,7 +3422,7 @@ sincerest sIns'i@r@st | |||
sinus saIn@s | |||
siphon $alt2 | |||
sir s,3: $only | |||
?5 sir s,VR $only | |||
?5 sir s,IR $only | |||
siren saIr@n | |||
site saIt // for sited | |||
ski ski: | |||
@@ -3455,12 +3457,13 @@ sommelier s0m'Eli@ | |||
son sVn | |||
sonar soUnA@ | |||
sonny sVnI | |||
sooth su:T $only | |||
sopapilla soUp@p'i:@ | |||
sope soUpeI | |||
sorbet sO@beI | |||
souffle su:fl'eI | |||
soundbite saUndbaIt | |||
souvenir su:v@n'i@3 | |||
sopapilla soUp@p'i:@ | |||
sorbet sO@beI | |||
soyabean sOI@bi:n | |||
specific sp@sIfIk | |||
specimen spEsI2m@n | |||
@@ -3568,7 +3571,6 @@ tallyho talI'hoU | |||
tamale ta#mA:li | |||
tampon tamp0n | |||
tangerine tandZ@r'i:n | |||
taoiseach ti:S@x | |||
tapestry tapI#stri | |||
tarantula t@rantS@l@ | |||
tardis $alt1 | |||
@@ -3913,6 +3915,7 @@ yer j3 $u+ | |||
ye ji: $u+ | |||
yea jeI | |||
yessir jEss3: | |||
?5 yessir jEssIR | |||
yoghurt j0g3t | |||
?3 yoghurt joUg3t | |||
?3 yogurt joUg3t | |||
@@ -4042,6 +4045,7 @@ Assam A:s'A:m | |||
Assamese A:sA:m'i:z | |||
Audubon O:d@b0n | |||
Augusta $2 | |||
Austen O2stI2n | |||
Baghdad $2 | |||
Bahawalpur $alt3 | |||
Bahia ba'i:@ | |||
@@ -4546,8 +4550,6 @@ Annise a#ni:s | |||
?!3 Anthony ant@ni | |||
Anton ant0n | |||
Anya anj@ | |||
Aoife i:f@ | |||
Aoiffe i:f@ | |||
Aphrodite afr@d'aIti | |||
Archibald A@tSIbO:ld | |||
Archie A@tSi | |||
@@ -4898,7 +4900,6 @@ Sabine sa#b'i:n | |||
Salman sa#lmA:n | |||
Samantha sa#manT@ | |||
(Santa claus) s'ant@||kl'O:z | |||
Saoirse si@S@ | |||
Sarah se@r@ | |||
Sarisa $alt3 | |||
Seamus SeIm@s | |||
@@ -4912,8 +4913,8 @@ Sheila Si:l@ | |||
Simon saIm@n | |||
Sinead SI2neId | |||
Sinéad SI2neId | |||
Siobhan S@vO:n | |||
Siobhán S@vO:n | |||
Siobhan SI2vO:n | |||
Siobhán SI2vO:n | |||
Sonia s0nj@ | |||
Sophia soUf'i@ | |||
Sophie soUfi |
@@ -150,12 +150,16 @@ | |||
sw) a (m_ a | |||
sw) a (nk a | |||
ao eI0 | |||
mh) ao eI // Irish, e.g. 'mhaol' /weIl/ | |||
m) ao aU | |||
p) ao aU | |||
t) ao aU | |||
ao (_ =aU | |||
aois (_ i:S | |||
aoise (_ i:S@ | |||
ao (ism aU | |||
ao (ist aU | |||
aoi (C i: // Irish, e.g. 'Aoife' /i:f@/ | |||
aoir (C e@ // Irish, e.g. 'Saoirse' /se@S@/ | |||
?3 aoir (C 3: // Irish, e.g. 'Saoirse' /s3:S@/ | |||
g) ao (l eI@ | |||
aor eI'o@ | |||
m) ao (ri aU | |||
@@ -180,7 +184,8 @@ | |||
_n) a (tional a | |||
@) a (tious 'eI | |||
ell) a (trix @ | |||
a (triC 'eI | |||
a (trix 'eI | |||
a (trice 'eI | |||
n) a (tur eI | |||
n) a (tura a | |||
&) a (ture_ @ | |||
@@ -512,7 +517,7 @@ | |||
_m) ag (ell a#dZ | |||
Cp) age (_ eIdZ | |||
pp) age (_ I2dZ | |||
_ant) ag 'ag | |||
_ant) ag (on 'ag | |||
enr) ag (e_ 'eIdZ | |||
outr) ag (e_ eIdZ | |||
der) ag (e_ eIdZ | |||
@@ -847,6 +852,7 @@ | |||
_) anony (m a#n0n@ | |||
_c) an (ood a#n | |||
&) an (_ @n | |||
&) an (ize @n | |||
&) an (_$w_alt1+ an | |||
?8 &) an (_ a#n | |||
@u) an (_S1 n | |||
@@ -1202,6 +1208,7 @@ calend) ar 3 | |||
_) as (in as | |||
as (k aas | |||
_) as (k aas | |||
s) as (k as | |||
_) as (n az | |||
_) as (oc eIs | |||
C) as (p aas | |||
@@ -1227,6 +1234,7 @@ calend) ar 3 | |||
ass (u @S | |||
ass (ump a#s | |||
assur @SU@ | |||
_) ass (wh as | |||
C) as (t aas | |||
C) ast (ell aas | |||
_bl) as (to as //not aa | |||
@@ -1391,7 +1399,7 @@ _it_separ) ate (_ @t | |||
au (m_ aU | |||
_) au (nt aa | |||
aur (_ O@ | |||
_) au (ror a# | |||
?!3 _) au (rora a# | |||
s) au (rus_ 'O: | |||
@) au (ri 'O: | |||
C) aus (_ aUs | |||
@@ -1463,7 +1471,7 @@ _it_separ) ate (_ @t | |||
may) be (_ bi: | |||
_) be (CA bI# | |||
_) bete (lg bi:t@ | |||
_) be (C% bE | |||
_) be (C%+ bE | |||
_) be (atiC b%i: | |||
_) be (b bi: | |||
_) be (cl bI# | |||
@@ -1477,7 +1485,7 @@ _it_separ) ate (_ @t | |||
_) be (kn bI# | |||
_) belarus bEl@r'u:s | |||
_) be (lC bE | |||
_) be (llig bI# | |||
_) be (llig+ bI# | |||
_) be (re bE | |||
_) be (sC bI# | |||
_) be (stia bE | |||
@@ -2150,6 +2158,8 @@ _it_separ) ate (_ @t | |||
e (Cical 'E | |||
e (CiuB i: | |||
&) e (_ | |||
aoiC) e (_ @ // Irish, e.g. 'Aoife' /i:fe/ | |||
aoiCC) e (_ @ // Irish, e.g. 'Saoirse' /se@S@/ | |||
acB) e (_ %I | |||
XC) e (_N i: | |||
vert) e (b I | |||
@@ -2377,7 +2387,9 @@ _it_separ) ate (_ @t | |||
@x) ed (_S2vi d# | |||
y) ed (_S2v d# | |||
debut) ed (_S2 d# | |||
edly (_S4m I#dl%i | |||
edly (_S3m I#dl%i | |||
nt) edly (_S4m I#dl%i | |||
tur) edly (_S3v d#l%i | |||
c) ed (e_ 'i:d | |||
p) ed (e_ i:d | |||
p) edal Ed@L | |||
@@ -2567,6 +2579,8 @@ _it_separ) ate (_ @t | |||
en (core 0n | |||
&) ency (_ @ns%i | |||
ency (cli %EnsI | |||
_) en (dg@ %En | |||
_) en (dp@ %En | |||
k) en (d_ En | |||
s) en (d_ En | |||
t) en (d_ En | |||
@@ -2771,7 +2785,7 @@ _it_separ) ate (_ @t | |||
exp) eri (en i@rI2 | |||
XC) er 3: | |||
th) er (@ 3: | |||
h) er (@ %3 | |||
h) er (nan %3 | |||
X) er (A E#r | |||
_h) eretical I#rEtIk@L | |||
_qu) er 3: | |||
@@ -2890,6 +2904,7 @@ _it_separ) ate (_ @t | |||
&z) es (_S2 %I#z | |||
&C) es (_S1i z | |||
xus) es (_S2 %I#z | |||
tamus) es (_S2 %I#z // hippopotamuses | |||
es (carp I2s | |||
es (cape %Es | |||
es (capi %Es | |||
@@ -3099,7 +3114,7 @@ _it_separ) ate (_ @t | |||
&) ford (_S4 f3d | |||
&f) ford (_S4 3d | |||
for (see f%O@ | |||
for (ward f'o@ // straightforward | |||
for (ward f'O@ | |||
ft (en f | |||
&) ful (_S3i f@L | |||
@@ -4288,6 +4303,8 @@ multip) ly laI | |||
_) metall (ic m@tal | |||
metabo m@t'ab0 | |||
_) meta (llu m%Eta | |||
mh (ao w // Irish, e.g. 'mhaol' /weIl/ | |||
aoi) mh (e v // Irish, e.g. 'Caoimhe' /ki:v@/ | |||
&) mobile m@bi:l | |||
_) mocha moUk@ | |||
mono (ga m@n'0 | |||
@@ -4299,6 +4316,7 @@ multip) ly laI | |||
&) mouth (_ m@T | |||
&) mouth (_$w_alt1 maUT | |||
_) multi mVlti | |||
_) multi (pl m,VltI | |||
_) multi (@@P5 m,VltI | |||
.group mi | |||
@@ -5622,6 +5640,7 @@ multip) ly laI | |||
.group re | |||
_) re (C@ rI# | |||
_) re (collec rE | |||
_) reflex ri:flE2ks | |||
_) reflexive rI#fl'EksIv | |||
&Ct) red (_ @d | |||
@@ -5847,6 +5866,10 @@ multip) ly laI | |||
Co) s (Er z | |||
Co) s (En z | |||
e) s (d z | |||
aoi) s (e S // Irish, e.g. 'Laoise' | |||
aoi) seach S@x // Irish, e.g. 'Taoiseach' | |||
aoi) sigh Si // Irish, e.g. 'Taoisigh' | |||
aoir) s (e S // Irish, e.g. 'Saoirse' | |||
_) se (clu sI# | |||
secur sI#kjU@ | |||
_) se (duc sI# | |||
@@ -5861,6 +5884,7 @@ multip) ly laI | |||
@) s (head_ s | |||
@) s (hill_ s | |||
@) s (hous s | |||
@) s (hors s | |||
_) she' %Si: | |||
A) sh (A_ =S | |||
&) ship (_S4 SIp | |||
@@ -5878,6 +5902,7 @@ multip) ly laI | |||
&) s (ic_ z | |||
n) s (ic_ s | |||
ss (ic s | |||
mu) s (e z | |||
mu) s (ic z | |||
ea) s (ie z | |||
ea) s (il z | |||
@@ -6082,6 +6107,8 @@ multip) ly laI | |||
th (ill th | |||
gh) th (A th | |||
ee) thing DI2N | |||
soo) th D | |||
soo) th (say T | |||
the (_ D | |||
&) th (L03_ =T | |||
ou) thed (_ Dd | |||
@@ -6411,6 +6438,7 @@ contin) u ju: | |||
j) ui (c u: | |||
uir (_ jU@ | |||
n) ui (s ju: | |||
?3 n) ui (s u: | |||
r) uis (A u:z | |||
r) ui (t u: | |||
gr) ui (t u:I2 |
@@ -1,5 +1,5 @@ | |||
// * Farsi Language fa (or Parsi or Persian) fa_list Version 3.133 | |||
// * This file writen by Shadyar Khodayari and Ehsan Esmaili who has managed collecting exceptional words. 05-10-2017 | |||
// * Farsi Language fa (or Parsi or Persian) fa_list Version 3.134 | |||
// * This file writen by Shadyar Khodayari and Ehsan Esmaili who has managed collecting exceptional words. 06-24-2017 | |||
//********* | |||
// * This program is free software; you can redistribute it and/or modify * | |||
// * it under the terms of the GNU General Public License as published by * | |||
@@ -554,6 +554,7 @@ _) paRAntezbaste: | |||
آموخت Amuxt | |||
آموزد Amuzad | |||
آموزش AmuzeS | |||
آمپر AmpeR | |||
آمپرمتر AmpeRmetR | |||
آمپلیفایر AmpelifAjeR | |||
آمپیریسم AmpiRism | |||
@@ -5055,7 +5056,6 @@ _) paRAntezbaste: | |||
درایه deRAje | |||
درایو deRAjv | |||
درایور deRAjveR | |||
درباره daR'bAReje: | |||
دربازکن daRbAzkon | |||
دربدر daRbedaR | |||
دربندکشیده daRbandkeSide | |||
@@ -6809,6 +6809,7 @@ _) paRAntezbaste: | |||
شدیدا Sadidan | |||
شدیداللحن Sadidollahn | |||
شدیم Sodim | |||
شراادی SA:_d:jA:_R | |||
شرافت SeRAfat | |||
شراپنل SeRApnel | |||
شراکت SeRAkat | |||
@@ -6816,7 +6817,6 @@ _) paRAntezbaste: | |||
شربت SaRbat | |||
شرت 'SoRt | |||
شرتکات SoRtkAt | |||
شراادی SA:_d:jA:_R | |||
شرشر SeRSeR | |||
شرطه SoRte: | |||
شرعا SaR?an |
@@ -1,5 +1,5 @@ | |||
// * Farsi Language fa (or Parsi or Persian) fa_rules Version 3.133 | |||
// * This file writen by Shadyar Khodayari 05-10-2017 | |||
// * Farsi Language fa (or Parsi or Persian) fa_rules Version 3.134 | |||
// * This file writen by Shadyar Khodayari 06-24-2017 | |||
//********* | |||
// * This program is free software; you can redistribute it and/or modify * | |||
// * it under the terms of the GNU General Public License as published by * | |||
@@ -4843,7 +4843,7 @@ L09L04) السّادات (_Sm8 ossAdAt | |||
L09L09L09L09) م (L03L09L09L09_ ma | |||
// Prefixes م | |||
_) م (L03L09L03_$noprefixP1@ ma | |||
_) م (L03L04L03_$noprefixP1@ ma | |||
_) می (L03L09+$noprefixP2@ mi | |||
_) می (آL09L09$noprefixP2@ mi | |||
_) می (وL09L09$noprefixP2@ mi |
@@ -29,7 +29,7 @@ n &n | |||
o o: | |||
ö Y: | |||
p pe: | |||
q ku: | |||
q qu: | |||
r &r | |||
s &s | |||
t te: | |||
@@ -370,22 +370,40 @@ yogurt jogurt:i | |||
// Abbreviations | |||
(à la) 'ala $dot // jonka mukaan | |||
abc $abbrev | |||
adhd $abbrev | |||
os $abbrev $dot | |||
ad $abbrev $dot // anno Domini, Herran vuonna | |||
atk $abbrev | |||
ay $abbrev // ammaatiyhdistys | |||
ca $abbrev $dot // circa | |||
dna $abbrev // elinkeinoelämän keskusliitto | |||
eg esimerkiksi $dot // exempli gratia, esimerkiksi | |||
em $abbrev $dot | |||
ek $abbrev // elinkeinoelämän keskusliitto | |||
ekr $abbrev $dot // ennen Kristuksen syntymää | |||
etc et_setera $dot // et cetera, ym., jne. | |||
ym ynn&_mu:ta $dot // ynnä muuta (etc) | |||
eg esimerkiksi $dot // exempli gratia, esimerkiksi | |||
eu $abbrev | |||
hiv $abbrev | |||
ict $abbrev | |||
isbn $abbrev | |||
it $abbrev | |||
jne $abbrev $dot // ja niin edelleen | |||
(à la) 'ala $dot // jonka mukaan | |||
ky $abbrev $dot // kommandiittiyhtiö | |||
oy $abbrev // osakeyhtiö | |||
nro numero $dot | |||
nvda $abbrev | |||
os $abbrev $dot | |||
oy $abbrev // osakeyhtiö | |||
ry $abbrev $dot // rekisteröity yhdistys | |||
usb $abbrev | |||
utf $abbrev | |||
ym ynn&_mu:ta $dot // ynnä muuta (etc) | |||
// foreign words | |||
blindsquare _^_EN | |||
bluetooth _^_EN | |||
daisy _^_EN | |||
facebook _^_EN | |||
talkback _^_EN | |||
voiceover _^_EN | |||
youtube _^_EN |
@@ -165,13 +165,16 @@ | |||
.group q | |||
q k | |||
qq k: | |||
q q | |||
qq q: | |||
.group r | |||
r r | |||
CA) rg (_ Rj // follow swedish pronunciation | |||
_CA) rg (C Rj // follow swedish pronunciation | |||
ruoan ru:an // Pronounce ruoan as ruuan. Include all inflections and compound words. | |||
// eg. ruoanlaitto, ruoankin, arkiruoan | |||
.group s | |||
s s | |||
@@ -197,9 +200,9 @@ | |||
.group u | |||
u u | |||
uu u: | |||
ui wi | |||
_) ui ui | |||
_j) ui ui // [ui] sounds better than [wi] when stressed. Especially <jui> at the beginning of the word sounds bad if pronounced [jwi] | |||
ui ui | |||
// _) ui ui | |||
// _j) ui ui // [ui] sounds better than [wi] when stressed. Especially <jui> at the beginning of the word sounds bad if pronounced [jwi] | |||
uii u|i: | |||
uo uo | |||
uoo u|o: |
@@ -1,6 +1,6 @@ | |||
| |||
// This file is UTF-8 encoded | |||
// Updated 2017 april 28 by Christian Leo M, <[email protected]> | |||
// Updated 2017 october 3 by Christian Leo M, <[email protected]> | |||
// $alt change [e] or [o] in the stressed syllable to [E] or [O] | |||
// $alt2 change [E] or [O] in the stressed syllable to [e] or [o] | |||
@@ -102,6 +102,10 @@ _< min'oRe||d'I | |||
_> madZ:'oRe||d'I | |||
_〈 ap'E@-*ta||,angol'aRe | |||
_〉 kj'uza||,angol'aRe | |||
_〈 ap'E@-*ta||angol'ata | |||
_〉 kj'uza||angol'ata | |||
_【 ap'E@-*ta||lentikol'aRe | |||
_】 kj'uza||lentikol'aRe | |||
* aste@-*'isko $max3 | |||
$ d'Ol:aRI | |||
% pe@-*tS'ENto $max3 | |||
@@ -111,7 +115,6 @@ $ d'Ol:aRI | |||
\ kont@-*ob'a:R*a $max3 | |||
_| b'aR*a||ve@-*tik'ale | |||
& 'a/nd | |||
© k'O:pi||raIt | |||
# kantSellet:o | |||
@ ki'otS:ola | |||
~ tilde | |||
@@ -137,7 +140,6 @@ _‡ k@-*'otSe||lat'ina||d'Op:ia | |||
_′ p@-*'imi | |||
_″ d'Op:io||'apitSe | |||
_‴ t@-*'iplo||'apitSe | |||
_‼ esklamatsi'One | |||
§ setsi'One | |||
¶ pa*'ag@-*afo | |||
_‐ legat'u:Ra | |||
@@ -150,6 +152,8 @@ _‑ t@-*at:,ino||duni'one | |||
ʔ glotalst'Op | |||
ɡ dZ'i||vel'aRe||ok:luz'iva // U+0261 | |||
ɣ g'am:a||min'uskola // U+0263 voiced velar fricative | |||
ß 'esse||ak'uta | |||
ɑ 'alfa | |||
_‣ punt'ato | |||
◦ punt'ato | |||
@@ -159,8 +163,6 @@ _‣ punt'ato | |||
↓ f@-*'etS:a||_dZ'u | |||
♭ bem'Ol:e | |||
♯ dI'ezis | |||
♥ 'asso||di||kw'ORI | |||
❓ p'unto||inteR*ogat'ivo | |||
_‧ sepaRat'oRe/ | |||
∞ infin'Ito | |||
@@ -787,6 +789,7 @@ black bl'E:k | |||
blackout bl'Ek'aUt | |||
blind bl'aInd $onlys | |||
blues bl'u:z | |||
bluff bl'ef: $only | |||
boiler $1 | |||
bonjour b,O:_Z'u:r | |||
brioche b@-*I'oS | |||
@@ -1020,7 +1023,7 @@ logging l'Oging | |||
lord $alt $only | |||
love l'O:v $onlys | |||
lover $1 | |||
manche m'a:nS $only | |||
manche m'a:nS $onlys | |||
my _^_EN | |||
myspace m'aI||sp'Eis | |||
machine maS'in $onlys | |||
@@ -2381,6 +2384,7 @@ ivano $2 | |||
jace _^_en $only | |||
jack dZ'E:k | |||
jackson _^_EN | |||
jefferson $1 | |||
jacopo j'a:kopo | |||
james _^_EN | |||
jane _^_EN | |||
@@ -2477,6 +2481,7 @@ paul p'O:l $only | |||
peggy p'Eg:I | |||
pericle $1 | |||
peter $1 $onlys | |||
peterson p'Ete@-*s,on | |||
pettarin $3 $only | |||
peugeot p,EZ'o | |||
piquet pik'E $only | |||
@@ -3206,6 +3211,7 @@ distino $1 | |||
distintesi $2 | |||
disturbano $2 | |||
disturbino $2 | |||
dissuadere dissuad'eRe | |||
divaghino $2 | |||
divaricano $2 | |||
diventino $2 | |||
@@ -4330,6 +4336,7 @@ situino $1 | |||
sloggiano $1 | |||
smagnetizzino $3 | |||
smascher $1 | |||
smascherano $1 | |||
smercino $1 | |||
sniffano $1 | |||
snodano $1 | |||
@@ -4673,6 +4680,8 @@ zuccherano $1 | |||
(quando capita) kw'ando||k'apita | |||
(se capita) se||k'a:pita | |||
(me capita) me||k'apita | |||
(cosa capita) k'oza||k'a:pita | |||
(come capita) k'ome||k'a:pita | |||
(capitano tutte) k'apitano||t'ut:e | |||
(che capitano) ke||k'apitano | |||
(quando capitano) kw'ando||k'a:pitano | |||
@@ -4775,6 +4784,7 @@ espellerl $2 | |||
esprimiti $2 | |||
evolverci $2 | |||
evolversi $2 | |||
facendomici fatS'endom,itSi | |||
fammel $1 | |||
fattel f'at:el | |||
fattoci $1 | |||
@@ -4825,7 +4835,6 @@ orientaci $3 | |||
pensaci $1 | |||
perdonatel $3 | |||
permettigli $2 | |||
pervenutaci $3 | |||
pizzical $1 | |||
pizzicami $1 | |||
portala $1 | |||
@@ -4841,7 +4850,6 @@ pulisciti $2 | |||
redigerl $2 | |||
raddrizzarl @-*ad:@-*its2:'a@-*l | |||
rafforzal $2 | |||
regalaci $2 | |||
regalati $2 $atstart | |||
regalavi $3 | |||
reinseritasi $4 |
@@ -81,6 +81,7 @@ afonie afon'i;e | |||
agadez $3 | |||
agapit $2 | |||
agave $1 | |||
agendine $3 | |||
agenzia $3 | |||
agenzie adZents'ie | |||
agerol $2 | |||
@@ -137,6 +138,7 @@ allodol $2 | |||
alloggi $alt | |||
allora al:'oRa | |||
alluce 'al:utSe | |||
alluci $1 | |||
almen $alt2 | |||
alope $1 | |||
alopecia alopetS'i:a |
@@ -1,7 +1,7 @@ | |||
// Italian translation rules | |||
// This file is UTF-8 encoded | |||
// Last update: 2017 march 31 by Christian Leo Mameli <[email protected]> | |||
// Last update: 2017 october 3 by Christian Leo Mameli <[email protected]> | |||
// letter groups | |||
// A any vowel | |||
// C any consonant | |||
@@ -28,7 +28,7 @@ | |||
au a|%U | |||
@C) a (_S1q a/ // lookup it_list without suffix | |||
@i) a (_S1q a // lookup it_list without suffix | |||
C) a (cY_ 'a | |||
// C) a (cY_ 'a | |||
@) a (co_ =a | |||
@) a (ca_ =a | |||
@) a (che_ =a/ | |||
@@ -37,14 +37,15 @@ | |||
@) a (bile_ 'a | |||
@) a (ggine_ 'a | |||
_) ae (r aE | |||
avano (_ 'avano | |||
avano (_ 'avano // verbs | |||
a (tterA_ 'a | |||
_) all' (P4t all | |||
_) anch' (P5t ank | |||
@) amo (L04_ 'amo // Pron.s verbs | |||
Ci) amo (L04_ 'amo | |||
@) ander (L04_ 'andE@-* | |||
ate (L04_+ 'ate | |||
ate (L04_+ 'ate | |||
abb) assa (L07_ 'assa | |||
_L04Z) auguri (_ 'awguRI | |||
astano (_ 'astano // verbs | |||
@@ -59,6 +60,7 @@ | |||
bbano (_ =b:ano // verbs | |||
bacia (L07_ b'atSa | |||
_) bagna (L07_ b'an^a | |||
a) bbraccia (L07_ b:@-*'atS:a | |||
.group c | |||
c k | |||
@@ -90,6 +92,7 @@ | |||
in) cer (L04_ =tSe@-* | |||
cuocer (L04_ kU'OtSe@-* | |||
compra (L07_ k'omp@-*a | |||
_L04Z) capite (_ kap'ite/ | |||
_L04Z) capit (A_ k'a:p,it | |||
_L04Z) capit (ano_ k'a:p,it | |||
correr (L04_ k'o:R*eR | |||
@@ -208,6 +211,8 @@ | |||
fob (A_ =fob | |||
farma (ci_ f'a@-*ma | |||
ferma (L07_ f'e@-*ma/ | |||
_) fatt (AL04_ f'at: | |||
_ri) fatt (AL04_ f'at: | |||
.group g | |||
g g | |||
@@ -504,6 +509,7 @@ | |||
qui (A kwj | |||
_) quell' (P6t kwEll | |||
_) quest' (P6t kwest | |||
_) quant' (P6t kwant | |||
.group r | |||
r @-* | |||
@@ -522,6 +528,7 @@ | |||
_) ripeter (L04_ @-*ip'E:te@-* | |||
_) romper (L04_ @-*'ompe@-* | |||
ca) re (zzaL07_ R'e | |||
_) regala (tAL04_ @-*egal'a | |||
C) rai (_ @-*'a:I | |||
A) rai (_ R'a:I | |||
rrai (_ R*'a:I | |||
@@ -563,6 +570,8 @@ | |||
_) segna (L05_ s'en^a | |||
in) segna (L07_ s'En^a | |||
_)segnala (L07_ sen^'ala | |||
specifica (L07_ spetS'ifika | |||
stringi (L04_ st@-*'indZi/ | |||
A) scano (_ =skano // verbs | |||
sciano (_ =Sano | |||
A) schiano (_ =skiano | |||
@@ -596,6 +605,7 @@ | |||
au) tentica (L07_ t'ENtIka/ | |||
a) ttiva (L07_ t:'iva | |||
taglia (L07_ t'al^a | |||
tira (L07_ t'iRa | |||
L02) tre (_ t@-*'e | |||
_) tutt' (P5t tut: | |||
@@ -619,6 +629,7 @@ | |||
ustano (_ 'u:stano | |||
C) uo (tano_ U'O | |||
uomini (_ w2'Omini | |||
fanc) u (lA_ 'u: | |||
.group v | |||
v v | |||
@@ -636,6 +647,8 @@ | |||
_) vota (L07_ v'Ota | |||
s) veglia (L07_ v'el^a | |||
volta (L07_ v'Olta | |||
venut (AL04_ ven'ut | |||
_) v' (P2t v | |||
.group w | |||
w w2 | |||
@@ -696,6 +709,7 @@ | |||
man) zie (_ ts'i;e | |||
me) zz dz: | |||
amma) zziamo (L04_ _tsi'a:mo | |||
sbara) zz (arL04_ ts: | |||
.group | |||
@@ -926,7 +926,8 @@ $textmode | |||
😖 შეცბუნებული სახე // [1F616] | |||
😗 კოცნის გამომხატველი სახე // [1F617] | |||
😘 სახე, რომელიც კოცნას აგზავნის // [1F618] | |||
😙 კოცნის გამომხატველი სახე მომღიმარე თვალებით // [1F619] | |||
😗 kissing face // [1F617] | |||
//😙 კოცნის გამომხატველი სახე მომღიმარე თვალებით // [1F619] TODO: This breaks speaking "7". | |||
😚 კოცნის გამომხატველი სახე დახუჭული თვალებით // [1F61A] | |||
😛 სახე გამოყოფილი ენით // [1F61B] | |||
😜 სახე გამოყოფილი ენითა და ჩაკრული თვალით // [1F61C] | |||
@@ -938,7 +939,8 @@ $textmode | |||
😢 მტირალა სახე // [1F622] | |||
😣 შეუპოვარი სახე // [1F623] | |||
😤 სახე ცხვირიდან გამომავალი ორთქლით // [1F624] | |||
😥 იმედგაცრუებული, მაგრამ შვების გამომხატველი სახე // [1F625] | |||
😥 disappointed but relieved face // [1F625] | |||
//😥 იმედგაცრუებული, მაგრამ შვების გამომხატველი სახე // [1F625] TODO: This breaks speaking "3". | |||
😦 შეჭმუხნილი სახე ღია პირით // [1F626] | |||
😧 ტანჯული სახე // [1F627] | |||
😨 შეშინებული სახე // [1F628] |
@@ -423,6 +423,7 @@ tikpat $2 | |||
tikvien $u2+ | |||
turpat $u2+ | |||
turpretī $u2 | |||
uzreiz $2 | |||
vienalga $2 | |||
vismaz $2 | |||
@@ -38,6 +38,7 @@ | |||
.L17 ai ais am ā ām ās ie iem o os // suffixes of certain adjectives finishing with ..ējais | |||
.L18 am āk i u ot ēt os // suffixes of adverbs (apstākļa vārdi) | |||
.L10 ~ at ie iz jā jā jāat jāie jāiz jāno jāsa ne no no pa pār pie pie sa vis // optional verb prefixes | |||
.L20 ~ ne // optional negation prefix | |||
// +---------------------------+ | |||
@@ -62,7 +63,6 @@ | |||
// +---------------------------+ | |||
// | Pronunciation of o | | |||
// +---------------------------+ | |||
.L30 ō ȯ // uo pre/post fixes. If facultative writing is used, o is spelled as uo | |||
// Default rules for o with succeeding consonants | |||
.L40 č ģ ķ ļ ņ ŗ š ž // uo indicators — o is spelled as uo in words with Latvian soft consonants | |||
@@ -204,7 +204,7 @@ | |||
// wide e ------------------------------------------------------------------------ // | |||
// widening consonants follow | |||
e (L25 E | |||
e (L25< E | |||
e (L25L25 E | |||
// widening vowels follow | |||
e (L25L24+ E | |||
@@ -253,6 +253,7 @@ | |||
_L20) e (sat_+ _!e // esat | |||
_L20) e (si_ _!e // esi | |||
_L20) e (smu_ _!e // esmu | |||
_L20) e (sot_ _!e // esot | |||
_m) e (dūzL04_ e | |||
_m) e (kL04_ e // Meka | |||
m) e (lL88 E | |||
@@ -261,6 +262,7 @@ | |||
_n) ere (tL04_ ERE // Nereta | |||
n) e (rv E | |||
p) e (rs e | |||
pr) e (cL52z e | |||
pr) e (L71L05_ e // prece | |||
_pr) e (t e | |||
pr) etē (@ ete: | |||
@@ -287,6 +289,7 @@ | |||
t) ermo eRmo | |||
t) e (st e | |||
_t) e (v_ e // tev | |||
_t) e (vi_ e // tevi | |||
_v) e (lgL04_ e // Velga | |||
_v) e (ltL04_ e // Velta | |||
_v) e (ntL04_ E // Venta | |||
@@ -337,7 +340,7 @@ | |||
// wide ē --------------------------------------------------------------------------- // | |||
// widening consonants follow | |||
ē (L25 E: | |||
ē (L25< E: | |||
ē (L25L25 E: | |||
// widening vowels follow | |||
ē (L25L24+ E: | |||
@@ -372,6 +375,7 @@ | |||
gr) ē (kL01_ E: | |||
izp) ē (t e: | |||
_kāp) ē (c_ e: // kāpēc | |||
_l) ē (L83+ e: // lēst | |||
m) ēne (L83 e:ne | |||
m) ē (rķ e: | |||
_m) ē (s_ e: // mēs | |||
@@ -425,7 +429,6 @@ | |||
ī i: | |||
.group j | |||
// A) j (@ :j | |||
j j | |||
_) jebk j%ebk // stress on 2nd syllable | |||
@@ -483,11 +486,6 @@ | |||
o (L41+ o // o indicators after | |||
o (JL41+ o | |||
L30J) o uo // uo indicators before (facultative writing) | |||
L30) o (+ uo | |||
o (JL30 uo // uo indicators after (facultative writing) | |||
o (L30+ uo | |||
o uo // words with Latvian roots are more common | |||
o (_++ uo // common ending for Latvian words | |||
o (L40 uo // usually uo before soft (Latvian) consonants | |||
@@ -541,6 +539,7 @@ L46L45L45) o (<< uo | |||
arist) o o | |||
ater) o o: | |||
_aut) o (< o | |||
bals) o uo | |||
bandr) o o: | |||
_bar) o (L12_ uo | |||
bar) o (L65 uo // barot | |||
@@ -575,12 +574,12 @@ L46L45L45) o (<< uo | |||
dinam) o o: | |||
disp) o o | |||
eg) o o> | |||
eir) o o | |||
_ek) o o | |||
eks) o o | |||
ekspl) o o | |||
ekvin) o o | |||
elektr) o o: | |||
ez) o o> | |||
energ) o o: | |||
enL87) o o | |||
ent) o (@ o | |||
@@ -588,6 +587,7 @@ L46L45L45) o (<< uo | |||
epr) o o | |||
ept) o (@ o | |||
eur) o o | |||
ez) o o> | |||
gen) o o | |||
get) o o | |||
glik) o o | |||
@@ -692,6 +692,7 @@ L46L45L45) o (<< uo | |||
pomp) o o: | |||
por) o o | |||
pr) o (L90 o | |||
_pr) o o | |||
prop) o o | |||
pseid) o o | |||
raps) o o: | |||
@@ -720,6 +721,7 @@ L46L45L45) o (<< uo | |||
sol) o o: | |||
son) o o | |||
spid) o o | |||
sp) o (L77++ uo | |||
sport) o uo | |||
sten) o (L65 uo | |||
_sten) o o | |||
@@ -763,6 +765,8 @@ L46L45L45) o (<< uo | |||
gl) ob ob | |||
g) ob (e ob | |||
k) ob ob | |||
l) ob (ē ob | |||
l) oboto (m oboto | |||
m) ob ob | |||
_) ob (amL01_ ob // Obama | |||
ob (je ob | |||
@@ -806,6 +810,7 @@ L46L45L45) o (<< uo | |||
m) od (u od | |||
m) od (uš uod | |||
n) od (L05_ o:d // ..node | |||
n) od uod | |||
_) od (ek od | |||
od (erL51 uod | |||
_) od (esL04_ od // Odesa | |||
@@ -878,6 +883,7 @@ L46L45L45) o (<< uo | |||
_d) ok (L01_ ok // doks | |||
d) ok (u ok | |||
fil) okok okok | |||
gl) ok (sīn ok | |||
g) ok ok | |||
_k) okako (lL04_ okako: // kokakola | |||
k) ok (L01 uo`k // koks with short uo, because of ambiguity | |||
@@ -1063,6 +1069,7 @@ L46L45L45) o (<< uo | |||
pr) om om | |||
_pr) om (_ uom // prom | |||
pt) om (L01_ o:m // ..ptoms | |||
pt) om o>m | |||
rd) om (L01_ o:m | |||
r) om (b om | |||
_r) om (L04_ uom // Roma | |||
@@ -1217,6 +1224,7 @@ L46L45L45) o (<< uo | |||
m) op op | |||
net) op (_ uop | |||
n) op (er+++ uop | |||
n) opo (st uopuo | |||
op (c op | |||
op (en op | |||
_) op (erL04_++++ o:p // opera | |||
@@ -1320,6 +1328,7 @@ L46L45L45) o (<< uo | |||
or (ien oR | |||
_) origo (_ oRigo: // Origo | |||
or (iģ oR | |||
or (kā oR | |||
or (ķest oR | |||
or (L01_+ o:R // ..ors | |||
_) or (L02_+ uoR // ore | |||
@@ -1387,6 +1396,7 @@ L46L45L45) o (<< uo | |||
p) os (tC@ os | |||
p) os (te os | |||
p) os (ter os | |||
p) os (tind os | |||
p) os (tī uos | |||
p) os (tL01 uos | |||
p) os (tL55m os | |||
@@ -1402,17 +1412,22 @@ L46L45L45) o (<< uo | |||
š) os (ej os | |||
_t) os (te os | |||
_t) os (tL01_ os // tosts | |||
v) osto (k osto | |||
_z) os (L06_ uos // zoss | |||
.group ot | |||
an) ot ot | |||
ast) ot uot | |||
av) ot uot | |||
_bal) ot (ē ot | |||
bankr) ot ot | |||
b) ot (ān ot | |||
d) ot (āc ot | |||
d) ot (ē ot | |||
er) ot (iL67 o:t | |||
er) ot (is o:t | |||
_er) ot (L01_ ot // Erots | |||
_ez) ot ot | |||
f) oto (_ oto: | |||
g) ot (ik o:t | |||
@@ -1423,6 +1438,7 @@ L46L45L45) o (<< uo | |||
k) ot (an ot | |||
k) ot (L51 ot | |||
k) ot (l ot | |||
_L10pr) ot (L13_ uot // (ne|sa..)prot(i|u) | |||
lin) ot (ip ot | |||
_l) ot (iņL04 ot // Lotiņa | |||
l) ot (L05_ ot // ..lote | |||
@@ -1433,22 +1449,25 @@ L46L45L45) o (<< uo | |||
nepr) ot uot | |||
_n) ot (L04_ ot // nota | |||
n) ot (L50r ot | |||
ot (āj uot | |||
ot (k ot | |||
m) otō oto: | |||
_) oto (C< oto | |||
pil) ot ot | |||
_p) ot (ašL04 ot // potaša | |||
p) ot (eL68 ot | |||
pr) ot (am uot | |||
pr) ot (e ot | |||
pr) ot (o ot | |||
pr) oto (š uotuo // protoš.. | |||
pr) otot (ip otot | |||
pr) oto (t uotuo // ..protot | |||
pr) ot (u_ uot | |||
publisk) ot uot | |||
r) ot (āc ot | |||
r) ot (b ot | |||
r) ot (er ot | |||
r) ot (ē ot | |||
r) ot (kaL77 o`t | |||
sab) ot ot | |||
sk) ot (L01_ ot | |||
sl) ot (L04_ uot // slota | |||
@@ -1566,6 +1585,7 @@ L46L45L45) o (<< uo | |||
v v | |||
// unstressed if starts as vis.. prefix | |||
// except for words where vis.. is part of root | |||
vecvec vetsvets | |||
_) vi (sād v'i // visād | |||
_) vi (sēd v'i // visēd | |||
_) vi (skijL01_ v'i // viskijs |
@@ -1,170 +1,194 @@ | |||
sindhi | |||
// This file is UTF8 encoded | |||
// Letter Names, Numbers and exceptional pronounciation of Urdu | |||
// The Letter names | |||
ا alIf | |||
ب be: | |||
پ pe: | |||
ت te: | |||
ٹ te: | |||
ث se: | |||
ج Ji:m | |||
چ ce: | |||
ح bar.i:|| | |||
خ xe: | |||
د da:l | |||
ڈ da:l | |||
ذ za:l | |||
ر Re: | |||
ڑ r.e: | |||
ز ze: | |||
ژ Ze: | |||
س si:n | |||
ش Si:n | |||
ص sUa:d | |||
ض zUa:d | |||
ط tOe: | |||
ظ zOe: | |||
ع aIn | |||
غ QaIn | |||
ف fe: | |||
ق qa:f | |||
ک ka:f | |||
گ ga:f | |||
ل la:m | |||
م mi:m | |||
ن nu:n | |||
_و va:O | |||
ہ he: | |||
ں ghUnna | |||
ﮨ cho:ti:||he: | |||
ھ dO||caSmi:||he: | |||
ء hamzah | |||
ی c#o:ti:||je: | |||
ے bar.i:||je: | |||
ئ h'amza | |||
ۂ he:h'amza | |||
_ؤ va:Oh'amza | |||
َ z@b@R | |||
ِ ze:R | |||
ُ pe:S | |||
ٰ ,alIfmaqs'u:r,a | |||
ّ t,aSd'i:d | |||
ً d'o:zab'ar | |||
// The numbers | |||
_0 bu're | |||
_1 hi'ku | |||
_2 ba: | |||
_3 te | |||
_4 ca:r | |||
_5 pan'ja: | |||
_6 ch'aha: | |||
_7 sa'ta: | |||
_8 ath'a: | |||
_9 na'va: | |||
_10 da'ha: | |||
_11 jara:ha | |||
_12 bara:ha | |||
_13 tera:ha | |||
_14 cOda:ha | |||
_15 pa'dra:ha | |||
_16 sora:ha | |||
_17 satira:ha | |||
_18 ari'rahan | |||
_19 una'via | |||
_20 viha: | |||
_21 ek'kie | |||
_22 bavi'a | |||
_23 tevi'a | |||
_24 cO'via | |||
_25 panc'via | |||
_26 cha'via | |||
_27 sat'avia | |||
_28 at:avia | |||
_29 una:tie | |||
_30 ti'ha | |||
_31 ek'atiha | |||
_32 battiha | |||
_33 tettiha | |||
_34 cO'tiha | |||
_35 panc:tiha | |||
_36 chat'tiha | |||
_37 sat'tatiha | |||
_38 att:atiha | |||
_39 unuta:vie | |||
_40 ca'li: | |||
_41 ek'eta:rie | |||
_42 ba:ite'rie | |||
_43 te'ta:rie | |||
_44 cOt'erie | |||
_45 panci'terie | |||
_46 cai'terieh | |||
_47 sati'terie | |||
_48 ati'terie | |||
_49 urur'ja | |||
_50 pan'ja | |||
_51 ekvan'ja | |||
_52 bavan'ja | |||
_53 tevan'ja | |||
_54 cOvanja | |||
_55 pa:van'ja | |||
_56 ca'vaja: | |||
_57 sat:ur'ja | |||
_58 at:ur'ja | |||
_59 una:hat:i | |||
_60 sa:thi | |||
_61 eka:thi | |||
_62 ba:hathi | |||
_63 teha:thi | |||
_64 cO'hathi | |||
_65 panja'hathi | |||
_66 ca:hathi | |||
_67 sat'tathi | |||
_68 at'thati | |||
_69 un'ha't:har | |||
_70 sata:ri | |||
_71 ek'hat:ar | |||
_72 ba'hat'ar | |||
_73 te'hat'ar | |||
_74 cOhat'ar | |||
_75 pan'jat'ar | |||
_76 cha'hat'ar | |||
_77 sat'ta'tar | |||
_78 at:hat'ar | |||
_79 un'a:si | |||
_80 a:si | |||
_81 ek'ea'si | |||
_82 bea'si | |||
_83 tea'si | |||
_84 cO'rasi | |||
_85 panc'a:si | |||
_86 chhajasi | |||
_87 sat'tea:si | |||
_88 at:ha:si | |||
_89 ur'ra:nave | |||
_90 nave | |||
_91 ek'ka'navi | |||
_92 bea'navi | |||
_93 tea'navi | |||
_94 cOra:navi | |||
_95 panca:navi | |||
_96 cha:navi | |||
_97 sat'ta:navi | |||
_98 at:tha:navi | |||
_99 nava:navi | |||
_100 sO | |||
_0M1 haz'a:r | |||
_0M2 l'a:kh | |||
_0M3 kaR'o:R | |||
_0M4 'aRab | |||
_0M5 'k#aRab | |||
_dpt _da:he_ | |||
// This file is UTF8 encoded | |||
// Letter Names, Numbers and exceptional pronounciation of Sindhi | |||
// The Letter names | |||
ا alIf | |||
ب be: | |||
ٻ bE | |||
ڀ b#e: | |||
پ pe: | |||
ت te: | |||
ٿ t#e: | |||
ٽ t.e: | |||
ٺ t.#e: | |||
ث se: | |||
ج Ji:m | |||
ڄ Je: | |||
جھ J#e: | |||
ڃ n^e: | |||
چ ce: | |||
ڇ c#e: | |||
ح vad.i:||he: | |||
خ xe: | |||
د da:l | |||
ڌ d#a:l | |||
ڊ d.a:l | |||
ڏ d.e: | |||
ڍ d.#a:l | |||
ذ za:l | |||
ر Re: | |||
ڙ r.e: | |||
ز ze: | |||
ژ Ze: | |||
س si:n | |||
ش Si:n | |||
ص sUa:d | |||
ض zUa:d | |||
ط tOe: | |||
ظ zOe: | |||
ع aIn | |||
غ QaIn | |||
ف fe: | |||
ڦ p#e: | |||
ڪ ka:f | |||
ق qa:f | |||
ک k#e: | |||
گ ga:f | |||
گھ g#e: | |||
ڳ ge: | |||
ڱ N-e: | |||
ل la:m | |||
م mi:m | |||
ن nu:n | |||
ڻ n.u:n. | |||
و va:O | |||
ه he: | |||
ہ Urdu:||he: | |||
ھ dO||caSmi:||he: | |||
ء hamzah | |||
ي je: | |||
ئ h'amza||je: | |||
ۂ he:h'amza | |||
ؤ va:Oh'amza | |||
َ z@b@R | |||
ِ ze:R | |||
ُ pe:S | |||
ٰ ,alIfmaqs'u:r,a | |||
ّ t,aSd'i:d | |||
ً d'o:zab'ar | |||
ٗ Ubto:pe:S | |||
// The numbers | |||
_0 bUr.i: | |||
_1 hIkU | |||
_2 ba: | |||
_3 t.e | |||
_4 ca:R | |||
_5 panJa | |||
_6 c#aha | |||
_7 sat:a | |||
_8 at.#a | |||
_9 nava | |||
_10 d.aha | |||
_11 jaraha | |||
_12 baraha | |||
_13 te:raha | |||
_14 cOd.aha | |||
_15 pandraha | |||
_16 soraha | |||
_17 satraha | |||
_18 arr.aha | |||
_19 Un.vi:ha | |||
_20 vi:ha | |||
_21 Ikvi:ha | |||
_22 ba:vi:ha | |||
_23 t.e:vi:ha | |||
_24 co:vi:ha | |||
_25 panJvi:ha | |||
_26 c#avi:ha | |||
_27 sata:vi:ha | |||
_28 at.#a:vi:ha | |||
_29 Un.at.i:ha | |||
_30 t.i:ha | |||
_31 Ikat.i:ha | |||
_32 bat.i:ha | |||
_33 t.e:t.i:ha | |||
_34 co:t.i:ha | |||
_35 panJati:ha | |||
_36 c#at.i:ha | |||
_37 satati:ha | |||
_38 at.#ati:ha | |||
_39 Un.ta:li:ha | |||
_40 ca:li:ha | |||
_41 Ikta:li:ha | |||
_42 ba:Ita:li:ha | |||
_43 t.e:ta:li:ha | |||
_44 co:Ita:li:ha | |||
_45 panJe:ta:li:ha | |||
_46 c#a:Ita:li:ha | |||
_47 sate:ta:li:ha | |||
_48 at.#e:ta:li:ha | |||
_49 Un.vanJa:h | |||
_50 panJa:h | |||
_51 IkvanJa:h | |||
_52 ba:vanJa:h | |||
_53 t.e:vanJa:h | |||
_54 co:vanJa:h | |||
_55 panJvanJa:h | |||
_56 c#a:vanJa:h | |||
_57 satvanJa:h | |||
_58 at.#vanJa:h | |||
_59 Un.ahat.#I | |||
_60 sat.#I | |||
_61 Ikahat.#I | |||
_62 bahat.#I | |||
_63 t.e:hat.#I | |||
_64 co:hat.#I | |||
_65 panJahat.#I | |||
_66 c#a:hat.#I | |||
_67 satahat.#I | |||
_68 at.#ahat.#I | |||
_69 Un.hat:aR | |||
_70 sat:aR | |||
_71 Ikahat:aR | |||
_72 ba:hataR | |||
_73 t.e:hataR | |||
_74 co:hataR | |||
_75 panJataR | |||
_76 c#a:hataR | |||
_77 satat:aR | |||
_78 at.#ahataR | |||
_79 Un.Ia:si: | |||
_80 assi: | |||
_81 IkIa:si: | |||
_82 bIa:si: | |||
_83 t.e:a:si | |||
_84 cOo:ra:si: | |||
_85 panJa:si: | |||
_86 c#aha:si: | |||
_87 satIa:si: | |||
_88 at.#Ia:si: | |||
_89 Un.Ia:nave: | |||
_90 navve: | |||
_91 IkIanave: | |||
_92 bIa:nave: | |||
_93 t.Ia:navE: | |||
_94 co:Ra:nave: | |||
_95 panJa:nave: | |||
_96 c#aha:nave: | |||
_97 satIa:nave: | |||
_98 at.#Ia:nave: | |||
_99 nava:nave: | |||
_0C s'aU | |||
_0M1 haz'a:r | |||
_0M2 l'a:kh | |||
_0M3 kaR'o:R | |||
_0M4 'aRab | |||
_0M5 'k#aRab | |||
_dpt _d.aha:i:_ | |||
// word exceptions | |||
آھي a:he: $u | |||
آهن a:hIn $u | |||
هن hIna | |||
۾ me~ $u | |||
۽ ae~ $brk | |||
آهي a:he: $u | |||
هڪ HIk | |||
ٿي t#i: $u | |||
ئي i: |
@@ -30,7 +30,7 @@ t tE | |||
u u | |||
ü y | |||
v vE | |||
w tS'ift||vE | |||
w d'ab@LjU | |||
x iks | |||
y jE | |||
z zE |
@@ -1,4 +1,4 @@ | |||
// This ur_list file is prepared by Him Prasad Gautam (Kathmandu, Nepal) | |||
// This ur_list file is prepared by Him Prasad Gautam (Kathmandu, Nepal) and Ejaz Shah (Pakistan) | |||
// This file is UTF8 encoded | |||
// Letter Names, Numbers and exceptional pronounciation of Urdu | |||
@@ -55,6 +55,8 @@ _ؤ va:Oh'amza | |||
ّ t,aSd'i:d | |||
ً d'o:zab'aR | |||
ْ sUk'u:n | |||
ٗ Ult.a:||pe:S | |||
ٓ mada | |||
// The numbers | |||
@@ -190,8 +192,11 @@ _dpt _ISaRI'Ia_ | |||
جن J'In $u | |||
جنھیں J,InH'e:n $u | |||
انہوں ,UnH'o:n $u | |||
انھوں UnHo:n $u | |||
انہیں ,UnH'e:n $u | |||
انھیں ,UnH'e:n $u | |||
انھی UnHi $u | |||
انہی UnHi: $u | |||
// unstressed prepositions | |||
کا $u | |||
@@ -199,7 +204,7 @@ _dpt _ISaRI'Ia_ | |||
کے $u | |||
سے $u | |||
اور OR $u $brk | |||
اور aUR $u $brk | |||
کہ k'e:H $u | |||
نے $u | |||
@@ -329,7 +334,7 @@ _dpt _ISaRI'Ia_ | |||
حفاظت H,Ifa:z.'at | |||
ہمت HIm'at | |||
سمیت sam'e:t | |||
اگرچہ ,agaRc'e:H | |||
اگرچہ ,agaRc'e:H $pause | |||
بلکہ b,alk'e:H | |||
حصہ H'Is.,a | |||
حصے H'Is.e: | |||
@@ -677,14 +682,13 @@ _dpt _ISaRI'Ia_ | |||
کلک klIk | |||
فکسنگ f,Iks'Ing | |||
مانند ma:n'Ind $1 | |||
اتار Ut'a:R | |||
آرکائیو ,a:Rk'a:jv | |||
لنک lInk | |||
فہرست fEHRIst | |||
کیلئے ke:li:;e: | |||
اگر agaR $u | |||
اگر agaR $pause | |||
ضرورت zaRu:Rat | |||
مگر magaR $u | |||
مگر magaR $pause | |||
دیگر digaR | |||
اہم EHEm | |||
فیصد fis.ad | |||
@@ -718,4 +722,273 @@ _dpt _ISaRI'Ia_ | |||
نصرت nUs.Rat | |||
خاتون xa:tu:n | |||
برتری baRtaRi | |||
برتر baRtaR | |||
برتر baRtaR | |||
سن sUn | |||
انھتر UnHataR | |||
انیس Uni:s | |||
ورلڈ vaRld. | |||
فرق faRq | |||
اوپر u:paR $1 | |||
اوپری u:pRi: | |||
دودھ du:d# | |||
اورئینٹل o:Ri;e:nt.al | |||
انکار Inka:R | |||
انکاری Inka:Ri | |||
انیک ane:k | |||
اونگ u:ng | |||
اوک u:k | |||
اویس ave:s | |||
اویسی ave:si | |||
اٹوٹ at.u:t. | |||
اٹھ Ut.# | |||
اٹھان Ut.#a:n | |||
اک Ik | |||
اکا Ika: | |||
دکا dUka: | |||
اکائی Ik'a:i | |||
اکبر akbaR $1 | |||
وکی vIki | |||
اکرم akRam $1 | |||
اکزیکٹیو Ikze:kIt.Iv | |||
اکتا Ukta: | |||
اکتایا Ukta:ja: | |||
اکتاہٹ Ukta:Hat. | |||
اکلو Iklo: | |||
اکمل akmal $1 | |||
مملکت mamlIkat | |||
قربت qURbat $1 | |||
مٹا mIt.a: | |||
ٹیوب t.ju:b | |||
سیہون sEHvan | |||
عرس URs | |||
اکھاڑ Uk#a:r. | |||
اکے Ike: | |||
آمیزش a:me:zIS | |||
واحد va:HId | |||
آنت a:nt | |||
آنچل a:ncal | |||
حجاب HIJa:b | |||
حلقہ Halqa | |||
لحاظ lIHa:z. | |||
کیچڑ kicar. | |||
گردش gaRdIS | |||
مروت mURavvat | |||
مزاج mIza:J | |||
غربت QURbat $1 | |||
آویزش a:ve:zIS | |||
پہر pEHER | |||
آہ a:H | |||
جگر JIgaR | |||
دلدوز dIldo:z $1 | |||
رحمت REHmat | |||
ابجد abJad | |||
(رسم الخط) RasmUlxat | |||
ابجدی abJadi | |||
حروف HURu:f | |||
ابر abR | |||
ابراہیم IbRa:Hi:m | |||
ابراہیمی IbRa:Hi:mi | |||
ابرق abRaq | |||
ابرنا UbaRna: | |||
ابرو abRu: | |||
کنول kV~val $2 | |||
ابل Ubal | |||
ابلا Ubla: | |||
ابلی Ubli: | |||
ابلیس Ibli:s | |||
الغرض alQaRaz | |||
الوقت Ulvaqt | |||
دہر dEHER | |||
ظلم z.Ulm | |||
ابو abu: | |||
طالب ta:lIb | |||
اپج UpaJ | |||
اپچار Upca:R | |||
اپدیش Upde:S | |||
اپواس Upva:s | |||
اپکار Upka:R | |||
سرسری saRsaRi $1 | |||
متخالف mUtaxa:lIf | |||
اتصالی ,ItIs.a:li | |||
اتمام ItIma:m | |||
حجت HUJat | |||
اتھل Ut#al | |||
پتھل pUt#al | |||
اجازت IJa:zat $2 | |||
اجرا IJRa: | |||
اجرت IJRa: | |||
اجگر aJgaR | |||
اجلا UJla: | |||
اجلی UJli: | |||
اجلے UJle: | |||
اجماع IJma: | |||
اجمل aJmal | |||
اجنبی aJnabi | |||
اجنٹ IJant. | |||
اجنڈا IJand.a: | |||
اچک Ucak | |||
اچکا Ucka: | |||
اجنب aJnab | |||
اچھوت ac#u:t | |||
اچھوتا ac#u:ta: | |||
اچھوتی ac#u:ti | |||
اچھوتے ac#u:te: | |||
پرسی pURsi: | |||
بالغیب bIlQEb $2 | |||
نگار nIga:R | |||
کاغذ ka:QaD | |||
اختری axtaRi: | |||
اخذ axaD | |||
جرات JURat | |||
اخوت Uxu:vat | |||
فہم fEHEm | |||
جرمنی JaRmani | |||
خدمت xIdmat | |||
شریعت SaRi;at | |||
ادت Idat | |||
ادراک IdRa:k | |||
تردد taRaddUd | |||
خدمات xIdma:t | |||
ادریس IdRi:s | |||
ادب adab | |||
ادغام IdQa:m | |||
ادلال Idla:l | |||
موا mu:a: | |||
ادھر Id#aR | |||
(ادھر ادھر) Id#aR||Ud#aR | |||
ادھم Ud#am | |||
اذالہ IDa:la | |||
ارتھ aRt# | |||
معلیٰ mUalla: | |||
ارسال IRsa:l | |||
ملیں mIle:n | |||
ارشاد IRSa:d | |||
ارض aRz | |||
سلطنت saltanat | |||
استاد Usta:d | |||
استادی Usta:di | |||
استر staR | |||
بخدا baxUda: | |||
بندش bandIS | |||
خرد xURd | |||
خردار xURda:R | |||
خردہ xURda | |||
خرشید xURSi:d | |||
تبرک tabaRUk | |||
خرم xURRam | |||
خزاں xIza:n | |||
پروردہ paRvaRda | |||
خشک xUSk | |||
خصوص xUs.u:s. | |||
زمرد zamaRUd | |||
جبلت JIbIll'at $2 | |||
بالآخر bIla:xIR | |||
شعاع SUa: | |||
حصار HIs.a:R | |||
شدگی SUdgi: | |||
بالاتفاق bIlItIfa:q | |||
بالاجماع bIlIJma: | |||
بالاجمال bIlIJma:l | |||
بالاشتراک bIlIStIRa:k | |||
بالاعلان bIle:la:n | |||
بالجبر bIlJabR | |||
بالعوض bIlIvaz | |||
بالغرض bIlQaRaz | |||
مرکزی maRkazi | |||
بالفرض bIlfaRz | |||
حکمت HIkmat | |||
بالفعل bIlfe:l | |||
بالمثل bIlmIsl | |||
بالمختصر bIlmUxtas.aR | |||
بالمشافہ bIlmUSa:fa | |||
بالمعنی bIlma:ni | |||
بالمقابل bIlmUqa:bIl | |||
بالواسطہ bIlva:sta | |||
نیند ni:nd | |||
باوجودیکہ ba:vUJu:de:ke: | |||
کتا kUt:a: $2 | |||
دکھاؤ dIk#a:o: | |||
کتے kUt:e: $2 | |||
کتوں kUt:o:n | |||
بپھر bIp#aR | |||
شکن SIkan | |||
بتکرار batakRa:R | |||
بچھ bIc# | |||
منجمد mUnJamId | |||
بحر bEHER | |||
بخدمت baxIdmat | |||
منکشف mUnkaSIf | |||
بخش baxS | |||
بخشش baxSIS | |||
جدت JIdat | |||
بخوشی baxUSi: | |||
بخیر baxE:R | |||
بچپن bacpan | |||
بچپنا bacpana: | |||
قطب qUtUb | |||
ذہن zEHEn | |||
سلوک sUlu:k | |||
انڈین Ind.i;an | |||
متنبہ mUtanabe: | |||
قیمتی qi:mti: | |||
بدک bIdak | |||
بذریعہ baDaRi:;a: | |||
برا bURa: | |||
نسبتی nIsbati | |||
برتن baRtan | |||
برج bURJ | |||
برد bURd | |||
بردہ bURda | |||
رغبت RaQbat | |||
برضا baRaza: | |||
علاج Ila:J | |||
الفت Ulfat | |||
برگزیدہ baRgUzi:da | |||
برہمن bRaHman | |||
الذمہ UzzIma | |||
صحبت s.OHbat | |||
برے bURe: | |||
بز bUz | |||
بزم bazm | |||
بستر bIstaR | |||
مرگ maRg | |||
بسکٹ bIskIt. | |||
(بسم اللہ) bIsmIl:a:H | |||
بسم bIsm | |||
بسنت basant | |||
بضد bazId | |||
بعید bai:d | |||
بغض bUQz | |||
بقید baqE:d | |||
(بلا واسطہ) bIla:||va:sta | |||
بلال bIla:l | |||
بلبل bUlbUl | |||
بلبلے bUlbUle: | |||
بلک bIlak | |||
بلیک ble:k | |||
مارکٹ ma:RkIt. | |||
(بن بلائے) bIn||bUla:e: | |||
(بن مول) bIn||mo:l | |||
بنت bInt | |||
سنور sV~vaR | |||
بو bu: $only | |||
بورڈنگ bo:Rd.Ing | |||
بولنگ bo:lIng | |||
امرت amRIt | |||
(ان بجھا) anbUJ#a: | |||
(ان بن) anban | |||
(ان پڑھ) anpar.h | |||
(ان گنت) an||gInat | |||
قدرت qUdRat | |||
انسلٹ Insalt. | |||
انسیت Unsi;at | |||
اللہ al:a:H | |||
انصاف Ins.a:f | |||
انصافی Ins.a:fi | |||
تپش tapIS | |||
انثیت Unsi;at | |||
انجم anJUm | |||
انجمن anJUman | |||
الجھن UlJ#an | |||
الحمد alHamd | |||
التفات IltIfa:t |
@@ -1,5 +1,5 @@ | |||
| |||
// This ur_rules file is written by Him Prasad Gautam (Kathmandu, Nepal). | |||
// This ur_rules file is written by Him Prasad Gautam (Kathmandu, Nepal) and Ejaz Shah (Pakistan). | |||
// This file is UTF8 encoded | |||
// phoneme rules for Urdu | |||
// Letter group - l01: Vowels | |||
@@ -17,16 +17,18 @@ | |||
٩ 9 | |||
ي ی | |||
یٰ ا | |||
ٰی ا | |||
آ آ | |||
// vowel signs, alif acts as consonants at start of word if these follow | |||
.L01 َ ِ ُ و ی ع ا ے | |||
// Consonants | |||
.L02 ب پ ت ٹ ث ج چ ح خ د ڈ ذ ر ڑ ز ژ س ش ص ض ط ظ غ ف ق ک گ ل م ن ہ ئ | |||
.L02 ب بھ پ پھ ت تھ ٹ ٹھ ث ج جھ چ چھ ح خ د دھ ڈ ڈھ ذ ر ڑ ز ژ س ش ص ض ط ظ غ ف ق ک کھ گ گھ ل م ن ہ ئ | |||
// Letter group - L03: Most of the letters | |||
.L03 ا ب پ ت ٹ ث ج چ ح خ د ڈ ذ ر ڑ ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ہ ئ ی ے | |||
.L03 ا ب بھ پ پھ ت تھ ٹ ٹھ ث ج جھ چ چھ ح خ د دھ ڈ ڈھ ذ ر ڑ ز ژ س ش ص ض ط ظ ع غ ف ق ک کھ گ گھ ل م ن و ہ ئ ی ے ٰ | |||
// VOWELS | |||
@@ -34,7 +36,7 @@ | |||
َ a | |||
َی E | |||
َے E | |||
َو O | |||
َو aU | |||
َع a: | |||
.group ِ | |||
@@ -48,6 +50,9 @@ | |||
ُو u: | |||
ُع O | |||
.group ٗ | |||
ٗ u: | |||
.group ھ | |||
ھ HV | |||
ھ (_ H: | |||
@@ -80,7 +85,7 @@ _) ای e: | |||
افتتاح ,ItIt'a:H | |||
اسلام ,Isl'a:m | |||
_) انسان Ins'a:n | |||
_) انت (L02 'Int,a | |||
_) انت (L02L01 'Int,a | |||
_) امید Um'i:d | |||
اً(_S2 'an | |||
_) امکان ,Imk'a:n | |||
@@ -123,12 +128,65 @@ _) ای e: | |||
_) است (L02 ,IstI | |||
_) ارت (L02 ,IRtI | |||
_) ادار Ida:R | |||
_)انک(L02L01 InkI | |||
_)انہتر UnHataR | |||
_)او(ا av | |||
_)انہ(L02L01 InHI | |||
_)اٹھتال at.#ta:l | |||
_)اٹھتر at.#at:aR | |||
_)اٹھتیس at.#ti:s | |||
_)اٹھلا It.#la: | |||
_)اٹھ(و Ut.# | |||
_)اکت(L02L01 IktI | |||
_)اکسا Uksa: | |||
_)اکٹھ(L01 Ikat.t.# | |||
_)اکہر IkEHR | |||
_)اکیل ake:l | |||
_)ائ aI | |||
_)ابال Uba:l | |||
_)ابوال(P5 abUl | |||
L02)او(L02 a:vV | |||
_)ابھار Ub#a:R | |||
_)اتار Uta:R | |||
_)اترو(L01 UtaRv | |||
_)ابکائ Ubka: | |||
_)اجت(L02L01 IJtI | |||
_)اجا(ر IJa: | |||
_)اجال UJa:l | |||
_)اجاڑ UJa:r. | |||
_)اچھال Uc#a:l | |||
_)اداس Uda:s | |||
_)ادھار Ud#a:R | |||
_)ادھڑ(L01 Ud#r. | |||
_)ادھڑ Ud#ar. | |||
_)ادھیڑ Ud#e:r. | |||
_)ارا(د IRa: | |||
_)اونچ u:nc | |||
اں a~ | |||
_)انج(L02L01 InJI | |||
_)امت(L02L01 ImtI | |||
_)انح(L02L01 InHI | |||
_)انخ(L02L01 InxI | |||
_)انس(پ Ins | |||
_)انس(L02L01 InsI | |||
_)انس(ٹ Ins | |||
_)انسٹھ Unsat.# | |||
_)انشا InSa: | |||
_)انش(L02L01 InSI | |||
_)انص(L02L01 Ins.I | |||
_)انض(L02L01 InzI | |||
_)انق(L02L01 InqI | |||
_)الت(L02L01 IltI | |||
_)انف(L02L01 InfI | |||
_)ال(L03L03L03P2 al | |||
.group آ | |||
آ a: | |||
آتش 'a:tIS | |||
آہست a:H'Ist | |||
آئ (L02 'a:I | |||
آمیز a:me:z | |||
آویز a:ve:z | |||
.group ع | |||
@@ -141,6 +199,8 @@ _) ای e: | |||
_) عمر 'UmR | |||
L02) عی (_ 'ai: | |||
علیحد 'alEHd | |||
عُ 'U | |||
عِ I | |||
.group و | |||
و o: | |||
@@ -152,8 +212,11 @@ _) ای e: | |||
وّ vv | |||
L02L02L02) و (L02 u: | |||
L02) ونکہ (_ u:nk'e:H | |||
L02L01) و (L02 vV | |||
L01) و (L01 v | |||
_L02)و(L01 av | |||
L01)و(L01 v | |||
وؤ u:o: | |||
L03L03L03L03)وں(S2 o:n | |||
_L02L01)و(L02_ vV | |||
.group ی | |||
ی e: | |||
@@ -162,12 +225,17 @@ _) ای e: | |||
_) ی jV | |||
یع(_ i: | |||
@) ی i: | |||
@) یں (_ e:n | |||
@) یں (_ e~ | |||
یّ jj | |||
@) یت (_S2 i:;'at | |||
_) یو jO | |||
ی (و e: | |||
L02)یوں i;o:n | |||
L03)یکشن e:kSan | |||
L03L03L03L03)یں(S2 e~ | |||
یں e~ | |||
L03)یک(ٹ e:k | |||
L03L01)یا(_S2 ja: | |||
.group ے // yeh barree | |||
ے e: | |||
@@ -180,7 +248,7 @@ _) ای e: | |||
ئ | |||
.group ؤ | |||
ؤ aU // ?? | |||
ؤ o: | |||
.group أ | |||
أ // ?? | |||
@@ -220,6 +288,12 @@ _) ای e: | |||
بوڑھ b'u:r.h | |||
_) بے (P2 b'e: | |||
بحران b,OHR'a:n | |||
_)بپھر(L01 bIp#R | |||
_)بچھ bIc# | |||
_)بخار bUxa:R | |||
_)برائی bURa:i | |||
_)بوا(ئ boa: | |||
_)بزدل bUzdIl | |||
.group پ | |||
@@ -237,6 +311,7 @@ _) ای e: | |||
پیچھ p'i:c# | |||
پھونک p#'u:nk | |||
_) پور (L01 p'u:R | |||
_)پچھل(L01 pIc#l | |||
.group ت | |||
ت tV | |||
@@ -254,10 +329,11 @@ _) ای e: | |||
تجرب taJ'aRb | |||
_) تیار t,ai:;'a:R | |||
_) تیسر t'i:sR | |||
L03L03) تا (_S2 ta: | |||
L03L03)تا(_S2 ta: | |||
L03L03) تی (_S2 ti: | |||
L03L03) تے (_S2 te: | |||
_) توا t'ava: | |||
تہ(_ ta | |||
.group ٹ | |||
ٹ t.V | |||
@@ -295,6 +371,7 @@ _) ای e: | |||
_) جمل J'Uml | |||
_) جہ (L02 J'EH | |||
_) جدا J'Uda: | |||
_)جذب JaDb | |||
.group چ | |||
چ cV | |||
@@ -320,6 +397,7 @@ _) ای e: | |||
حّ HHV | |||
حّ (L01 HH | |||
_)حیا Haja: | |||
.group خ | |||
خ xV | |||
@@ -331,6 +409,8 @@ _) ای e: | |||
_) خود x'Ud | |||
_) خواہش xv'a:HIS | |||
_) خیا x'aja: | |||
_)خوا xva: | |||
_)خدا xUda: | |||
.group د | |||
@@ -353,6 +433,7 @@ _) ای e: | |||
_) دوسر d'u:sR | |||
_) دین de:n | |||
_) دیت de:t | |||
دہ(_ da | |||
.group ڈ | |||
ڈ d.V | |||
@@ -366,11 +447,9 @@ _) ای e: | |||
ڈرائیور d.R'a:jvaR | |||
.group ذ | |||
ذ DV | |||
ذ (L01 D | |||
ذّ DDV | |||
ذّ (L01 DD | |||
_) ذہ (L02 D'EH | |||
ذ zV | |||
ذ (L01 z | |||
_) ذہ (L02 z'EH | |||
.group ر | |||
ر RV | |||
@@ -446,6 +525,7 @@ _) ای e: | |||
_) شخص S'axs. | |||
_) شہ (L02 S'EH | |||
شرمند S,aRm'Ind | |||
_)شمار SUma:R | |||
.group ص | |||
ص s.V | |||
@@ -529,12 +609,13 @@ _) ای e: | |||
_) گہ (L02 g'EH | |||
گزارش gUz'a:RIS | |||
_) گیت g'i:t | |||
_)گزار gUza:R | |||
.group ل | |||
ل lV | |||
ل (L01 l | |||
لّ llV | |||
لّ (L01 ll | |||
لّ l:V | |||
لّ (L01 l: | |||
لکھ l'Ik# | |||
_) لہ (L02 l'EH | |||
_) لیت le:t | |||
@@ -596,12 +677,12 @@ _) ای e: | |||
_) نمٹ nIm'at. | |||
_) نمٹ (L01 nImt. | |||
@) ن (پ n | |||
@) نچل n'Icl | |||
_) نچل n'Icl | |||
نشان nIS'a:n | |||
@) ن (ڈ n | |||
_) نظر naz.'aR | |||
_) نظام nIz.'a:m | |||
_) نہ (L02 n'H | |||
_) نہ (L02 nEHE | |||
L01) نٹ n't. | |||
نھ nH | |||
_) نکت n'Ukt | |||
@@ -626,8 +707,8 @@ _) ای e: | |||
ہ H | |||
_) ہ (L01 H | |||
_) ہ (ند HI | |||
ہّ HHV | |||
ہّ (L01 HH | |||
ہّ H:V | |||
ہّ (L01 H: | |||
ہ (_ a | |||
_) ہلن H'Iln | |||
@@ -636,24 +717,25 @@ _) ای e: | |||
_) ہم (L02L02L02P2 H'am | |||
.group ّ | |||
ّ | |||
ّ : | |||
.group ً | |||
ً | |||
ً an | |||
// Common symbols | |||
.group | |||
$ do:l@R | |||
, sVkat.Vh // Sakata سکتہ | |||
! f'iJa:ja //Fijaya فجائیہ | |||
; w'ak't'a //Waqfa وقفہ | |||
, sakta // Sakta سکتہ | |||
! f'iJa:ja //Fijaya فجائیہ | |||
; vakfa //Waqfa وقفہ | |||
: r'a:b'tah//Rabtar رابطہ | |||
? saw'a:l'i:ja:n'is'a:nV // Sawaliya Nishan سوالیہ نشان | |||
% f'i:sVd //Fisad فیصد | |||
% f'i:sVd //Fisad فیصد | |||
۔ xatma //Khatma ختمہ | |||
؟ sava:li:;a:||nISa:n //Sawalya Nishan سوالیہ نشان | |||
.group 0xe0a4 // devanagari | |||
0xe0a4 _^_NE // switch to Nepali voice |
@@ -55,9 +55,9 @@ The utility 'phonemes' are: | |||
| `=` | put the primary stress on the preceding syllable | | |||
| `_:` | short pause | | |||
| `_` | a shorter pause | | |||
| `||` | indicates a word boundary within a phoneme string | | |||
| `|` | can be used to separate two adjacent characters, to prevent them from being considered as a multi-character phoneme mnemonic | | |||
| <code>|</code> | indicates a word boundary within a phoneme string | | |||
| <code>||</code> | can be used to separate two adjacent characters, to prevent them from being considered as a multi-character phoneme mnemonic | | |||
It is not necessary to specify the stress of every syllable. Stress | |||
markers are only needed in order to change the effect of the language's | |||
default stress rule. |
@@ -8,7 +8,7 @@ and dialects, | |||
[private-use extensions](https://raw.githubusercontent.com/espeak-ng/bcp47-data/master/bcp47-extensions) | |||
have been used. | |||
The supported languages are: | |||
The 100 supported languages and accents are: | |||
| Family Code | Identifier | Language Family | Language | Accent/Dialect | | |||
|-------------|-------------------|-----------------------|-----------------------------|------------------------| | |||
@@ -75,6 +75,7 @@ The supported languages are: | |||
| `art` | `lfn` | Constructed | Lingua Franca Nova | | | |||
| `bat` | `lt` | Baltic | Lithuanian | | | |||
| `art` | `jbo` | Constructed | Lojban | | | |||
| `poz` | `mi` | Malayo-Polynesian | Māori | | | |||
| `zls` | `mk` | South Slavic | Macedonian | | | |||
| `poz` | `ms` | Malayo-Polynesian | Malay | | | |||
| `dra` | `ml` | Dravidian | Malayalam | | |
@@ -52,6 +52,12 @@ | |||
display: block; | |||
margin-bottom: 1rem; | |||
} | |||
#ipaarea { | |||
width: 100%; | |||
height: 8rem; | |||
display: block; | |||
margin-bottom: 1rem; | |||
} | |||
p.gh { | |||
color: #333; | |||
text-align: right; | |||
@@ -100,6 +106,7 @@ | |||
<h1>espeakng.js 1.49.1 Demo</h1> | |||
<form> | |||
<textarea id="texttospeak">Call me Ishmael. Some years ago --- never mind how long precisely --- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving off the spleen and regulating the circulation.</textarea> | |||
<textarea readonly="true" placeholder="IPA" id="ipaarea"></textarea> | |||
<div class="speecharg"> | |||
<label for="pitch">Pitch</label><input id="pitch" type="range" value="50" min="0" max="100" /><button type="button" aria-label="Reset pitch" title="Reset pitch" onclick="resetPitch();">↶</button> | |||
</div> | |||
@@ -110,7 +117,7 @@ | |||
<label for="voice">Voice</label><select id="voice"></select><button type="button" aria-label="Reset voice" title="Reset voice" onclick="resetVoice();">↶</button> | |||
</div> | |||
<div class="bottom"> | |||
<button type="button" onmousedown="speak();">Speak</button> | |||
<button type="button" onmousedown="speakAndIpa();">Speak</button> | |||
<button type="button" onmousedown="stop();">Stop</button> | |||
</div> | |||
<p class="gh"><a href="https://github.com/eeejay/espeak/tree/emscripten">Original Code for eSpeak: Eitan Isaacson</a></p> |
@@ -50,6 +50,35 @@ public: | |||
espeak_SetSynthCallback(NULL); | |||
} | |||
int synth_ipa_(const char* aText, const char* virtualFileName) { | |||
/* phoneme_mode | |||
bit 1: 0=eSpeak's ascii phoneme names, 1= International Phonetic Alphabet (as UTF-8 characters). | |||
bit 7: use (bits 8-23) as a tie within multi-letter phonemes names | |||
bits 8-23: separator character, between phoneme names | |||
*/ | |||
espeak_SetSynthCallback(NULL); | |||
int phoneme_options = (1 << 1); // Use IPA | |||
int use_custom_phoneme_separator = (0 << 7); | |||
int phonemes_separator = ' '; // Use a default value | |||
int phoneme_conf = phoneme_options | (phonemes_separator << 8); | |||
FILE* f_phonemes_out = fopen(virtualFileName,"wb"); | |||
if(!f_phonemes_out) | |||
return -1; | |||
//espeak_ng_InitializeOutput(ENOUTPUT_MODE_SYNCHRONOUS, 0, NULL); | |||
espeak_SetPhonemeTrace(phoneme_conf, f_phonemes_out); | |||
espeak_Synth(aText, 0, 0, POS_CHARACTER, 0, 0, NULL, NULL); | |||
espeak_SetPhonemeTrace(0, NULL); | |||
fclose(f_phonemes_out); | |||
return 0; | |||
} | |||
long set_voice( | |||
const char* aName, | |||
const char* aLang=NULL, |
@@ -52,6 +52,7 @@ interface espeak_EVENT { | |||
interface eSpeakNGWorker { | |||
void eSpeakNGWorker(); | |||
void synth_(DOMString aText, VoidPtr aCallback); | |||
long synth_ipa_(DOMString aText, DOMString virtualFileName); | |||
long getSizeOfEventStruct_(); | |||
long set_voice(DOMString aName, DOMString aLang, optional octet gender=0, optional octet age=0, optional octet aVariant=0); | |||
[Const] attribute espeak_VOICE[] voices; |
@@ -179,10 +179,12 @@ function speak() { | |||
pusher.connect(ctx.destination); | |||
console.log(' Creating pusher... done'); | |||
var user_text = document.getElementById('texttospeak').value; | |||
// actual synthesis | |||
console.log(' Calling synthesize...'); | |||
tts.synthesize( | |||
document.getElementById('texttospeak').value, | |||
user_text, | |||
function cb(samples, events) { | |||
//console.log(' Inside synt cb'); | |||
if (!samples) { | |||
@@ -203,11 +205,32 @@ function speak() { | |||
//console.log(' Leaving synt cb'); | |||
} // end of function cb | |||
); // end of tts.synthesize() | |||
console.log(' Calling synthesize... done'); | |||
console.log(' Calling synthesize... done'); | |||
console.log('Leaving speak()'); | |||
} // end of speak() | |||
function ipa() { | |||
console.log("Synthesizing ipa ... "); | |||
var ts = new Date(); | |||
var user_text = document.getElementById('texttospeak').value; | |||
//user_text = user_text.repeat(50); | |||
tts.set_voice(document.getElementById('voice').value); | |||
tts.synthesize_ipa(user_text, function(result) { | |||
var te = new Date(); | |||
document.getElementById('ipaarea').value = result.ipa; | |||
console.log("Ipa synthesis done in " + (te-ts) + " ms.") | |||
}); | |||
} | |||
function speakAndIpa() { | |||
speak(); | |||
ipa(); | |||
} | |||
function resetPitch() { | |||
document.getElementById('pitch').value = 50; | |||
} | |||
@@ -254,5 +277,6 @@ function initializeDemo() { | |||
console.log('Leaving cb1'); | |||
} // end of function cb1 | |||
); | |||
console.log('Creating eSpeakNG instance... done'); | |||
} |
@@ -63,7 +63,8 @@ for (var method of [ | |||
'set_rate', | |||
'set_pitch', | |||
'set_voice', | |||
'synthesize' | |||
'synthesize', | |||
'synthesize_ipa' | |||
]) { | |||
eSpeakNG.prototype[method] = _createAsyncMethod(method); | |||
} |
@@ -93,6 +93,28 @@ eSpeakNGWorker.prototype.synthesize = function (aText, aCallback) { | |||
Runtime.removeFunction(fp); | |||
}; | |||
eSpeakNGWorker.prototype.synthesize_ipa = function (aText, aCallback) { | |||
// Use a unique temp file for the worker. Avoid collisions, just in case. | |||
var ipaVirtualFileName = "espeak-ng-ipa-tmp-" + Math.random().toString().substring(2); | |||
var res = ""; | |||
var code = this.synth_ipa_(aText, ipaVirtualFileName); | |||
if(code == 0) | |||
res = FS.readFile(ipaVirtualFileName, { encoding: 'utf8' }) | |||
// Clean up the tmp file | |||
FS.unlink(ipaVirtualFileName); | |||
var ret = { | |||
code: code, | |||
ipa: res | |||
} | |||
return ret; | |||
}; | |||
// Make this a worker | |||
if (typeof WorkerGlobalScope !== 'undefined') { | |||
@@ -104,6 +126,7 @@ if (typeof WorkerGlobalScope !== 'undefined') { | |||
}); | |||
onmessage = function(e) { | |||
if (!worker) { | |||
throw 'eSpeakNGWorker worker not initialized'; | |||
} |
@@ -1,2 +1,3 @@ | |||
name Sindhi | |||
language sd | |||
maintainer Ejaz Shah <[email protected]> |
@@ -1,3 +1,4 @@ | |||
name Māori | |||
language mi | |||
status testing | |||
@@ -0,0 +1,75 @@ | |||
# =========================================================================== | |||
# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html | |||
# =========================================================================== | |||
# | |||
# SYNOPSIS | |||
# | |||
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) | |||
# | |||
# DESCRIPTION | |||
# | |||
# Check whether the given FLAG works with the current language's compiler | |||
# or gives an error. (Warnings, however, are ignored) | |||
# | |||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on | |||
# success/failure. | |||
# | |||
# If EXTRA-FLAGS is defined, it is added to the current language's default | |||
# flags (e.g. CFLAGS) when the check is done. The check is thus made with | |||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to | |||
# force the compiler to issue an error when a bad flag is given. | |||
# | |||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE. | |||
# | |||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this | |||
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. | |||
# | |||
# LICENSE | |||
# | |||
# Copyright (c) 2008 Guido U. Draheim <[email protected]> | |||
# Copyright (c) 2011 Maarten Bosmans <[email protected]> | |||
# | |||
# This program is free software: you can redistribute it and/or modify it | |||
# under the terms of the GNU General Public License as published by the | |||
# Free Software Foundation, either version 3 of the License, or (at your | |||
# option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, but | |||
# WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | |||
# Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License along | |||
# with this program. If not, see <https://www.gnu.org/licenses/>. | |||
# | |||
# As a special exception, the respective Autoconf Macro's copyright owner | |||
# gives unlimited permission to copy, distribute and modify the configure | |||
# scripts that are the output of Autoconf when processing the Macro. You | |||
# need not follow the terms of the GNU General Public License when using | |||
# or distributing such scripts, even though portions of the text of the | |||
# Macro appear in them. The GNU General Public License (GPL) does govern | |||
# all other use of the material that constitutes the Autoconf Macro. | |||
# | |||
# This special exception to the GPL applies to versions of the Autoconf | |||
# Macro released by the Autoconf Archive. When you make and distribute a | |||
# modified version of the Autoconf Macro, you may extend this special | |||
# exception to the GPL to apply to your modified version as well. | |||
#serial 5 | |||
AC_DEFUN([AX_CHECK_COMPILE_FLAG], | |||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF | |||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl | |||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ | |||
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS | |||
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" | |||
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], | |||
[AS_VAR_SET(CACHEVAR,[yes])], | |||
[AS_VAR_SET(CACHEVAR,[no])]) | |||
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) | |||
AS_VAR_IF(CACHEVAR,yes, | |||
[m4_default([$2], :)], | |||
[m4_default([$3], :)]) | |||
AS_VAR_POPDEF([CACHEVAR])dnl | |||
])dnl AX_CHECK_COMPILE_FLAGS | |||
@@ -198,6 +198,25 @@ phoneme n- // more voiced variant of n | |||
FMT(n/n-syl) | |||
endphoneme | |||
phoneme h // more quiet version of standard h | |||
vls glt apr | |||
lengthmod 3 | |||
ipa h | |||
IF nextPh(#a) THEN | |||
WAV(h/ha, 20) | |||
ELIF nextPh(#e) THEN | |||
WAV(h/he, 20) | |||
ELIF nextPh(#i) THEN | |||
WAV(h/hi, 20) | |||
ELIF nextPh(#o) THEN | |||
WAV(h/ho, 20) | |||
ELIF nextPh(#u) THEN | |||
WAV(h/hu, 20) | |||
ENDIF | |||
WAV(h/h_, 20) // no vowel following | |||
endphoneme | |||
phoneme R // Latvian hard r | |||
liquid trl | |||
lengthmod 6 | |||
@@ -336,15 +355,6 @@ phoneme } // Tiny, 5ms non-linked pause (used between phonemes in word) | |||
length 5 | |||
endphoneme | |||
// TODO should use this with correct lengthening | |||
//phoneme l | |||
// liquid | |||
// unstressed | |||
// dnt | |||
// length 150 | |||
// FMT(vwl_hi/l-voc) | |||
//endphoneme | |||
phoneme s | |||
vls alv frc sib | |||
voicingswitch z | |||
@@ -422,4 +432,3 @@ phoneme l | |||
endphoneme | |||
@@ -126,7 +126,7 @@ FILE *f_wavfile = NULL; | |||
char filetype[5]; | |||
char wavefile[200]; | |||
void DisplayVoices(FILE *f_out, char *language) | |||
static void DisplayVoices(FILE *f_out, char *language) | |||
{ | |||
int ix; | |||
const char *p; | |||
@@ -197,7 +197,7 @@ static void Write4Bytes(FILE *f, int value) | |||
} | |||
} | |||
int OpenWavFile(char *path, int rate) | |||
static int OpenWavFile(char *path, int rate) | |||
{ | |||
static unsigned char wave_hdr[44] = { | |||
'R', 'I', 'F', 'F', 0x24, 0xf0, 0xff, 0x7f, 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ', | |||
@@ -598,7 +598,7 @@ int main(int argc, char **argv) | |||
} | |||
if (voicename[0] == 0) | |||
strcpy(voicename, "en"); | |||
strcpy(voicename, ESPEAKNG_DEFAULT_VOICE); | |||
result = espeak_ng_SetVoiceByName(voicename); | |||
if (result != ENS_OK) { |
@@ -32,7 +32,4 @@ | |||
#include <ucd/ucd.h> | |||
#define towlower ucd_tolower | |||
#define towupper ucd_toupper | |||
#endif |
@@ -17,6 +17,8 @@ | |||
#ifndef ESPEAK_NG_ENCODING_H | |||
#define ESPEAK_NG_ENCODING_H | |||
#include <stdint.h> | |||
#ifdef __cplusplus | |||
extern "C" | |||
{ |
@@ -36,6 +36,8 @@ extern "C" | |||
#define ESPEAK_NG_API | |||
#endif | |||
#define ESPEAKNG_DEFAULT_VOICE "en" | |||
typedef enum { | |||
ENS_GROUP_MASK = 0x70000000, | |||
ENS_GROUP_ERRNO = 0x00000000, /* Values 0-255 map to errno error codes. */ |
@@ -38,7 +38,7 @@ | |||
#define ESPEAK_API | |||
#endif | |||
#define ESPEAK_API_REVISION 10 | |||
#define ESPEAK_API_REVISION 12 | |||
/* | |||
Revision 2 | |||
Added parameter "options" to eSpeakInitialize() | |||
@@ -68,6 +68,12 @@ Revision 9 30.May.2013 | |||
Revision 10 29.Aug.2014 | |||
Changed phonememode parameter to espeak_TextToPhonemes() and espeak_SetPhonemeTrace | |||
Revision 11 (espeak-ng) | |||
Made ESPEAK_API import/export symbols correctly on Windows. | |||
Revision 12 (espeak-ng) | |||
Exposed espeak_SetPhonemeCallback. This is available in eSpeak, but was not exposed in this header. | |||
*/ | |||
/********************/ | |||
/* Initialization */ | |||
@@ -260,6 +266,11 @@ int UriCallback(int type, const char *uri, const char *base); | |||
occurs. The calling program can then play the sound at that point. | |||
*/ | |||
#ifdef __cplusplus | |||
extern "C" | |||
#endif | |||
ESPEAK_API void espeak_SetPhonemeCallback(int (*PhonemeCallback)(const char *)); | |||
/********************/ | |||
/* Synthesis */ |
@@ -1,75 +0,0 @@ | |||
/* | |||
* Copyright (C) 2017 Reece H. Dunn | |||
* | |||
* This program is free software; you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License as published by | |||
* the Free Software Foundation; either version 3 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU General Public License | |||
* along with this program; if not, see: <http://www.gnu.org/licenses/>. | |||
*/ | |||
#ifndef ESPEAK_NG_TOKENIZER_H | |||
#define ESPEAK_NG_TOKENIZER_H | |||
#ifdef __cplusplus | |||
extern "C" | |||
{ | |||
#endif | |||
typedef struct espeak_ng_TOKENIZER_ espeak_ng_TOKENIZER; | |||
ESPEAK_NG_API espeak_ng_TOKENIZER * | |||
create_tokenizer(void); | |||
ESPEAK_NG_API void | |||
destroy_tokenizer(espeak_ng_TOKENIZER *tokenizer); | |||
typedef enum | |||
{ | |||
ESPEAKNG_TOKENIZER_OPTION_TEXT = 0, | |||
} espeak_ng_TOKENIZER_OPTIONS; | |||
ESPEAK_NG_API int | |||
tokenizer_reset(espeak_ng_TOKENIZER *tokenizer, | |||
espeak_ng_TEXT_DECODER *decoder, | |||
espeak_ng_TOKENIZER_OPTIONS options); | |||
typedef enum | |||
{ | |||
ESPEAKNG_TOKEN_END_OF_BUFFER, | |||
ESPEAKNG_TOKEN_UNKNOWN, | |||
ESPEAKNG_TOKEN_NEWLINE, | |||
ESPEAKNG_TOKEN_PARAGRAPH, | |||
ESPEAKNG_TOKEN_WHITESPACE, | |||
ESPEAKNG_TOKEN_WORD_UPPERCASE, | |||
ESPEAKNG_TOKEN_WORD_LOWERCASE, | |||
ESPEAKNG_TOKEN_WORD_MIXEDCASE, | |||
ESPEAKNG_TOKEN_WORD_CAPITALIZED, | |||
ESPEAKNG_TOKEN_FULL_STOP, | |||
ESPEAKNG_TOKEN_QUESTION_MARK, | |||
ESPEAKNG_TOKEN_EXCLAMATION_MARK, | |||
ESPEAKNG_TOKEN_COMMA, | |||
ESPEAKNG_TOKEN_COLON, | |||
ESPEAKNG_TOKEN_SEMICOLON, | |||
ESPEAKNG_TOKEN_ELLIPSIS, | |||
ESPEAKNG_TOKEN_PUNCTUATION, | |||
ESPEAKNG_TOKEN_SYMBOL, | |||
} espeak_ng_TOKEN_TYPE; | |||
ESPEAK_NG_API espeak_ng_TOKEN_TYPE | |||
tokenizer_read_next_token(espeak_ng_TOKENIZER *tokenizer); | |||
ESPEAK_NG_API const char * | |||
tokenizer_get_token_text(espeak_ng_TOKENIZER *tokenizer); | |||
#ifdef __cplusplus | |||
} | |||
#endif | |||
#endif |
@@ -33,13 +33,15 @@ | |||
#include <espeak-ng/espeak_ng.h> | |||
#include <espeak-ng/speak_lib.h> | |||
#include <espeak-ng/encoding.h> | |||
#include "error.h" | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "spect.h" | |||
#include "translate.h" | |||
typedef struct { | |||
unsigned int value; | |||
@@ -50,9 +52,6 @@ NAMETAB *manifest = NULL; | |||
int n_manifest; | |||
char phsrc[sizeof(path_home)+40]; // Source: path to the 'phonemes' source file. | |||
extern ESPEAK_NG_API int utf8_in(int *c, const char *buf); | |||
extern int utf8_out(unsigned int c, char *buf); | |||
typedef struct { | |||
const char *mnem; | |||
int type; | |||
@@ -722,7 +721,7 @@ static void unget_char(unsigned int c) | |||
linenum--; | |||
} | |||
int CheckNextChar() | |||
static int CheckNextChar() | |||
{ | |||
int c; | |||
while (((c = get_char()) == ' ') || (c == '\t')) | |||
@@ -893,7 +892,7 @@ static int Range(int value, int divide, int min, int max) | |||
return value - min; | |||
} | |||
int CompileVowelTransition(int which) | |||
static int CompileVowelTransition(int which) | |||
{ | |||
// Compile a vowel transition | |||
int key; | |||
@@ -999,7 +998,7 @@ int CompileVowelTransition(int which) | |||
return 0; | |||
} | |||
espeak_ng_STATUS LoadSpect(const char *path, int control, int *addr) | |||
static espeak_ng_STATUS LoadSpect(const char *path, int control, int *addr) | |||
{ | |||
SpectSeq *spectseq; | |||
int peak; | |||
@@ -1401,15 +1400,17 @@ static int LoadEnvelope2(FILE *f, const char *fname) | |||
n_points++; | |||
} | |||
} | |||
env_x[n_points] = env_x[n_points-1]; | |||
env_y[n_points] = env_y[n_points-1]; | |||
if (n_points > 0) { | |||
env_x[n_points] = env_x[n_points-1]; | |||
env_y[n_points] = env_y[n_points-1]; | |||
} | |||
ix = -1; | |||
ix2 = 0; | |||
for (x = 0; x < ENV_LEN; x++) { | |||
if (x > env_x[ix+4]) | |||
if (n_points > 0) for (x = 0; x < ENV_LEN; x++) { | |||
if (n_points > 3 && x > env_x[ix+4]) | |||
ix++; | |||
if (x >= env_x[ix2+1]) | |||
if (n_points > 2 && x >= env_x[ix2+1]) | |||
ix2++; | |||
if (env_lin[ix2] > 0) { | |||
@@ -1612,7 +1613,7 @@ static void CompileSound(int keyword, int isvowel) | |||
=8 data = stress bitmap | |||
=9 special tests | |||
*/ | |||
int CompileIf(int elif) | |||
static int CompileIf(int elif) | |||
{ | |||
int key; | |||
int finish = 0; | |||
@@ -1721,7 +1722,7 @@ int CompileIf(int elif) | |||
return 0; | |||
} | |||
void FillThen(int add) | |||
static void FillThen(int add) | |||
{ | |||
USHORT *p; | |||
int offset; | |||
@@ -1749,7 +1750,7 @@ void FillThen(int add) | |||
then_count = 0; | |||
} | |||
int CompileElse(void) | |||
static int CompileElse(void) | |||
{ | |||
USHORT *ref; | |||
USHORT *p; | |||
@@ -1776,7 +1777,7 @@ int CompileElse(void) | |||
return 0; | |||
} | |||
int CompileElif(void) | |||
static int CompileElif(void) | |||
{ | |||
if (if_level < 1) { | |||
error("ELIF not expected"); | |||
@@ -1788,7 +1789,7 @@ int CompileElif(void) | |||
return 0; | |||
} | |||
int CompileEndif(void) | |||
static int CompileEndif(void) | |||
{ | |||
USHORT *p; | |||
int chain; | |||
@@ -1951,7 +1952,7 @@ static void DecThenCount() | |||
then_count--; | |||
} | |||
int CompilePhoneme(int compile_phoneme) | |||
static int CompilePhoneme(int compile_phoneme) | |||
{ | |||
int endphoneme = 0; | |||
int keyword; | |||
@@ -2231,11 +2232,11 @@ int CompilePhoneme(int compile_phoneme) | |||
CompileToneSpec(); | |||
break; | |||
case kCONTINUE: | |||
*prog_out++ = OPCODE_CONTINUE; | |||
*prog_out++ = INSTN_CONTINUE; | |||
DecThenCount(); | |||
break; | |||
case kRETURN: | |||
*prog_out++ = OPCODE_RETURN; | |||
*prog_out++ = INSTN_RETURN; | |||
DecThenCount(); | |||
break; | |||
case kINCLUDE: | |||
@@ -2248,7 +2249,7 @@ int CompilePhoneme(int compile_phoneme) | |||
if (if_level > 0) | |||
error("Missing ENDIF"); | |||
if ((prog_out > prog_buf) && (if_stack[0].returned == 0)) | |||
*prog_out++ = OPCODE_RETURN; | |||
*prog_out++ = INSTN_RETURN; | |||
break; | |||
} | |||
break; | |||
@@ -2357,8 +2358,6 @@ static void WritePhonemeTables() | |||
static void EndPhonemeTable() | |||
{ | |||
int ix; | |||
int *pw; | |||
int length; | |||
if (n_phoneme_tabs == 0) | |||
return; | |||
@@ -2697,7 +2696,7 @@ MNEM_TAB envelope_names[] = { | |||
{ NULL, -1 } | |||
}; | |||
int LookupEnvelopeName(const char *name) | |||
static int LookupEnvelopeName(const char *name) | |||
{ | |||
return LookupMnem(envelope_names, name); | |||
} | |||
@@ -2717,7 +2716,7 @@ espeak_ng_STATUS espeak_ng_CompileIntonation(FILE *log, espeak_ng_ERROR_CONTEXT | |||
int done_onset = 0; | |||
int done_last = 0; | |||
int n_preset_tunes = 0; | |||
int found; | |||
int found = 0; | |||
int tune_number = 0; | |||
FILE *f_out; | |||
TUNE *tune_data; | |||
@@ -2825,6 +2824,7 @@ espeak_ng_STATUS espeak_ng_CompileIntonation(FILE *log, espeak_ng_ERROR_CONTEXT | |||
error("Bad tune name: '%s;", new_tune.name); | |||
break; | |||
case kENDTUNE: | |||
if (!found) continue; | |||
if (done_onset == 0) { | |||
new_tune.unstr_start[0] = new_tune.unstr_start[1]; | |||
new_tune.unstr_end[0] = new_tune.unstr_end[1]; |
@@ -35,11 +35,11 @@ | |||
#include "error.h" | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
extern void Write4Bytes(FILE *f, int value); | |||
int HashDictionary(const char *string); | |||
static FILE *f_log = NULL; | |||
extern char *dir_dictionary; | |||
@@ -52,8 +52,15 @@ static int text_mode = 0; | |||
static int debug_flag = 0; | |||
static int error_need_dictionary = 0; | |||
static int hash_counts[N_HASH_DICT]; | |||
// A hash chain is a linked-list of hash chain entry objects: | |||
// struct hash_chain_entry { | |||
// hash_chain_entry *next_entry; | |||
// // dict_line output from compile_line: | |||
// uint8_t length; | |||
// char contents[length]; | |||
// }; | |||
static char *hash_chains[N_HASH_DICT]; | |||
static char letterGroupsDefined[N_LETTER_GROUPS]; | |||
MNEM_TAB mnem_rules[] = { | |||
@@ -164,16 +171,6 @@ typedef struct { | |||
int group3_ix; | |||
} RGROUP; | |||
int isspace2(unsigned int c) | |||
{ | |||
// can't use isspace() because on Windows, isspace(0xe1) gives TRUE ! | |||
int c2; | |||
if (((c2 = (c & 0xff)) == 0) || (c > ' ')) | |||
return 0; | |||
return 1; | |||
} | |||
void print_dictionary_flags(unsigned int *flags, char *buf, int buf_len) | |||
{ | |||
int stress; | |||
@@ -411,8 +408,8 @@ static int compile_line(char *linebuf, char *dict_line, int n_dict_line, int *ha | |||
step = LINE_PARSER_WORD; | |||
c = 0; | |||
while (c != '\n') { | |||
c = *p; | |||
while (c != '\n' && c != '\0') { | |||
c = *p; | |||
if ((c == '?') && (step == 0)) { | |||
@@ -649,7 +646,7 @@ static int compile_line(char *linebuf, char *dict_line, int n_dict_line, int *ha | |||
length += ix; | |||
} | |||
} | |||
dict_line[0] = length; | |||
*((uint8_t *)dict_line) = (uint8_t)length; | |||
return length; | |||
} | |||
@@ -669,7 +666,6 @@ static void compile_dictlist_start(void) | |||
p = p2; | |||
} | |||
hash_chains[ix] = NULL; | |||
hash_counts[ix] = 0; | |||
} | |||
} | |||
@@ -682,10 +678,9 @@ static void compile_dictlist_end(FILE *f_out) | |||
for (hash = 0; hash < N_HASH_DICT; hash++) { | |||
p = hash_chains[hash]; | |||
hash_counts[hash] = (int)ftell(f_out); | |||
while (p != NULL) { | |||
length = *(p+sizeof(char *)); | |||
length = *(uint8_t *)(p+sizeof(char *)); | |||
fwrite(p+sizeof(char *), length, 1, f_out); | |||
memcpy(&p, p, sizeof(char *)); | |||
} | |||
@@ -702,7 +697,7 @@ static int compile_dictlist_file(const char *path, const char *filename) | |||
FILE *f_in; | |||
char buf[200]; | |||
char fname[sizeof(path_home)+45]; | |||
char dict_line[200]; | |||
char dict_line[256]; // length is uint8_t, so an entry can't take up more than 256 bytes | |||
text_mode = 0; | |||
@@ -725,8 +720,6 @@ static int compile_dictlist_file(const char *path, const char *filename) | |||
length = compile_line(buf, dict_line, sizeof(dict_line), &hash); | |||
if (length == 0) continue; // blank line | |||
hash_counts[hash]++; | |||
p = (char *)malloc(length+sizeof(char *)); | |||
if (p == NULL) { | |||
if (f_log != NULL) { | |||
@@ -738,6 +731,7 @@ static int compile_dictlist_file(const char *path, const char *filename) | |||
memcpy(p, &hash_chains[hash], sizeof(char *)); | |||
hash_chains[hash] = p; | |||
// NOTE: dict_line[0] is the entry length (0-255) | |||
memcpy(p+sizeof(char *), dict_line, length); | |||
count++; | |||
} | |||
@@ -758,7 +752,7 @@ static int group3_ix; | |||
#define N_RULES 3000 // max rules for each group | |||
int isHexDigit(int c) | |||
static int isHexDigit(int c) | |||
{ | |||
if ((c >= '0') && (c <= '9')) | |||
return c - '0'; | |||
@@ -1165,7 +1159,7 @@ static char *compile_rule(char *input) | |||
return prule; | |||
} | |||
int __cdecl string_sorter(char **a, char **b) | |||
static int __cdecl string_sorter(char **a, char **b) | |||
{ | |||
char *pa, *pb; | |||
int ix; |
@@ -31,6 +31,7 @@ | |||
#include "error.h" | |||
#include "phoneme.h" | |||
#include "speech.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
static const char *basename(const char *filename) |
@@ -33,15 +33,13 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
int dictionary_skipwords; | |||
char dictionary_name[40]; | |||
extern void print_dictionary_flags(unsigned int *flags, char *buf, int buf_len); | |||
extern char *DecodeRule(const char *group_chars, int group_length, char *rule, int control); | |||
// accented characters which indicate (in some languages) the start of a separate syllable | |||
static const unsigned short diereses_list[7] = { 0xe4, 0xeb, 0xef, 0xf6, 0xfc, 0xff, 0 }; | |||
@@ -198,7 +196,7 @@ int LoadDictionary(Translator *tr, const char *name, int no_error) | |||
int *pw; | |||
int length; | |||
FILE *f; | |||
unsigned int size; | |||
int size; | |||
char fname[sizeof(path_home)+20]; | |||
strncpy(dictionary_name, name, 40); // currently loaded dictionary name | |||
@@ -254,7 +252,7 @@ int LoadDictionary(Translator *tr, const char *name, int no_error) | |||
for (hash = 0; hash < N_HASH_DICT; hash++) { | |||
tr->dict_hashtab[hash] = p; | |||
while ((length = *p) != 0) | |||
while ((length = *(uint8_t *)p) != 0) | |||
p += length; | |||
p++; // skip over the zero which terminates the list for this hash value | |||
} | |||
@@ -1571,7 +1569,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
int letter_w; // current letter, wide character | |||
int last_letter_w; // last letter, wide character | |||
int letter_xbytes; // number of extra bytes of multibyte character (num bytes - 1) | |||
unsigned char last_letter; | |||
char *pre_ptr; | |||
char *post_ptr; // pointer to first character after group | |||
@@ -1627,7 +1624,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
unpron_ignore = word_flags & FLAG_UNPRON_TEST; | |||
match_type = 0; | |||
consumed = 0; | |||
letter = 0; | |||
letter_w = 0; | |||
distance_right = -6; // used to reduce points for matches further away the current letter | |||
distance_left = -2; | |||
@@ -1732,7 +1728,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
distance_right += 6; | |||
if (distance_right > 18) | |||
distance_right = 19; | |||
last_letter = letter; | |||
last_letter_w = letter_w; | |||
letter_xbytes = utf8_in(&letter_w, post_ptr)-1; | |||
letter = *post_ptr++; | |||
@@ -1939,7 +1934,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
if (distance_left > 18) | |||
distance_left = 19; | |||
last_letter = *pre_ptr; | |||
utf8_in(&last_letter_w, pre_ptr); | |||
pre_ptr--; | |||
letter_xbytes = utf8_in2(&letter_w, pre_ptr, 1)-1; | |||
@@ -2719,7 +2713,7 @@ static const char *LookupDict2(Translator *tr, const char *word, const char *wor | |||
continue; | |||
} | |||
if ((dictionary_flags2 & FLAG_ATSTART) && !(wtab->flags & FLAG_FIRST_WORD)) { | |||
if ((dictionary_flags2 & FLAG_ATSTART) && !(wflags & FLAG_FIRST_WORD)) { | |||
// only use this pronunciation if it's the first word of a clause | |||
continue; | |||
} | |||
@@ -2894,7 +2888,7 @@ int LookupDictList(Translator *tr, char **wordptr, char *ph_out, unsigned int *f | |||
found = word2 + len; | |||
} | |||
if (found == 0) { | |||
if (found == 0 && length >= 2) { | |||
ph_out[0] = 0; | |||
// try modifications to find a recognised word | |||
@@ -3003,7 +2997,7 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy) | |||
int end_flags; | |||
const char *p; | |||
int len; | |||
char ending[50]; | |||
char ending[50] = {0}; | |||
// these lists are language specific, but are only relevent if the 'e' suffix flag is used | |||
static const char *add_e_exceptions[] = { |
@@ -26,43 +26,10 @@ | |||
#include <espeak-ng/encoding.h> | |||
#include "speech.h" | |||
#define LEADING_2_BITS 0xC0 // 0b11000000 | |||
#define UTF8_TAIL_BITS 0x80 // 0b10000000 | |||
int utf8_out(unsigned int c, char *buf) | |||
{ | |||
// write a unicode character into a buffer as utf8 | |||
// returns the number of bytes written | |||
int n_bytes; | |||
int j; | |||
int shift; | |||
static char unsigned code[4] = { 0, 0xc0, 0xe0, 0xf0 }; | |||
if (c < 0x80) { | |||
buf[0] = c; | |||
return 1; | |||
} | |||
if (c >= 0x110000) { | |||
buf[0] = ' '; // out of range character code | |||
return 1; | |||
} | |||
if (c < 0x0800) | |||
n_bytes = 1; | |||
else if (c < 0x10000) | |||
n_bytes = 2; | |||
else | |||
n_bytes = 3; | |||
shift = 6*n_bytes; | |||
buf[0] = code[n_bytes] | (c >> shift); | |||
for (j = 0; j < n_bytes; j++) { | |||
shift -= 6; | |||
buf[j+1] = 0x80 + ((c >> shift) & 0x3f); | |||
} | |||
return n_bytes+1; | |||
} | |||
#include "phoneme.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
// http://www.iana.org/assignments/character-sets/character-sets.xhtml | |||
MNEM_TAB mnem_encoding[] = { | |||
@@ -654,6 +621,7 @@ string_decoder_getc_auto(espeak_ng_TEXT_DECODER *decoder) | |||
static uint32_t | |||
null_decoder_getc(espeak_ng_TEXT_DECODER *decoder) | |||
{ | |||
(void)decoder; // unused parameter | |||
return 0; | |||
} | |||
@@ -29,6 +29,7 @@ | |||
#include "error.h" | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
espeak_ng_STATUS |
@@ -29,6 +29,7 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
#include "event.h" |
@@ -66,8 +66,8 @@ static node *head = NULL; | |||
static node *tail = NULL; | |||
static int node_counter = 0; | |||
static espeak_ng_STATUS push(void *data); | |||
static void *pop(); | |||
static void init(); | |||
static void *pop(void); | |||
static void init(void); | |||
static void *polling_thread(void *); | |||
void event_set_callback(t_espeak_callback *SynthCallback) | |||
@@ -257,7 +257,7 @@ static void *polling_thread(void *p) | |||
while (1) { | |||
int a_stop_is_required = 0; | |||
int a_status = pthread_mutex_lock(&my_mutex); | |||
(void)pthread_mutex_lock(&my_mutex); | |||
my_event_is_running = 0; | |||
while (my_start_is_required == 0) { | |||
@@ -284,16 +284,16 @@ static void *polling_thread(void *p) | |||
event->user_data = NULL; | |||
} | |||
a_status = pthread_mutex_lock(&my_mutex); | |||
(void)pthread_mutex_lock(&my_mutex); | |||
event_delete((espeak_EVENT *)pop()); | |||
a_stop_is_required = my_stop_is_required; | |||
if (a_stop_is_required > 0) | |||
my_stop_is_required = 0; | |||
a_status = pthread_mutex_unlock(&my_mutex); | |||
(void)pthread_mutex_unlock(&my_mutex); | |||
} | |||
a_status = pthread_mutex_lock(&my_mutex); | |||
(void)pthread_mutex_lock(&my_mutex); | |||
my_event_is_running = 0; | |||
@@ -303,7 +303,7 @@ static void *polling_thread(void *p) | |||
my_stop_is_required = 0; | |||
} | |||
a_status = pthread_mutex_unlock(&my_mutex); | |||
(void)pthread_mutex_unlock(&my_mutex); | |||
if (a_stop_is_required > 0) { | |||
// no mutex required since the stop command is synchronous | |||
@@ -311,10 +311,10 @@ static void *polling_thread(void *p) | |||
init(); | |||
// acknowledge the stop request | |||
espeak_ng_STATUS a_status = pthread_mutex_lock(&my_mutex); | |||
(void)pthread_mutex_lock(&my_mutex); | |||
my_stop_is_acknowledged = 1; | |||
a_status = pthread_cond_signal(&my_cond_stop_is_acknowledged); | |||
a_status = pthread_mutex_unlock(&my_mutex); | |||
(void)pthread_cond_signal(&my_cond_stop_is_acknowledged); | |||
(void)pthread_mutex_unlock(&my_mutex); | |||
} | |||
} | |||
@@ -52,14 +52,14 @@ void event_init(void); | |||
void event_set_callback(t_espeak_callback *cb); | |||
// Clear any pending event. | |||
espeak_ng_STATUS event_clear_all(); | |||
espeak_ng_STATUS event_clear_all(void); | |||
// Declare a future event | |||
espeak_ng_STATUS event_declare(espeak_EVENT *event); | |||
// Terminate the event component. | |||
// Last function to be called. | |||
void event_terminate(); | |||
void event_terminate(void); | |||
// general functions | |||
void clock_gettime2(struct timespec *ts); |
@@ -58,7 +58,7 @@ static int my_stop_is_acknowledged = 0; | |||
static void *say_thread(void *); | |||
static espeak_ng_STATUS push(t_espeak_command *the_command); | |||
static t_espeak_command *pop(); | |||
static t_espeak_command *pop(void); | |||
static void init(int process_parameters); | |||
static int node_counter = 0; | |||
@@ -29,7 +29,7 @@ extern "C" | |||
// Initialize the fifo component. | |||
// First function to be called. | |||
void fifo_init(); | |||
void fifo_init(void); | |||
// Add an espeak command. | |||
// | |||
@@ -44,15 +44,15 @@ espeak_ng_STATUS fifo_add_command(t_espeak_command *c); | |||
espeak_ng_STATUS fifo_add_commands(t_espeak_command *c1, t_espeak_command *c2); | |||
// The current running command must be stopped and the awaiting commands are cleared. | |||
espeak_ng_STATUS fifo_stop(); | |||
espeak_ng_STATUS fifo_stop(void); | |||
// Is there a running command? | |||
// Returns 1 if yes; 0 otherwise. | |||
int fifo_is_busy(); | |||
int fifo_is_busy(void); | |||
// Terminate the fifo component. | |||
// Last function to be called. | |||
void fifo_terminate(); | |||
void fifo_terminate(void); | |||
// Indicates if the running command is still enabled. | |||
// | |||
@@ -61,7 +61,7 @@ void fifo_terminate(); | |||
// stopping speech as soon as a cancel command is applied. | |||
// | |||
// Returns 1 if yes, or 0 otherwise. | |||
int fifo_is_command_enabled(); | |||
int fifo_is_command_enabled(void); | |||
#ifdef __cplusplus | |||
} |
@@ -49,15 +49,10 @@ | |||
#include <stdio.h> | |||
#include <math.h> | |||
#include "ieee80.h" | |||
typedef float Single; | |||
#ifndef applec | |||
typedef double defdouble; | |||
#else applec | |||
typedef long double defdouble; | |||
#endif applec | |||
#ifndef THINK_C | |||
typedef double Double; | |||
#else THINK_C |
@@ -0,0 +1,62 @@ | |||
/* Copyright (C) 1989-1991 Apple Computer, Inc. | |||
* | |||
* All rights reserved. | |||
* | |||
* Warranty Information | |||
* Even though Apple has reviewed this software, Apple makes no warranty | |||
* or representation, either express or implied, with respect to this | |||
* software, its quality, accuracy, merchantability, or fitness for a | |||
* particular purpose. As a result, this software is provided "as is," | |||
* and you, its user, are assuming the entire risk as to its quality | |||
* and accuracy. | |||
* | |||
* This code may be used and freely distributed as long as it includes | |||
* this copyright notice and the above warranty information. | |||
* | |||
* Machine-independent I/O routines for IEEE floating-point numbers. | |||
* | |||
* NaN's and infinities are converted to HUGE_VAL or HUGE, which | |||
* happens to be infinity on IEEE machines. Unfortunately, it is | |||
* impossible to preserve NaN's in a machine-independent way. | |||
* Infinities are, however, preserved on IEEE machines. | |||
* | |||
* These routines have been tested on the following machines: | |||
* Apple Macintosh, MPW 3.1 C compiler | |||
* Apple Macintosh, THINK C compiler | |||
* Silicon Graphics IRIS, MIPS compiler | |||
* Cray X/MP and Y/MP | |||
* Digital Equipment VAX | |||
* Sequent Balance (Multiprocesor 386) | |||
* NeXT | |||
* | |||
* | |||
* Implemented by Malcolm Slaney and Ken Turkowski. | |||
* | |||
* Malcolm Slaney contributions during 1988-1990 include big- and little- | |||
* endian file I/O, conversion to and from Motorola's extended 80-bit | |||
* floating-point format, and conversions to and from IEEE single- | |||
* precision floating-point format. | |||
* | |||
* In 1991, Ken Turkowski implemented the conversions to and from | |||
* IEEE double-precision format, added more precision to the extended | |||
* conversions, and accommodated conversions involving +/- infinity, | |||
* NaN's, and denormalized numbers. | |||
*/ | |||
#ifndef IEEE_H | |||
#define IEEE_H | |||
#ifndef applec | |||
typedef double defdouble; | |||
#else applec | |||
typedef long double defdouble; | |||
#endif applec | |||
defdouble ConvertFromIeeeSingle( char *bytes); | |||
defdouble ConvertFromIeeeDouble( char *bytes); | |||
defdouble ConvertFromIeeeExtended(char *bytes); | |||
void ConvertToIeeeSingle( defdouble num, char *bytes); | |||
void ConvertToIeeeDouble( defdouble num, char *bytes); | |||
void ConvertToIeeeExtended(defdouble num, char *bytes); | |||
#endif |
@@ -30,8 +30,8 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
/* Note this module is mostly old code that needs to be rewritten to | |||
@@ -949,8 +949,8 @@ void CalcPitches(Translator *tr, int clause_type) | |||
n_primary = 0; | |||
for (ix = 0; ix < (n_phoneme_list-1); ix++) { | |||
p = &phoneme_list[ix]; | |||
syllable_tab[ix].flags = 0; | |||
if (p->synthflags & SFLAG_SYLLABLE) { | |||
syllable_tab[n_st].flags = 0; | |||
syllable_tab[n_st].env = PITCHfall; | |||
syllable_tab[n_st].nextph_type = phoneme_list[ix+1].type; | |||
syllable_tab[n_st++].stress = p->stresslevel; |
@@ -35,10 +35,10 @@ | |||
#include <espeak-ng/speak_lib.h> | |||
#include "speech.h" | |||
#include "klatt.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "klatt.h" | |||
extern unsigned char *out_ptr; | |||
extern unsigned char *out_start; | |||
@@ -846,7 +846,7 @@ static int klattp[N_KLATTP]; | |||
static double klattp1[N_KLATTP]; | |||
static double klattp_inc[N_KLATTP]; | |||
int Wavegen_Klatt(int resume) | |||
static int Wavegen_Klatt(int resume) | |||
{ | |||
int pk; | |||
int x; | |||
@@ -935,7 +935,7 @@ int Wavegen_Klatt(int resume) | |||
return 0; | |||
} | |||
void SetSynth_Klatt(int length, frame_t *fr1, frame_t *fr2, voice_t *v, int control) | |||
static void SetSynth_Klatt(int length, frame_t *fr1, frame_t *fr2, voice_t *v, int control) | |||
{ | |||
int ix; | |||
DOUBLEX next; |
@@ -1,7 +1,7 @@ | |||
/* | |||
* Copyright (C) 2008 by Jonathan Duddington | |||
* email: [email protected] | |||
* Copyright (C) 2015 Reece H. Dunn | |||
* Copyright (C) 2015-2017 Reece H. Dunn | |||
* | |||
* Based on a re-implementation by: | |||
* (c) 1993,94 Jon Iles and Nick Ing-Simmons | |||
@@ -171,6 +171,10 @@ typedef struct { | |||
DOUBLEX bp_inc; | |||
} klatt_peaks_t; | |||
void KlattInit(void); | |||
void KlattReset(int control); | |||
int Wavegen_Klatt2(int length, int resume, frame_t *fr1, frame_t *fr2); | |||
#ifdef __cplusplus | |||
} |
@@ -20,11 +20,24 @@ | |||
#include "config.h" | |||
#if defined(_WIN32) || defined(_WIN64) | |||
#include <windows.h> | |||
#endif | |||
#include "mbrowrap.h" | |||
int (WINAPI *init_MBR)(char *voice_path); | |||
void (WINAPI *close_MBR)(void); | |||
void (WINAPI *reset_MBR)(void); | |||
int (WINAPI *read_MBR)(short *buffer, int nb_samples); | |||
int (WINAPI *write_MBR)(char *data); | |||
int (WINAPI *flush_MBR)(void); | |||
int (WINAPI *getFreq_MBR)(void); | |||
void (WINAPI *setVolumeRatio_MBR)(float value); | |||
char * (WINAPI *lastErrorStr_MBR)(char *buffer, int bufsize); | |||
void (WINAPI *setNoError_MBR)(int no_error); | |||
#if defined(_WIN32) || defined(_WIN64) | |||
HINSTANCE hinstDllMBR = NULL; | |||
BOOL load_MBR() | |||
@@ -69,8 +82,6 @@ void unload_MBR() | |||
#include <unistd.h> | |||
#include <espeak-ng/espeak_ng.h> | |||
#include "mbrowrap.h" | |||
#include "speech.h" | |||
/* | |||
@@ -508,7 +519,7 @@ static ssize_t receive_from_mbrola(void *buffer, size_t bufsize) | |||
* API functions. | |||
*/ | |||
int init_mbrola(char *voice_path) | |||
static int init_mbrola(char *voice_path) | |||
{ | |||
int error, result; | |||
unsigned char wavhdr[45]; | |||
@@ -551,7 +562,7 @@ int init_mbrola(char *voice_path) | |||
return 0; | |||
} | |||
void close_mbrola(void) | |||
static void close_mbrola(void) | |||
{ | |||
stop_mbrola(); | |||
free_pending_data(); | |||
@@ -560,7 +571,7 @@ void close_mbrola(void) | |||
mbr_volume = 1.0; | |||
} | |||
void reset_mbrola(void) | |||
static void reset_mbrola(void) | |||
{ | |||
int result, success = 1; | |||
char dummybuf[4096]; | |||
@@ -584,7 +595,7 @@ void reset_mbrola(void) | |||
mbr_state = MBR_IDLE; | |||
} | |||
int read_mbrola(short *buffer, int nb_samples) | |||
static int read_mbrola(short *buffer, int nb_samples) | |||
{ | |||
int result = receive_from_mbrola(buffer, nb_samples * 2); | |||
if (result > 0) | |||
@@ -592,23 +603,23 @@ int read_mbrola(short *buffer, int nb_samples) | |||
return result; | |||
} | |||
int write_mbrola(char *data) | |||
static int write_mbrola(char *data) | |||
{ | |||
mbr_state = MBR_NEWDATA; | |||
return send_to_mbrola(data); | |||
} | |||
int flush_mbrola(void) | |||
static int flush_mbrola(void) | |||
{ | |||
return send_to_mbrola("\n#\n") == 3; | |||
} | |||
int getFreq_mbrola(void) | |||
static int getFreq_mbrola(void) | |||
{ | |||
return mbr_samplerate; | |||
} | |||
void setVolumeRatio_mbrola(float value) | |||
static void setVolumeRatio_mbrola(float value) | |||
{ | |||
if (value == mbr_volume) | |||
return; | |||
@@ -623,7 +634,7 @@ void setVolumeRatio_mbrola(float value) | |||
init_MBR(mbr_voice_path); | |||
} | |||
char *lastErrorStr_mbrola(char *buffer, int bufsize) | |||
static char *lastErrorStr_mbrola(char *buffer, int bufsize) | |||
{ | |||
if (mbr_pid) | |||
mbrola_has_errors(); | |||
@@ -631,7 +642,7 @@ char *lastErrorStr_mbrola(char *buffer, int bufsize) | |||
return buffer; | |||
} | |||
void setNoError_mbrola(int no_error) | |||
static void setNoError_mbrola(int no_error) | |||
{ | |||
(void)no_error; // unused | |||
} |
@@ -37,20 +37,20 @@ typedef int BOOL; | |||
* error reason. If this is successful, then close_MBR() must be called | |||
* before init_MBR() can be called again. | |||
*/ | |||
int (WINAPI *init_MBR)(char *voice_path); | |||
extern int (WINAPI *init_MBR)(char *voice_path); | |||
/* | |||
* Stop mbrola and release any resources. It is necessary to call | |||
* this after a successful call to init_MBR() before init_MBR() can be | |||
* called again. | |||
*/ | |||
void (WINAPI *close_MBR)(void); | |||
extern void (WINAPI *close_MBR)(void); | |||
/* | |||
* Stop any ongoing processing and flush all buffers. After this call | |||
* any synthesis request will start afresh. | |||
*/ | |||
void (WINAPI *reset_MBR)(void); | |||
extern void (WINAPI *reset_MBR)(void); | |||
/* | |||
* Return at most 'nb_samples' audio samples into 'buffer'. The returned | |||
@@ -58,14 +58,14 @@ void (WINAPI *reset_MBR)(void); | |||
* If not successful, lastErrorStr_MBR() will provide the error reason. | |||
* Samples are always 16-bit little endian. | |||
*/ | |||
int (WINAPI *read_MBR)(short *buffer, int nb_samples); | |||
extern int (WINAPI *read_MBR)(short *buffer, int nb_samples); | |||
/* | |||
* Write a NULL terminated string of phoneme in the input buffer. | |||
* Return the number of chars actually written, or -1 on error. | |||
* If not successful, lastErrorStr_MBR() will provide the error reason. | |||
*/ | |||
int (WINAPI *write_MBR)(char *data); | |||
extern int (WINAPI *write_MBR)(char *data); | |||
/* | |||
* Send a flush command to the mbrola input stream. | |||
@@ -73,17 +73,17 @@ int (WINAPI *write_MBR)(char *data); | |||
* or 0 on failure. If not successful, lastErrorStr_MBR() will provide | |||
* the error reason. | |||
*/ | |||
int (WINAPI *flush_MBR)(void); | |||
extern int (WINAPI *flush_MBR)(void); | |||
/* | |||
* Return the audio sample frequency of the used voice database. | |||
*/ | |||
int (WINAPI *getFreq_MBR)(void); | |||
extern int (WINAPI *getFreq_MBR)(void); | |||
/* | |||
* Overall volume. | |||
*/ | |||
void (WINAPI *setVolumeRatio_MBR)(float value); | |||
extern void (WINAPI *setVolumeRatio_MBR)(float value); | |||
/* | |||
* Copy into 'buffer' at most 'bufsize' bytes from the latest error | |||
@@ -91,12 +91,12 @@ void (WINAPI *setVolumeRatio_MBR)(float value); | |||
* no error message is pending then an empty string is returned. | |||
* Consecutive calls to lastErrorStr_MBR() will return the same message. | |||
*/ | |||
char * (WINAPI *lastErrorStr_MBR)(char *buffer, int bufsize); | |||
extern char * (WINAPI *lastErrorStr_MBR)(char *buffer, int bufsize); | |||
/* | |||
* Tolerance to missing diphones. | |||
*/ | |||
void (WINAPI *setNoError_MBR)(int no_error); | |||
extern void (WINAPI *setNoError_MBR)(int no_error); | |||
BOOL load_MBR(void); | |||
void unload_MBR(void); |
@@ -33,8 +33,8 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
#define M_LIGATURE 0x8000 | |||
@@ -548,7 +548,7 @@ static const int number_ranges[] = { | |||
0 | |||
}; | |||
int NonAsciiNumber(int letter) | |||
static int NonAsciiNumber(int letter) | |||
{ | |||
// Change non-ascii digit into ascii digit '0' to '9', (or -1 if not) | |||
const int *p; | |||
@@ -1711,7 +1711,7 @@ static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null | |||
return 0; | |||
} | |||
bool CheckThousandsGroup(char *word, int group_len) | |||
static bool CheckThousandsGroup(char *word, int group_len) | |||
{ | |||
// Is this a group of 3 digits which looks like a thousands group? | |||
int ix; |
@@ -30,6 +30,7 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
@@ -34,12 +34,13 @@ | |||
#include <espeak-ng/espeak_ng.h> | |||
#include <espeak-ng/speak_lib.h> | |||
#include <espeak-ng/encoding.h> | |||
#include <ucd/ucd.h> | |||
#include "error.h" | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
#define N_XML_BUF 500 | |||
@@ -89,6 +90,55 @@ PARAM_STACK param_stack[N_PARAM_STACK]; | |||
static int speech_parameters[N_SPEECH_PARAM]; // current values, from param_stack | |||
int saved_parameters[N_SPEECH_PARAM]; // Parameters saved on synthesis start | |||
#define ESPEAKNG_CLAUSE_TYPE_PROPERTY_MASK 0xFFF0000000000000ull | |||
int clause_type_from_codepoint(uint32_t c) | |||
{ | |||
ucd_category cat = ucd_lookup_category(c); | |||
ucd_property props = ucd_properties(c, cat); | |||
switch (props & ESPEAKNG_CLAUSE_TYPE_PROPERTY_MASK) | |||
{ | |||
case ESPEAKNG_PROPERTY_FULL_STOP: | |||
return CLAUSE_PERIOD; | |||
case ESPEAKNG_PROPERTY_FULL_STOP | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
return CLAUSE_PERIOD | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_QUESTION_MARK: | |||
return CLAUSE_QUESTION; | |||
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
return CLAUSE_QUESTION | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_PUNCTUATION_IN_WORD: | |||
return CLAUSE_QUESTION | CLAUSE_PUNCTUATION_IN_WORD; | |||
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK: | |||
return CLAUSE_EXCLAMATION; | |||
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
return CLAUSE_EXCLAMATION | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_PUNCTUATION_IN_WORD: | |||
return CLAUSE_EXCLAMATION | CLAUSE_PUNCTUATION_IN_WORD; | |||
case ESPEAKNG_PROPERTY_COMMA: | |||
return CLAUSE_COMMA; | |||
case ESPEAKNG_PROPERTY_COMMA | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
return CLAUSE_COMMA | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_COLON: | |||
return CLAUSE_COLON; | |||
case ESPEAKNG_PROPERTY_COLON | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
return CLAUSE_COLON | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_SEMI_COLON: | |||
case ESPEAKNG_PROPERTY_EXTENDED_DASH: | |||
return CLAUSE_SEMICOLON; | |||
case ESPEAKNG_PROPERTY_SEMI_COLON | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER | ESPEAKNG_PROPERTY_INVERTED_TERMINAL_PUNCTUATION: | |||
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER | ESPEAKNG_PROPERTY_INVERTED_TERMINAL_PUNCTUATION: | |||
return CLAUSE_SEMICOLON | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_ELLIPSIS: | |||
return CLAUSE_SEMICOLON | CLAUSE_SPEAK_PUNCTUATION_NAME | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_PARAGRAPH_SEPARATOR: | |||
return CLAUSE_PARAGRAPH; | |||
} | |||
return CLAUSE_NONE; | |||
} | |||
const int param_defaults[N_SPEECH_PARAM] = { | |||
0, // silence (internal use) | |||
175, // rate wpm | |||
@@ -113,7 +163,7 @@ int towlower2(unsigned int c) | |||
if (c == 'I' && translator->langopts.dotless_i) | |||
return 0x131; // I -> ı | |||
return towlower(c); | |||
return ucd_tolower(c); | |||
} | |||
static int IsRomanU(unsigned int c) | |||
@@ -134,7 +184,6 @@ int Eof(void) | |||
static int GetC(void) | |||
{ | |||
int c1; | |||
static int ungot2 = 0; | |||
if ((c1 = ungot_char) != 0) { | |||
ungot_char = 0; | |||
@@ -792,7 +841,7 @@ static int attrnumber(const wchar_t *pw, int default_value, int type) | |||
while (IsDigit09(*pw)) | |||
value = value*10 + *pw++ - '0'; | |||
if ((type == 1) && (towlower(*pw) == 's')) { | |||
if ((type == 1) && (ucd_tolower(*pw) == 's')) { | |||
// time: seconds rather than ms | |||
value *= 1000; | |||
} | |||
@@ -869,7 +918,7 @@ static int attr_prosody_value(int param_type, const wchar_t *pw, int *value_out) | |||
return sign; // -1, 0, or 1 | |||
} | |||
int AddNameData(const char *name, int wide) | |||
static int AddNameData(const char *name, int wide) | |||
{ | |||
// Add the name to the namedata and return its position | |||
// (Used by the Windows SAPI wrapper) |
@@ -30,12 +30,10 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
extern int GetAmplitude(void); | |||
extern void DoSonicSpeed(int value); | |||
extern int saved_parameters[]; | |||
// convert from words-per-minute to internal speed factor |
@@ -32,12 +32,10 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "spect.h" | |||
extern double ConvertFromIeeeExtended(unsigned char *bytes); | |||
extern int PeaksToHarmspect(wavegen_peaks_t *peaks, int pitch, int *htab, int control); | |||
#include "ieee80.h" | |||
extern unsigned char pk_shape1[]; | |||
extern int pk_select; | |||
@@ -57,7 +55,7 @@ static double read_double(FILE *stream) | |||
{ | |||
unsigned char bytes[10]; | |||
fread(bytes, sizeof(char), 10, stream); | |||
return ConvertFromIeeeExtended(bytes); | |||
return ConvertFromIeeeExtended((char *)bytes); | |||
} | |||
float polint(float xa[], float ya[], int n, float x) |
@@ -22,6 +22,8 @@ extern "C" | |||
{ | |||
#endif | |||
float polint(float xa[], float ya[], int n, float x); | |||
#define FRAME_WIDTH 1000 // max width for 8000kHz frame | |||
#define MAX_DISPLAY_FREQ 9500 | |||
#define FRAME_HEIGHT 240 | |||
@@ -124,7 +126,7 @@ typedef struct { | |||
int file_format; | |||
} SpectSeq; | |||
SpectSeq *SpectSeqCreate(); | |||
SpectSeq *SpectSeqCreate(void); | |||
void SpectSeqDestroy(SpectSeq *spect); | |||
espeak_ng_STATUS LoadSpectSeq(SpectSeq *spect, const char *filename); | |||
@@ -50,8 +50,8 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
#include "espeak_command.h" | |||
#include "fifo.h" | |||
@@ -400,7 +400,7 @@ static espeak_ng_STATUS Synthesize(unsigned int unique_identifier, const void *t | |||
espeak_ng_STATUS status; | |||
if (translator == NULL) { | |||
status = espeak_SetVoiceByName("en"); | |||
status = espeak_ng_SetVoiceByName("en"); | |||
if (status != ENS_OK) | |||
return status; | |||
} | |||
@@ -876,9 +876,6 @@ ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Synchronize(void) | |||
return berr; | |||
} | |||
extern void FreePhData(void); | |||
extern void FreeVoiceList(void); | |||
ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Terminate(void) | |||
{ | |||
#ifdef USE_ASYNC |
@@ -33,14 +33,13 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
#include "voice.h" | |||
#ifdef INCLUDE_MBROLA | |||
extern int Read4Bytes(FILE *f); | |||
extern void SetPitch2(voice_t *voice, int pitch1, int pitch2, int *pitch_base, int *pitch_range); | |||
extern unsigned char *outbuf; | |||
#if defined(_WIN32) || defined(_WIN64) | |||
@@ -573,16 +572,25 @@ void MbrolaReset(void) | |||
espeak_ng_STATUS LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int *srate) | |||
{ | |||
(void)mbrola_voice; // unused parameter | |||
(void)phtrans; // unused parameter | |||
(void)srate; // unused parameter | |||
return ENS_NOT_SUPPORTED; | |||
} | |||
int MbrolaGenerate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
{ | |||
(void)phoneme_list; // unused parameter | |||
(void)n_ph; // unused parameter | |||
(void)resume; // unused parameter | |||
return 0; | |||
} | |||
int MbrolaFill(int length, int resume, int amplitude) | |||
{ | |||
(void)length; // unused parameter | |||
(void)resume; // unused parameter | |||
(void)amplitude; // unused parameter | |||
return 0; | |||
} | |||
@@ -34,8 +34,8 @@ | |||
#include "error.h" | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
const char *version_string = PACKAGE_VERSION; | |||
@@ -66,14 +66,12 @@ int vowel_transition[4]; | |||
int vowel_transition0; | |||
int vowel_transition1; | |||
int FormantTransition2(frameref_t *seq, int *n_frames, unsigned int data1, unsigned int data2, PHONEME_TAB *other_ph, int which); | |||
static espeak_ng_STATUS ReadPhFile(void **ptr, const char *fname, int *size, espeak_ng_ERROR_CONTEXT *context) | |||
{ | |||
if (!ptr) return EINVAL; | |||
FILE *f_in; | |||
unsigned int length; | |||
int length; | |||
char buf[sizeof(path_home)+40]; | |||
sprintf(buf, "%s%c%s", path_home, PATHSEP, fname); | |||
@@ -112,7 +110,6 @@ espeak_ng_STATUS LoadPhData(int *srate, espeak_ng_ERROR_CONTEXT *context) | |||
int length = 0; | |||
int rate; | |||
unsigned char *p; | |||
int *pw; | |||
espeak_ng_STATUS status; | |||
if ((status = ReadPhFile((void **)&phoneme_tab_data, "phontab", NULL, context)) != ENS_OK) | |||
@@ -508,7 +505,6 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, | |||
unsigned int data; | |||
int instn; | |||
int instn2; | |||
int count; | |||
int check_endtype = 0; | |||
PHONEME_TAB *ph; | |||
PHONEME_LIST *plist_this; | |||
@@ -760,7 +756,7 @@ int NumInstnWords(USHORT *prog) | |||
// This instruction is followed by addWav(), 2 more words | |||
return 4; | |||
} | |||
if (instn2 == OPCODE_CONTINUE) | |||
if (instn2 == INSTN_CONTINUE) | |||
return 3; | |||
return 2; | |||
} | |||
@@ -817,10 +813,10 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
// instructions with no operand | |||
switch (data) | |||
{ | |||
case OPCODE_RETURN: | |||
case INSTN_RETURN: | |||
end_flag = 1; | |||
break; | |||
case OPCODE_CONTINUE: | |||
case INSTN_CONTINUE: | |||
break; | |||
default: | |||
InvalidInstn(ph, instn); | |||
@@ -958,7 +954,7 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
param_sc = phdata->sound_param[instn2] = (instn >> 4) & 0xff; | |||
prog++; | |||
if (prog[1] != OPCODE_CONTINUE) { | |||
if (prog[1] != INSTN_CONTINUE) { | |||
if (instn2 < 2) { | |||
// FMT() and WAV() imply Return | |||
end_flag = 1; |
@@ -33,8 +33,8 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
extern FILE *f_log; |
@@ -74,7 +74,6 @@ extern "C" | |||
extern int embedded_value[N_EMBEDDED_VALUES]; | |||
extern int embedded_default[N_EMBEDDED_VALUES]; | |||
#define N_PEAKS 9 | |||
#define N_PEAKS2 9 // plus Notch and Fill (not yet implemented) | |||
#define N_MARKERS 8 | |||
@@ -268,8 +267,8 @@ typedef struct { | |||
// instructions | |||
#define OPCODE_RETURN 0x0001 | |||
#define OPCODE_CONTINUE 0x0002 | |||
#define INSTN_RETURN 0x0001 | |||
#define INSTN_CONTINUE 0x0002 | |||
// Group 0 instrcutions with 8 bit operand. These values go into bits 8-15 of the instruction | |||
#define i_CHANGE_PHONEME 0x01 | |||
@@ -453,14 +452,16 @@ extern int wcmdq_head; | |||
extern int wcmdq_tail; | |||
// from Wavegen file | |||
int WcmdqFree(); | |||
void WcmdqStop(); | |||
int WcmdqUsed(); | |||
void WcmdqInc(); | |||
int WcmdqFree(void); | |||
void WcmdqStop(void); | |||
int WcmdqUsed(void); | |||
void WcmdqInc(void); | |||
void WavegenInit(int rate, int wavemult_fact); | |||
float polint(float xa[], float ya[], int n, float x); | |||
int WavegenFill(); | |||
int WavegenFill(void); | |||
void MarkerEvent(int type, unsigned int char_position, int value, int value2, unsigned char *out_ptr); | |||
int GetAmplitude(void); | |||
void SetPitch2(voice_t *voice, int pitch1, int pitch2, int *pitch_base, int *pitch_range); | |||
int PeaksToHarmspect(wavegen_peaks_t *peaks, int pitch, int *htab, int control); | |||
extern unsigned char *wavefile_data; | |||
extern int samplerate; | |||
@@ -485,6 +486,7 @@ extern char mbrola_name[20]; | |||
// from synthdata file | |||
unsigned int LookupSound(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int *match_level, int control); | |||
frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, int *n_frames, PHONEME_LIST *plist); | |||
void FreePhData(void); | |||
unsigned char *LookupEnvelope(int ix); | |||
espeak_ng_STATUS LoadPhData(int *srate, espeak_ng_ERROR_CONTEXT *context); | |||
@@ -497,11 +499,16 @@ void SetSpeed(int control); | |||
void SetEmbedded(int control, int value); | |||
void SelectPhonemeTable(int number); | |||
int SelectPhonemeTableName(const char *name); | |||
int FormantTransition2(frameref_t *seq, int *n_frames, unsigned int data1, unsigned int data2, PHONEME_TAB *other_ph, int which); | |||
void Write4Bytes(FILE *f, int value); | |||
int Read4Bytes(FILE *f); | |||
int Reverse4Bytes(int word); | |||
#if HAVE_SONIC_H | |||
void DoSonicSpeed(int value); | |||
#endif | |||
#define ENV_LEN 128 // length of pitch envelopes | |||
#define PITCHfall 0 // standard pitch envelopes | |||
#define PITCHrise 2 | |||
@@ -545,10 +552,6 @@ int NumInstnWords(USHORT *prog); | |||
void InitBreath(void); | |||
void KlattInit(); | |||
void KlattReset(int control); | |||
int Wavegen_Klatt2(int length, int resume, frame_t *fr1, frame_t *fr2); | |||
#ifdef __cplusplus | |||
} | |||
#endif |
@@ -1,410 +0,0 @@ | |||
/* Tokenizer APIs. | |||
* | |||
* Copyright (C) 2017 Reece H. Dunn | |||
* | |||
* This program is free software; you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License as published by | |||
* the Free Software Foundation; either version 3 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU General Public License | |||
* along with this program; if not, see: <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include "config.h" | |||
#include <errno.h> | |||
#include <stdint.h> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include <espeak-ng/espeak_ng.h> | |||
#include <espeak-ng/encoding.h> | |||
#include <espeak-ng/tokenizer.h> | |||
#include <ucd/ucd.h> | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
#define ESPEAKNG_CLAUSE_TYPE_PROPERTY_MASK 0xFFF0000000000000ull | |||
int clause_type_from_codepoint(uint32_t c) | |||
{ | |||
ucd_category cat = ucd_lookup_category(c); | |||
ucd_property props = ucd_properties(c, cat); | |||
switch (props & ESPEAKNG_CLAUSE_TYPE_PROPERTY_MASK) | |||
{ | |||
case ESPEAKNG_PROPERTY_FULL_STOP: | |||
return CLAUSE_PERIOD; | |||
case ESPEAKNG_PROPERTY_FULL_STOP | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
return CLAUSE_PERIOD | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_QUESTION_MARK: | |||
return CLAUSE_QUESTION; | |||
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
return CLAUSE_QUESTION | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_PUNCTUATION_IN_WORD: | |||
return CLAUSE_QUESTION | CLAUSE_PUNCTUATION_IN_WORD; | |||
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK: | |||
return CLAUSE_EXCLAMATION; | |||
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
return CLAUSE_EXCLAMATION | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_PUNCTUATION_IN_WORD: | |||
return CLAUSE_EXCLAMATION | CLAUSE_PUNCTUATION_IN_WORD; | |||
case ESPEAKNG_PROPERTY_COMMA: | |||
return CLAUSE_COMMA; | |||
case ESPEAKNG_PROPERTY_COMMA | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
return CLAUSE_COMMA | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_COLON: | |||
return CLAUSE_COLON; | |||
case ESPEAKNG_PROPERTY_COLON | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
return CLAUSE_COLON | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_SEMI_COLON: | |||
case ESPEAKNG_PROPERTY_EXTENDED_DASH: | |||
return CLAUSE_SEMICOLON; | |||
case ESPEAKNG_PROPERTY_SEMI_COLON | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER: | |||
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER | ESPEAKNG_PROPERTY_INVERTED_TERMINAL_PUNCTUATION: | |||
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER | ESPEAKNG_PROPERTY_INVERTED_TERMINAL_PUNCTUATION: | |||
return CLAUSE_SEMICOLON | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_ELLIPSIS: | |||
return CLAUSE_SEMICOLON | CLAUSE_SPEAK_PUNCTUATION_NAME | CLAUSE_OPTIONAL_SPACE_AFTER; | |||
case ESPEAKNG_PROPERTY_PARAGRAPH_SEPARATOR: | |||
return CLAUSE_PARAGRAPH; | |||
} | |||
return CLAUSE_NONE; | |||
} | |||
typedef enum { | |||
ESPEAKNG_CTYPE_OTHER, | |||
ESPEAKNG_CTYPE_CARRIAGE_RETURN, | |||
ESPEAKNG_CTYPE_NEWLINE, | |||
ESPEAKNG_CTYPE_END_OF_STRING, | |||
ESPEAKNG_CTYPE_PARAGRAPH, | |||
ESPEAKNG_CTYPE_WHITESPACE, | |||
ESPEAKNG_CTYPE_LOWERCASE, | |||
ESPEAKNG_CTYPE_UPPERCASE, | |||
ESPEAKNG_CTYPE_FULL_STOP, | |||
ESPEAKNG_CTYPE_QUESTION_MARK, | |||
ESPEAKNG_CTYPE_EXCLAMATION_MARK, | |||
ESPEAKNG_CTYPE_COMMA, | |||
ESPEAKNG_CTYPE_COLON, | |||
ESPEAKNG_CTYPE_SEMICOLON, | |||
ESPEAKNG_CTYPE_ELLIPSIS, | |||
ESPEAKNG_CTYPE_PUNCTUATION, | |||
ESPEAKNG_CTYPE_SYMBOL, | |||
} espeakng_CTYPE; | |||
#define ESPEAKNG_CTYPE_PROPERTY_MASK 0xFE0000000000C001ull | |||
// Reference: http://www.unicode.org/reports/tr14/tr14-32.html -- Unicode Line Breaking Algorithm | |||
static espeakng_CTYPE codepoint_type(uint32_t c) | |||
{ | |||
// 1. Detect and classify specific codepoints. | |||
switch (c) | |||
{ | |||
case 0x0000: return ESPEAKNG_CTYPE_END_OF_STRING; // NULL | |||
case 0x000A: return ESPEAKNG_CTYPE_NEWLINE; // LINE FEED (LF) | |||
case 0x000C: return ESPEAKNG_CTYPE_NEWLINE; // FORM FEED (FF) | |||
case 0x000D: return ESPEAKNG_CTYPE_CARRIAGE_RETURN; // CARRIAGE RETURN (CR) | |||
case 0x0085: return ESPEAKNG_CTYPE_NEWLINE; // NEW LINE (NEL) | |||
} | |||
// 2. Override property types for codepoints by their Unicode General Category. | |||
ucd_category cat = ucd_lookup_category(c); | |||
switch (cat) | |||
{ | |||
case UCD_CATEGORY_Zl: return ESPEAKNG_CTYPE_NEWLINE; | |||
case UCD_CATEGORY_Zp: return ESPEAKNG_CTYPE_PARAGRAPH; | |||
} | |||
// 3. Classify codepoints by their Unicode properties. | |||
ucd_property props = ucd_properties(c, cat); | |||
switch (props & ESPEAKNG_CTYPE_PROPERTY_MASK) | |||
{ | |||
case UCD_PROPERTY_WHITE_SPACE: | |||
return ESPEAKNG_CTYPE_WHITESPACE; | |||
case UCD_PROPERTY_OTHER_LOWERCASE: | |||
return ESPEAKNG_CTYPE_LOWERCASE; | |||
case UCD_PROPERTY_OTHER_UPPERCASE: | |||
return ESPEAKNG_CTYPE_UPPERCASE; | |||
case ESPEAKNG_PROPERTY_FULL_STOP: | |||
return ESPEAKNG_CTYPE_FULL_STOP; | |||
case ESPEAKNG_PROPERTY_QUESTION_MARK: | |||
return ESPEAKNG_CTYPE_QUESTION_MARK; | |||
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK: | |||
return ESPEAKNG_CTYPE_EXCLAMATION_MARK; | |||
case ESPEAKNG_PROPERTY_COMMA: | |||
return ESPEAKNG_CTYPE_COMMA; | |||
case ESPEAKNG_PROPERTY_COLON: | |||
return ESPEAKNG_CTYPE_COLON; | |||
case ESPEAKNG_PROPERTY_SEMI_COLON: | |||
return ESPEAKNG_CTYPE_SEMICOLON; | |||
case ESPEAKNG_PROPERTY_ELLIPSIS: | |||
return ESPEAKNG_CTYPE_ELLIPSIS; | |||
} | |||
// 4. Classify codepoints by their Unicode General Category. | |||
switch (cat) | |||
{ | |||
case UCD_CATEGORY_Lu: return ESPEAKNG_CTYPE_UPPERCASE; | |||
case UCD_CATEGORY_Ll: return ESPEAKNG_CTYPE_LOWERCASE; | |||
case UCD_CATEGORY_Pc: return ESPEAKNG_CTYPE_PUNCTUATION; | |||
case UCD_CATEGORY_Pd: return ESPEAKNG_CTYPE_PUNCTUATION; | |||
case UCD_CATEGORY_Pe: return ESPEAKNG_CTYPE_PUNCTUATION; | |||
case UCD_CATEGORY_Pf: return ESPEAKNG_CTYPE_PUNCTUATION; | |||
case UCD_CATEGORY_Pi: return ESPEAKNG_CTYPE_PUNCTUATION; | |||
case UCD_CATEGORY_Po: return ESPEAKNG_CTYPE_PUNCTUATION; | |||
case UCD_CATEGORY_Ps: return ESPEAKNG_CTYPE_PUNCTUATION; | |||
case UCD_CATEGORY_Sc: return ESPEAKNG_CTYPE_SYMBOL; | |||
case UCD_CATEGORY_Sk: return ESPEAKNG_CTYPE_SYMBOL; | |||
case UCD_CATEGORY_Sm: return ESPEAKNG_CTYPE_SYMBOL; | |||
case UCD_CATEGORY_So: return ESPEAKNG_CTYPE_SYMBOL; | |||
} | |||
// 5. Classify the remaining codepoints. | |||
return ESPEAKNG_CTYPE_OTHER; | |||
} | |||
#define ESPEAKNG_CODEPOINT_INVALID 0xFFFFFFFF | |||
struct espeak_ng_TOKENIZER_ | |||
{ | |||
espeak_ng_TEXT_DECODER *decoder; | |||
char token[256]; | |||
uint32_t keepc; | |||
espeak_ng_TOKEN_TYPE (*read)(espeak_ng_TOKENIZER *tokenizer); | |||
}; | |||
static espeak_ng_TOKEN_TYPE | |||
tokenizer_state_end_of_buffer(espeak_ng_TOKENIZER *tokenizer) | |||
{ | |||
*tokenizer->token = '\0'; | |||
return ESPEAKNG_TOKEN_END_OF_BUFFER; | |||
} | |||
static espeak_ng_TOKEN_TYPE | |||
tokenizer_read_word_token(espeak_ng_TOKENIZER *tokenizer, char *current, espeak_ng_TOKEN_TYPE type) | |||
{ | |||
char *end = tokenizer->token + sizeof(tokenizer->token) - 5; // allow for UTF-8 trailing bytes | |||
int initial_state = 1; | |||
while (current < end && !text_decoder_eof(tokenizer->decoder)) { | |||
uint32_t c = text_decoder_getc(tokenizer->decoder); | |||
switch (codepoint_type(c)) | |||
{ | |||
case ESPEAKNG_CTYPE_LOWERCASE: | |||
current += utf8_out(c, current); | |||
switch (type) | |||
{ | |||
case ESPEAKNG_TOKEN_WORD_LOWERCASE: | |||
case ESPEAKNG_TOKEN_WORD_MIXEDCASE: | |||
case ESPEAKNG_TOKEN_WORD_CAPITALIZED: | |||
break; | |||
case ESPEAKNG_TOKEN_WORD_UPPERCASE: | |||
type = initial_state | |||
? ESPEAKNG_TOKEN_WORD_CAPITALIZED | |||
: ESPEAKNG_TOKEN_WORD_MIXEDCASE; | |||
break; | |||
} | |||
initial_state = 0; | |||
break; | |||
case ESPEAKNG_CTYPE_UPPERCASE: | |||
current += utf8_out(c, current); | |||
switch (type) | |||
{ | |||
case ESPEAKNG_TOKEN_WORD_UPPERCASE: | |||
case ESPEAKNG_TOKEN_WORD_MIXEDCASE: | |||
break; | |||
case ESPEAKNG_TOKEN_WORD_LOWERCASE: | |||
case ESPEAKNG_TOKEN_WORD_CAPITALIZED: | |||
type = ESPEAKNG_TOKEN_WORD_MIXEDCASE; | |||
break; | |||
} | |||
initial_state = 0; | |||
break; | |||
default: | |||
tokenizer->keepc = c; | |||
*current = '\0'; | |||
return type; | |||
} | |||
} | |||
*current = '\0'; | |||
return type; | |||
} | |||
static espeak_ng_TOKEN_TYPE | |||
tokenizer_state_default(espeak_ng_TOKENIZER *tokenizer) | |||
{ | |||
if (text_decoder_eof(tokenizer->decoder)) { | |||
tokenizer->read = tokenizer_state_end_of_buffer; | |||
return tokenizer_state_end_of_buffer(tokenizer); | |||
} | |||
char *current = tokenizer->token; | |||
char *end = tokenizer->token + sizeof(tokenizer->token) - 5; // allow for UTF-8 trailing bytes | |||
uint32_t c; | |||
if (tokenizer->keepc != ESPEAKNG_CODEPOINT_INVALID) { | |||
c = tokenizer->keepc; | |||
tokenizer->keepc = ESPEAKNG_CODEPOINT_INVALID; | |||
} else { | |||
c = text_decoder_getc(tokenizer->decoder); | |||
} | |||
switch (codepoint_type(c)) | |||
{ | |||
case ESPEAKNG_CTYPE_END_OF_STRING: // '\0' | |||
tokenizer->read = tokenizer_state_end_of_buffer; | |||
return tokenizer_state_end_of_buffer(tokenizer); | |||
case ESPEAKNG_CTYPE_CARRIAGE_RETURN: // '\r' | |||
if (text_decoder_peekc(tokenizer->decoder) == '\n') { | |||
current += utf8_out(c, current); | |||
c = text_decoder_getc(tokenizer->decoder); | |||
} | |||
// fallthrough | |||
case ESPEAKNG_CTYPE_NEWLINE: | |||
current += utf8_out(c, current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_NEWLINE; | |||
case ESPEAKNG_CTYPE_PARAGRAPH: | |||
current += utf8_out(c, current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_PARAGRAPH; | |||
case ESPEAKNG_CTYPE_WHITESPACE: | |||
current += utf8_out(c, current); | |||
while (!text_decoder_eof(tokenizer->decoder) && | |||
current < end && | |||
codepoint_type(c = text_decoder_getc(tokenizer->decoder)) == ESPEAKNG_CTYPE_WHITESPACE) | |||
{ | |||
current += utf8_out(c, current); | |||
} | |||
tokenizer->keepc = c; | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_WHITESPACE; | |||
case ESPEAKNG_CTYPE_LOWERCASE: | |||
current += utf8_out(c, current); | |||
return tokenizer_read_word_token(tokenizer, current, ESPEAKNG_TOKEN_WORD_LOWERCASE); | |||
case ESPEAKNG_CTYPE_UPPERCASE: | |||
current += utf8_out(c, current); | |||
return tokenizer_read_word_token(tokenizer, current, ESPEAKNG_TOKEN_WORD_UPPERCASE); | |||
case ESPEAKNG_CTYPE_FULL_STOP: | |||
current += utf8_out(c, current); | |||
if (c == '.' && text_decoder_peekc(tokenizer->decoder) == '.') { | |||
c = text_decoder_getc(tokenizer->decoder); | |||
if (text_decoder_peekc(tokenizer->decoder) == '.') { | |||
c = text_decoder_getc(tokenizer->decoder); | |||
current += utf8_out('.', current); | |||
current += utf8_out('.', current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_ELLIPSIS; | |||
} else { | |||
tokenizer->keepc = c; | |||
} | |||
} | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_FULL_STOP; | |||
case ESPEAKNG_CTYPE_QUESTION_MARK: | |||
current += utf8_out(c, current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_QUESTION_MARK; | |||
case ESPEAKNG_CTYPE_EXCLAMATION_MARK: | |||
current += utf8_out(c, current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_EXCLAMATION_MARK; | |||
case ESPEAKNG_CTYPE_COMMA: | |||
current += utf8_out(c, current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_COMMA; | |||
case ESPEAKNG_CTYPE_COLON: | |||
current += utf8_out(c, current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_COLON; | |||
case ESPEAKNG_CTYPE_SEMICOLON: | |||
current += utf8_out(c, current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_SEMICOLON; | |||
case ESPEAKNG_CTYPE_ELLIPSIS: | |||
current += utf8_out(c, current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_ELLIPSIS; | |||
case ESPEAKNG_CTYPE_PUNCTUATION: | |||
current += utf8_out(c, current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_PUNCTUATION; | |||
case ESPEAKNG_CTYPE_SYMBOL: | |||
current += utf8_out(c, current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_SYMBOL; | |||
default: | |||
current += utf8_out(c, current); | |||
*current = '\0'; | |||
return ESPEAKNG_TOKEN_UNKNOWN; | |||
} | |||
return ESPEAKNG_TOKEN_END_OF_BUFFER; | |||
} | |||
#pragma GCC visibility push(default) | |||
espeak_ng_TOKENIZER * | |||
create_tokenizer(void) | |||
{ | |||
espeak_ng_TOKENIZER *tokenizer = malloc(sizeof(espeak_ng_TOKENIZER)); | |||
if (!tokenizer) return NULL; | |||
tokenizer->decoder = NULL; | |||
tokenizer->keepc = ESPEAKNG_CODEPOINT_INVALID; | |||
tokenizer->read = tokenizer_state_end_of_buffer; | |||
*tokenizer->token = '\0'; | |||
return tokenizer; | |||
} | |||
void | |||
destroy_tokenizer(espeak_ng_TOKENIZER *tokenizer) | |||
{ | |||
if (tokenizer) free(tokenizer); | |||
} | |||
int | |||
tokenizer_reset(espeak_ng_TOKENIZER *tokenizer, | |||
espeak_ng_TEXT_DECODER *decoder, | |||
espeak_ng_TOKENIZER_OPTIONS options) | |||
{ | |||
if (!tokenizer) return 0; | |||
tokenizer->decoder = decoder; | |||
tokenizer->keepc = ESPEAKNG_CODEPOINT_INVALID; | |||
tokenizer->read = decoder ? tokenizer_state_default : tokenizer_state_end_of_buffer; | |||
return 1; | |||
} | |||
espeak_ng_TOKEN_TYPE | |||
tokenizer_read_next_token(espeak_ng_TOKENIZER *tokenizer) | |||
{ | |||
return tokenizer->read(tokenizer); | |||
} | |||
const char * | |||
tokenizer_get_token_text(espeak_ng_TOKENIZER *tokenizer) | |||
{ | |||
return tokenizer->token; | |||
} | |||
#pragma GCC visibility pop |
@@ -32,6 +32,7 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
@@ -158,19 +159,44 @@ static void SetLetterBitsRange(Translator *tr, int group, int first, int last) | |||
// ignore these characters | |||
static const unsigned short chars_ignore_default[] = { | |||
0xad, 1, // soft hyphen | |||
0x200c, 1, // zero width non-joiner | |||
0x200d, 1, // zero width joiner | |||
0, 0 | |||
// U+00AD SOFT HYPHEN | |||
// Used to mark hyphenation points in words for where to split a | |||
// word at the end of a line to provide readable justified text. | |||
0xad, 1, | |||
// U+200C ZERO WIDTH NON-JOINER | |||
// Used to prevent combined ligatures being displayed in their | |||
// combined form. | |||
0x200c, 1, | |||
// U+200D ZERO WIDTH JOINER | |||
// Used to indicate an alternative connected form made up of the | |||
// characters surrounding the ZWJ in Devanagari, Kannada, Malayalam | |||
// and Emoji. | |||
// 0x200d, 1, // Not ignored. | |||
// End of the ignored character list. | |||
0, 0 | |||
}; | |||
// alternatively, ignore characters but allow zero-width-non-joiner (lang-fa) | |||
static const unsigned short chars_ignore_zwnj_hyphen[] = { | |||
0xad, 1, // soft hyphen | |||
0x640, 1, // igniore Arabic Tatweel (lang=FA) | |||
0x200c, '-', // zero width non-joiner, replace with hyphen | |||
0x200d, 1, // zero width joiner | |||
0, 0 | |||
// U+00AD SOFT HYPHEN | |||
// Used to mark hyphenation points in words for where to split a | |||
// word at the end of a line to provide readable justified text. | |||
0xad, 1, | |||
// U+0640 TATWEEL (KASHIDA) | |||
// Used in Arabic scripts to stretch characters for justifying | |||
// the text. | |||
0x640, 1, | |||
// U+200C ZERO WIDTH NON-JOINER | |||
// Used to prevent combined ligatures being displayed in their | |||
// combined form. | |||
0x200c, '-', | |||
// U+200D ZERO WIDTH JOINER | |||
// Used to indicate an alternative connected form made up of the | |||
// characters surrounding the ZWJ in Devanagari, Kannada, Malayalam | |||
// and Emoji. | |||
// 0x200d, 1, // Not ignored. | |||
// End of the ignored character list. | |||
0, 0 | |||
}; | |||
const unsigned char utf8_ordinal[] = { 0xc2, 0xba, 0 }; // masculine ordinal character, UTF-8 | |||
@@ -387,7 +413,7 @@ static void SetCyrillicLetters(Translator *tr) | |||
SetLetterBits(tr, LETTERGP_VOWEL2, (char *)ru_vowels); | |||
} | |||
void SetIndicLetters(Translator *tr) | |||
static void SetIndicLetters(Translator *tr) | |||
{ | |||
// Set letter types for Indic scripts, Devanagari, Tamill, etc | |||
static const char dev_consonants2[] = { 0x02, 0x03, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x7b, 0x7c, 0x7e, 0x7f, 0 }; | |||
@@ -412,7 +438,7 @@ void SetIndicLetters(Translator *tr) | |||
tr->langopts.suffix_add_e = tr->letter_bits_offset + 0x4d; // virama | |||
} | |||
void SetupTranslator(Translator *tr, const short *lengths, const unsigned char *amps) | |||
static void SetupTranslator(Translator *tr, const short *lengths, const unsigned char *amps) | |||
{ | |||
if (lengths != NULL) | |||
memcpy(tr->stress_lengths, lengths, sizeof(tr->stress_lengths)); |
@@ -33,8 +33,8 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
Translator *translator = NULL; // the main translator | |||
@@ -254,7 +254,7 @@ int IsDigit(unsigned int c) | |||
return 0; | |||
} | |||
int IsSpace(unsigned int c) | |||
static int IsSpace(unsigned int c) | |||
{ | |||
if (c == 0) | |||
return 0; | |||
@@ -265,6 +265,16 @@ int IsSpace(unsigned int c) | |||
return iswspace(c); | |||
} | |||
int isspace2(unsigned int c) | |||
{ | |||
// can't use isspace() because on Windows, isspace(0xe1) gives TRUE ! | |||
int c2; | |||
if (((c2 = (c & 0xff)) == 0) || (c > ' ')) | |||
return 0; | |||
return 1; | |||
} | |||
void DeleteTranslator(Translator *tr) | |||
{ | |||
if (tr->data_dictlist != NULL) | |||
@@ -388,6 +398,40 @@ int utf8_in(int *c, const char *buf) | |||
} | |||
#pragma GCC visibility pop | |||
int utf8_out(unsigned int c, char *buf) | |||
{ | |||
// write a unicode character into a buffer as utf8 | |||
// returns the number of bytes written | |||
int n_bytes; | |||
int j; | |||
int shift; | |||
static char unsigned code[4] = { 0, 0xc0, 0xe0, 0xf0 }; | |||
if (c < 0x80) { | |||
buf[0] = c; | |||
return 1; | |||
} | |||
if (c >= 0x110000) { | |||
buf[0] = ' '; // out of range character code | |||
return 1; | |||
} | |||
if (c < 0x0800) | |||
n_bytes = 1; | |||
else if (c < 0x10000) | |||
n_bytes = 2; | |||
else | |||
n_bytes = 3; | |||
shift = 6*n_bytes; | |||
buf[0] = code[n_bytes] | (c >> shift); | |||
for (j = 0; j < n_bytes; j++) { | |||
shift -= 6; | |||
buf[j+1] = 0x80 + ((c >> shift) & 0x3f); | |||
} | |||
return n_bytes+1; | |||
} | |||
char *strchr_w(const char *s, int c) | |||
{ | |||
// return NULL for any non-ascii character | |||
@@ -396,17 +440,6 @@ char *strchr_w(const char *s, int c) | |||
return strchr((char *)s, c); // (char *) is needed for Borland compiler | |||
} | |||
int IsAllUpper(const char *word) | |||
{ | |||
int c; | |||
while ((*word != 0) && !isspace2(*word)) { | |||
word += utf8_in(&c, word); | |||
if (!iswupper(c)) | |||
return 0; | |||
} | |||
return 1; | |||
} | |||
static char *SpeakIndividualLetters(Translator *tr, char *word, char *phonemes, int spell_word) | |||
{ | |||
int posn = 0; | |||
@@ -525,7 +558,6 @@ static int TranslateWord3(Translator *tr, char *word_start, WORD_TAB *wtab, char | |||
int more_suffixes; | |||
int confirm_prefix; | |||
int spell_word; | |||
int stress_bits; | |||
int emphasize_allcaps = 0; | |||
int wflags; | |||
int wmark; | |||
@@ -1139,7 +1171,7 @@ int TranslateWord(Translator *tr, char *word_start, WORD_TAB *wtab, char *word_o | |||
char word[N_WORD_BYTES+1]; | |||
word[0] = 0; | |||
word[1] = ' '; | |||
memcpy(word+2, word_out, strlen(word_out)); | |||
strcpy(word+2, word_out); | |||
word_out = word+2; | |||
while (*word_out && available > 1) { | |||
@@ -1195,7 +1227,7 @@ static int CountSyllables(unsigned char *phonemes) | |||
return count; | |||
} | |||
void Word_EmbeddedCmd() | |||
static void Word_EmbeddedCmd() | |||
{ | |||
// Process embedded commands for emphasis, sayas, and break | |||
int embedded_cmd; | |||
@@ -1791,13 +1823,13 @@ static int SubstituteChar(Translator *tr, unsigned int c, unsigned int next_in, | |||
// don't convert the case of the second character unless the next letter is also upper case | |||
c2 = new_c >> 16; | |||
if (upper_case && iswupper(next_in)) | |||
c2 = towupper(c2); | |||
c2 = ucd_toupper(c2); | |||
*insert = c2; | |||
new_c &= 0xffff; | |||
} | |||
if (upper_case) | |||
new_c = towupper(new_c); | |||
new_c = ucd_toupper(new_c); | |||
*wordflags |= FLAG_CHAR_REPLACED; | |||
return new_c; | |||
@@ -1874,7 +1906,7 @@ static int TranslateChar(Translator *tr, char *ptr, int prev_in, unsigned int c, | |||
static const char *UCase_ga[] = { "bp", "bhf", "dt", "gc", "hA", "mb", "nd", "ng", "ts", "tA", "nA", NULL }; | |||
int UpperCaseInWord(Translator *tr, char *word, int c) | |||
static int UpperCaseInWord(Translator *tr, char *word, int c) | |||
{ | |||
int ix; | |||
int len; |
@@ -1,7 +1,7 @@ | |||
/* | |||
* Copyright (C) 2005 to 2014 by Jonathan Duddington | |||
* email: [email protected] | |||
* Copyright (C) 2015 Reece H. Dunn | |||
* Copyright (C) 2015-2017 Reece H. Dunn | |||
* | |||
* This program is free software; you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License as published by | |||
@@ -706,10 +706,15 @@ extern void SetLengthMods(Translator *tr, int value); | |||
void LoadConfig(void); | |||
int TransposeAlphabet(Translator *tr, char *text); | |||
#define LEADING_2_BITS 0xC0 // 0b11000000 | |||
#define UTF8_TAIL_BITS 0x80 // 0b10000000 | |||
ESPEAK_NG_API int utf8_in(int *c, const char *buf); | |||
int utf8_in2(int *c, const char *buf, int backwards); | |||
int utf8_out(unsigned int c, char *buf); | |||
int utf8_nbytes(const char *buf); | |||
int lookupwchar(const unsigned short *list, int c); | |||
int lookupwchar2(const unsigned short *list, int c); | |||
int Eof(void); | |||
@@ -747,6 +752,10 @@ void LookupAccentedLetter(Translator *tr, unsigned int letter, char *ph_buf); | |||
int LoadDictionary(Translator *tr, const char *name, int no_error); | |||
int LookupDictList(Translator *tr, char **wordptr, char *ph_out, unsigned int *flags, int end_flags, WORD_TAB *wtab); | |||
int HashDictionary(const char *string); | |||
void print_dictionary_flags(unsigned int *flags, char *buf, int buf_len); | |||
char *DecodeRule(const char *group_chars, int group_length, char *rule, int control); | |||
void MakePhonemeList(Translator *tr, int post_pause, int new_sentence); | |||
int ChangePhonemes_ru(Translator *tr, PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch); |
@@ -22,6 +22,8 @@ extern "C" | |||
{ | |||
#endif | |||
#define N_PEAKS 9 | |||
typedef struct { | |||
char v_name[40]; | |||
char language_name[20]; | |||
@@ -86,6 +88,7 @@ espeak_ng_STATUS DoVoiceChange(voice_t *v); | |||
void WavegenSetVoice(voice_t *v); | |||
void ReadTonePoints(char *string, int *tone_pts); | |||
void VoiceReset(int control); | |||
void FreeVoiceList(void); | |||
#ifdef __cplusplus | |||
} |
@@ -40,8 +40,8 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#include "translate.h" | |||
MNEM_TAB genders[] = { | |||
@@ -474,18 +474,6 @@ static int Read8Numbers(char *data_in, int *data) | |||
&data[0], &data[1], &data[2], &data[3], &data[4], &data[5], &data[6], &data[7]); | |||
} | |||
static unsigned int StringToWord2(const char *string) | |||
{ | |||
// Convert a language name string to a word such as L('e','n') | |||
int ix; | |||
int c; | |||
unsigned int value = 0; | |||
for (ix = 0; (ix < 4) && ((c = string[ix]) != 0); ix++) | |||
value = (value << 8) | (c & 0xff); | |||
return value; | |||
} | |||
voice_t *LoadVoice(const char *vname, int control) | |||
{ | |||
// control, bit 0 1= no_default | |||
@@ -544,7 +532,7 @@ voice_t *LoadVoice(const char *vname, int control) | |||
return NULL; | |||
} else { | |||
if (voicename[0] == 0) | |||
strcpy(voicename, "en"); | |||
strcpy(voicename, ESPEAKNG_DEFAULT_VOICE); | |||
sprintf(path_voices, "%s%cvoices%c", path_home, PATHSEP, PATHSEP); | |||
sprintf(buf, "%s%s", path_voices, voicename); // look in the main voices directory | |||
@@ -705,47 +693,57 @@ voice_t *LoadVoice(const char *vname, int control) | |||
break; | |||
case V_INTONATION: // intonation | |||
sscanf(p, "%d %d", &option_tone_flags, &option_tone2); | |||
if ((option_tone_flags & 0xff) != 0) | |||
langopts->intonation_group = option_tone_flags & 0xff; | |||
if ((option_tone_flags & 0xff) != 0) { | |||
if (langopts) | |||
langopts->intonation_group = option_tone_flags & 0xff; | |||
else | |||
fprintf(stderr, "Cannot set intonation: language not set, or is invalid.\n"); | |||
} | |||
break; | |||
case V_TUNES: | |||
n = sscanf(p, "%s %s %s %s %s %s", names[0], names[1], names[2], names[3], names[4], names[5]); | |||
langopts->intonation_group = 0; | |||
for (ix = 0; ix < n; ix++) { | |||
if (strcmp(names[ix], "NULL") == 0) | |||
continue; | |||
if ((value = LookupTune(names[ix])) < 0) | |||
fprintf(stderr, "Unknown tune '%s'\n", names[ix]); | |||
else | |||
langopts->tunes[ix] = value; | |||
} | |||
if (langopts) { | |||
langopts->intonation_group = 0; | |||
for (ix = 0; ix < n; ix++) { | |||
if (strcmp(names[ix], "NULL") == 0) | |||
continue; | |||
if ((value = LookupTune(names[ix])) < 0) | |||
fprintf(stderr, "Unknown tune '%s'\n", names[ix]); | |||
else | |||
langopts->tunes[ix] = value; | |||
} | |||
} else | |||
fprintf(stderr, "Cannot set tunes: language not set, or is invalid.\n"); | |||
break; | |||
case V_DICTRULES: // conditional dictionary rules and list entries | |||
case V_NUMBERS: | |||
case V_STRESSOPT: | |||
// expect a list of numbers | |||
while (*p != 0) { | |||
while (isspace(*p)) p++; | |||
if ((n = atoi(p)) > 0) { | |||
p++; | |||
if (n < 32) { | |||
if (key == V_DICTRULES) | |||
conditional_rules |= (1 << n); | |||
else if (key == V_NUMBERS) | |||
langopts->numbers |= (1 << n); | |||
else if (key == V_STRESSOPT) | |||
langopts->stress_flags |= (1 << n); | |||
} else { | |||
if ((key == V_NUMBERS) && (n < 64)) | |||
langopts->numbers2 |= (1 << (n-32)); | |||
else | |||
fprintf(stderr, "Bad option number %d\n", n); | |||
if (langopts) { | |||
// expect a list of numbers | |||
while (*p != 0) { | |||
while (isspace(*p)) p++; | |||
if ((n = atoi(p)) > 0) { | |||
p++; | |||
if (n < 32) { | |||
if (key == V_DICTRULES) | |||
conditional_rules |= (1 << n); | |||
else if (key == V_NUMBERS) | |||
langopts->numbers |= (1 << n); | |||
else if (key == V_STRESSOPT) | |||
langopts->stress_flags |= (1 << n); | |||
} else { | |||
if ((key == V_NUMBERS) && (n < 64)) | |||
langopts->numbers2 |= (1 << (n-32)); | |||
else | |||
fprintf(stderr, "Bad option number %d\n", n); | |||
} | |||
} | |||
while (isalnum(*p)) p++; | |||
} | |||
while (isalnum(*p)) p++; | |||
} | |||
ProcessLanguageOptions(langopts); | |||
ProcessLanguageOptions(langopts); | |||
} else | |||
fprintf(stderr, "Cannot set stressopt: language not set, or is invalid.\n"); | |||
break; | |||
case V_REPLACE: | |||
if (phonemes_set == 0) { | |||
@@ -756,22 +754,31 @@ voice_t *LoadVoice(const char *vname, int control) | |||
PhonemeReplacement(p); | |||
break; | |||
case V_WORDGAP: // words | |||
sscanf(p, "%d %d", &langopts->word_gap, &langopts->vowel_pause); | |||
if (langopts) | |||
sscanf(p, "%d %d", &langopts->word_gap, &langopts->vowel_pause); | |||
else | |||
fprintf(stderr, "Cannot set wordgap: language not set, or is invalid.\n"); | |||
break; | |||
case V_STRESSRULE: | |||
sscanf(p, "%d %d %d %d", &langopts->stress_rule, | |||
&langopts->stress_flags, | |||
&langopts->unstressed_wd1, | |||
&langopts->unstressed_wd2); | |||
if (langopts) | |||
sscanf(p, "%d %d %d %d", &langopts->stress_rule, | |||
&langopts->stress_flags, | |||
&langopts->unstressed_wd1, | |||
&langopts->unstressed_wd2); | |||
else | |||
fprintf(stderr, "Cannot set stressrule: language not set, or is invalid.\n"); | |||
break; | |||
case V_OPTION: | |||
value2 = 0; | |||
if (((sscanf(p, "%s %d %d", option_name, &value, &value2) >= 2) && ((ix = LookupMnem(options_tab, option_name)) >= 0)) || | |||
((sscanf(p, "%d %d %d", &ix, &value, &value2) >= 2) && (ix < N_LOPTS))) { | |||
langopts->param[ix] = value; | |||
langopts->param2[ix] = value2; | |||
if (langopts) { | |||
value2 = 0; | |||
if (((sscanf(p, "%s %d %d", option_name, &value, &value2) >= 2) && ((ix = LookupMnem(options_tab, option_name)) >= 0)) || | |||
((sscanf(p, "%d %d %d", &ix, &value, &value2) >= 2) && (ix < N_LOPTS))) { | |||
langopts->param[ix] = value; | |||
langopts->param2[ix] = value2; | |||
} else | |||
fprintf(stderr, "Bad voice option: %s %s\n", buf, p); | |||
} else | |||
fprintf(stderr, "Bad voice option: %s %s\n", buf, p); | |||
fprintf(stderr, "Cannot set option: language not set, or is invalid.\n"); | |||
break; | |||
case V_ECHO: | |||
// echo. suggest: 135mS 11% | |||
@@ -852,9 +859,12 @@ voice_t *LoadVoice(const char *vname, int control) | |||
case V_STATUS: | |||
break; | |||
default: | |||
if ((key & 0xff00) == 0x100) | |||
sscanf(p, "%d", &langopts->param[key &0xff]); | |||
else | |||
if ((key & 0xff00) == 0x100) { | |||
if (langopts) | |||
sscanf(p, "%d", &langopts->param[key &0xff]); | |||
else | |||
fprintf(stderr, "Cannot set voice attribute: language not set, or is invalid.\n"); | |||
} else | |||
fprintf(stderr, "Bad voice attribute: %s\n", buf); | |||
break; | |||
} | |||
@@ -1272,7 +1282,7 @@ char const *SelectVoice(espeak_VOICE *voice_select, int *found) | |||
if (voice_select2.name == NULL) { | |||
if ((voice_select2.name = voice_select2.identifier) == NULL) | |||
voice_select2.name = "default"; | |||
voice_select2.name = ESPEAKNG_DEFAULT_VOICE; | |||
} | |||
strncpy0(buf, voice_select2.name, sizeof(buf)); | |||
@@ -1299,7 +1309,7 @@ char const *SelectVoice(espeak_VOICE *voice_select, int *found) | |||
if (nv == 0) { | |||
// no matching voice, choose the default | |||
*found = 0; | |||
if ((voices[0] = SelectVoiceByName(voices_list, "default")) != NULL) | |||
if ((voices[0] = SelectVoiceByName(voices_list, ESPEAKNG_DEFAULT_VOICE)) != NULL) | |||
nv = 1; | |||
} | |||
@@ -33,8 +33,12 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "synthesize.h" | |||
#ifdef INCLUDE_KLATT | |||
#include "klatt.h" | |||
#endif | |||
#if HAVE_SONIC_H | |||
#include "sonic.h" | |||
@@ -665,7 +669,7 @@ static int ApplyBreath(void) | |||
return value; | |||
} | |||
int Wavegen() | |||
static int Wavegen() | |||
{ | |||
if (wvoice == NULL) | |||
return 0; | |||
@@ -1117,7 +1121,7 @@ void SetPitch2(voice_t *voice, int pitch1, int pitch2, int *pitch_base, int *pit | |||
*pitch_range = base + (pitch2 * range)/2 - *pitch_base; | |||
} | |||
void SetPitch(int length, unsigned char *env, int pitch1, int pitch2) | |||
static void SetPitch(int length, unsigned char *env, int pitch1, int pitch2) | |||
{ | |||
if (wvoice == NULL) | |||
return; | |||
@@ -1140,7 +1144,7 @@ void SetPitch(int length, unsigned char *env, int pitch1, int pitch2) | |||
flutter_amp = wvoice->flutter; | |||
} | |||
void SetSynth(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v) | |||
static void SetSynth(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v) | |||
{ | |||
if (wvoice == NULL || v == NULL) | |||
return; | |||
@@ -1246,7 +1250,7 @@ void Write4Bytes(FILE *f, int value) | |||
} | |||
} | |||
int WavegenFill2() | |||
static int WavegenFill2() | |||
{ | |||
// Pick up next wavegen commands from the queue | |||
// return: 0 output buffer has been filled |
@@ -1,4 +1,5 @@ | |||
.*.swp | |||
*~ | |||
# intermediate files: | |||
@@ -52,12 +53,15 @@ depcomp | |||
install-sh | |||
libtool | |||
ltmain.sh | |||
m4/ | |||
missing | |||
Makefile | |||
Makefile.in | |||
stamp-h1 | |||
m4/* | |||
!m4/ax_check_compile_flag.m4 | |||
# emscripten: | |||
a.out.js | |||
a.out.js.mem |
@@ -7,11 +7,14 @@ These are eSpeak NG specific modifications to the `ucd-tools` project: | |||
* `data/espeak-ng` data files for eSpeak NG extended data. | |||
* espeak-ng PropList property lookup as part of the `ucd_property` API. | |||
## 9.0.0.1 - (In Progress) | |||
## 10.0.0 - 2017-06-25 | |||
* Add `iswblank` and `iswxdigit` compatibility. | |||
* Improve ctype compatibility. | |||
* PropList property lookup. | |||
* PropList and emoji-data property lookup. | |||
* Support building with a C89 compiler. | |||
* Update to Unicode Character Data 10.0.0. | |||
* Unicode Emoji 5.0. | |||
## 9.0.0 - 2016-12-28 | |||
@@ -55,34 +55,34 @@ EXTRA_DIST += ChangeLog | |||
############################# Unicode Data #################################### | |||
EMOJI_VERSION=4.0 | |||
EMOJI_VERSION=5.0 | |||
UCD_VERSION=@UCD_VERSION@ | |||
UCD_ROOTDIR=data/ucd | |||
UCD_SRCDIR=http://www.unicode.org/Public | |||
data/emoji/emoji-data.txt: | |||
mkdir -pv data/emoji | |||
curl ${UCD_SRCDIR}/emoji/${EMOJI_VERSION}/emoji-data.txt > $@ | |||
curl ${UCD_SRCDIR}/emoji/${EMOJI_VERSION}/emoji-data.txt -o $@ | |||
data/ucd/PropList.txt: | |||
mkdir -pv data/ucd | |||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/PropList.txt > $@ | |||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/PropList.txt -o $@ | |||
data/ucd/DerivedCoreProperties.txt: | |||
mkdir -pv data/ucd | |||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/DerivedCoreProperties.txt > $@ | |||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/DerivedCoreProperties.txt -o $@ | |||
data/ucd/PropertyValueAliases.txt: | |||
mkdir -pv data/ucd | |||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/PropertyValueAliases.txt > $@ | |||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/PropertyValueAliases.txt -o $@ | |||
data/ucd/Scripts.txt: | |||
mkdir -pv data/ucd | |||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/Scripts.txt > $@ | |||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/Scripts.txt -o $@ | |||
data/ucd/UnicodeData.txt: | |||
mkdir -pv data/ucd | |||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/UnicodeData.txt > $@ | |||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/UnicodeData.txt -o $@ | |||
############################# documentation ################################### | |||
@@ -1,5 +1,5 @@ | |||
AC_PREREQ([2.65]) | |||
AC_INIT([Unicode Character Database Tools], [9.0.0], [https://github.com/rhdunn/ucd-tools/issues], [ucd-tools], [https://github.com/rhdunn/ucd-tools]) | |||
AC_INIT([Unicode Character Database Tools], [10.0.0], [https://github.com/rhdunn/ucd-tools/issues], [ucd-tools], [https://github.com/rhdunn/ucd-tools]) | |||
AM_INIT_AUTOMAKE() | |||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES]) | |||
@@ -24,6 +24,7 @@ dnl library checks. | |||
dnl ================================================================ | |||
AC_CHECK_HEADERS([stddef.h]) dnl C89 | |||
AC_CHECK_FUNCS([iswblank]) dnl C99 | |||
AC_TYPE_UINT8_T | |||
AC_TYPE_UINT32_T | |||
@@ -33,13 +34,22 @@ dnl UCD data configuration. | |||
dnl ================================================================ | |||
AC_ARG_WITH([unicode-version], | |||
[AS_HELP_STRING([--with-unicode-version], [Unicode version to support @<:@default=9.0.0@:>@])], | |||
[AS_HELP_STRING([--with-unicode-version], [Unicode version to support @<:@default=10.0.0@:>@])], | |||
[AS_IF([test x"$withval" != x], | |||
[UCD_VERSION="$withval"])], | |||
[UCD_VERSION="9.0.0"]) | |||
[UCD_VERSION="10.0.0"]) | |||
AC_SUBST(UCD_VERSION) | |||
dnl ================================================================ | |||
dnl Compiler warnings. | |||
dnl | |||
dnl Reference: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html | |||
dnl ================================================================ | |||
AX_CHECK_COMPILE_FLAG([-Wmissing-prototypes], [CFLAGS="-Wmissing-prototypes $CFLAGS"]) | |||
AX_CHECK_COMPILE_FLAG([-Wreturn-type], [CFLAGS="-Wreturn-type $CFLAGS"]) | |||
dnl ================================================================ | |||
dnl Generate output. | |||
dnl ================================================================ |
@@ -0,0 +1,75 @@ | |||
# =========================================================================== | |||
# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html | |||
# =========================================================================== | |||
# | |||
# SYNOPSIS | |||
# | |||
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) | |||
# | |||
# DESCRIPTION | |||
# | |||
# Check whether the given FLAG works with the current language's compiler | |||
# or gives an error. (Warnings, however, are ignored) | |||
# | |||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on | |||
# success/failure. | |||
# | |||
# If EXTRA-FLAGS is defined, it is added to the current language's default | |||
# flags (e.g. CFLAGS) when the check is done. The check is thus made with | |||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to | |||
# force the compiler to issue an error when a bad flag is given. | |||
# | |||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE. | |||
# | |||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this | |||
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. | |||
# | |||
# LICENSE | |||
# | |||
# Copyright (c) 2008 Guido U. Draheim <[email protected]> | |||
# Copyright (c) 2011 Maarten Bosmans <[email protected]> | |||
# | |||
# This program is free software: you can redistribute it and/or modify it | |||
# under the terms of the GNU General Public License as published by the | |||
# Free Software Foundation, either version 3 of the License, or (at your | |||
# option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, but | |||
# WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | |||
# Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License along | |||
# with this program. If not, see <https://www.gnu.org/licenses/>. | |||
# | |||
# As a special exception, the respective Autoconf Macro's copyright owner | |||
# gives unlimited permission to copy, distribute and modify the configure | |||
# scripts that are the output of Autoconf when processing the Macro. You | |||
# need not follow the terms of the GNU General Public License when using | |||
# or distributing such scripts, even though portions of the text of the | |||
# Macro appear in them. The GNU General Public License (GPL) does govern | |||
# all other use of the material that constitutes the Autoconf Macro. | |||
# | |||
# This special exception to the GPL applies to versions of the Autoconf | |||
# Macro released by the Autoconf Archive. When you make and distribute a | |||
# modified version of the Autoconf Macro, you may extend this special | |||
# exception to the GPL to apply to your modified version as well. | |||
#serial 5 | |||
AC_DEFUN([AX_CHECK_COMPILE_FLAG], | |||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF | |||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl | |||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ | |||
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS | |||
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" | |||
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], | |||
[AS_VAR_SET(CACHEVAR,[yes])], | |||
[AS_VAR_SET(CACHEVAR,[no])]) | |||
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) | |||
AS_VAR_IF(CACHEVAR,yes, | |||
[m4_default([$2], :)], | |||
[m4_default([$3], :)]) | |||
AS_VAR_POPDEF([CACHEVAR])dnl | |||
])dnl AX_CHECK_COMPILE_FLAGS | |||
@@ -18,14 +18,15 @@ | |||
* along with ucd-tools. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
// NOTE: This file is automatically generated from the UnicodeData.txt file in | |||
// the Unicode Character database by the ucd-tools/tools/categories.py script. | |||
/* NOTE: This file is automatically generated from the UnicodeData.txt file in | |||
* the Unicode Character database by the ucd-tools/tools/categories.py script. | |||
*/ | |||
#include "ucd/ucd.h" | |||
#include <stddef.h> | |||
// Unicode Character Data 9.0.0 | |||
/* Unicode Character Data 10.0.0 */ | |||
struct case_conversion_entry | |||
{ |