install-sh | install-sh | ||||
libtool | libtool | ||||
ltmain.sh | ltmain.sh | ||||
m4/ | |||||
missing | missing | ||||
stamp-h1 | stamp-h1 | ||||
.dirstamp | .dirstamp | ||||
m4/* | |||||
!m4/ax_check_compile_flag.m4 | |||||
# libraries | # libraries | ||||
docs/speak_lib.h | docs/speak_lib.h | ||||
tests/*.test | tests/*.test | ||||
!tests/languages.test | !tests/languages.test | ||||
!tests/phoneme-output.test | |||||
espeak-ng.pc | espeak-ng.pc | ||||
The espeak-ng project is a fork of the espeak project. | 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. | * Provide more validation when reading phoneme tables and voice/language files. | ||||
* Removed support for phoneme equivalence tables. These were disabled in the | * Removed support for phoneme equivalence tables. These were disabled in the | ||||
* Fix running `make clean ; make`. | * Fix running `make clean ; make`. | ||||
* Fix reading stdin buffers larger than 1000. | * Fix reading stdin buffers larger than 1000. | ||||
* Fixed various language and parent BCP 47 codes (`jp` is now `ja`). | * Fixed various language and parent BCP 47 codes (`jp` is now `ja`). | ||||
* Fixed several crashes and bugs in `espeak_SetVoiceByName/Properties`. | |||||
new languages: | new languages: | ||||
* fr-CH (French (Switzerland)) -- Claude Beazley | * fr-CH (French (Switzerland)) -- Claude Beazley | ||||
* kok (Konkani) -- Vardhan | * kok (Konkani) -- Vardhan | ||||
* mi (Māori) -- Graham Oliver | * mi (Māori) -- Graham Oliver | ||||
* sd (Sindhi, Arabic script) -- Vardhan | |||||
* sd (Sindhi, Arabic script) -- Vardhan, Ejaz Shah | |||||
updated languages: | updated languages: | ||||
* lt (Lithuanian) | * lt (Lithuanian) | ||||
* lv (Latvian) | * lv (Latvian) | ||||
* mk (Macedonian) | * mk (Macedonian) | ||||
* ml (Malayalam) | |||||
* mr (Marathi) | * mr (Marathi) | ||||
* ms (Malay) | * ms (Malay) | ||||
* my (Myanmar/Burmese) | |||||
* ne (Nepali) | |||||
* nl (Dutch) | * nl (Dutch) | ||||
* or (Oriya) | * or (Oriya) | ||||
* pa (Punjabi) | |||||
* pl (Polish) | * pl (Polish) | ||||
* pt (Portuguese) -- Brazil | * pt (Portuguese) -- Brazil | ||||
* ro (Romanian) | * ro (Romanian) | ||||
* sr (Serbian) | * sr (Serbian) | ||||
* sv (Swedish) | * sv (Swedish) | ||||
* sw (Swahili) | * sw (Swahili) | ||||
* ta (Tamil) | |||||
* te (Telugu) | * te (Telugu) | ||||
* tr (Turkish) | * tr (Turkish) | ||||
* ur (Urdu) | * ur (Urdu) |
espeak_ng_include_HEADERS = \ | espeak_ng_include_HEADERS = \ | ||||
src/include/espeak-ng/encoding.h \ | src/include/espeak-ng/encoding.h \ | ||||
src/include/espeak-ng/espeak_ng.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 | lib_LTLIBRARIES += src/libespeak-ng.la | ||||
src/libespeak-ng/synthdata.c \ | src/libespeak-ng/synthdata.c \ | ||||
src/libespeak-ng/synthesize.c \ | src/libespeak-ng/synthesize.c \ | ||||
src/libespeak-ng/synth_mbrola.c \ | src/libespeak-ng/synth_mbrola.c \ | ||||
src/libespeak-ng/tokenizer.c \ | |||||
src/libespeak-ng/translate.c \ | src/libespeak-ng/translate.c \ | ||||
src/libespeak-ng/tr_languages.c \ | src/libespeak-ng/tr_languages.c \ | ||||
src/libespeak-ng/voices.c \ | src/libespeak-ng/voices.c \ | ||||
tests_encoding_test_LDADD = src/libespeak-ng.la | tests_encoding_test_LDADD = src/libespeak-ng.la | ||||
tests_encoding_test_SOURCES = tests/encoding.c | 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 | noinst_bin_PROGRAMS += tests/readclause.test | ||||
tests_readclause_test_CFLAGS = -Isrc/libespeak-ng ${AM_CFLAGS} | tests_readclause_test_CFLAGS = -Isrc/libespeak-ng ${AM_CFLAGS} | ||||
@ESPEAK_DATA_PATH=$(PWD) $< && echo " PASSED $<" | @ESPEAK_DATA_PATH=$(PWD) $< && echo " PASSED $<" | ||||
check: tests/encoding.check \ | check: tests/encoding.check \ | ||||
tests/tokenizer.check \ | |||||
tests/readclause.check \ | tests/readclause.check \ | ||||
tests/api.check \ | tests/api.check \ | ||||
tests/phoneme-output.check \ | |||||
tests/languages.check | tests/languages.check | ||||
##### phoneme data: | ##### phoneme data: | ||||
rm -f $@ | rm -f $@ | ||||
find espeak-ng-data/{intonations,phondata,phonindex,phontab} | zip -@ $@ | find espeak-ng-data/{intonations,phondata,phonindex,phontab} | zip -@ $@ | ||||
find espeak-ng-data/*_dict | 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 -@ $@ | find espeak-ng-data/voices -type f | grep -vF "/mb/" | zip -@ $@ | ||||
android/res/raw/espeakdata_version: android/res/raw/espeakdata.zip | android/res/raw/espeakdata_version: android/res/raw/espeakdata.zip | ||||
espeak-ng-data/mk_dict: dictsource/mk_list dictsource/mk_rules dictsource/mk_extra dictsource/mk_emoji | espeak-ng-data/mk_dict: dictsource/mk_list dictsource/mk_rules dictsource/mk_extra dictsource/mk_emoji | ||||
ml: espeak-ng-data/ml_dict | 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 | mr: espeak-ng-data/mr_dict | ||||
espeak-ng-data/mr_dict: dictsource/mr_list dictsource/mr_rules dictsource/mr_extra dictsource/mr_emoji | espeak-ng-data/mr_dict: dictsource/mr_list dictsource/mr_rules dictsource/mr_extra dictsource/mr_emoji | ||||
espeak-ng-data/mt_dict: dictsource/mt_list dictsource/mt_rules dictsource/mt_extra | espeak-ng-data/mt_dict: dictsource/mt_list dictsource/mt_rules dictsource/mt_extra | ||||
my: espeak-ng-data/my_dict | 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 | nci: espeak-ng-data/nci_dict | ||||
espeak-ng-data/nci_dict: dictsource/nci_list dictsource/nci_rules dictsource/nci_extra | espeak-ng-data/nci_dict: dictsource/nci_list dictsource/nci_rules dictsource/nci_extra | ||||
ne: espeak-ng-data/ne_dict | 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 | nl: espeak-ng-data/nl_dict | ||||
espeak-ng-data/nl_dict: dictsource/nl_list dictsource/nl_rules dictsource/nl_extra dictsource/nl_emoji | espeak-ng-data/nl_dict: dictsource/nl_list dictsource/nl_rules dictsource/nl_extra dictsource/nl_emoji | ||||
espeak-ng-data/or_dict: dictsource/or_list dictsource/or_rules dictsource/or_extra dictsource/or_emoji | espeak-ng-data/or_dict: dictsource/or_list dictsource/or_rules dictsource/or_extra dictsource/or_emoji | ||||
pa: espeak-ng-data/pa_dict | 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 | pap: espeak-ng-data/pap_dict | ||||
espeak-ng-data/pap_dict: dictsource/pap_list dictsource/pap_rules dictsource/pap_extra | espeak-ng-data/pap_dict: dictsource/pap_list dictsource/pap_rules dictsource/pap_extra | ||||
espeak-ng-data/sw_dict: dictsource/sw_list dictsource/sw_rules dictsource/sw_extra dictsource/sw_emoji | espeak-ng-data/sw_dict: dictsource/sw_list dictsource/sw_rules dictsource/sw_extra dictsource/sw_emoji | ||||
ta: espeak-ng-data/ta_dict | 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 | te: espeak-ng-data/te_dict | ||||
espeak-ng-data/te_dict: dictsource/te_list dictsource/te_rules dictsource/te_extra dictsource/te_emoji | espeak-ng-data/te_dict: dictsource/te_list dictsource/te_rules dictsource/te_extra dictsource/te_emoji |
### Binaries | ### 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 | 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 | 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). | You also need to install the [Visual C++ Redistributable for Visual Studio 2015](https://www.microsoft.com/en-us/download/details.aspx?id=48145). | ||||
1. a copy of Visual Studio 2013 or later, such as the Community Edition; | 1. a copy of Visual Studio 2013 or later, such as the Community Edition; | ||||
2. the Windows 8.1 SDK; | 2. the Windows 8.1 SDK; | ||||
3. the [WiX installer](http://wixtoolset.org) plugin; | 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`). | `src` (as `src/pcaudiolib`). | ||||
You can then open and build the `src/windows/espeak-ng.sln` solution in Visual | You can then open and build the `src/windows/espeak-ng.sln` solution in Visual | ||||
Optionally, 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; | 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; | enable sonic audio speed up support; | ||||
4. the `ronn` man-page markdown processor to build the man pages. | 4. the `ronn` man-page markdown processor to build the man pages. | ||||
[ToFromIEEE.c.txt](http://www.realitypixels.com/turk/opensource/ToFromIEEE.c.txt) | [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 | which has been made available for use in Open Source applications per the | ||||
[license statement](COPYING.IEEE) on http://www.realitypixels.com/turk/opensource/. | [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 | The `getopt.c` compatibility implementation for getopt support on Windows is | ||||
taken from the NetBSD `getopt_long` implementation, which is licensed under a | taken from the NetBSD `getopt_long` implementation, which is licensed under a |
mavenCentral() | mavenCentral() | ||||
} | } | ||||
dependencies { | dependencies { | ||||
classpath 'com.android.tools.build:gradle:1.2.3' | |||||
classpath 'com.android.tools.build:gradle:2.3.3' | |||||
} | } | ||||
} | } | ||||
} | } | ||||
android { | android { | ||||
buildToolsVersion '19.1' | |||||
compileSdkVersion 23 | |||||
buildToolsVersion '25.0.3' | |||||
compileSdkVersion 26 | |||||
defaultConfig { | defaultConfig { | ||||
minSdkVersion 14 | minSdkVersion 14 | ||||
targetSdkVersion 23 | |||||
targetSdkVersion 26 | |||||
versionCode 20 | versionCode 20 | ||||
versionName "1.48.15" | versionName "1.48.15" | ||||
} | } | ||||
manifest.srcFile 'AndroidManifest.xml' | manifest.srcFile 'AndroidManifest.xml' | ||||
java.srcDirs = ['src'] | java.srcDirs = ['src'] | ||||
res.srcDirs = ['res'] | res.srcDirs = ['res'] | ||||
jniLibs.srcDir 'libs' | |||||
} | } | ||||
androidTest.setRoot('eSpeakTests') | androidTest.setRoot('eSpeakTests') | ||||
androidTest { | androidTest { | ||||
abortOnError false | abortOnError false | ||||
} | } | ||||
} | } | ||||
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { | |||||
pkgTask -> pkgTask.jniFolders = new HashSet<File>() | |||||
pkgTask.jniFolders.add(new File(projectDir, 'libs')) | |||||
} |
public void testMatchVoiceWithLanguageAndCountry() | 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, is(notNullValue())); | ||||
assertThat(voice.match(de), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); | assertThat(voice.match(de), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); | ||||
assertThat(voice.match(de_CH_1901), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); | assertThat(voice.match(de_CH_1901), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); | ||||
assertThat(voice.match(fr), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | 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_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), 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_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() | 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, is(notNullValue())); | ||||
assertThat(voice.match(de), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); | assertThat(voice.match(de), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); |
} | } | ||||
public void testOnLoadLanguage() { | 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(), 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)); | assertThat(mService.onLoadLanguage("eng", "USA", ""), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | ||||
checkLanguage(mService.onGetLanguage(), "eng", "USA", ""); | checkLanguage(mService.onGetLanguage(), "eng", "USA", ""); | ||||
assertThat(mService.onLoadLanguage("eng", "GBR", "scotland"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | assertThat(mService.onLoadLanguage("eng", "GBR", "scotland"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | ||||
checkLanguage(mService.onGetLanguage(), "eng", "GBR", "scotland"); | checkLanguage(mService.onGetLanguage(), "eng", "GBR", "scotland"); | ||||
assertThat(mService.getActiveVoice(), is(notNullValue())); | 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)); | assertThat(mService.onLoadLanguage("eng", "USA", "rp"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE)); | ||||
checkLanguage(mService.onGetLanguage(), "eng", "USA", ""); | checkLanguage(mService.onGetLanguage(), "eng", "USA", ""); | ||||
assertThat(mService.getActiveVoice(), is(notNullValue())); | assertThat(mService.getActiveVoice(), is(notNullValue())); | ||||
assertThat(mService.getActiveVoice().name, is("en-us")); | 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(), 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)); | 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(), is(notNullValue())); | ||||
assertThat(mService.getActiveVoice().name, is("en")); | |||||
assertThat(mService.getActiveVoice().name, is("en-gb")); | |||||
assertThat(mService.onLoadLanguage("eng", "FRA", ""), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | 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(), is(notNullValue())); | ||||
assertThat(mService.getActiveVoice().name, is("en")); | |||||
assertThat(mService.getActiveVoice().name, is("en-gb")); | |||||
assertThat(mService.onLoadLanguage("ine", "", ""), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED)); | 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(), is(notNullValue())); | ||||
assertThat(mService.getActiveVoice().name, is("en")); | |||||
assertThat(mService.getActiveVoice().name, is("en-gb")); | |||||
} | } | ||||
public void testOnIsLanguageAvailable() { | 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(), 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)); | 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(), 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)); | 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(), 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)); | 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(), 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(), 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)); | 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(), 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)); | 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(), 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)); | 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(), is(notNullValue())); | ||||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||||
} | } | ||||
public void testOnGetDefaultVoiceNameFor() { | 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(), 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")); | 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(), 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(), 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")); | 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(), 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(), 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(), 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(), is(notNullValue())); | ||||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||||
assertThat(mService.onGetDefaultVoiceNameFor("ine", "", ""), is(nullValue())); | 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(), is(notNullValue())); | ||||
assertThat(mService.getActiveVoice().name, is("vi-sgn")); | |||||
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central")); | |||||
} | } | ||||
public void testLanguages() { | public void testLanguages() { |
Log.d("TextToSpeechTestCase", "setUp: available = " + available); | Log.d("TextToSpeechTestCase", "setUp: available = " + available); | ||||
} | } | ||||
assertThat(available, isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); | |||||
assertThat(available, isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); | |||||
} | } | ||||
catch (Exception e) | catch (Exception e) | ||||
{ | { |
} | } | ||||
public static final Voice[] voices = new Voice[] { | 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 中文 (香港)"), | |||||
}; | }; | ||||
} | } |
# ucd-tools wide-character compatibility support: | # ucd-tools wide-character compatibility support: | ||||
UCDTOOLS_SRC_PATH := ../../ucd-tools/src | |||||
UCDTOOLS_SRC_PATH := ../../src/ucd-tools/src | |||||
UCDTOOLS_SRC_FILES := \ | UCDTOOLS_SRC_FILES := \ | ||||
$(subst $(LOCAL_PATH)/$(UCDTOOLS_SRC_PATH),$(UCDTOOLS_SRC_PATH),$(wildcard $(LOCAL_PATH)/$(UCDTOOLS_SRC_PATH)/*.c*)) | $(subst $(LOCAL_PATH)/$(UCDTOOLS_SRC_PATH),$(UCDTOOLS_SRC_PATH),$(wildcard $(LOCAL_PATH)/$(UCDTOOLS_SRC_PATH)/*.c*)) | ||||
src/libespeak-ng/synthdata.c \ | src/libespeak-ng/synthdata.c \ | ||||
src/libespeak-ng/synthesize.c \ | src/libespeak-ng/synthesize.c \ | ||||
src/libespeak-ng/synth_mbrola.c \ | src/libespeak-ng/synth_mbrola.c \ | ||||
src/libespeak-ng/tokenizer.c \ | |||||
src/libespeak-ng/translate.c \ | src/libespeak-ng/translate.c \ | ||||
src/libespeak-ng/tr_languages.c \ | src/libespeak-ng/tr_languages.c \ | ||||
src/libespeak-ng/voices.c \ | src/libespeak-ng/voices.c \ |
APP_OPTIM := release | APP_OPTIM := release | ||||
APP_PLATFORM := android-8 | |||||
APP_PLATFORM := android-14 | |||||
APP_TOOLCHAIN_VERSION := 4.6.3 | APP_TOOLCHAIN_VERSION := 4.6.3 | ||||
APP_ABI := mips armeabi armeabi-v7a x86 | APP_ABI := mips armeabi armeabi-v7a x86 |
// This is created by autoconf on POSIX-compatibe build environments. | // This is created by autoconf on POSIX-compatibe build environments. | ||||
#define PACKAGE_VERSION "1.49.2-dev" | |||||
#define PACKAGE_VERSION "1.49.3-dev" |
return new Locale(parts[0], parts[1]); | return new Locale(parts[0], parts[1]); | ||||
case 3: // language-country-variant | case 3: // language-country-variant | ||||
return new Locale(parts[0], parts[1], parts[2]); | 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: | default: | ||||
return null; | return null; | ||||
} | } | ||||
static { | static { | ||||
mJavaToIanaLanguageCode.put("afr", "af"); | mJavaToIanaLanguageCode.put("afr", "af"); | ||||
mJavaToIanaLanguageCode.put("amh", "am"); | mJavaToIanaLanguageCode.put("amh", "am"); | ||||
mJavaToIanaLanguageCode.put("ara", "ar"); | |||||
mJavaToIanaLanguageCode.put("arg", "an"); | mJavaToIanaLanguageCode.put("arg", "an"); | ||||
mJavaToIanaLanguageCode.put("asm", "as"); | mJavaToIanaLanguageCode.put("asm", "as"); | ||||
mJavaToIanaLanguageCode.put("aze", "az"); | mJavaToIanaLanguageCode.put("aze", "az"); | ||||
mJavaToIanaLanguageCode.put("fra", "fr"); | mJavaToIanaLanguageCode.put("fra", "fr"); | ||||
mJavaToIanaLanguageCode.put("gle", "ga"); | mJavaToIanaLanguageCode.put("gle", "ga"); | ||||
mJavaToIanaLanguageCode.put("gla", "gd"); | mJavaToIanaLanguageCode.put("gla", "gd"); | ||||
mJavaToIanaLanguageCode.put("grn", "gn"); | |||||
mJavaToIanaLanguageCode.put("guj", "gu"); | mJavaToIanaLanguageCode.put("guj", "gu"); | ||||
mJavaToIanaLanguageCode.put("hin", "hi"); | mJavaToIanaLanguageCode.put("hin", "hi"); | ||||
mJavaToIanaLanguageCode.put("hrv", "hr"); | mJavaToIanaLanguageCode.put("hrv", "hr"); | ||||
mJavaToIanaLanguageCode.put("ind", "in"); // NOTE: The deprecated 'in' code is used by Java/Android. | mJavaToIanaLanguageCode.put("ind", "in"); // NOTE: The deprecated 'in' code is used by Java/Android. | ||||
mJavaToIanaLanguageCode.put("isl", "is"); | mJavaToIanaLanguageCode.put("isl", "is"); | ||||
mJavaToIanaLanguageCode.put("ita", "it"); | mJavaToIanaLanguageCode.put("ita", "it"); | ||||
mJavaToIanaLanguageCode.put("jpn", "ja"); | |||||
mJavaToIanaLanguageCode.put("kat", "ka"); | mJavaToIanaLanguageCode.put("kat", "ka"); | ||||
mJavaToIanaLanguageCode.put("kal", "kl"); | mJavaToIanaLanguageCode.put("kal", "kl"); | ||||
mJavaToIanaLanguageCode.put("kan", "kn"); | mJavaToIanaLanguageCode.put("kan", "kn"); | ||||
mJavaToIanaLanguageCode.put("kir", "ky"); | |||||
mJavaToIanaLanguageCode.put("kor", "ko"); | mJavaToIanaLanguageCode.put("kor", "ko"); | ||||
mJavaToIanaLanguageCode.put("kur", "ku"); | mJavaToIanaLanguageCode.put("kur", "ku"); | ||||
mJavaToIanaLanguageCode.put("lat", "la"); | mJavaToIanaLanguageCode.put("lat", "la"); | ||||
mJavaToIanaLanguageCode.put("mkd", "mk"); | mJavaToIanaLanguageCode.put("mkd", "mk"); | ||||
mJavaToIanaLanguageCode.put("mal", "ml"); | mJavaToIanaLanguageCode.put("mal", "ml"); | ||||
mJavaToIanaLanguageCode.put("mar", "mr"); | mJavaToIanaLanguageCode.put("mar", "mr"); | ||||
mJavaToIanaLanguageCode.put("mlt", "mt"); | |||||
mJavaToIanaLanguageCode.put("mri", "mi"); | |||||
mJavaToIanaLanguageCode.put("msa", "ms"); | mJavaToIanaLanguageCode.put("msa", "ms"); | ||||
mJavaToIanaLanguageCode.put("mya", "my"); | |||||
mJavaToIanaLanguageCode.put("nep", "ne"); | mJavaToIanaLanguageCode.put("nep", "ne"); | ||||
mJavaToIanaLanguageCode.put("nld", "nl"); | mJavaToIanaLanguageCode.put("nld", "nl"); | ||||
mJavaToIanaLanguageCode.put("nob", "nb"); | mJavaToIanaLanguageCode.put("nob", "nb"); | ||||
mJavaToIanaLanguageCode.put("sin", "si"); | mJavaToIanaLanguageCode.put("sin", "si"); | ||||
mJavaToIanaLanguageCode.put("slk", "sk"); | mJavaToIanaLanguageCode.put("slk", "sk"); | ||||
mJavaToIanaLanguageCode.put("slv", "sl"); | mJavaToIanaLanguageCode.put("slv", "sl"); | ||||
mJavaToIanaLanguageCode.put("snd", "sd"); | |||||
mJavaToIanaLanguageCode.put("sqi", "sq"); | mJavaToIanaLanguageCode.put("sqi", "sq"); | ||||
mJavaToIanaLanguageCode.put("srp", "sr"); | mJavaToIanaLanguageCode.put("srp", "sr"); | ||||
mJavaToIanaLanguageCode.put("swe", "sv"); | mJavaToIanaLanguageCode.put("swe", "sv"); | ||||
mJavaToIanaLanguageCode.put("swa", "sw"); | mJavaToIanaLanguageCode.put("swa", "sw"); | ||||
mJavaToIanaLanguageCode.put("tam", "ta"); | mJavaToIanaLanguageCode.put("tam", "ta"); | ||||
mJavaToIanaLanguageCode.put("tel", "te"); | mJavaToIanaLanguageCode.put("tel", "te"); | ||||
mJavaToIanaLanguageCode.put("tat", "tt"); | |||||
mJavaToIanaLanguageCode.put("tsn", "tn"); | |||||
mJavaToIanaLanguageCode.put("tur", "tr"); | mJavaToIanaLanguageCode.put("tur", "tr"); | ||||
mJavaToIanaLanguageCode.put("urd", "ur"); | mJavaToIanaLanguageCode.put("urd", "ur"); | ||||
mJavaToIanaLanguageCode.put("vie", "vi"); | mJavaToIanaLanguageCode.put("vie", "vi"); | ||||
mJavaToIanaCountryCode.put("ARM", "AM"); | mJavaToIanaCountryCode.put("ARM", "AM"); | ||||
mJavaToIanaCountryCode.put("BEL", "BE"); | mJavaToIanaCountryCode.put("BEL", "BE"); | ||||
mJavaToIanaCountryCode.put("BRA", "BR"); | mJavaToIanaCountryCode.put("BRA", "BR"); | ||||
mJavaToIanaCountryCode.put("CHE", "CH"); | |||||
mJavaToIanaCountryCode.put("FRA", "FR"); | mJavaToIanaCountryCode.put("FRA", "FR"); | ||||
mJavaToIanaCountryCode.put("GBR", "GB"); | mJavaToIanaCountryCode.put("GBR", "GB"); | ||||
mJavaToIanaCountryCode.put("HKG", "HK"); | mJavaToIanaCountryCode.put("HKG", "HK"); | ||||
mJavaToIanaCountryCode.put("USA", "US"); | mJavaToIanaCountryCode.put("USA", "US"); | ||||
mJavaToIanaCountryCode.put("VNM", "VN"); | 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")); | |||||
} | } | ||||
} | } |
AC_PREREQ([2.63]) | 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() | AM_INIT_AUTOMAKE() | ||||
LT_INIT | LT_INIT | ||||
AC_MSG_ERROR([C99 is not supported by $CC.]) | AC_MSG_ERROR([C99 is not supported by $CC.]) | ||||
fi | 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 ================================================================ | ||||
dnl library checks. | dnl library checks. | ||||
dnl ================================================================ | dnl ================================================================ | ||||
AM_CONDITIONAL(HAVE_ZH_EXTENDED_DICTIONARY, [test x"$have_extdict_zh" = 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]) | 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 ================================================================ | ||||
dnl Generate output. | dnl Generate output. | ||||
dnl ================================================================ | dnl ================================================================ |
alaska al'aska | alaska al'aska | ||||
albanië alb'A:ne@:@- | albanië alb'A:ne@:@- | ||||
algerië alx2'e@re@:@- | algerië alx2'e@re@:@- | ||||
alhambra al'ambra | |||||
amanzimtoti $4 | amanzimtoti $4 | ||||
amstel amst@l | |||||
antwerpen antv&rp@n | antwerpen antv&rp@n | ||||
avignon _^_FR | avignon _^_FR | ||||
babilon babilOn | babilon babilOn | ||||
oklahoma @Ukl@h'@Uma | oklahoma @Ukl@h'@Uma | ||||
outeniekwa @Ut@n'ikwa | outeniekwa @Ut@n'ikwa | ||||
oxford _^_EN | oxford _^_EN | ||||
paardeneiland pA:rd@n_'eIlant | |||||
palermo pal'&rmu | palermo pal'&rmu | ||||
pelindaba p&l@nd'A:ba | pelindaba p&l@nd'A:ba | ||||
perú p@ru | perú p@ru | ||||
potchefstroom pOtSIfstr'o@m | potchefstroom pOtSIfstr'o@m | ||||
rhône _^_FR | rhône _^_FR | ||||
richardsbaai ritS@dsb'AI | richardsbaai ritS@dsb'AI | ||||
riversdal r@v@rsdal | |||||
riviersonderend r@fi:rsOn@r_'Ent | riviersonderend r@fi:rsOn@r_'Ent | ||||
robertson _^_EN | robertson _^_EN | ||||
salvador salvadO:r | salvador salvadO:r | ||||
wakloof vA:klo@f | wakloof vA:klo@f | ||||
zimbabwe zI:mb'ab_wE | zimbabwe zI:mb'ab_wE | ||||
zulu zulu // Kwazulu-Natal | zulu zulu // Kwazulu-Natal | ||||
zürich _^_DE | |||||
// People names | // People names | ||||
abdullah abd'ula | abdullah abd'ula | ||||
jane _^_EN | jane _^_EN | ||||
janine dZ@ni:n | janine dZ@ni:n | ||||
Jean ZA~n $capital | Jean ZA~n $capital | ||||
jeff _^_EN | |||||
jesebel je@s@b&l | jesebel je@s@b&l | ||||
jessica _^_EN | jessica _^_EN | ||||
jimmy _^_EN | jimmy _^_EN | ||||
jung juN | jung juN | ||||
khayyam kaj'am | khayyam kaj'am | ||||
kelvin _^_EN | kelvin _^_EN | ||||
kennedy _^_EN | |||||
kim _^_EN $capital | kim _^_EN $capital | ||||
kleopatra kliu:p'A:tra | kleopatra kliu:p'A:tra | ||||
krige krix2@ | krige krix2@ | ||||
stuart _^_EN | stuart _^_EN | ||||
suzanne suz'A:n | suzanne suz'A:n | ||||
suzette suz'Et | suzette suz'Et | ||||
sylvia _^_EN | |||||
tania tanja | tania tanja | ||||
telemann te@l@man | telemann te@l@man | ||||
terblanche t@rblA:nS | terblanche t@rblA:nS | ||||
thelma _^_EN | |||||
theo tiu | theo tiu | ||||
theron tr'On | theron tr'On | ||||
thessalonicense tEsalo@nis'E:ns@ | thessalonicense tEsalo@nis'E:ns@ | ||||
viviers v@v@je@ | viviers v@v@je@ | ||||
wilhelm v@lh&l@-m | wilhelm v@lh&l@-m | ||||
williston _^_EN | williston _^_EN | ||||
woltemade vOlt@mA:d@ | |||||
khumalo kum'A:lu | khumalo kum'A:lu | ||||
zuma zu:ma | zuma zu:ma | ||||
antares $2 | antares $2 | ||||
beatles _^_EN | beatles _^_EN | ||||
boeing _^_EN | boeing _^_EN | ||||
cadillac _^_EN | |||||
checkers tSEk@rs | checkers tSEk@rs | ||||
chevrolet _^_FR | chevrolet _^_FR | ||||
chrysler kraIsl@r | chrysler kraIsl@r | ||||
forma _^_LA | forma _^_LA | ||||
grata _^_LA | grata _^_LA | ||||
habitatio _^_LA | habitatio _^_LA | ||||
inclusio _^_LA | |||||
inclusio _^_LA | |||||
(in camera) @n||kam@ra | |||||
(in debiti) _^_LA | (in debiti) _^_LA | ||||
(in absentia) _^_LA | (in absentia) _^_LA | ||||
(in extremis) _^_LA | (in extremis) _^_LA | ||||
// main word list | // main word list | ||||
aangaande $2 | aangaande $2 | ||||
aanmerklik $2 | |||||
aanstaande $2 | aanstaande $2 | ||||
aanswel A:nsw&l | |||||
(a cappella) a||kap'&la | (a cappella) a||kap'&la | ||||
adagio ad'A:dZi;%@U | adagio ad'A:dZi;%@U | ||||
afgaanse afg'A:ns@ | afgaanse afg'A:ns@ | ||||
alge alx2@ | alge alx2@ | ||||
algehele alx2@h,e@l@ | algehele alx2@h,e@l@ | ||||
allegro al'Egru | allegro al'Egru | ||||
allengs alENs | |||||
allergene $3 | allergene $3 | ||||
almiskie $3 | almiskie $3 | ||||
alom al_'Om | alom al_'Om | ||||
babelaas bab@lA:s | babelaas bab@lA:s | ||||
barrikade $3 | barrikade $3 | ||||
beaming b@_A:m@N | |||||
bedewete be@d@ve@t@ | bedewete be@d@ve@t@ | ||||
beide beId@ | beide beId@ | ||||
bekaf b&kaf | bekaf b&kaf | ||||
belangriker b@laNr@k,Ir | belangriker b@laNr@k,Ir | ||||
bene be@n@ | bene be@n@ | ||||
beringde b@rINd@ | |||||
beswil bEsv@l | beswil bEsv@l | ||||
besnedene b@sne@d@n@ | besnedene b@sne@d@n@ | ||||
bestes bEst@s | bestes bEst@s | ||||
bewebeen be@v@be@n | bewebeen be@v@be@n | ||||
bewend be@v@nt | bewend be@v@nt | ||||
bewering b@ve@rIN | bewering b@ve@rIN | ||||
bilharzia b@lharsia | |||||
biopsie bi'Opsi | biopsie bi'Opsi | ||||
bomaat bo@mA:t | bomaat bo@mA:t | ||||
bordegoed bO:rd@x2ut | bordegoed bO:rd@x2ut | ||||
charisma kar'Isma | charisma kar'Isma | ||||
cinsaut s@nso@ | cinsaut s@nso@ | ||||
cliché kliS'eI: | cliché kliS'eI: | ||||
clientèle _^_FR | |||||
clivia klIvija | clivia klIvija | ||||
cognac kOn^ak | cognac kOn^ak | ||||
confetti $2 | confetti $2 | ||||
déjà _^_FR | déjà _^_FR | ||||
dekade dEk'A:d@ | dekade dEk'A:d@ | ||||
dekreling dEkre@l@N | dekreling dEkre@l@N | ||||
demensie d@me~nsi | |||||
deurentyd dy@r@nteIt | deurentyd dy@r@nteIt | ||||
deurgaans $1 | deurgaans $1 | ||||
deurkruis $2 | deurkruis $2 | ||||
dikwels dIkv@ls | dikwels dIkv@ls | ||||
diplomasie d@plo@mas'i | diplomasie d@plo@mas'i | ||||
disleksie $2 | disleksie $2 | ||||
dissiplinering d@s@plin'e@r@N | |||||
divan div'an | divan div'an | ||||
doktore $2 | doktore $2 | ||||
doyen dO:j'En | doyen dO:j'En | ||||
exodus Eks'o@dWs | exodus Eks'o@dWs | ||||
factotum $2 | factotum $2 | ||||
faktotum $2 | |||||
fakture $2 | fakture $2 | ||||
fetakaas fEtakA:s | fetakaas fEtakA:s | ||||
figuur f@x2yr | figuur f@x2yr | ||||
filippense f@l@pEns@ | filippense f@l@pEns@ | ||||
finalis $3 | finalis $3 | ||||
finaliste $3 | finaliste $3 | ||||
fluktuasie $3 | |||||
fort fOrt | fort fOrt | ||||
forte fOrt@ | forte fOrt@ | ||||
helaas he@l'A:s | helaas he@l'A:s | ||||
here he@r@ | here he@r@ | ||||
herero hEr'E:ru | herero hEr'E:ru | ||||
herontmoeting h&r_Ontmut@N | |||||
herrysenis h&r'eIs@n@s | herrysenis h&r'eIs@n@s | ||||
hierso hi:rsO | hierso hi:rsO | ||||
hippie _^_EN | hippie _^_EN | ||||
inkluis $2 | inkluis $2 | ||||
innestel InnEst@l | innestel InnEst@l | ||||
insomnia @nsOmnija | insomnia @nsOmnija | ||||
inteling Inte@l@N | |||||
intens @nt'Ens | intens @nt'Ens | ||||
intensiteit $4 | intensiteit $4 | ||||
inwegery Inve@x2@reI | |||||
ironieë irun'i:@ | ironieë irun'i:@ | ||||
jantwak jantw'ak | jantwak jantw'ak | ||||
kaliefa kal'ifa | kaliefa kal'ifa | ||||
kameraderie kam@rA:d@r'i | kameraderie kam@rA:d@r'i | ||||
kapittel kap'It@l | kapittel kap'It@l | ||||
karolie kar_o@li | |||||
kateter kat'e@t@r | kateter kat'e@t@r | ||||
katswink katsv@nk | katswink katsv@nk | ||||
kaviaar kavi'A:r | kaviaar kavi'A:r | ||||
kennisvaardig $1 | kennisvaardig $1 | ||||
kimono $2 | kimono $2 | ||||
klaasvakie $2 | klaasvakie $2 | ||||
kliënteel $3 | |||||
klimeid klImeIt | klimeid klImeIt | ||||
knapsekêrel knaps@k&:r@l | knapsekêrel knaps@k&:r@l | ||||
kolossense kOl@s'e~ns@ | kolossense kOl@s'e~ns@ | ||||
korswel kOrsv@l | korswel kOrsv@l | ||||
kotiljons kOt@lj'o~ns | kotiljons kOt@lj'o~ns | ||||
kritiek krIt'ik | kritiek krIt'ik | ||||
kruisteling krYyste@l@N | |||||
kulture $2 | kulture $2 | ||||
kunsmatige kWnsm'A:t@x2@ | kunsmatige kWnsm'A:t@x2@ | ||||
kwansuis $2 | kwansuis $2 | ||||
kweekwal kwe@kval | kweekwal kwe@kval | ||||
landswye lantsveI@ | |||||
lasagne las'anj@ | lasagne las'anj@ | ||||
legaat l@x2A:t | legaat l@x2A:t | ||||
legate l@x2A:t@ | legate l@x2A:t@ | ||||
liefdespel lifd@sp&l | liefdespel lifd@sp&l | ||||
lipstiek lIpstik | lipstiek lIpstik | ||||
lisensiaat l@se~nsi;'A:t | lisensiaat l@se~nsi;'A:t | ||||
logieserwys lo@x2is@rveIs | |||||
lokaas lOk_A:s | lokaas lOk_A:s | ||||
londense lOnd@ns@ | londense lOnd@ns@ | ||||
lord _^_EN | lord _^_EN | ||||
oorsese $2 | oorsese $2 | ||||
oorval $2 $verb | oorval $2 $verb | ||||
opend Op_Ent | opend Op_Ent | ||||
opwindends Opv'Ind@nts | |||||
oraal o@r'A:l | oraal o@r'A:l | ||||
orale o@r'A:l@ | orale o@r'A:l@ | ||||
oranjepers o@r'anj@p&:rs | oranjepers o@r'anj@p&:rs | ||||
pirouette p@ru:'Et | pirouette p@ru:'Et | ||||
plaasjaap plA:sjA:p | plaasjaap plA:sjA:p | ||||
plasenta plas'Enta | plasenta plas'Enta | ||||
platwaai platvAI | |||||
poinsettia pOIns'Etia | poinsettia pOIns'Etia | ||||
pond po~nt | pond po~nt | ||||
poniepers po@nip&rs | poniepers po@nip&rs | ||||
samelewing sA:m@l,e@v@N | samelewing sA:m@l,e@v@N | ||||
sanhedrin sanh'e@dr@n | sanhedrin sanh'e@dr@n | ||||
sangemeenskap sanx2@me@nskap | sangemeenskap sanx2@me@nskap | ||||
sedeles se@d@lEs | |||||
sedertdien $3 | sedertdien $3 | ||||
sektore $2 | sektore $2 | ||||
sinagoge s@n@x2o@x2@ | sinagoge s@n@x2o@x2@ | ||||
sonure sOn_yr@ | sonure sOn_yr@ | ||||
sover so@f&r | sover so@f&r | ||||
staccato $2 | staccato $2 | ||||
steekhoudendheid $2 | |||||
sterwens st&rv@ns | sterwens st&rv@ns | ||||
stilswye $1 | stilswye $1 | ||||
strydros streIt_rOs | strydros streIt_rOs | ||||
tevrede t@fre@d@ | tevrede t@fre@d@ | ||||
thula tu:la | thula tu:la | ||||
toegee tux2e@ | toegee tux2e@ | ||||
toegeklik tux2@klIk | |||||
toemessel tumEs@l | |||||
toereken ture@k@n | toereken ture@k@n | ||||
toleransie tOl@r'ansi | |||||
tornado $2 | tornado $2 | ||||
totale tut'A:l@ | totale tut'A:l@ | ||||
totsiens $2 | totsiens $2 | ||||
uitdaging YydA:x2@N | uitdaging YydA:x2@N | ||||
uiteraard Yyt@r_'A:rt | uiteraard Yyt@r_'A:rt | ||||
uitermate $3 | uitermate $3 | ||||
uitgeslotene Yytx2@slo@t@n@ | |||||
uniforme $3 | uniforme $3 | ||||
vaarwel fA:rv'&l | vaarwel fA:rv'&l | ||||
vraprys frA:preIs | vraprys frA:preIs | ||||
vrek fr&k | vrek fr&k | ||||
vroeërig fru:@r@x2 | vroeërig fru:@r@x2 | ||||
vrygelatene freIx2@lA:t@n@ | |||||
vu _^_FR | vu _^_FR | ||||
waarskynlik $2 | waarskynlik $2 | ||||
weleer v&l_'e@r | weleer v&l_'e@r | ||||
wentaktiek $1 | wentaktiek $1 | ||||
willens vIl@ns | willens vIl@ns | ||||
wydoog veIt_o@x2 | |||||
wysgere veIsx2e@r@ | wysgere veIsx2e@r@ | ||||
êrenster &:r@nst@r | êrenster &:r@nst@r |
@@@smokkel) ary %ar%eI // default stress: diamant-/drank-/dwelm-/goud-/kokaïensmokkelary, etc. | @@@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 | amarula %am%arul%a // fix stress and a sounds: amarula and compounds | ||||
a (ment %a // shorten a sound: perkament/testament 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 | arends A:r@nts_ // fix e sound: arendsoog/-kloue/-nes | ||||
argen (tA %arx2@n // move default stress: Argentinië/Argentyns/-e | argen (tA %arx2@n // move default stress: Argentinië/Argentyns/-e | ||||
a (riA 'A: // akwarium/barium/estuarium/herbarium/seminaria | a (riA 'A: // akwarium/barium/estuarium/herbarium/seminaria | ||||
attaché _%at%aSe@ // correct pronunciation: (handels-/inligtings-)attaché | attaché _%at%aSe@ // correct pronunciation: (handels-/inligtings-)attaché | ||||
attrib (u %atr@b // move default stress: attribuut/bute/attributêr | attrib (u %atr@b // move default stress: attribuut/bute/attributêr | ||||
K) au @U // trauma/-ties/Aucamp/Paul/-a/-us | 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 | augustus %Ox2WstWs | ||||
avokado %af%ukA:du // stress and o sounds | avokado %af%ukA:du // stress and o sounds | ||||
avokade %af%ukA:d@ // variant form of avokado | avokade %af%ukA:d@ // variant form of avokado | ||||
bo (grond bo@ // fix 1st o sound: bogronds/-e | bo (grond bo@ // fix 1st o sound: bogronds/-e | ||||
_) bo (kle bo@ // fix o sound: bokleed/boklere | _) bo (kle bo@ // fix o sound: bokleed/boklere | ||||
bokma (kier b%Okm%a // fix stress and a sound: bokmakierie/-s/-tjie | 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 | bomaans bo@mA:ns // but fix O sound: bomaans/-e | ||||
bonde (C bOnd@ // verbondenheid/bondeldraer/gebondene/saambondelend | bonde (C bOnd@ // verbondenheid/bondeldraer/gebondene/saambondelend | ||||
boos (aardig b%o@s_ // move default stress: boosaardig/-e/-heid | boos (aardig b%o@s_ // move default stress: boosaardig/-e/-heid | ||||
bakate (l b%ak@t& // fix stress and vowel sounds: bakatel/-le/-letjie | bakate (l b%ak@t& // fix stress and vowel sounds: bakatel/-le/-letjie | ||||
baken bA:k@n // fix e sound: afbakening and compounds | baken bA:k@n // fix e sound: afbakening and compounds | ||||
bakte (ri b%akte@ // fix stress and e sound: bakterie/-ë | 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... | _) bam (boes b%am // move default stress: bamboes/-e/bamboesfluit... | ||||
ba (nalA b%a // fix stress and 1st a sound: banale/banaliteit | 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 | band (Alier b,and // fix stress and d sound: band(e/o)lier/-e | ||||
ba (sieli b%a // fix stress and 1st a sound: basielie/-kruit, etc. | 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 | basotho b%asut%u // fix stress and vowel sounds: Basotho/-0ponie and similar | ||||
basi (s bA:s@ // basis and compounds | 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 | bastille b%asti:l // Bastille and compounds like Bastilledag | ||||
batal (jon b%at%al // shorten 1st a sound, moved stress: bataljon and compounds | 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 | ba (tik b%a // fix stress and a sound: batik/-doek/-kuns/-werk | ||||
bere (_ be@r@ //tediebere pandabere etc. | bere (_ be@r@ //tediebere pandabere etc. | ||||
_) ber (C b&r // fix e sound: Bert/Berta/Bertie/Bertus/berke/-boom | _) ber (C b&r // fix e sound: Bert/Berta/Bertie/Bertus/berke/-boom | ||||
beste (_ bEst@ // fix e sound: beste/allerbeste/naasbeste/-s | 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 | be (weging b@ // draaibeweging/swaaibeweging | ||||
bewende be@v@nd@ // first e pronounced long | bewende be@v@nd@ // first e pronounced long | ||||
bewe (rig be@v@ // fix e sound and stress: bewerig/-e/-heid | bewe (rig be@v@ // fix e sound and stress: bewerig/-e/-heid | ||||
dia (C d%i%a // diabeet/diafragma/diagnose/dialek/dialoog/diamant | dia (C d%i%a // diabeet/diafragma/diagnose/dialek/dialoog/diamant | ||||
diaken d%iA:k@n // diaken and compounds | diaken d%iA:k@n // diaken and compounds | ||||
diako (nie d%i%ak%u // fix stress and o sound: diakonie/-ë | 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 | diens (willi d%ins // move default stress: dienswillig/-e/-heid | ||||
dieper (@ dip@r // fix e sound: diepere/dieperliggend/-e | dieper (@ dip@r // fix e sound: diepere/dieperliggend/-e | ||||
digi (ta d%ix2%i // move default stress: digitaal/digitale | digi (ta d%ix2%i // move default stress: digitaal/digitale | ||||
@C) e (reekK @ // fix e sound: duine-/rotsereeks | @C) e (reekK @ // fix e sound: duine-/rotsereeks | ||||
aai) e (C @ // fix e sound: baaierd/waaierstert/paaiement/compounds starting with baaiers- | aai) e (C @ // fix e sound: baaierd/waaierstert/paaiement/compounds starting with baaiers- | ||||
lat) eres @r@s //lateres | 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. | fp) ers (_ &rs // fix e sound: dof-/gif-/olyf-/tydskrifpers, etc. | ||||
bloup) ers &:rs // fix e sound: bloupers | bloup) ers &:rs // fix e sound: bloupers | ||||
iew) ers (ter @rs // fix e sound: (l)iewerster | iew) ers (ter @rs // fix e sound: (l)iewerster | ||||
p) e (talje @ // fix stress and 1st e sound: petalje and compounds | p) e (talje @ // fix stress and 1st e sound: petalje and compounds | ||||
l) e (moen @ //fix lemoen and compounds | l) e (moen @ //fix lemoen and compounds | ||||
Cy) e (C+ @ // fix connecting e sound in compounds like byekorf/skilderyemuseum, etc. | 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 | eier eI@r // eiergeel/eierwit/leierfiguur/leiergroep | ||||
@C) ei (land _,eI // insert short pause: skiereiland and many -eiland compounds | @C) ei (land _,eI // insert short pause: skiereiland and many -eiland compounds | ||||
@) ei (sen _'eI // (on)veeleisend/spoedeisend | @) ei (sen _'eI // (on)veeleisend/spoedeisend | ||||
een (Cjie e@:iN // eendjie/Leentjie/steentjies | een (Cjie e@:iN // eendjie/Leentjie/steentjies | ||||
een (vorm %e@n // move default stress: eenvormig/-e/-heid | een (vorm %e@n // move default stress: eenvormig/-e/-heid | ||||
_) een (voud@ %e@n // stress on 2nd slb: eenvoudig, but on 1st: eenvoud | _) 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 | eerbied (A e@rb'id // eerbiedig/ing | ||||
eerbiedw %e@rb%itv // eerbiedwaardig/eerbiedwekkend | eerbiedw %e@rb%itv // eerbiedwaardig/eerbiedwekkend | ||||
_) eerw %e@rv // stress: eerwaarde | _) eerw %e@rv // stress: eerwaarde | ||||
flu (we fl%y // move default stress: fluweel/fluwele and compounds | flu (we fl%y // move default stress: fluweel/fluwele and compounds | ||||
_) fok (o fOk_ // fix o sound, insert short break: fokop/fokof | _) fok (o fOk_ // fix o sound, insert short break: fokop/fokof | ||||
folio fo@li_u // fix o sounds: folio and compounds | 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 | fondue f%Ondy // fix stress and ue sound: fondue and compounds | ||||
fone (tiek f%o@n@ // fix e sound: fonetiek and compounds | fone (tiek f%o@n@ // fix e sound: fonetiek and compounds | ||||
fone (tie f%une@ // fix stress and o sound: foneties/-e | fone (tie f%une@ // fix stress and o sound: foneties/-e | ||||
formi (da f%Orm%i // move default stress: formidabel/-e | formi (da f%Orm%i // move default stress: formidabel/-e | ||||
formu (lier f%Orm%y // move default stress: formulier/-e/-boek | formu (lier f%Orm%y // move default stress: formulier/-e/-boek | ||||
_) for (se_ f'Or // stress back to 1st slb; se rule: _) for (C | _) 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 | fos (fa f%Os // move default stress: fosfaat/fosfate | ||||
fo (ssiel f%O // move default stress: fossiel/-e and compounds | fo (ssiel f%O // move default stress: fossiel/-e and compounds | ||||
foto fo@tu | foto fo@tu | ||||
_) gra (na x2r@ // granaat(boom)/granate | _) gra (na x2r@ // granaat(boom)/granate | ||||
grandi (o x2r%and%i // move default stress: grandioos/-ose | grandi (o x2r%and%i // move default stress: grandioos/-ose | ||||
_) gra (vA x2r%a // fix stress and a sound: gravin/-ne/gravure | _) 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. | griekwa x2rikwa // fix w sound and a sound in compounds: Griekwa/-land, etc. | ||||
ouCa) gr (ootjie x2r' // move default stress: ouma/oupagrootjie/-s | ouCa) gr (ootjie x2r' // move default stress: ouma/oupagrootjie/-s | ||||
_) graad (e x2r%A:t_ // fix stress and d sound: graadeen(tjies)/-elfs | _) graad (e x2r%A:t_ // fix stress and d sound: graadeen(tjies)/-elfs | ||||
gegesel x2@x2e@s@l // fix middle e sound | gegesel x2@x2e@s@l // fix middle e sound | ||||
K) gele (_ x2e@l@ // fix stress and e sound: (eier)gele | K) gele (_ x2e@l@ // fix stress and e sound: (eier)gele | ||||
_) geler x2e@l@r // stress and 1st e sound: geler/gelerig | _) 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 | gemel (d x2@m&l // fix e sound: bo-/bowe-/laas-/meergemeld/-e | ||||
gems x2Ems // fix e sound: (baster)gemsbok/-bul/-ooi, etc. | gems x2Ems // fix e sound: (baster)gemsbok/-bul/-ooi, etc. | ||||
gene (_ x2e@n@ // gene/diegene | gene (_ x2e@n@ // gene/diegene | ||||
_) ge (ossP2 x2@ // but ge- prefix: geossilleer/geossifiseer, etc. | _) ge (ossP2 x2@ // but ge- prefix: geossilleer/geossifiseer, etc. | ||||
ni) ge (ri x2'e@ //nigeriese etc. | ni) ge (ri x2'e@ //nigeriese etc. | ||||
gese (_ x2'e@s@ //Portugese, and others | gese (_ x2'e@s@ //Portugese, and others | ||||
gesp (etjie x2Esp // fix e sounds: gespetjie/-s | |||||
gespe (_ x2Esp@ // gespe and compounds | gespe (_ x2Esp@ // gespe and compounds | ||||
gespes (_ x2Esp@s // gespes and compounds | gespes (_ x2Esp@s // gespes and compounds | ||||
gewens (g x2e@v@ns // (on)vergewensgesind/-e/-heid | gewens (g x2e@v@ns // (on)vergewensgesind/-e/-heid | ||||
hart (stogte_ h%art // move default stress: hartstogtelik | hart (stogte_ h%art // move default stress: hartstogtelik | ||||
hart (stogte_N hart // restore default stress: hartstogte | hart (stogte_N hart // restore default stress: hartstogte | ||||
ha (we hA: // fix stress and a sound: hawearbeider/lewendehaweafdeling | 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 | hia (sint h%ij%a // fix stress: hiasint/-e and compounds | ||||
_) hi (bis h%i // move default stress: hibiskus/-se 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 | hierna (maal h%i:rnA: // fix stress and a sound: hiernamaals/-e | ||||
_) idi (o %id%i // idioom/idiome/idioot | _) idi (o %id%i // idioom/idiome/idioot | ||||
_) id (A %id // idille/idillies/ideëryk | _) id (A %id // idille/idillies/ideëryk | ||||
&l) iker (C @k@r // fix i sound: menslikerwys/redelikerwyse, etc. | &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 | illumi (nA %il%um%i // fix stress and vowel sounds: illuminasie/illumineer/illuminati | ||||
illu (si %ily // illusie/-s/illusief | illu (si %ily // illusie/-s/illusief | ||||
illu (strA %il%W // fix i sound: illustreer/illustrering/illustrasie | illu (strA %il%W // fix i sound: illustreer/illustrering/illustrasie | ||||
_) in (a@P2 In // inakkuraat/inaktief/inaktiwiteit | _) in (a@P2 In // inakkuraat/inaktief/inaktiwiteit | ||||
_) inbe (lC Inb%& // fix e sound in compounds like inbelprogram | _) inbe (lC Inb%& // fix e sound in compounds like inbelprogram | ||||
indone (si @nd%uni: // fix stress and vowel sounds: Indonesië/Indonesiese | 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 | _) in (oe In_ // fix i sound, pause: inoefen/-oes and derivatives | ||||
invest (eer @nv%Est // fix stress, v and e sounds: investeer/-der | invest (eer @nv%Est // fix stress, v and e sounds: investeer/-der | ||||
investe (r@ @nv%Este@ // fix e sound: (kapitaal)investering/investerende | investe (r@ @nv%Este@ // fix e sound: (kapitaal)investering/investerende | ||||
klaarblyklik klA:rbl'eIkl@k // klaarblyklik/e | klaarblyklik klA:rbl'eIkl@k // klaarblyklik/e | ||||
kla (kous klA: // fix stress and long a sound: klakous/-e | kla (kous klA: // fix stress and long a sound: klakous/-e | ||||
klande (sti kl%and@ // move default stress: klandestien/-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 | kla (ssiek kl%a // move default stress: klassiek/-e | ||||
klavesimbel klA:v@s@mb@l // fix v and e sounds: klavesimbel and compounds | klavesimbel klA:v@s@mb@l // fix v and e sounds: klavesimbel and compounds | ||||
kla (vier kl%a // klavier and many compounds | kla (vier kl%a // klavier and many compounds | ||||
krieketw krik@tv //krieket followed by w in compounds always v | krieketw krik@tv //krieket followed by w in compounds always v | ||||
krokodi (l kr%Ok@dI // (wyfie)krokodil/-le | 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 | kruger kr'Y@@r | ||||
ku (ba@ k%y // move default stress: kubaan/kubane | ku (ba@ k%y // move default stress: kubaan/kubane | ||||
ku (biek k%y // move default stress: kubiek/-e/-getal | 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 | kulin k%Wl%in // Move default stress and fix u sound: kulinër/-e | ||||
@) kundi (g k'Wnd@ // wiskundige/onoordeelkundigheid and many similar | @) kundi (g k'Wnd@ // wiskundige/onoordeelkundigheid and many similar | ||||
kurwe kWrv@ // fix e sound: kurwes/skurwebas/skurwebek/skurwepadda | kurwe kWrv@ // fix e sound: kurwes/skurwebas/skurwebek/skurwepadda | ||||
kabine (t k%ab%inE // kabinet/drankkabinet/-te/kabinetsvergadering | kabine (t k%ab%inE // kabinet/drankkabinet/-te/kabinetsvergadering | ||||
_) ka (d@ k%a // stress and 1st a: kadawer-/kadet-/kado/kadot(jie)/kadriel,etc. | _) 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 | ka (der kA: // restore stress on long a: kader/-s and compounds | ||||
kad (mium kad // fix stress and d sound: kadmium 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 (te k%af@ // fix stress and vowel sounds: kafeteria and compounds | ||||
kafe (ï k%af%i // fix stress and vowel sounds: kafeïene 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 | 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 | kake (C kA:k@ // kakebeen/skakelaar/skakelbord/skakelfunksie | ||||
kalahari kalah'A:ri // stress: Kalahari/-sand/-woestyn | kalahari kalah'A:ri // stress: Kalahari/-sand/-woestyn | ||||
_) ka (lAnC k%a // kalender and compounds/kalant/kalander and compounds | _) ka (lAnC k%a // kalender and compounds/kalant/kalander and compounds | ||||
kontrasep k%Ontr%asEp // fix stress and e sound: kontrasepsie and derivatives | kontrasep k%Ontr%asEp // fix stress and e sound: kontrasepsie and derivatives | ||||
kontrover (s k%Ontr%uv&r // o and v sounds: kontroversie/kontroversieel | kontrover (s k%Ontr%uv&r // o and v sounds: kontroversie/kontroversieel | ||||
kop (o kOp? // fix o sound: koponderstebo/kopomdraai/kopoperasie/gryskoponderwyser/poenskopolifant | 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 | kopu (lA k%Op%y // fix o sound: kopulasie/kopuleer and derivatives | ||||
_) kor (dA k%Or // kordaat/kordon | _) kor (dA k%Or // kordaat/kordon | ||||
ko (rint k%u // fix stress and o sound: korint/-e and compounds | ko (rint k%u // fix stress and o sound: korint/-e and compounds | ||||
loboto (mie l%ub%Ot%u // fix stress and o sounds: lobotomie | loboto (mie l%ub%Ot%u // fix stress and o sounds: lobotomie | ||||
lo (ja l%u // fix stress and o sound: lojale/lojaliteit | lo (ja l%u // fix stress and o sound: lojale/lojaliteit | ||||
lo (kalA l%u // fix stress and o sound: lokale/ontvangslokale, etc. | 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 | lom (bardA l%Om // move default stress: Lombardies/-e/Lombarde | ||||
_) lore (C@ lo@r@ // fix e sound: verloregaan/verloregoederekantoor/Verlorerivier | _) lore (C@ lo@r@ // fix e sound: verloregaan/verloregoederekantoor/Verlorerivier | ||||
_) losge (@P5 l'Osx2@ | _) losge (@P5 l'Osx2@ | ||||
mando (lien m%and%u // fix stress and o sound: mandolien and compounds | 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 (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 | 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 | _) mango maNg%u // fix g and o sounds: mangoboord/-sap/-'s | ||||
man (haft m%an // move default stress: manhaftig/-e/-heid | 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 | mani (akK mA:n%i // fix stress and 1st a sound: maniak/-ke and compounds | ||||
medisyne m@d@seIn@ //medisyne and compounds | medisyne m@d@seIn@ //medisyne and compounds | ||||
meganies m@x2'A:nis | meganies m@x2'A:nis | ||||
_) meege (@P5 m'e@x2@ | _) 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 (juf m@ // move default stress and shorten e sound | ||||
me (laats m@ // fix stress and e sound: melaats/-e/-heid | 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 | melancholie (_N m%El%aNk%o@li // fix stress and 1st e sound: melancholie | ||||
morf (otomie m%Orf // move default stress: morfotomie | morf (otomie m%Orf // move default stress: morfotomie | ||||
_) morr (i mOr // restore default stress: morrig/morrie/-doring | _) morr (i mOr // restore default stress: morrig/morrie/-doring | ||||
_) mors (@ mOrs // restore default stress: morsaf/morsdood/morsig | _) 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 | 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 | mosa (ïek m%o@s%a // move default stress: mosaïek and compounds | ||||
mo (skee m%O // move default stress: moskee/-s and compounds | mo (skee m%O // move default stress: moskee/-s and compounds | ||||
ne (anderCa n%i // move default stress: Neander(d/t)al/-ler | ne (anderCa n%i // move default stress: Neander(d/t)al/-ler | ||||
neger (in n%e@x2@r // move default stress: negerin/-ne | neger (in n%e@x2@r // move default stress: negerin/-ne | ||||
ne (gosie n@ // fix stress and e sound: negosie/-ware, etc. | 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. | 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 | neo (li n%i%u // fix stress and vowel sounds: neolities/-e/neolitikum | ||||
ner (veu n%&r // move default stress: nerveus/-e | ner (veu n%&r // move default stress: nerveus/-e | ||||
nood (lotti n%o@t // move default stress: noodlottig/-e | 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%o@t // move default stress: noodsaaklik/-e/-heid, vs. noodsaak | ||||
nood (saak_N no@t // restore default stress: (ge)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 | noord (oos n%o@rt_ // move default stress: noordoos/-te/-telik/-e | ||||
nor (ma@ n%Or // normaal/normaalweg/normale/abnormaal/-ale | nor (ma@ n%Or // normaal/normaalweg/normale/abnormaal/-ale | ||||
nostal (gie_N n%Ost%al // stress on last slb.: nostalgie | nostal (gie_N n%Ost%al // stress on last slb.: nostalgie | ||||
ofoon uf'o@n // mikrofoon/sakso(saxo)foon | ofoon uf'o@n // mikrofoon/sakso(saxo)foon | ||||
ofone uf'o@n@ // mikrofone/sakso(saxo)fone | ofone uf'o@n@ // mikrofone/sakso(saxo)fone | ||||
ograaf ux2r'A:f // biograaf/demograaf/fotograaf | ograaf ux2r'A:f // biograaf/demograaf/fotograaf | ||||
ografeer ux2raf'e@r // fix o sound: (ge)fotografeer | |||||
ografie ux2raf'i // biografie/demografie/fotografie | ografie ux2raf'i // biografie/demografie/fotografie | ||||
ografies ux2r'A:fis // biografies/demografies/fotografies | ografies ux2r'A:fis // biografies/demografies/fotografies | ||||
ograwe ux2r'A:v@ // biograwe/demograwe/fotograwe | ograwe ux2r'A:v@ // biograwe/demograwe/fotograwe | ||||
ooi oI | ooi oI | ||||
ooy oI | ooy oI | ||||
oodjie oIci | oodjie oIci | ||||
CC) ool (A o@l_ // insert break: skooluur/-ure, steenkooluitvoer, but not: Karoolug | |||||
ootjie oIci | ootjie oIci | ||||
oontjie oINki | oontjie oINki | ||||
oondjie oINki | oondjie oINki | ||||
oot (moedig %o@t // move default stress: ootmoedig/-e/-heid | oot (moedig %o@t // move default stress: ootmoedig/-e/-heid | ||||
.group op | .group op | ||||
_) opaal %o@pA:l // fix o sound, remove break: opaal and compounds | |||||
opaat up'A:t // homeopaat/psigopaat and similar | opaat up'A:t // homeopaat/psigopaat and similar | ||||
opatie upat'i // homeopatie/neuropatie and similar | opatie upat'i // homeopatie/neuropatie and similar | ||||
opaties up'A:tis // psigopaties/osteopaties and similar | opaties up'A:tis // psigopaties/osteopaties and similar | ||||
pol (vy p%Ol // move default stress: polvy/-e and compounds | pol (vy p%Ol // move default stress: polvy/-e and compounds | ||||
pomelo p%ume@l%u // fix stress and o sounds: pomelo(sap/-drankie...) | pomelo p%ume@l%u // fix stress and o sounds: pomelo(sap/-drankie...) | ||||
_) pon (dok p%On // move default stress: pondok/-ke/-kie | _) 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 | popu ,pOpy | ||||
_) por (C %pOr //portret portaal etc. | _) por (C %pOr //portret portaal etc. | ||||
por (ie p%o@r // move default stress: porie/-ë | por (ie p%o@r // move default stress: porie/-ë | ||||
sirene s@re@n@ // move default stress and fix vowel sounds: sirene/-s/-lied/-sang | sirene s@re@n@ // move default stress and fix vowel sounds: sirene/-s/-lied/-sang | ||||
si (troen s@ // move default stress: sitroen and compounds | si (troen s@ // move default stress: sitroen and compounds | ||||
sitronella s@tr%un&l%a // fix stress and vowel sounds: sitronella 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 | skade skA:d@ // elik suffix rule breaks a sound of (on)skadelik | ||||
skadu skA:dy // skaduagtig/skadutjie | skadu skA:dy // skaduagtig/skadutjie | ||||
skaker (ing sk%ake@r // skakering/-s/kleurskakering | skaker (ing sk%ake@r // skakering/-s/kleurskakering | ||||
sker (muts sk%&r // move default stress: (ge)skermutsel/skermutseling/-e | sker (muts sk%&r // move default stress: (ge)skermutsel/skermutseling/-e | ||||
skerpi (oen sk%&rp%i // move default stress: skerpioen/-e and compounds | 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 | 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 | skisofr (e sk%is%ufr // fix stress and o sound: skisofreen/skisofrene | ||||
skle (rose skl@ // fix stress and e sound: sklerose and compounds | skle (rose skl@ // fix stress and e sound: sklerose and compounds | ||||
_) skok (AP4 sk''Ok_ // fix o sound and stress: skokaankondiging/-effek/-insluiting/-onthulling... | _) skok (AP4 sk''Ok_ // fix o sound and stress: skokaankondiging/-effek/-insluiting/-onthulling... | ||||
_) su (meri s%u // fix stress and u sound: sumeries/-e | _) su (meri s%u // fix stress and u sound: sumeries/-e | ||||
su (mmier s%W // move default stress: sumier/-e | su (mmier s%W // move default stress: sumier/-e | ||||
super (A s''yp@r_ // fix stress, break in compounds like superintelligent | 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 | 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 | 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 | su (saC s%u // fix stress and u sound: susan/-na/susara | ||||
swepe swe@p@ // fix w sound: rubberswepe | swepe swe@p@ // fix w sound: rubberswepe | ||||
sw (erm sw // fix e sound: naderswerm | sw (erm sw // fix e sound: naderswerm | ||||
switser swIts@r // fix e sound: Switserland/Switserse | switser swIts@r // fix e sound: Switserland/Switserse | ||||
sypel (end seIp@l // fix e sound: sypelend/-e | |||||
.group se | .group se | ||||
se (_ s@ //the word se and some ending in se | se (_ s@ //the word se and some ending in se | ||||
stede (_ ste@d@ //voorstede, hoofstede etc. | stede (_ ste@d@ //voorstede, hoofstede etc. | ||||
stele (_ ste@l@ //kastele lepelstele 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. | stene (_ ste@n@ //skoorstene, bakstene etc. | ||||
sten (sil stEn // fix e sound in compounds like wolbaalstensil | sten (sil stEn // fix e sound in compounds like wolbaalstensil | ||||
chri) stene (_ st@n@ //fix christene and compounds | chri) stene (_ st@n@ //fix christene and compounds | ||||
toe (riste@ t%u // move default stress: toeristebedryf/-sentrum and similar | toe (riste@ t%u // move default stress: toeristebedryf/-sentrum and similar | ||||
toer (n t%ur // move default stress: compounds of toernooi | toer (n t%ur // move default stress: compounds of toernooi | ||||
toere (_ tu:r@ // restore default stress | 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 | tokke (lo t%Ok@ // move default stress: tokkelos/-sie/tokkelok and compounds | ||||
tok (tokk t%Ok // move default stress: toktokkie/-s/-spelery, etc. | tok (tokk t%Ok // move default stress: toktokkie/-s/-spelery, etc. | ||||
tombola t%Ombo@l%a // move default stress: tombola and compounds | tombola t%Ombo@l%a // move default stress: tombola and compounds | ||||
@) toris (_ t'o@r@s // fix stress: pectoris/klitoris | @) toris (_ t'o@r@s // fix stress: pectoris/klitoris | ||||
_) tor (nyn t%Or // move default stress: tornyn/-e and compounds | _) tor (nyn t%Or // move default stress: tornyn/-e and compounds | ||||
_) tos (ka t%Os // move default stress: Toskaanse/Toskane | _) 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 | ttel t@l // many compounds of bottel/skottelgoed | ||||
tuberkulose t%yb@rk%ylo@s@ // fix stress; e sound in compounds: tuberkulose/-behandeling | tuberkulose t%yb@rk%ylo@s@ // fix stress; e sound in compounds: tuberkulose/-behandeling | ||||
tug (A tWx2_ // fix u sound: (on)tugondersoek/-oortreding/-ordonnansie | tug (A tWx2_ // fix u sound: (on)tugondersoek/-oortreding/-ordonnansie | ||||
_) vanklik faNkl@k // (on)ontvanklik/-e/-er/-heid | _) vanklik faNkl@k // (on)ontvanklik/-e/-er/-heid | ||||
vanself (spr f%ans%&lf // move default stress: vanselfsprekend/-e/-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 | 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. | vaseline v%as@lin // fix stress, v and vowel sounds: vaseline/-bottel, etc. | ||||
vasste (l fast& // fix e sound: vasstel(ling/-lende) | vasste (l fast& // fix e sound: vasstel(ling/-lende) | ||||
_) vat (A@ fat_ // fix a sound: vatafstand/-orgaan | _) vat (A@ fat_ // fix a sound: vatafstand/-orgaan | ||||
ve (l f& // maagvel, stress on 1st slb | ve (l f& // maagvel, stress on 1st slb | ||||
@) vel (A fe@l // aanbeveling/aanbevelingsbrief | @) 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 (C f< // fix d sound: veldreuk/-radio/-rantsoen, etc. | ||||
veld (eks f<_ // fix d sound, pause: veldekskursie/-ekspedisie/-s | veld (eks f<_ // fix d sound, pause: veldekskursie/-ekspedisie/-s | ||||
veld (o f<_ // fix d sound, pause: veldorgideë/-opsigter/-oppervlakte/-opname, etc. | 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@ | vele f'e@l@ | ||||
ven (detta v%En // fix stress and v sound: vendatta and compounds | ven (detta v%En // fix stress and v sound: vendatta and compounds | ||||
ven (dusie f@n // fix stress and e sound: vendusie and compounds | ven (dusie f@n // fix stress and e sound: vendusie and compounds | ||||
vol (kome f%Ol | vol (kome f%Ol | ||||
vo (llA_ fO // volle/vollê/Volla - exception to: vo (lC f%O | 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... | 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 | vo (ller fO // exception to: vo (lC f%O | ||||
volles (_ fOl@s // fix stress and e sound: volles/passievolles, etc. | volles (_ fOl@s // fix stress and e sound: volles/passievolles, etc. | ||||
vol (hou_ fOl // exception to: vo (lC f%O | vol (hou_ fOl // exception to: vo (lC f%O | ||||
waardeer vard'e@r // waardeer/waardeerder | waardeer vard'e@r // waardeer/waardeerder | ||||
waarder (@ vard'e@r // waarderend/e/waardering | waarder (@ vard'e@r // waarderend/e/waardering | ||||
&) waardig v'A:rd@x2 // stress on -waardig: merkwaardig/besienswaardigheid, etc. | &) 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 | waar (neemba v%A:r // move default stress: waarneembaar/-bare | ||||
C) waarts vA:rts // fix w sound: dakwaarts/huiswaarts/kerkwaarts/noordwaarts/weswaarts | 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 | wêrel (djie v&:r@l // fix -djie in wêreldjie and compounds |
كغم kiluu||gHraam | كغم kiluu||gHraam | ||||
طن t[un | طن t[un | ||||
كم kiiluu||mitar | كم 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 | د.ج diinaar||dZazaa?irij | ||||
$ duulaar | $ duulaar |
automobile O:t@m@bi@l | automobile O:t@m@bi@l | ||||
automaton O:t'0m@t@n | automaton O:t'0m@t@n | ||||
autopsy O:t20psi | autopsy O:t20psi | ||||
?3 aurora $2 | |||||
avalanche av@laanS | avalanche av@laanS | ||||
avast $alt3 | avast $alt3 | ||||
avatar ava#tA@ | avatar ava#tA@ | ||||
descant dEskant | descant dEskant | ||||
descry dI#skreI | descry dI#skreI | ||||
desert dI#z3:t | desert dI#z3:t | ||||
desert dEz3t $only | |||||
desert dEz3t $onlys | |||||
desert dI#z3:t $verb | desert dI#z3:t $verb | ||||
desi deIsi | desi deIsi | ||||
desolate dEs@l@t $only | desolate dEs@l@t $only | ||||
idly aIdlI | idly aIdlI | ||||
idiocy IdI@si | idiocy IdI@si | ||||
ifrog $alt6 | ifrog $alt6 | ||||
ignoramus Igno@r'eIm@s | |||||
ignoramus IgnO@r'eIm@s | |||||
illiterate $alt2 | illiterate $alt2 | ||||
illumine $alt2 | illumine $alt2 | ||||
imagery ImIdZri | imagery ImIdZri | ||||
nonetheless nVnD@l'Es | nonetheless nVnD@l'Es | ||||
nosedive noUzdaIv | nosedive noUzdaIv | ||||
nosir noUs3: | nosir noUs3: | ||||
?5 nosir noUsIR | |||||
not noUt // for noted, notable, etc | not noUt // for noted, notable, etc | ||||
nots n0ts | nots n0ts | ||||
(nôtre dame) noUtr@'dA:m | (nôtre dame) noUtr@'dA:m | ||||
sinus saIn@s | sinus saIn@s | ||||
siphon $alt2 | siphon $alt2 | ||||
sir s,3: $only | sir s,3: $only | ||||
?5 sir s,VR $only | |||||
?5 sir s,IR $only | |||||
siren saIr@n | siren saIr@n | ||||
site saIt // for sited | site saIt // for sited | ||||
ski ski: | ski ski: | ||||
son sVn | son sVn | ||||
sonar soUnA@ | sonar soUnA@ | ||||
sonny sVnI | sonny sVnI | ||||
sooth su:T $only | |||||
sopapilla soUp@p'i:@ | |||||
sope soUpeI | sope soUpeI | ||||
sorbet sO@beI | |||||
souffle su:fl'eI | souffle su:fl'eI | ||||
soundbite saUndbaIt | soundbite saUndbaIt | ||||
souvenir su:v@n'i@3 | souvenir su:v@n'i@3 | ||||
sopapilla soUp@p'i:@ | |||||
sorbet sO@beI | |||||
soyabean sOI@bi:n | soyabean sOI@bi:n | ||||
specific sp@sIfIk | specific sp@sIfIk | ||||
specimen spEsI2m@n | specimen spEsI2m@n | ||||
tamale ta#mA:li | tamale ta#mA:li | ||||
tampon tamp0n | tampon tamp0n | ||||
tangerine tandZ@r'i:n | tangerine tandZ@r'i:n | ||||
taoiseach ti:S@x | |||||
tapestry tapI#stri | tapestry tapI#stri | ||||
tarantula t@rantS@l@ | tarantula t@rantS@l@ | ||||
tardis $alt1 | tardis $alt1 | ||||
ye ji: $u+ | ye ji: $u+ | ||||
yea jeI | yea jeI | ||||
yessir jEss3: | yessir jEss3: | ||||
?5 yessir jEssIR | |||||
yoghurt j0g3t | yoghurt j0g3t | ||||
?3 yoghurt joUg3t | ?3 yoghurt joUg3t | ||||
?3 yogurt joUg3t | ?3 yogurt joUg3t | ||||
Assamese A:sA:m'i:z | Assamese A:sA:m'i:z | ||||
Audubon O:d@b0n | Audubon O:d@b0n | ||||
Augusta $2 | Augusta $2 | ||||
Austen O2stI2n | |||||
Baghdad $2 | Baghdad $2 | ||||
Bahawalpur $alt3 | Bahawalpur $alt3 | ||||
Bahia ba'i:@ | Bahia ba'i:@ | ||||
?!3 Anthony ant@ni | ?!3 Anthony ant@ni | ||||
Anton ant0n | Anton ant0n | ||||
Anya anj@ | Anya anj@ | ||||
Aoife i:f@ | |||||
Aoiffe i:f@ | |||||
Aphrodite afr@d'aIti | Aphrodite afr@d'aIti | ||||
Archibald A@tSIbO:ld | Archibald A@tSIbO:ld | ||||
Archie A@tSi | Archie A@tSi | ||||
Salman sa#lmA:n | Salman sa#lmA:n | ||||
Samantha sa#manT@ | Samantha sa#manT@ | ||||
(Santa claus) s'ant@||kl'O:z | (Santa claus) s'ant@||kl'O:z | ||||
Saoirse si@S@ | |||||
Sarah se@r@ | Sarah se@r@ | ||||
Sarisa $alt3 | Sarisa $alt3 | ||||
Seamus SeIm@s | Seamus SeIm@s | ||||
Simon saIm@n | Simon saIm@n | ||||
Sinead SI2neId | Sinead SI2neId | ||||
Sinéad SI2neId | Sinéad SI2neId | ||||
Siobhan S@vO:n | |||||
Siobhán S@vO:n | |||||
Siobhan SI2vO:n | |||||
Siobhán SI2vO:n | |||||
Sonia s0nj@ | Sonia s0nj@ | ||||
Sophia soUf'i@ | Sophia soUf'i@ | ||||
Sophie soUfi | Sophie soUfi |
sw) a (m_ a | sw) a (m_ a | ||||
sw) a (nk a | sw) a (nk a | ||||
ao eI0 | ao eI0 | ||||
mh) ao eI // Irish, e.g. 'mhaol' /weIl/ | |||||
m) ao aU | m) ao aU | ||||
p) ao aU | p) ao aU | ||||
t) ao aU | t) ao aU | ||||
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@ | g) ao (l eI@ | ||||
aor eI'o@ | aor eI'o@ | ||||
m) ao (ri aU | m) ao (ri aU | ||||
_n) a (tional a | _n) a (tional a | ||||
@) a (tious 'eI | @) a (tious 'eI | ||||
ell) a (trix @ | ell) a (trix @ | ||||
a (triC 'eI | |||||
a (trix 'eI | |||||
a (trice 'eI | |||||
n) a (tur eI | n) a (tur eI | ||||
n) a (tura a | n) a (tura a | ||||
&) a (ture_ @ | &) a (ture_ @ | ||||
_m) ag (ell a#dZ | _m) ag (ell a#dZ | ||||
Cp) age (_ eIdZ | Cp) age (_ eIdZ | ||||
pp) age (_ I2dZ | pp) age (_ I2dZ | ||||
_ant) ag 'ag | |||||
_ant) ag (on 'ag | |||||
enr) ag (e_ 'eIdZ | enr) ag (e_ 'eIdZ | ||||
outr) ag (e_ eIdZ | outr) ag (e_ eIdZ | ||||
der) ag (e_ eIdZ | der) ag (e_ eIdZ | ||||
_) anony (m a#n0n@ | _) anony (m a#n0n@ | ||||
_c) an (ood a#n | _c) an (ood a#n | ||||
&) an (_ @n | &) an (_ @n | ||||
&) an (ize @n | |||||
&) an (_$w_alt1+ an | &) an (_$w_alt1+ an | ||||
?8 &) an (_ a#n | ?8 &) an (_ a#n | ||||
@u) an (_S1 n | @u) an (_S1 n | ||||
_) as (in as | _) as (in as | ||||
as (k aas | as (k aas | ||||
_) as (k aas | _) as (k aas | ||||
s) as (k as | |||||
_) as (n az | _) as (n az | ||||
_) as (oc eIs | _) as (oc eIs | ||||
C) as (p aas | C) as (p aas | ||||
ass (u @S | ass (u @S | ||||
ass (ump a#s | ass (ump a#s | ||||
assur @SU@ | assur @SU@ | ||||
_) ass (wh as | |||||
C) as (t aas | C) as (t aas | ||||
C) ast (ell aas | C) ast (ell aas | ||||
_bl) as (to as //not aa | _bl) as (to as //not aa | ||||
au (m_ aU | au (m_ aU | ||||
_) au (nt aa | _) au (nt aa | ||||
aur (_ O@ | aur (_ O@ | ||||
_) au (ror a# | |||||
?!3 _) au (rora a# | |||||
s) au (rus_ 'O: | s) au (rus_ 'O: | ||||
@) au (ri 'O: | @) au (ri 'O: | ||||
C) aus (_ aUs | C) aus (_ aUs | ||||
may) be (_ bi: | may) be (_ bi: | ||||
_) be (CA bI# | _) be (CA bI# | ||||
_) bete (lg bi:t@ | _) bete (lg bi:t@ | ||||
_) be (C% bE | |||||
_) be (C%+ bE | |||||
_) be (atiC b%i: | _) be (atiC b%i: | ||||
_) be (b bi: | _) be (b bi: | ||||
_) be (cl bI# | _) be (cl bI# | ||||
_) be (kn bI# | _) be (kn bI# | ||||
_) belarus bEl@r'u:s | _) belarus bEl@r'u:s | ||||
_) be (lC bE | _) be (lC bE | ||||
_) be (llig bI# | |||||
_) be (llig+ bI# | |||||
_) be (re bE | _) be (re bE | ||||
_) be (sC bI# | _) be (sC bI# | ||||
_) be (stia bE | _) be (stia bE | ||||
e (Cical 'E | e (Cical 'E | ||||
e (CiuB i: | e (CiuB i: | ||||
&) e (_ | &) e (_ | ||||
aoiC) e (_ @ // Irish, e.g. 'Aoife' /i:fe/ | |||||
aoiCC) e (_ @ // Irish, e.g. 'Saoirse' /se@S@/ | |||||
acB) e (_ %I | acB) e (_ %I | ||||
XC) e (_N i: | XC) e (_N i: | ||||
vert) e (b I | vert) e (b I | ||||
@x) ed (_S2vi d# | @x) ed (_S2vi d# | ||||
y) ed (_S2v d# | y) ed (_S2v d# | ||||
debut) ed (_S2 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 | c) ed (e_ 'i:d | ||||
p) ed (e_ i:d | p) ed (e_ i:d | ||||
p) edal Ed@L | p) edal Ed@L | ||||
en (core 0n | en (core 0n | ||||
&) ency (_ @ns%i | &) ency (_ @ns%i | ||||
ency (cli %EnsI | ency (cli %EnsI | ||||
_) en (dg@ %En | |||||
_) en (dp@ %En | |||||
k) en (d_ En | k) en (d_ En | ||||
s) en (d_ En | s) en (d_ En | ||||
t) en (d_ En | t) en (d_ En | ||||
exp) eri (en i@rI2 | exp) eri (en i@rI2 | ||||
XC) er 3: | XC) er 3: | ||||
th) er (@ 3: | th) er (@ 3: | ||||
h) er (@ %3 | |||||
h) er (nan %3 | |||||
X) er (A E#r | X) er (A E#r | ||||
_h) eretical I#rEtIk@L | _h) eretical I#rEtIk@L | ||||
_qu) er 3: | _qu) er 3: | ||||
&z) es (_S2 %I#z | &z) es (_S2 %I#z | ||||
&C) es (_S1i z | &C) es (_S1i z | ||||
xus) es (_S2 %I#z | xus) es (_S2 %I#z | ||||
tamus) es (_S2 %I#z // hippopotamuses | |||||
es (carp I2s | es (carp I2s | ||||
es (cape %Es | es (cape %Es | ||||
es (capi %Es | es (capi %Es | ||||
&) ford (_S4 f3d | &) ford (_S4 f3d | ||||
&f) ford (_S4 3d | &f) ford (_S4 3d | ||||
for (see f%O@ | for (see f%O@ | ||||
for (ward f'o@ // straightforward | |||||
for (ward f'O@ | |||||
ft (en f | ft (en f | ||||
&) ful (_S3i f@L | &) ful (_S3i f@L | ||||
_) metall (ic m@tal | _) metall (ic m@tal | ||||
metabo m@t'ab0 | metabo m@t'ab0 | ||||
_) meta (llu m%Eta | _) 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 | &) mobile m@bi:l | ||||
_) mocha moUk@ | _) mocha moUk@ | ||||
mono (ga m@n'0 | mono (ga m@n'0 | ||||
&) mouth (_ m@T | &) mouth (_ m@T | ||||
&) mouth (_$w_alt1 maUT | &) mouth (_$w_alt1 maUT | ||||
_) multi mVlti | _) multi mVlti | ||||
_) multi (pl m,VltI | |||||
_) multi (@@P5 m,VltI | _) multi (@@P5 m,VltI | ||||
.group mi | .group mi | ||||
.group re | .group re | ||||
_) re (C@ rI# | _) re (C@ rI# | ||||
_) re (collec rE | |||||
_) reflex ri:flE2ks | _) reflex ri:flE2ks | ||||
_) reflexive rI#fl'EksIv | _) reflexive rI#fl'EksIv | ||||
&Ct) red (_ @d | &Ct) red (_ @d | ||||
Co) s (Er z | Co) s (Er z | ||||
Co) s (En z | Co) s (En z | ||||
e) s (d 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# | _) se (clu sI# | ||||
secur sI#kjU@ | secur sI#kjU@ | ||||
_) se (duc sI# | _) se (duc sI# | ||||
@) s (head_ s | @) s (head_ s | ||||
@) s (hill_ s | @) s (hill_ s | ||||
@) s (hous s | @) s (hous s | ||||
@) s (hors s | |||||
_) she' %Si: | _) she' %Si: | ||||
A) sh (A_ =S | A) sh (A_ =S | ||||
&) ship (_S4 SIp | &) ship (_S4 SIp | ||||
&) s (ic_ z | &) s (ic_ z | ||||
n) s (ic_ s | n) s (ic_ s | ||||
ss (ic s | ss (ic s | ||||
mu) s (e z | |||||
mu) s (ic z | mu) s (ic z | ||||
ea) s (ie z | ea) s (ie z | ||||
ea) s (il z | ea) s (il z | ||||
th (ill th | th (ill th | ||||
gh) th (A th | gh) th (A th | ||||
ee) thing DI2N | ee) thing DI2N | ||||
soo) th D | |||||
soo) th (say T | |||||
the (_ D | the (_ D | ||||
&) th (L03_ =T | &) th (L03_ =T | ||||
ou) thed (_ Dd | ou) thed (_ Dd | ||||
j) ui (c u: | j) ui (c u: | ||||
uir (_ jU@ | uir (_ jU@ | ||||
n) ui (s ju: | n) ui (s ju: | ||||
?3 n) ui (s u: | |||||
r) uis (A u:z | r) uis (A u:z | ||||
r) ui (t u: | r) ui (t u: | ||||
gr) ui (t u:I2 | gr) ui (t u:I2 |
// * 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 * | // * 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 * | // * it under the terms of the GNU General Public License as published by * | ||||
آموخت Amuxt | آموخت Amuxt | ||||
آموزد Amuzad | آموزد Amuzad | ||||
آموزش AmuzeS | آموزش AmuzeS | ||||
آمپر AmpeR | |||||
آمپرمتر AmpeRmetR | آمپرمتر AmpeRmetR | ||||
آمپلیفایر AmpelifAjeR | آمپلیفایر AmpelifAjeR | ||||
آمپیریسم AmpiRism | آمپیریسم AmpiRism | ||||
درایه deRAje | درایه deRAje | ||||
درایو deRAjv | درایو deRAjv | ||||
درایور deRAjveR | درایور deRAjveR | ||||
درباره daR'bAReje: | |||||
دربازکن daRbAzkon | دربازکن daRbAzkon | ||||
دربدر daRbedaR | دربدر daRbedaR | ||||
دربندکشیده daRbandkeSide | دربندکشیده daRbandkeSide | ||||
شدیدا Sadidan | شدیدا Sadidan | ||||
شدیداللحن Sadidollahn | شدیداللحن Sadidollahn | ||||
شدیم Sodim | شدیم Sodim | ||||
شراادی SA:_d:jA:_R | |||||
شرافت SeRAfat | شرافت SeRAfat | ||||
شراپنل SeRApnel | شراپنل SeRApnel | ||||
شراکت SeRAkat | شراکت SeRAkat | ||||
شربت SaRbat | شربت SaRbat | ||||
شرت 'SoRt | شرت 'SoRt | ||||
شرتکات SoRtkAt | شرتکات SoRtkAt | ||||
شراادی SA:_d:jA:_R | |||||
شرشر SeRSeR | شرشر SeRSeR | ||||
شرطه SoRte: | شرطه SoRte: | ||||
شرعا SaR?an | شرعا SaR?an |
// * 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 * | // * 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 * | // * it under the terms of the GNU General Public License as published by * | ||||
L09L09L09L09) م (L03L09L09L09_ ma | L09L09L09L09) م (L03L09L09L09_ ma | ||||
// Prefixes م | // Prefixes م | ||||
_) م (L03L09L03_$noprefixP1@ ma | |||||
_) م (L03L04L03_$noprefixP1@ ma | |||||
_) می (L03L09+$noprefixP2@ mi | _) می (L03L09+$noprefixP2@ mi | ||||
_) می (آL09L09$noprefixP2@ mi | _) می (آL09L09$noprefixP2@ mi | ||||
_) می (وL09L09$noprefixP2@ mi | _) می (وL09L09$noprefixP2@ mi |
o o: | o o: | ||||
ö Y: | ö Y: | ||||
p pe: | p pe: | ||||
q ku: | |||||
q qu: | |||||
r &r | r &r | ||||
s &s | s &s | ||||
t te: | t te: | ||||
// Abbreviations | // Abbreviations | ||||
(à la) 'ala $dot // jonka mukaan | |||||
abc $abbrev | abc $abbrev | ||||
adhd $abbrev | adhd $abbrev | ||||
os $abbrev $dot | |||||
ad $abbrev $dot // anno Domini, Herran vuonna | ad $abbrev $dot // anno Domini, Herran vuonna | ||||
atk $abbrev | |||||
ay $abbrev // ammaatiyhdistys | |||||
ca $abbrev $dot // circa | ca $abbrev $dot // circa | ||||
dna $abbrev // elinkeinoelämän keskusliitto | |||||
eg esimerkiksi $dot // exempli gratia, esimerkiksi | |||||
em $abbrev $dot | em $abbrev $dot | ||||
ek $abbrev // elinkeinoelämän keskusliitto | |||||
ekr $abbrev $dot // ennen Kristuksen syntymää | ekr $abbrev $dot // ennen Kristuksen syntymää | ||||
etc et_setera $dot // et cetera, ym., jne. | 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 | jne $abbrev $dot // ja niin edelleen | ||||
(à la) 'ala $dot // jonka mukaan | |||||
ky $abbrev $dot // kommandiittiyhtiö | ky $abbrev $dot // kommandiittiyhtiö | ||||
oy $abbrev // osakeyhtiö | |||||
nro numero $dot | 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 |
.group q | .group q | ||||
q k | |||||
qq k: | |||||
q q | |||||
qq q: | |||||
.group r | .group r | ||||
r 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 | .group s | ||||
s s | s s | ||||
.group u | .group u | ||||
u u | u u | ||||
uu 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: | uii u|i: | ||||
uo uo | uo uo | ||||
uoo u|o: | uoo u|o: |
| | ||||
// This file is UTF-8 encoded | // 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] | // $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] | // $alt2 change [E] or [O] in the stressed syllable to [e] or [o] | ||||
_> madZ:'oRe||d'I | _> madZ:'oRe||d'I | ||||
_〈 ap'E@-*ta||,angol'aRe | _〈 ap'E@-*ta||,angol'aRe | ||||
_〉 kj'uza||,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 | * aste@-*'isko $max3 | ||||
$ d'Ol:aRI | $ d'Ol:aRI | ||||
% pe@-*tS'ENto $max3 | % pe@-*tS'ENto $max3 | ||||
\ kont@-*ob'a:R*a $max3 | \ kont@-*ob'a:R*a $max3 | ||||
_| b'aR*a||ve@-*tik'ale | _| b'aR*a||ve@-*tik'ale | ||||
& 'a/nd | & 'a/nd | ||||
© k'O:pi||raIt | |||||
# kantSellet:o | # kantSellet:o | ||||
@ ki'otS:ola | @ ki'otS:ola | ||||
~ tilde | ~ tilde | ||||
_′ p@-*'imi | _′ p@-*'imi | ||||
_″ d'Op:io||'apitSe | _″ d'Op:io||'apitSe | ||||
_‴ t@-*'iplo||'apitSe | _‴ t@-*'iplo||'apitSe | ||||
_‼ esklamatsi'One | |||||
§ setsi'One | § setsi'One | ||||
¶ pa*'ag@-*afo | ¶ pa*'ag@-*afo | ||||
_‐ legat'u:Ra | _‐ legat'u:Ra | ||||
ʔ glotalst'Op | ʔ glotalst'Op | ||||
ɡ dZ'i||vel'aRe||ok:luz'iva // U+0261 | ɡ dZ'i||vel'aRe||ok:luz'iva // U+0261 | ||||
ɣ g'am:a||min'uskola // U+0263 voiced velar fricative | ɣ g'am:a||min'uskola // U+0263 voiced velar fricative | ||||
ß 'esse||ak'uta | |||||
ɑ 'alfa | |||||
_‣ punt'ato | _‣ punt'ato | ||||
◦ punt'ato | ◦ punt'ato | ||||
↓ f@-*'etS:a||_dZ'u | ↓ f@-*'etS:a||_dZ'u | ||||
♭ bem'Ol:e | ♭ bem'Ol:e | ||||
♯ dI'ezis | ♯ dI'ezis | ||||
♥ 'asso||di||kw'ORI | |||||
❓ p'unto||inteR*ogat'ivo | |||||
_‧ sepaRat'oRe/ | _‧ sepaRat'oRe/ | ||||
∞ infin'Ito | ∞ infin'Ito | ||||
blackout bl'Ek'aUt | blackout bl'Ek'aUt | ||||
blind bl'aInd $onlys | blind bl'aInd $onlys | ||||
blues bl'u:z | blues bl'u:z | ||||
bluff bl'ef: $only | |||||
boiler $1 | boiler $1 | ||||
bonjour b,O:_Z'u:r | bonjour b,O:_Z'u:r | ||||
brioche b@-*I'oS | brioche b@-*I'oS | ||||
lord $alt $only | lord $alt $only | ||||
love l'O:v $onlys | love l'O:v $onlys | ||||
lover $1 | lover $1 | ||||
manche m'a:nS $only | |||||
manche m'a:nS $onlys | |||||
my _^_EN | my _^_EN | ||||
myspace m'aI||sp'Eis | myspace m'aI||sp'Eis | ||||
machine maS'in $onlys | machine maS'in $onlys | ||||
jace _^_en $only | jace _^_en $only | ||||
jack dZ'E:k | jack dZ'E:k | ||||
jackson _^_EN | jackson _^_EN | ||||
jefferson $1 | |||||
jacopo j'a:kopo | jacopo j'a:kopo | ||||
james _^_EN | james _^_EN | ||||
jane _^_EN | jane _^_EN | ||||
peggy p'Eg:I | peggy p'Eg:I | ||||
pericle $1 | pericle $1 | ||||
peter $1 $onlys | peter $1 $onlys | ||||
peterson p'Ete@-*s,on | |||||
pettarin $3 $only | pettarin $3 $only | ||||
peugeot p,EZ'o | peugeot p,EZ'o | ||||
piquet pik'E $only | piquet pik'E $only | ||||
distintesi $2 | distintesi $2 | ||||
disturbano $2 | disturbano $2 | ||||
disturbino $2 | disturbino $2 | ||||
dissuadere dissuad'eRe | |||||
divaghino $2 | divaghino $2 | ||||
divaricano $2 | divaricano $2 | ||||
diventino $2 | diventino $2 | ||||
sloggiano $1 | sloggiano $1 | ||||
smagnetizzino $3 | smagnetizzino $3 | ||||
smascher $1 | smascher $1 | ||||
smascherano $1 | |||||
smercino $1 | smercino $1 | ||||
sniffano $1 | sniffano $1 | ||||
snodano $1 | snodano $1 | ||||
(quando capita) kw'ando||k'apita | (quando capita) kw'ando||k'apita | ||||
(se capita) se||k'a:pita | (se capita) se||k'a:pita | ||||
(me capita) me||k'apita | (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 | (capitano tutte) k'apitano||t'ut:e | ||||
(che capitano) ke||k'apitano | (che capitano) ke||k'apitano | ||||
(quando capitano) kw'ando||k'a:pitano | (quando capitano) kw'ando||k'a:pitano | ||||
esprimiti $2 | esprimiti $2 | ||||
evolverci $2 | evolverci $2 | ||||
evolversi $2 | evolversi $2 | ||||
facendomici fatS'endom,itSi | |||||
fammel $1 | fammel $1 | ||||
fattel f'at:el | fattel f'at:el | ||||
fattoci $1 | fattoci $1 | ||||
pensaci $1 | pensaci $1 | ||||
perdonatel $3 | perdonatel $3 | ||||
permettigli $2 | permettigli $2 | ||||
pervenutaci $3 | |||||
pizzical $1 | pizzical $1 | ||||
pizzicami $1 | pizzicami $1 | ||||
portala $1 | portala $1 | ||||
redigerl $2 | redigerl $2 | ||||
raddrizzarl @-*ad:@-*its2:'a@-*l | raddrizzarl @-*ad:@-*its2:'a@-*l | ||||
rafforzal $2 | rafforzal $2 | ||||
regalaci $2 | |||||
regalati $2 $atstart | regalati $2 $atstart | ||||
regalavi $3 | regalavi $3 | ||||
reinseritasi $4 | reinseritasi $4 |
agadez $3 | agadez $3 | ||||
agapit $2 | agapit $2 | ||||
agave $1 | agave $1 | ||||
agendine $3 | |||||
agenzia $3 | agenzia $3 | ||||
agenzie adZents'ie | agenzie adZents'ie | ||||
agerol $2 | agerol $2 | ||||
alloggi $alt | alloggi $alt | ||||
allora al:'oRa | allora al:'oRa | ||||
alluce 'al:utSe | alluce 'al:utSe | ||||
alluci $1 | |||||
almen $alt2 | almen $alt2 | ||||
alope $1 | alope $1 | ||||
alopecia alopetS'i:a | alopecia alopetS'i:a |
// Italian translation rules | // Italian translation rules | ||||
// This file is UTF-8 encoded | // 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 | // letter groups | ||||
// A any vowel | // A any vowel | ||||
// C any consonant | // C any consonant | ||||
au a|%U | au a|%U | ||||
@C) a (_S1q a/ // lookup it_list without suffix | @C) a (_S1q a/ // lookup it_list without suffix | ||||
@i) 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 (co_ =a | ||||
@) a (ca_ =a | @) a (ca_ =a | ||||
@) a (che_ =a/ | @) a (che_ =a/ | ||||
@) a (bile_ 'a | @) a (bile_ 'a | ||||
@) a (ggine_ 'a | @) a (ggine_ 'a | ||||
_) ae (r aE | _) ae (r aE | ||||
avano (_ 'avano | |||||
avano (_ 'avano // verbs | |||||
a (tterA_ 'a | a (tterA_ 'a | ||||
_) all' (P4t all | _) all' (P4t all | ||||
_) anch' (P5t ank | _) anch' (P5t ank | ||||
@) amo (L04_ 'amo // Pron.s verbs | @) amo (L04_ 'amo // Pron.s verbs | ||||
Ci) amo (L04_ 'amo | Ci) amo (L04_ 'amo | ||||
@) ander (L04_ 'andE@-* | @) ander (L04_ 'andE@-* | ||||
ate (L04_+ 'ate | |||||
ate (L04_+ 'ate | |||||
abb) assa (L07_ 'assa | |||||
_L04Z) auguri (_ 'awguRI | _L04Z) auguri (_ 'awguRI | ||||
astano (_ 'astano // verbs | astano (_ 'astano // verbs | ||||
bbano (_ =b:ano // verbs | bbano (_ =b:ano // verbs | ||||
bacia (L07_ b'atSa | bacia (L07_ b'atSa | ||||
_) bagna (L07_ b'an^a | _) bagna (L07_ b'an^a | ||||
a) bbraccia (L07_ b:@-*'atS:a | |||||
.group c | .group c | ||||
c k | c k | ||||
in) cer (L04_ =tSe@-* | in) cer (L04_ =tSe@-* | ||||
cuocer (L04_ kU'OtSe@-* | cuocer (L04_ kU'OtSe@-* | ||||
compra (L07_ k'omp@-*a | compra (L07_ k'omp@-*a | ||||
_L04Z) capite (_ kap'ite/ | |||||
_L04Z) capit (A_ k'a:p,it | _L04Z) capit (A_ k'a:p,it | ||||
_L04Z) capit (ano_ k'a:p,it | _L04Z) capit (ano_ k'a:p,it | ||||
correr (L04_ k'o:R*eR | correr (L04_ k'o:R*eR | ||||
fob (A_ =fob | fob (A_ =fob | ||||
farma (ci_ f'a@-*ma | farma (ci_ f'a@-*ma | ||||
ferma (L07_ f'e@-*ma/ | ferma (L07_ f'e@-*ma/ | ||||
_) fatt (AL04_ f'at: | |||||
_ri) fatt (AL04_ f'at: | |||||
.group g | .group g | ||||
g g | g g | ||||
qui (A kwj | qui (A kwj | ||||
_) quell' (P6t kwEll | _) quell' (P6t kwEll | ||||
_) quest' (P6t kwest | _) quest' (P6t kwest | ||||
_) quant' (P6t kwant | |||||
.group r | .group r | ||||
r @-* | r @-* | ||||
_) ripeter (L04_ @-*ip'E:te@-* | _) ripeter (L04_ @-*ip'E:te@-* | ||||
_) romper (L04_ @-*'ompe@-* | _) romper (L04_ @-*'ompe@-* | ||||
ca) re (zzaL07_ R'e | ca) re (zzaL07_ R'e | ||||
_) regala (tAL04_ @-*egal'a | |||||
C) rai (_ @-*'a:I | C) rai (_ @-*'a:I | ||||
A) rai (_ R'a:I | A) rai (_ R'a:I | ||||
rrai (_ R*'a:I | rrai (_ R*'a:I | ||||
_) segna (L05_ s'en^a | _) segna (L05_ s'en^a | ||||
in) segna (L07_ s'En^a | in) segna (L07_ s'En^a | ||||
_)segnala (L07_ sen^'ala | _)segnala (L07_ sen^'ala | ||||
specifica (L07_ spetS'ifika | |||||
stringi (L04_ st@-*'indZi/ | |||||
A) scano (_ =skano // verbs | A) scano (_ =skano // verbs | ||||
sciano (_ =Sano | sciano (_ =Sano | ||||
A) schiano (_ =skiano | A) schiano (_ =skiano | ||||
au) tentica (L07_ t'ENtIka/ | au) tentica (L07_ t'ENtIka/ | ||||
a) ttiva (L07_ t:'iva | a) ttiva (L07_ t:'iva | ||||
taglia (L07_ t'al^a | taglia (L07_ t'al^a | ||||
tira (L07_ t'iRa | |||||
L02) tre (_ t@-*'e | L02) tre (_ t@-*'e | ||||
_) tutt' (P5t tut: | _) tutt' (P5t tut: | ||||
ustano (_ 'u:stano | ustano (_ 'u:stano | ||||
C) uo (tano_ U'O | C) uo (tano_ U'O | ||||
uomini (_ w2'Omini | uomini (_ w2'Omini | ||||
fanc) u (lA_ 'u: | |||||
.group v | .group v | ||||
v v | v v | ||||
_) vota (L07_ v'Ota | _) vota (L07_ v'Ota | ||||
s) veglia (L07_ v'el^a | s) veglia (L07_ v'el^a | ||||
volta (L07_ v'Olta | volta (L07_ v'Olta | ||||
venut (AL04_ ven'ut | |||||
_) v' (P2t v | |||||
.group w | .group w | ||||
w w2 | w w2 | ||||
man) zie (_ ts'i;e | man) zie (_ ts'i;e | ||||
me) zz dz: | me) zz dz: | ||||
amma) zziamo (L04_ _tsi'a:mo | amma) zziamo (L04_ _tsi'a:mo | ||||
sbara) zz (arL04_ ts: | |||||
.group | .group | ||||
😖 შეცბუნებული სახე // [1F616] | 😖 შეცბუნებული სახე // [1F616] | ||||
😗 კოცნის გამომხატველი სახე // [1F617] | 😗 კოცნის გამომხატველი სახე // [1F617] | ||||
😘 სახე, რომელიც კოცნას აგზავნის // [1F618] | 😘 სახე, რომელიც კოცნას აგზავნის // [1F618] | ||||
😙 კოცნის გამომხატველი სახე მომღიმარე თვალებით // [1F619] | |||||
😗 kissing face // [1F617] | |||||
//😙 კოცნის გამომხატველი სახე მომღიმარე თვალებით // [1F619] TODO: This breaks speaking "7". | |||||
😚 კოცნის გამომხატველი სახე დახუჭული თვალებით // [1F61A] | 😚 კოცნის გამომხატველი სახე დახუჭული თვალებით // [1F61A] | ||||
😛 სახე გამოყოფილი ენით // [1F61B] | 😛 სახე გამოყოფილი ენით // [1F61B] | ||||
😜 სახე გამოყოფილი ენითა და ჩაკრული თვალით // [1F61C] | 😜 სახე გამოყოფილი ენითა და ჩაკრული თვალით // [1F61C] | ||||
😢 მტირალა სახე // [1F622] | 😢 მტირალა სახე // [1F622] | ||||
😣 შეუპოვარი სახე // [1F623] | 😣 შეუპოვარი სახე // [1F623] | ||||
😤 სახე ცხვირიდან გამომავალი ორთქლით // [1F624] | 😤 სახე ცხვირიდან გამომავალი ორთქლით // [1F624] | ||||
😥 იმედგაცრუებული, მაგრამ შვების გამომხატველი სახე // [1F625] | |||||
😥 disappointed but relieved face // [1F625] | |||||
//😥 იმედგაცრუებული, მაგრამ შვების გამომხატველი სახე // [1F625] TODO: This breaks speaking "3". | |||||
😦 შეჭმუხნილი სახე ღია პირით // [1F626] | 😦 შეჭმუხნილი სახე ღია პირით // [1F626] | ||||
😧 ტანჯული სახე // [1F627] | 😧 ტანჯული სახე // [1F627] | ||||
😨 შეშინებული სახე // [1F628] | 😨 შეშინებული სახე // [1F628] |
tikvien $u2+ | tikvien $u2+ | ||||
turpat $u2+ | turpat $u2+ | ||||
turpretī $u2 | turpretī $u2 | ||||
uzreiz $2 | |||||
vienalga $2 | vienalga $2 | ||||
vismaz $2 | vismaz $2 | ||||
.L17 ai ais am ā ām ās ie iem o os // suffixes of certain adjectives finishing with ..ējais | .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) | .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 | .L20 ~ ne // optional negation prefix | ||||
// +---------------------------+ | // +---------------------------+ | ||||
// +---------------------------+ | // +---------------------------+ | ||||
// | Pronunciation of o | | // | 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 | // Default rules for o with succeeding consonants | ||||
.L40 č ģ ķ ļ ņ ŗ š ž // uo indicators — o is spelled as uo in words with Latvian soft consonants | .L40 č ģ ķ ļ ņ ŗ š ž // uo indicators — o is spelled as uo in words with Latvian soft consonants | ||||
// wide e ------------------------------------------------------------------------ // | // wide e ------------------------------------------------------------------------ // | ||||
// widening consonants follow | // widening consonants follow | ||||
e (L25 E | |||||
e (L25< E | |||||
e (L25L25 E | e (L25L25 E | ||||
// widening vowels follow | // widening vowels follow | ||||
e (L25L24+ E | e (L25L24+ E | ||||
_L20) e (sat_+ _!e // esat | _L20) e (sat_+ _!e // esat | ||||
_L20) e (si_ _!e // esi | _L20) e (si_ _!e // esi | ||||
_L20) e (smu_ _!e // esmu | _L20) e (smu_ _!e // esmu | ||||
_L20) e (sot_ _!e // esot | |||||
_m) e (dūzL04_ e | _m) e (dūzL04_ e | ||||
_m) e (kL04_ e // Meka | _m) e (kL04_ e // Meka | ||||
m) e (lL88 E | m) e (lL88 E | ||||
_n) ere (tL04_ ERE // Nereta | _n) ere (tL04_ ERE // Nereta | ||||
n) e (rv E | n) e (rv E | ||||
p) e (rs e | p) e (rs e | ||||
pr) e (cL52z e | |||||
pr) e (L71L05_ e // prece | pr) e (L71L05_ e // prece | ||||
_pr) e (t e | _pr) e (t e | ||||
pr) etē (@ ete: | pr) etē (@ ete: | ||||
t) ermo eRmo | t) ermo eRmo | ||||
t) e (st e | t) e (st e | ||||
_t) e (v_ e // tev | _t) e (v_ e // tev | ||||
_t) e (vi_ e // tevi | |||||
_v) e (lgL04_ e // Velga | _v) e (lgL04_ e // Velga | ||||
_v) e (ltL04_ e // Velta | _v) e (ltL04_ e // Velta | ||||
_v) e (ntL04_ E // Venta | _v) e (ntL04_ E // Venta | ||||
// wide ē --------------------------------------------------------------------------- // | // wide ē --------------------------------------------------------------------------- // | ||||
// widening consonants follow | // widening consonants follow | ||||
ē (L25 E: | |||||
ē (L25< E: | |||||
ē (L25L25 E: | ē (L25L25 E: | ||||
// widening vowels follow | // widening vowels follow | ||||
ē (L25L24+ E: | ē (L25L24+ E: | ||||
gr) ē (kL01_ E: | gr) ē (kL01_ E: | ||||
izp) ē (t e: | izp) ē (t e: | ||||
_kāp) ē (c_ e: // kāpēc | _kāp) ē (c_ e: // kāpēc | ||||
_l) ē (L83+ e: // lēst | |||||
m) ēne (L83 e:ne | m) ēne (L83 e:ne | ||||
m) ē (rķ e: | m) ē (rķ e: | ||||
_m) ē (s_ e: // mēs | _m) ē (s_ e: // mēs | ||||
ī i: | ī i: | ||||
.group j | .group j | ||||
// A) j (@ :j | |||||
j j | j j | ||||
_) jebk j%ebk // stress on 2nd syllable | _) jebk j%ebk // stress on 2nd syllable | ||||
o (L41+ o // o indicators after | o (L41+ o // o indicators after | ||||
o (JL41+ o | 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 // words with Latvian roots are more common | ||||
o (_++ uo // common ending for Latvian words | o (_++ uo // common ending for Latvian words | ||||
o (L40 uo // usually uo before soft (Latvian) consonants | o (L40 uo // usually uo before soft (Latvian) consonants | ||||
arist) o o | arist) o o | ||||
ater) o o: | ater) o o: | ||||
_aut) o (< o | _aut) o (< o | ||||
bals) o uo | |||||
bandr) o o: | bandr) o o: | ||||
_bar) o (L12_ uo | _bar) o (L12_ uo | ||||
bar) o (L65 uo // barot | bar) o (L65 uo // barot | ||||
dinam) o o: | dinam) o o: | ||||
disp) o o | disp) o o | ||||
eg) o o> | eg) o o> | ||||
eir) o o | |||||
_ek) o o | _ek) o o | ||||
eks) o o | eks) o o | ||||
ekspl) o o | ekspl) o o | ||||
ekvin) o o | ekvin) o o | ||||
elektr) o o: | elektr) o o: | ||||
ez) o o> | |||||
energ) o o: | energ) o o: | ||||
enL87) o o | enL87) o o | ||||
ent) o (@ o | ent) o (@ o | ||||
epr) o o | epr) o o | ||||
ept) o (@ o | ept) o (@ o | ||||
eur) o o | eur) o o | ||||
ez) o o> | |||||
gen) o o | gen) o o | ||||
get) o o | get) o o | ||||
glik) o o | glik) o o | ||||
pomp) o o: | pomp) o o: | ||||
por) o o | por) o o | ||||
pr) o (L90 o | pr) o (L90 o | ||||
_pr) o o | |||||
prop) o o | prop) o o | ||||
pseid) o o | pseid) o o | ||||
raps) o o: | raps) o o: | ||||
sol) o o: | sol) o o: | ||||
son) o o | son) o o | ||||
spid) o o | spid) o o | ||||
sp) o (L77++ uo | |||||
sport) o uo | sport) o uo | ||||
sten) o (L65 uo | sten) o (L65 uo | ||||
_sten) o o | _sten) o o | ||||
gl) ob ob | gl) ob ob | ||||
g) ob (e ob | g) ob (e ob | ||||
k) ob ob | k) ob ob | ||||
l) ob (ē ob | |||||
l) oboto (m oboto | |||||
m) ob ob | m) ob ob | ||||
_) ob (amL01_ ob // Obama | _) ob (amL01_ ob // Obama | ||||
ob (je ob | ob (je ob | ||||
m) od (u od | m) od (u od | ||||
m) od (uš uod | m) od (uš uod | ||||
n) od (L05_ o:d // ..node | n) od (L05_ o:d // ..node | ||||
n) od uod | |||||
_) od (ek od | _) od (ek od | ||||
od (erL51 uod | od (erL51 uod | ||||
_) od (esL04_ od // Odesa | _) od (esL04_ od // Odesa | ||||
_d) ok (L01_ ok // doks | _d) ok (L01_ ok // doks | ||||
d) ok (u ok | d) ok (u ok | ||||
fil) okok okok | fil) okok okok | ||||
gl) ok (sīn ok | |||||
g) ok ok | g) ok ok | ||||
_k) okako (lL04_ okako: // kokakola | _k) okako (lL04_ okako: // kokakola | ||||
k) ok (L01 uo`k // koks with short uo, because of ambiguity | k) ok (L01 uo`k // koks with short uo, because of ambiguity | ||||
pr) om om | pr) om om | ||||
_pr) om (_ uom // prom | _pr) om (_ uom // prom | ||||
pt) om (L01_ o:m // ..ptoms | pt) om (L01_ o:m // ..ptoms | ||||
pt) om o>m | |||||
rd) om (L01_ o:m | rd) om (L01_ o:m | ||||
r) om (b om | r) om (b om | ||||
_r) om (L04_ uom // Roma | _r) om (L04_ uom // Roma | ||||
m) op op | m) op op | ||||
net) op (_ uop | net) op (_ uop | ||||
n) op (er+++ uop | n) op (er+++ uop | ||||
n) opo (st uopuo | |||||
op (c op | op (c op | ||||
op (en op | op (en op | ||||
_) op (erL04_++++ o:p // opera | _) op (erL04_++++ o:p // opera | ||||
or (ien oR | or (ien oR | ||||
_) origo (_ oRigo: // Origo | _) origo (_ oRigo: // Origo | ||||
or (iģ oR | or (iģ oR | ||||
or (kā oR | |||||
or (ķest oR | or (ķest oR | ||||
or (L01_+ o:R // ..ors | or (L01_+ o:R // ..ors | ||||
_) or (L02_+ uoR // ore | _) or (L02_+ uoR // ore | ||||
p) os (tC@ os | p) os (tC@ os | ||||
p) os (te os | p) os (te os | ||||
p) os (ter os | p) os (ter os | ||||
p) os (tind os | |||||
p) os (tī uos | p) os (tī uos | ||||
p) os (tL01 uos | p) os (tL01 uos | ||||
p) os (tL55m os | p) os (tL55m os | ||||
š) os (ej os | š) os (ej os | ||||
_t) os (te os | _t) os (te os | ||||
_t) os (tL01_ os // tosts | _t) os (tL01_ os // tosts | ||||
v) osto (k osto | |||||
_z) os (L06_ uos // zoss | _z) os (L06_ uos // zoss | ||||
.group ot | .group ot | ||||
an) ot ot | an) ot ot | ||||
ast) ot uot | |||||
av) ot uot | av) ot uot | ||||
_bal) ot (ē ot | _bal) ot (ē ot | ||||
bankr) ot ot | |||||
b) ot (ān ot | b) ot (ān ot | ||||
d) ot (āc ot | d) ot (āc ot | ||||
d) ot (ē ot | d) ot (ē ot | ||||
er) ot (iL67 o:t | er) ot (iL67 o:t | ||||
er) ot (is o:t | er) ot (is o:t | ||||
_er) ot (L01_ ot // Erots | |||||
_ez) ot ot | _ez) ot ot | ||||
f) oto (_ oto: | f) oto (_ oto: | ||||
g) ot (ik o:t | g) ot (ik o:t | ||||
k) ot (an ot | k) ot (an ot | ||||
k) ot (L51 ot | k) ot (L51 ot | ||||
k) ot (l ot | k) ot (l ot | ||||
_L10pr) ot (L13_ uot // (ne|sa..)prot(i|u) | |||||
lin) ot (ip ot | lin) ot (ip ot | ||||
_l) ot (iņL04 ot // Lotiņa | _l) ot (iņL04 ot // Lotiņa | ||||
l) ot (L05_ ot // ..lote | l) ot (L05_ ot // ..lote | ||||
nepr) ot uot | nepr) ot uot | ||||
_n) ot (L04_ ot // nota | _n) ot (L04_ ot // nota | ||||
n) ot (L50r ot | n) ot (L50r ot | ||||
ot (āj uot | |||||
ot (k ot | ot (k ot | ||||
m) otō oto: | |||||
_) oto (C< oto | _) oto (C< oto | ||||
pil) ot ot | pil) ot ot | ||||
_p) ot (ašL04 ot // potaša | _p) ot (ašL04 ot // potaša | ||||
p) ot (eL68 ot | p) ot (eL68 ot | ||||
pr) ot (am uot | |||||
pr) ot (e ot | pr) ot (e ot | ||||
pr) ot (o ot | pr) ot (o ot | ||||
pr) oto (š uotuo // protoš.. | pr) oto (š uotuo // protoš.. | ||||
pr) otot (ip otot | pr) otot (ip otot | ||||
pr) oto (t uotuo // ..protot | pr) oto (t uotuo // ..protot | ||||
pr) ot (u_ uot | |||||
publisk) ot uot | publisk) ot uot | ||||
r) ot (āc ot | r) ot (āc ot | ||||
r) ot (b ot | r) ot (b ot | ||||
r) ot (er ot | r) ot (er ot | ||||
r) ot (ē ot | r) ot (ē ot | ||||
r) ot (kaL77 o`t | |||||
sab) ot ot | sab) ot ot | ||||
sk) ot (L01_ ot | sk) ot (L01_ ot | ||||
sl) ot (L04_ uot // slota | sl) ot (L04_ uot // slota | ||||
v v | v v | ||||
// unstressed if starts as vis.. prefix | // unstressed if starts as vis.. prefix | ||||
// except for words where vis.. is part of root | // 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 (sēd v'i // visēd | _) vi (sēd v'i // visēd | ||||
_) vi (skijL01_ v'i // viskijs | _) vi (skijL01_ v'i // viskijs |
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: |
u u | u u | ||||
ü y | ü y | ||||
v vE | v vE | ||||
w tS'ift||vE | |||||
w d'ab@LjU | |||||
x iks | x iks | ||||
y jE | y jE | ||||
z zE | z zE |
// 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 | // This file is UTF8 encoded | ||||
// Letter Names, Numbers and exceptional pronounciation of Urdu | // Letter Names, Numbers and exceptional pronounciation of Urdu | ||||
ّ t,aSd'i:d | ّ t,aSd'i:d | ||||
ً d'o:zab'aR | ً d'o:zab'aR | ||||
ْ sUk'u:n | ْ sUk'u:n | ||||
ٗ Ult.a:||pe:S | |||||
ٓ mada | |||||
// The numbers | // The numbers | ||||
جن J'In $u | جن J'In $u | ||||
جنھیں J,InH'e:n $u | جنھیں J,InH'e:n $u | ||||
انہوں ,UnH'o:n $u | انہوں ,UnH'o:n $u | ||||
انھوں UnHo:n $u | |||||
انہیں ,UnH'e:n $u | انہیں ,UnH'e:n $u | ||||
انھیں ,UnH'e:n $u | انھیں ,UnH'e:n $u | ||||
انھی UnHi $u | |||||
انہی UnHi: $u | |||||
// unstressed prepositions | // unstressed prepositions | ||||
کا $u | کا $u | ||||
کے $u | کے $u | ||||
سے $u | سے $u | ||||
اور OR $u $brk | |||||
اور aUR $u $brk | |||||
کہ k'e:H $u | کہ k'e:H $u | ||||
نے $u | نے $u | ||||
حفاظت H,Ifa:z.'at | حفاظت H,Ifa:z.'at | ||||
ہمت HIm'at | ہمت HIm'at | ||||
سمیت sam'e:t | سمیت sam'e:t | ||||
اگرچہ ,agaRc'e:H | |||||
اگرچہ ,agaRc'e:H $pause | |||||
بلکہ b,alk'e:H | بلکہ b,alk'e:H | ||||
حصہ H'Is.,a | حصہ H'Is.,a | ||||
حصے H'Is.e: | حصے H'Is.e: | ||||
کلک klIk | کلک klIk | ||||
فکسنگ f,Iks'Ing | فکسنگ f,Iks'Ing | ||||
مانند ma:n'Ind $1 | مانند ma:n'Ind $1 | ||||
اتار Ut'a:R | |||||
آرکائیو ,a:Rk'a:jv | آرکائیو ,a:Rk'a:jv | ||||
لنک lInk | لنک lInk | ||||
فہرست fEHRIst | فہرست fEHRIst | ||||
کیلئے ke:li:;e: | کیلئے ke:li:;e: | ||||
اگر agaR $u | |||||
اگر agaR $pause | |||||
ضرورت zaRu:Rat | ضرورت zaRu:Rat | ||||
مگر magaR $u | |||||
مگر magaR $pause | |||||
دیگر digaR | دیگر digaR | ||||
اہم EHEm | اہم EHEm | ||||
فیصد fis.ad | فیصد fis.ad | ||||
نصرت nUs.Rat | نصرت nUs.Rat | ||||
خاتون xa:tu:n | خاتون xa:tu:n | ||||
برتری baRtaRi | برتری 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 |
| | ||||
// 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 | // This file is UTF8 encoded | ||||
// phoneme rules for Urdu | // phoneme rules for Urdu | ||||
// Letter group - l01: Vowels | // Letter group - l01: Vowels | ||||
٩ 9 | ٩ 9 | ||||
ي ی | ي ی | ||||
یٰ ا | یٰ ا | ||||
ٰی ا | |||||
آ آ | |||||
// vowel signs, alif acts as consonants at start of word if these follow | // vowel signs, alif acts as consonants at start of word if these follow | ||||
.L01 َ ِ ُ و ی ع ا ے | .L01 َ ِ ُ و ی ع ا ے | ||||
// Consonants | // Consonants | ||||
.L02 ب پ ت ٹ ث ج چ ح خ د ڈ ذ ر ڑ ز ژ س ش ص ض ط ظ غ ف ق ک گ ل م ن ہ ئ | |||||
.L02 ب بھ پ پھ ت تھ ٹ ٹھ ث ج جھ چ چھ ح خ د دھ ڈ ڈھ ذ ر ڑ ز ژ س ش ص ض ط ظ غ ف ق ک کھ گ گھ ل م ن ہ ئ | |||||
// Letter group - L03: Most of the letters | // Letter group - L03: Most of the letters | ||||
.L03 ا ب پ ت ٹ ث ج چ ح خ د ڈ ذ ر ڑ ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ہ ئ ی ے | |||||
.L03 ا ب بھ پ پھ ت تھ ٹ ٹھ ث ج جھ چ چھ ح خ د دھ ڈ ڈھ ذ ر ڑ ز ژ س ش ص ض ط ظ ع غ ف ق ک کھ گ گھ ل م ن و ہ ئ ی ے ٰ | |||||
// VOWELS | // VOWELS | ||||
َ a | َ a | ||||
َی E | َی E | ||||
َے E | َے E | ||||
َو O | |||||
َو aU | |||||
َع a: | َع a: | ||||
.group ِ | .group ِ | ||||
ُو u: | ُو u: | ||||
ُع O | ُع O | ||||
.group ٗ | |||||
ٗ u: | |||||
.group ھ | .group ھ | ||||
ھ HV | ھ HV | ||||
ھ (_ H: | ھ (_ H: | ||||
افتتاح ,ItIt'a:H | افتتاح ,ItIt'a:H | ||||
اسلام ,Isl'a:m | اسلام ,Isl'a:m | ||||
_) انسان Ins'a:n | _) انسان Ins'a:n | ||||
_) انت (L02 'Int,a | |||||
_) انت (L02L01 'Int,a | |||||
_) امید Um'i:d | _) امید Um'i:d | ||||
اً(_S2 'an | اً(_S2 'an | ||||
_) امکان ,Imk'a:n | _) امکان ,Imk'a:n | ||||
_) است (L02 ,IstI | _) است (L02 ,IstI | ||||
_) ارت (L02 ,IRtI | _) ارت (L02 ,IRtI | ||||
_) ادار Ida:R | _) ادار 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 آ | .group آ | ||||
آ a: | آ a: | ||||
آتش 'a:tIS | آتش 'a:tIS | ||||
آہست a:H'Ist | آہست a:H'Ist | ||||
آئ (L02 'a:I | آئ (L02 'a:I | ||||
آمیز a:me:z | |||||
آویز a:ve:z | |||||
.group ع | .group ع | ||||
_) عمر 'UmR | _) عمر 'UmR | ||||
L02) عی (_ 'ai: | L02) عی (_ 'ai: | ||||
علیحد 'alEHd | علیحد 'alEHd | ||||
عُ 'U | |||||
عِ I | |||||
.group و | .group و | ||||
و o: | و o: | ||||
وّ vv | وّ vv | ||||
L02L02L02) و (L02 u: | L02L02L02) و (L02 u: | ||||
L02) ونکہ (_ u:nk'e:H | 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 ی | .group ی | ||||
ی e: | ی e: | ||||
_) ی jV | _) ی jV | ||||
یع(_ i: | یع(_ i: | ||||
@) ی i: | @) ی i: | ||||
@) یں (_ e:n | |||||
@) یں (_ e~ | |||||
یّ jj | یّ jj | ||||
@) یت (_S2 i:;'at | @) یت (_S2 i:;'at | ||||
_) یو jO | _) یو jO | ||||
ی (و e: | ی (و e: | ||||
L02)یوں i;o:n | L02)یوں i;o:n | ||||
L03)یکشن e:kSan | |||||
L03L03L03L03)یں(S2 e~ | |||||
یں e~ | |||||
L03)یک(ٹ e:k | |||||
L03L01)یا(_S2 ja: | |||||
.group ے // yeh barree | .group ے // yeh barree | ||||
ے e: | ے e: | ||||
ئ | ئ | ||||
.group ؤ | .group ؤ | ||||
ؤ aU // ?? | |||||
ؤ o: | |||||
.group أ | .group أ | ||||
أ // ?? | أ // ?? | ||||
بوڑھ b'u:r.h | بوڑھ b'u:r.h | ||||
_) بے (P2 b'e: | _) بے (P2 b'e: | ||||
بحران b,OHR'a:n | بحران b,OHR'a:n | ||||
_)بپھر(L01 bIp#R | |||||
_)بچھ bIc# | |||||
_)بخار bUxa:R | |||||
_)برائی bURa:i | |||||
_)بوا(ئ boa: | |||||
_)بزدل bUzdIl | |||||
.group پ | .group پ | ||||
پیچھ p'i:c# | پیچھ p'i:c# | ||||
پھونک p#'u:nk | پھونک p#'u:nk | ||||
_) پور (L01 p'u:R | _) پور (L01 p'u:R | ||||
_)پچھل(L01 pIc#l | |||||
.group ت | .group ت | ||||
ت tV | ت tV | ||||
تجرب taJ'aRb | تجرب taJ'aRb | ||||
_) تیار t,ai:;'a:R | _) تیار t,ai:;'a:R | ||||
_) تیسر t'i:sR | _) تیسر t'i:sR | ||||
L03L03) تا (_S2 ta: | |||||
L03L03)تا(_S2 ta: | |||||
L03L03) تی (_S2 ti: | L03L03) تی (_S2 ti: | ||||
L03L03) تے (_S2 te: | L03L03) تے (_S2 te: | ||||
_) توا t'ava: | _) توا t'ava: | ||||
تہ(_ ta | |||||
.group ٹ | .group ٹ | ||||
ٹ t.V | ٹ t.V | ||||
_) جمل J'Uml | _) جمل J'Uml | ||||
_) جہ (L02 J'EH | _) جہ (L02 J'EH | ||||
_) جدا J'Uda: | _) جدا J'Uda: | ||||
_)جذب JaDb | |||||
.group چ | .group چ | ||||
چ cV | چ cV | ||||
حّ HHV | حّ HHV | ||||
حّ (L01 HH | حّ (L01 HH | ||||
_)حیا Haja: | |||||
.group خ | .group خ | ||||
خ xV | خ xV | ||||
_) خود x'Ud | _) خود x'Ud | ||||
_) خواہش xv'a:HIS | _) خواہش xv'a:HIS | ||||
_) خیا x'aja: | _) خیا x'aja: | ||||
_)خوا xva: | |||||
_)خدا xUda: | |||||
.group د | .group د | ||||
_) دوسر d'u:sR | _) دوسر d'u:sR | ||||
_) دین de:n | _) دین de:n | ||||
_) دیت de:t | _) دیت de:t | ||||
دہ(_ da | |||||
.group ڈ | .group ڈ | ||||
ڈ d.V | ڈ d.V | ||||
ڈرائیور d.R'a:jvaR | ڈرائیور d.R'a:jvaR | ||||
.group ذ | .group ذ | ||||
ذ DV | |||||
ذ (L01 D | |||||
ذّ DDV | |||||
ذّ (L01 DD | |||||
_) ذہ (L02 D'EH | |||||
ذ zV | |||||
ذ (L01 z | |||||
_) ذہ (L02 z'EH | |||||
.group ر | .group ر | ||||
ر RV | ر RV | ||||
_) شخص S'axs. | _) شخص S'axs. | ||||
_) شہ (L02 S'EH | _) شہ (L02 S'EH | ||||
شرمند S,aRm'Ind | شرمند S,aRm'Ind | ||||
_)شمار SUma:R | |||||
.group ص | .group ص | ||||
ص s.V | ص s.V | ||||
_) گہ (L02 g'EH | _) گہ (L02 g'EH | ||||
گزارش gUz'a:RIS | گزارش gUz'a:RIS | ||||
_) گیت g'i:t | _) گیت g'i:t | ||||
_)گزار gUza:R | |||||
.group ل | .group ل | ||||
ل lV | ل lV | ||||
ل (L01 l | ل (L01 l | ||||
لّ llV | |||||
لّ (L01 ll | |||||
لّ l:V | |||||
لّ (L01 l: | |||||
لکھ l'Ik# | لکھ l'Ik# | ||||
_) لہ (L02 l'EH | _) لہ (L02 l'EH | ||||
_) لیت le:t | _) لیت le:t | ||||
_) نمٹ nIm'at. | _) نمٹ nIm'at. | ||||
_) نمٹ (L01 nImt. | _) نمٹ (L01 nImt. | ||||
@) ن (پ n | @) ن (پ n | ||||
@) نچل n'Icl | |||||
_) نچل n'Icl | |||||
نشان nIS'a:n | نشان nIS'a:n | ||||
@) ن (ڈ n | @) ن (ڈ n | ||||
_) نظر naz.'aR | _) نظر naz.'aR | ||||
_) نظام nIz.'a:m | _) نظام nIz.'a:m | ||||
_) نہ (L02 n'H | |||||
_) نہ (L02 nEHE | |||||
L01) نٹ n't. | L01) نٹ n't. | ||||
نھ nH | نھ nH | ||||
_) نکت n'Ukt | _) نکت n'Ukt | ||||
ہ H | ہ H | ||||
_) ہ (L01 H | _) ہ (L01 H | ||||
_) ہ (ند HI | _) ہ (ند HI | ||||
ہّ HHV | |||||
ہّ (L01 HH | |||||
ہّ H:V | |||||
ہّ (L01 H: | |||||
ہ (_ a | ہ (_ a | ||||
_) ہلن H'Iln | _) ہلن H'Iln | ||||
_) ہم (L02L02L02P2 H'am | _) ہم (L02L02L02P2 H'am | ||||
.group ّ | .group ّ | ||||
ّ | |||||
ّ : | |||||
.group ً | .group ً | ||||
ً | |||||
ً an | |||||
// Common symbols | // Common symbols | ||||
.group | .group | ||||
$ do:l@R | $ 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 رابطہ | : r'a:b'tah//Rabtar رابطہ | ||||
? saw'a:l'i:ja:n'is'a:nV // Sawaliya Nishan سوالیہ نشان | ? 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 | .group 0xe0a4 // devanagari | ||||
0xe0a4 _^_NE // switch to Nepali voice | 0xe0a4 _^_NE // switch to Nepali voice |
| `=` | put the primary stress on the preceding syllable | | | `=` | put the primary stress on the preceding syllable | | ||||
| `_:` | short pause | | | `_:` | short pause | | ||||
| `_` | a shorter 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 | 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 | markers are only needed in order to change the effect of the language's | ||||
default stress rule. | default stress rule. |
[private-use extensions](https://raw.githubusercontent.com/espeak-ng/bcp47-data/master/bcp47-extensions) | [private-use extensions](https://raw.githubusercontent.com/espeak-ng/bcp47-data/master/bcp47-extensions) | ||||
have been used. | have been used. | ||||
The supported languages are: | |||||
The 100 supported languages and accents are: | |||||
| Family Code | Identifier | Language Family | Language | Accent/Dialect | | | Family Code | Identifier | Language Family | Language | Accent/Dialect | | ||||
|-------------|-------------------|-----------------------|-----------------------------|------------------------| | |-------------|-------------------|-----------------------|-----------------------------|------------------------| | ||||
| `art` | `lfn` | Constructed | Lingua Franca Nova | | | | `art` | `lfn` | Constructed | Lingua Franca Nova | | | ||||
| `bat` | `lt` | Baltic | Lithuanian | | | | `bat` | `lt` | Baltic | Lithuanian | | | ||||
| `art` | `jbo` | Constructed | Lojban | | | | `art` | `jbo` | Constructed | Lojban | | | ||||
| `poz` | `mi` | Malayo-Polynesian | Māori | | | |||||
| `zls` | `mk` | South Slavic | Macedonian | | | | `zls` | `mk` | South Slavic | Macedonian | | | ||||
| `poz` | `ms` | Malayo-Polynesian | Malay | | | | `poz` | `ms` | Malayo-Polynesian | Malay | | | ||||
| `dra` | `ml` | Dravidian | Malayalam | | | | `dra` | `ml` | Dravidian | Malayalam | | |
display: block; | display: block; | ||||
margin-bottom: 1rem; | margin-bottom: 1rem; | ||||
} | } | ||||
#ipaarea { | |||||
width: 100%; | |||||
height: 8rem; | |||||
display: block; | |||||
margin-bottom: 1rem; | |||||
} | |||||
p.gh { | p.gh { | ||||
color: #333; | color: #333; | ||||
text-align: right; | text-align: right; | ||||
<h1>espeakng.js 1.49.1 Demo</h1> | <h1>espeakng.js 1.49.1 Demo</h1> | ||||
<form> | <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 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"> | <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> | <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> | </div> | ||||
<label for="voice">Voice</label><select id="voice"></select><button type="button" aria-label="Reset voice" title="Reset voice" onclick="resetVoice();">↶</button> | <label for="voice">Voice</label><select id="voice"></select><button type="button" aria-label="Reset voice" title="Reset voice" onclick="resetVoice();">↶</button> | ||||
</div> | </div> | ||||
<div class="bottom"> | <div class="bottom"> | ||||
<button type="button" onmousedown="speak();">Speak</button> | |||||
<button type="button" onmousedown="speakAndIpa();">Speak</button> | |||||
<button type="button" onmousedown="stop();">Stop</button> | <button type="button" onmousedown="stop();">Stop</button> | ||||
</div> | </div> | ||||
<p class="gh"><a href="https://github.com/eeejay/espeak/tree/emscripten">Original Code for eSpeak: Eitan Isaacson</a></p> | <p class="gh"><a href="https://github.com/eeejay/espeak/tree/emscripten">Original Code for eSpeak: Eitan Isaacson</a></p> |
espeak_SetSynthCallback(NULL); | 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( | long set_voice( | ||||
const char* aName, | const char* aName, | ||||
const char* aLang=NULL, | const char* aLang=NULL, |
interface eSpeakNGWorker { | interface eSpeakNGWorker { | ||||
void eSpeakNGWorker(); | void eSpeakNGWorker(); | ||||
void synth_(DOMString aText, VoidPtr aCallback); | void synth_(DOMString aText, VoidPtr aCallback); | ||||
long synth_ipa_(DOMString aText, DOMString virtualFileName); | |||||
long getSizeOfEventStruct_(); | long getSizeOfEventStruct_(); | ||||
long set_voice(DOMString aName, DOMString aLang, optional octet gender=0, optional octet age=0, optional octet aVariant=0); | long set_voice(DOMString aName, DOMString aLang, optional octet gender=0, optional octet age=0, optional octet aVariant=0); | ||||
[Const] attribute espeak_VOICE[] voices; | [Const] attribute espeak_VOICE[] voices; |
pusher.connect(ctx.destination); | pusher.connect(ctx.destination); | ||||
console.log(' Creating pusher... done'); | console.log(' Creating pusher... done'); | ||||
var user_text = document.getElementById('texttospeak').value; | |||||
// actual synthesis | // actual synthesis | ||||
console.log(' Calling synthesize...'); | console.log(' Calling synthesize...'); | ||||
tts.synthesize( | tts.synthesize( | ||||
document.getElementById('texttospeak').value, | |||||
user_text, | |||||
function cb(samples, events) { | function cb(samples, events) { | ||||
//console.log(' Inside synt cb'); | //console.log(' Inside synt cb'); | ||||
if (!samples) { | if (!samples) { | ||||
//console.log(' Leaving synt cb'); | //console.log(' Leaving synt cb'); | ||||
} // end of function cb | } // end of function cb | ||||
); // end of tts.synthesize() | ); // end of tts.synthesize() | ||||
console.log(' Calling synthesize... done'); | |||||
console.log(' Calling synthesize... done'); | |||||
console.log('Leaving speak()'); | console.log('Leaving speak()'); | ||||
} // end of 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() { | function resetPitch() { | ||||
document.getElementById('pitch').value = 50; | document.getElementById('pitch').value = 50; | ||||
} | } | ||||
console.log('Leaving cb1'); | console.log('Leaving cb1'); | ||||
} // end of function cb1 | } // end of function cb1 | ||||
); | ); | ||||
console.log('Creating eSpeakNG instance... done'); | console.log('Creating eSpeakNG instance... done'); | ||||
} | } |
'set_rate', | 'set_rate', | ||||
'set_pitch', | 'set_pitch', | ||||
'set_voice', | 'set_voice', | ||||
'synthesize' | |||||
'synthesize', | |||||
'synthesize_ipa' | |||||
]) { | ]) { | ||||
eSpeakNG.prototype[method] = _createAsyncMethod(method); | eSpeakNG.prototype[method] = _createAsyncMethod(method); | ||||
} | } |
Runtime.removeFunction(fp); | 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 | // Make this a worker | ||||
if (typeof WorkerGlobalScope !== 'undefined') { | if (typeof WorkerGlobalScope !== 'undefined') { | ||||
}); | }); | ||||
onmessage = function(e) { | onmessage = function(e) { | ||||
if (!worker) { | if (!worker) { | ||||
throw 'eSpeakNGWorker worker not initialized'; | throw 'eSpeakNGWorker worker not initialized'; | ||||
} | } |
name Sindhi | name Sindhi | ||||
language sd | language sd | ||||
maintainer Ejaz Shah <[email protected]> |
name Māori | |||||
language mi | language mi | ||||
status testing | status testing | ||||
# =========================================================================== | |||||
# 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 | |||||
FMT(n/n-syl) | FMT(n/n-syl) | ||||
endphoneme | 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 | phoneme R // Latvian hard r | ||||
liquid trl | liquid trl | ||||
lengthmod 6 | lengthmod 6 | ||||
length 5 | length 5 | ||||
endphoneme | endphoneme | ||||
// TODO should use this with correct lengthening | |||||
//phoneme l | |||||
// liquid | |||||
// unstressed | |||||
// dnt | |||||
// length 150 | |||||
// FMT(vwl_hi/l-voc) | |||||
//endphoneme | |||||
phoneme s | phoneme s | ||||
vls alv frc sib | vls alv frc sib | ||||
voicingswitch z | voicingswitch z | ||||
endphoneme | endphoneme | ||||
char filetype[5]; | char filetype[5]; | ||||
char wavefile[200]; | char wavefile[200]; | ||||
void DisplayVoices(FILE *f_out, char *language) | |||||
static void DisplayVoices(FILE *f_out, char *language) | |||||
{ | { | ||||
int ix; | int ix; | ||||
const char *p; | const char *p; | ||||
} | } | ||||
} | } | ||||
int OpenWavFile(char *path, int rate) | |||||
static int OpenWavFile(char *path, int rate) | |||||
{ | { | ||||
static unsigned char wave_hdr[44] = { | static unsigned char wave_hdr[44] = { | ||||
'R', 'I', 'F', 'F', 0x24, 0xf0, 0xff, 0x7f, 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ', | 'R', 'I', 'F', 'F', 0x24, 0xf0, 0xff, 0x7f, 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ', | ||||
} | } | ||||
if (voicename[0] == 0) | if (voicename[0] == 0) | ||||
strcpy(voicename, "en"); | |||||
strcpy(voicename, ESPEAKNG_DEFAULT_VOICE); | |||||
result = espeak_ng_SetVoiceByName(voicename); | result = espeak_ng_SetVoiceByName(voicename); | ||||
if (result != ENS_OK) { | if (result != ENS_OK) { |
#include <ucd/ucd.h> | #include <ucd/ucd.h> | ||||
#define towlower ucd_tolower | |||||
#define towupper ucd_toupper | |||||
#endif | #endif |
#ifndef ESPEAK_NG_ENCODING_H | #ifndef ESPEAK_NG_ENCODING_H | ||||
#define ESPEAK_NG_ENCODING_H | #define ESPEAK_NG_ENCODING_H | ||||
#include <stdint.h> | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
extern "C" | extern "C" | ||||
{ | { |
#define ESPEAK_NG_API | #define ESPEAK_NG_API | ||||
#endif | #endif | ||||
#define ESPEAKNG_DEFAULT_VOICE "en" | |||||
typedef enum { | typedef enum { | ||||
ENS_GROUP_MASK = 0x70000000, | ENS_GROUP_MASK = 0x70000000, | ||||
ENS_GROUP_ERRNO = 0x00000000, /* Values 0-255 map to errno error codes. */ | ENS_GROUP_ERRNO = 0x00000000, /* Values 0-255 map to errno error codes. */ |
#define ESPEAK_API | #define ESPEAK_API | ||||
#endif | #endif | ||||
#define ESPEAK_API_REVISION 10 | |||||
#define ESPEAK_API_REVISION 12 | |||||
/* | /* | ||||
Revision 2 | Revision 2 | ||||
Added parameter "options" to eSpeakInitialize() | Added parameter "options" to eSpeakInitialize() | ||||
Revision 10 29.Aug.2014 | Revision 10 29.Aug.2014 | ||||
Changed phonememode parameter to espeak_TextToPhonemes() and espeak_SetPhonemeTrace | 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 */ | /* Initialization */ | ||||
occurs. The calling program can then play the sound at that point. | 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 */ | /* Synthesis */ |
/* | |||||
* 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 |
#include <espeak-ng/espeak_ng.h> | #include <espeak-ng/espeak_ng.h> | ||||
#include <espeak-ng/speak_lib.h> | #include <espeak-ng/speak_lib.h> | ||||
#include <espeak-ng/encoding.h> | |||||
#include "error.h" | #include "error.h" | ||||
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "spect.h" | #include "spect.h" | ||||
#include "translate.h" | |||||
typedef struct { | typedef struct { | ||||
unsigned int value; | unsigned int value; | ||||
int n_manifest; | int n_manifest; | ||||
char phsrc[sizeof(path_home)+40]; // Source: path to the 'phonemes' source file. | 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 { | typedef struct { | ||||
const char *mnem; | const char *mnem; | ||||
int type; | int type; | ||||
linenum--; | linenum--; | ||||
} | } | ||||
int CheckNextChar() | |||||
static int CheckNextChar() | |||||
{ | { | ||||
int c; | int c; | ||||
while (((c = get_char()) == ' ') || (c == '\t')) | while (((c = get_char()) == ' ') || (c == '\t')) | ||||
return value - min; | return value - min; | ||||
} | } | ||||
int CompileVowelTransition(int which) | |||||
static int CompileVowelTransition(int which) | |||||
{ | { | ||||
// Compile a vowel transition | // Compile a vowel transition | ||||
int key; | int key; | ||||
return 0; | 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; | SpectSeq *spectseq; | ||||
int peak; | int peak; | ||||
n_points++; | 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; | ix = -1; | ||||
ix2 = 0; | 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++; | ix++; | ||||
if (x >= env_x[ix2+1]) | |||||
if (n_points > 2 && x >= env_x[ix2+1]) | |||||
ix2++; | ix2++; | ||||
if (env_lin[ix2] > 0) { | if (env_lin[ix2] > 0) { | ||||
=8 data = stress bitmap | =8 data = stress bitmap | ||||
=9 special tests | =9 special tests | ||||
*/ | */ | ||||
int CompileIf(int elif) | |||||
static int CompileIf(int elif) | |||||
{ | { | ||||
int key; | int key; | ||||
int finish = 0; | int finish = 0; | ||||
return 0; | return 0; | ||||
} | } | ||||
void FillThen(int add) | |||||
static void FillThen(int add) | |||||
{ | { | ||||
USHORT *p; | USHORT *p; | ||||
int offset; | int offset; | ||||
then_count = 0; | then_count = 0; | ||||
} | } | ||||
int CompileElse(void) | |||||
static int CompileElse(void) | |||||
{ | { | ||||
USHORT *ref; | USHORT *ref; | ||||
USHORT *p; | USHORT *p; | ||||
return 0; | return 0; | ||||
} | } | ||||
int CompileElif(void) | |||||
static int CompileElif(void) | |||||
{ | { | ||||
if (if_level < 1) { | if (if_level < 1) { | ||||
error("ELIF not expected"); | error("ELIF not expected"); | ||||
return 0; | return 0; | ||||
} | } | ||||
int CompileEndif(void) | |||||
static int CompileEndif(void) | |||||
{ | { | ||||
USHORT *p; | USHORT *p; | ||||
int chain; | int chain; | ||||
then_count--; | then_count--; | ||||
} | } | ||||
int CompilePhoneme(int compile_phoneme) | |||||
static int CompilePhoneme(int compile_phoneme) | |||||
{ | { | ||||
int endphoneme = 0; | int endphoneme = 0; | ||||
int keyword; | int keyword; | ||||
CompileToneSpec(); | CompileToneSpec(); | ||||
break; | break; | ||||
case kCONTINUE: | case kCONTINUE: | ||||
*prog_out++ = OPCODE_CONTINUE; | |||||
*prog_out++ = INSTN_CONTINUE; | |||||
DecThenCount(); | DecThenCount(); | ||||
break; | break; | ||||
case kRETURN: | case kRETURN: | ||||
*prog_out++ = OPCODE_RETURN; | |||||
*prog_out++ = INSTN_RETURN; | |||||
DecThenCount(); | DecThenCount(); | ||||
break; | break; | ||||
case kINCLUDE: | case kINCLUDE: | ||||
if (if_level > 0) | if (if_level > 0) | ||||
error("Missing ENDIF"); | error("Missing ENDIF"); | ||||
if ((prog_out > prog_buf) && (if_stack[0].returned == 0)) | if ((prog_out > prog_buf) && (if_stack[0].returned == 0)) | ||||
*prog_out++ = OPCODE_RETURN; | |||||
*prog_out++ = INSTN_RETURN; | |||||
break; | break; | ||||
} | } | ||||
break; | break; | ||||
static void EndPhonemeTable() | static void EndPhonemeTable() | ||||
{ | { | ||||
int ix; | int ix; | ||||
int *pw; | |||||
int length; | |||||
if (n_phoneme_tabs == 0) | if (n_phoneme_tabs == 0) | ||||
return; | return; | ||||
{ NULL, -1 } | { NULL, -1 } | ||||
}; | }; | ||||
int LookupEnvelopeName(const char *name) | |||||
static int LookupEnvelopeName(const char *name) | |||||
{ | { | ||||
return LookupMnem(envelope_names, name); | return LookupMnem(envelope_names, name); | ||||
} | } | ||||
int done_onset = 0; | int done_onset = 0; | ||||
int done_last = 0; | int done_last = 0; | ||||
int n_preset_tunes = 0; | int n_preset_tunes = 0; | ||||
int found; | |||||
int found = 0; | |||||
int tune_number = 0; | int tune_number = 0; | ||||
FILE *f_out; | FILE *f_out; | ||||
TUNE *tune_data; | TUNE *tune_data; | ||||
error("Bad tune name: '%s;", new_tune.name); | error("Bad tune name: '%s;", new_tune.name); | ||||
break; | break; | ||||
case kENDTUNE: | case kENDTUNE: | ||||
if (!found) continue; | |||||
if (done_onset == 0) { | if (done_onset == 0) { | ||||
new_tune.unstr_start[0] = new_tune.unstr_start[1]; | new_tune.unstr_start[0] = new_tune.unstr_start[1]; | ||||
new_tune.unstr_end[0] = new_tune.unstr_end[1]; | new_tune.unstr_end[0] = new_tune.unstr_end[1]; |
#include "error.h" | #include "error.h" | ||||
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "voice.h" | |||||
#include "synthesize.h" | #include "synthesize.h" | ||||
#include "translate.h" | #include "translate.h" | ||||
extern void Write4Bytes(FILE *f, int value); | extern void Write4Bytes(FILE *f, int value); | ||||
int HashDictionary(const char *string); | |||||
static FILE *f_log = NULL; | static FILE *f_log = NULL; | ||||
extern char *dir_dictionary; | extern char *dir_dictionary; | ||||
static int debug_flag = 0; | static int debug_flag = 0; | ||||
static int error_need_dictionary = 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 *hash_chains[N_HASH_DICT]; | ||||
static char letterGroupsDefined[N_LETTER_GROUPS]; | static char letterGroupsDefined[N_LETTER_GROUPS]; | ||||
MNEM_TAB mnem_rules[] = { | MNEM_TAB mnem_rules[] = { | ||||
int group3_ix; | int group3_ix; | ||||
} RGROUP; | } 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) | void print_dictionary_flags(unsigned int *flags, char *buf, int buf_len) | ||||
{ | { | ||||
int stress; | int stress; | ||||
step = LINE_PARSER_WORD; | step = LINE_PARSER_WORD; | ||||
c = 0; | |||||
while (c != '\n') { | |||||
c = *p; | |||||
while (c != '\n' && c != '\0') { | |||||
c = *p; | c = *p; | ||||
if ((c == '?') && (step == 0)) { | if ((c == '?') && (step == 0)) { | ||||
length += ix; | length += ix; | ||||
} | } | ||||
} | } | ||||
dict_line[0] = length; | |||||
*((uint8_t *)dict_line) = (uint8_t)length; | |||||
return length; | return length; | ||||
} | } | ||||
p = p2; | p = p2; | ||||
} | } | ||||
hash_chains[ix] = NULL; | hash_chains[ix] = NULL; | ||||
hash_counts[ix] = 0; | |||||
} | } | ||||
} | } | ||||
for (hash = 0; hash < N_HASH_DICT; hash++) { | for (hash = 0; hash < N_HASH_DICT; hash++) { | ||||
p = hash_chains[hash]; | p = hash_chains[hash]; | ||||
hash_counts[hash] = (int)ftell(f_out); | |||||
while (p != NULL) { | while (p != NULL) { | ||||
length = *(p+sizeof(char *)); | |||||
length = *(uint8_t *)(p+sizeof(char *)); | |||||
fwrite(p+sizeof(char *), length, 1, f_out); | fwrite(p+sizeof(char *), length, 1, f_out); | ||||
memcpy(&p, p, sizeof(char *)); | memcpy(&p, p, sizeof(char *)); | ||||
} | } | ||||
FILE *f_in; | FILE *f_in; | ||||
char buf[200]; | char buf[200]; | ||||
char fname[sizeof(path_home)+45]; | 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; | text_mode = 0; | ||||
length = compile_line(buf, dict_line, sizeof(dict_line), &hash); | length = compile_line(buf, dict_line, sizeof(dict_line), &hash); | ||||
if (length == 0) continue; // blank line | if (length == 0) continue; // blank line | ||||
hash_counts[hash]++; | |||||
p = (char *)malloc(length+sizeof(char *)); | p = (char *)malloc(length+sizeof(char *)); | ||||
if (p == NULL) { | if (p == NULL) { | ||||
if (f_log != NULL) { | if (f_log != NULL) { | ||||
memcpy(p, &hash_chains[hash], sizeof(char *)); | memcpy(p, &hash_chains[hash], sizeof(char *)); | ||||
hash_chains[hash] = p; | hash_chains[hash] = p; | ||||
// NOTE: dict_line[0] is the entry length (0-255) | |||||
memcpy(p+sizeof(char *), dict_line, length); | memcpy(p+sizeof(char *), dict_line, length); | ||||
count++; | count++; | ||||
} | } | ||||
#define N_RULES 3000 // max rules for each group | #define N_RULES 3000 // max rules for each group | ||||
int isHexDigit(int c) | |||||
static int isHexDigit(int c) | |||||
{ | { | ||||
if ((c >= '0') && (c <= '9')) | if ((c >= '0') && (c <= '9')) | ||||
return c - '0'; | return c - '0'; | ||||
return prule; | return prule; | ||||
} | } | ||||
int __cdecl string_sorter(char **a, char **b) | |||||
static int __cdecl string_sorter(char **a, char **b) | |||||
{ | { | ||||
char *pa, *pb; | char *pa, *pb; | ||||
int ix; | int ix; |
#include "error.h" | #include "error.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "speech.h" | #include "speech.h" | ||||
#include "voice.h" | |||||
#include "synthesize.h" | #include "synthesize.h" | ||||
static const char *basename(const char *filename) | static const char *basename(const char *filename) |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "voice.h" | |||||
#include "synthesize.h" | #include "synthesize.h" | ||||
#include "translate.h" | #include "translate.h" | ||||
int dictionary_skipwords; | int dictionary_skipwords; | ||||
char dictionary_name[40]; | 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 | // 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 }; | static const unsigned short diereses_list[7] = { 0xe4, 0xeb, 0xef, 0xf6, 0xfc, 0xff, 0 }; | ||||
int *pw; | int *pw; | ||||
int length; | int length; | ||||
FILE *f; | FILE *f; | ||||
unsigned int size; | |||||
int size; | |||||
char fname[sizeof(path_home)+20]; | char fname[sizeof(path_home)+20]; | ||||
strncpy(dictionary_name, name, 40); // currently loaded dictionary name | strncpy(dictionary_name, name, 40); // currently loaded dictionary name | ||||
for (hash = 0; hash < N_HASH_DICT; hash++) { | for (hash = 0; hash < N_HASH_DICT; hash++) { | ||||
tr->dict_hashtab[hash] = p; | tr->dict_hashtab[hash] = p; | ||||
while ((length = *p) != 0) | |||||
while ((length = *(uint8_t *)p) != 0) | |||||
p += length; | p += length; | ||||
p++; // skip over the zero which terminates the list for this hash value | p++; // skip over the zero which terminates the list for this hash value | ||||
} | } | ||||
int letter_w; // current letter, wide character | int letter_w; // current letter, wide character | ||||
int last_letter_w; // last letter, wide character | int last_letter_w; // last letter, wide character | ||||
int letter_xbytes; // number of extra bytes of multibyte character (num bytes - 1) | int letter_xbytes; // number of extra bytes of multibyte character (num bytes - 1) | ||||
unsigned char last_letter; | |||||
char *pre_ptr; | char *pre_ptr; | ||||
char *post_ptr; // pointer to first character after group | char *post_ptr; // pointer to first character after group | ||||
unpron_ignore = word_flags & FLAG_UNPRON_TEST; | unpron_ignore = word_flags & FLAG_UNPRON_TEST; | ||||
match_type = 0; | match_type = 0; | ||||
consumed = 0; | consumed = 0; | ||||
letter = 0; | |||||
letter_w = 0; | letter_w = 0; | ||||
distance_right = -6; // used to reduce points for matches further away the current letter | distance_right = -6; // used to reduce points for matches further away the current letter | ||||
distance_left = -2; | distance_left = -2; | ||||
distance_right += 6; | distance_right += 6; | ||||
if (distance_right > 18) | if (distance_right > 18) | ||||
distance_right = 19; | distance_right = 19; | ||||
last_letter = letter; | |||||
last_letter_w = letter_w; | last_letter_w = letter_w; | ||||
letter_xbytes = utf8_in(&letter_w, post_ptr)-1; | letter_xbytes = utf8_in(&letter_w, post_ptr)-1; | ||||
letter = *post_ptr++; | letter = *post_ptr++; | ||||
if (distance_left > 18) | if (distance_left > 18) | ||||
distance_left = 19; | distance_left = 19; | ||||
last_letter = *pre_ptr; | |||||
utf8_in(&last_letter_w, pre_ptr); | utf8_in(&last_letter_w, pre_ptr); | ||||
pre_ptr--; | pre_ptr--; | ||||
letter_xbytes = utf8_in2(&letter_w, pre_ptr, 1)-1; | letter_xbytes = utf8_in2(&letter_w, pre_ptr, 1)-1; | ||||
continue; | 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 | // only use this pronunciation if it's the first word of a clause | ||||
continue; | continue; | ||||
} | } | ||||
found = word2 + len; | found = word2 + len; | ||||
} | } | ||||
if (found == 0) { | |||||
if (found == 0 && length >= 2) { | |||||
ph_out[0] = 0; | ph_out[0] = 0; | ||||
// try modifications to find a recognised word | // try modifications to find a recognised word | ||||
int end_flags; | int end_flags; | ||||
const char *p; | const char *p; | ||||
int len; | 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 | // these lists are language specific, but are only relevent if the 'e' suffix flag is used | ||||
static const char *add_e_exceptions[] = { | static const char *add_e_exceptions[] = { |
#include <espeak-ng/encoding.h> | #include <espeak-ng/encoding.h> | ||||
#include "speech.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 | // http://www.iana.org/assignments/character-sets/character-sets.xhtml | ||||
MNEM_TAB mnem_encoding[] = { | MNEM_TAB mnem_encoding[] = { | ||||
static uint32_t | static uint32_t | ||||
null_decoder_getc(espeak_ng_TEXT_DECODER *decoder) | null_decoder_getc(espeak_ng_TEXT_DECODER *decoder) | ||||
{ | { | ||||
(void)decoder; // unused parameter | |||||
return 0; | return 0; | ||||
} | } | ||||
#include "error.h" | #include "error.h" | ||||
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "voice.h" | |||||
#include "synthesize.h" | #include "synthesize.h" | ||||
espeak_ng_STATUS | espeak_ng_STATUS |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "voice.h" | |||||
#include "synthesize.h" | #include "synthesize.h" | ||||
#include "translate.h" | #include "translate.h" | ||||
#include "event.h" | #include "event.h" |
static node *tail = NULL; | static node *tail = NULL; | ||||
static int node_counter = 0; | static int node_counter = 0; | ||||
static espeak_ng_STATUS push(void *data); | 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 *); | static void *polling_thread(void *); | ||||
void event_set_callback(t_espeak_callback *SynthCallback) | void event_set_callback(t_espeak_callback *SynthCallback) | ||||
while (1) { | while (1) { | ||||
int a_stop_is_required = 0; | 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; | my_event_is_running = 0; | ||||
while (my_start_is_required == 0) { | while (my_start_is_required == 0) { | ||||
event->user_data = NULL; | event->user_data = NULL; | ||||
} | } | ||||
a_status = pthread_mutex_lock(&my_mutex); | |||||
(void)pthread_mutex_lock(&my_mutex); | |||||
event_delete((espeak_EVENT *)pop()); | event_delete((espeak_EVENT *)pop()); | ||||
a_stop_is_required = my_stop_is_required; | a_stop_is_required = my_stop_is_required; | ||||
if (a_stop_is_required > 0) | if (a_stop_is_required > 0) | ||||
my_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; | my_event_is_running = 0; | ||||
my_stop_is_required = 0; | my_stop_is_required = 0; | ||||
} | } | ||||
a_status = pthread_mutex_unlock(&my_mutex); | |||||
(void)pthread_mutex_unlock(&my_mutex); | |||||
if (a_stop_is_required > 0) { | if (a_stop_is_required > 0) { | ||||
// no mutex required since the stop command is synchronous | // no mutex required since the stop command is synchronous | ||||
init(); | init(); | ||||
// acknowledge the stop request | // 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; | 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); | |||||
} | } | ||||
} | } | ||||
void event_set_callback(t_espeak_callback *cb); | void event_set_callback(t_espeak_callback *cb); | ||||
// Clear any pending event. | // Clear any pending event. | ||||
espeak_ng_STATUS event_clear_all(); | |||||
espeak_ng_STATUS event_clear_all(void); | |||||
// Declare a future event | // Declare a future event | ||||
espeak_ng_STATUS event_declare(espeak_EVENT *event); | espeak_ng_STATUS event_declare(espeak_EVENT *event); | ||||
// Terminate the event component. | // Terminate the event component. | ||||
// Last function to be called. | // Last function to be called. | ||||
void event_terminate(); | |||||
void event_terminate(void); | |||||
// general functions | // general functions | ||||
void clock_gettime2(struct timespec *ts); | void clock_gettime2(struct timespec *ts); |
static void *say_thread(void *); | static void *say_thread(void *); | ||||
static espeak_ng_STATUS push(t_espeak_command *the_command); | 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 void init(int process_parameters); | ||||
static int node_counter = 0; | static int node_counter = 0; | ||||
// Initialize the fifo component. | // Initialize the fifo component. | ||||
// First function to be called. | // First function to be called. | ||||
void fifo_init(); | |||||
void fifo_init(void); | |||||
// Add an espeak command. | // Add an espeak command. | ||||
// | // | ||||
espeak_ng_STATUS fifo_add_commands(t_espeak_command *c1, t_espeak_command *c2); | 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. | // 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? | // Is there a running command? | ||||
// Returns 1 if yes; 0 otherwise. | // Returns 1 if yes; 0 otherwise. | ||||
int fifo_is_busy(); | |||||
int fifo_is_busy(void); | |||||
// Terminate the fifo component. | // Terminate the fifo component. | ||||
// Last function to be called. | // Last function to be called. | ||||
void fifo_terminate(); | |||||
void fifo_terminate(void); | |||||
// Indicates if the running command is still enabled. | // Indicates if the running command is still enabled. | ||||
// | // | ||||
// stopping speech as soon as a cancel command is applied. | // stopping speech as soon as a cancel command is applied. | ||||
// | // | ||||
// Returns 1 if yes, or 0 otherwise. | // Returns 1 if yes, or 0 otherwise. | ||||
int fifo_is_command_enabled(); | |||||
int fifo_is_command_enabled(void); | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
} | } |
#include <stdio.h> | #include <stdio.h> | ||||
#include <math.h> | #include <math.h> | ||||
#include "ieee80.h" | |||||
typedef float Single; | typedef float Single; | ||||
#ifndef applec | |||||
typedef double defdouble; | |||||
#else applec | |||||
typedef long double defdouble; | |||||
#endif applec | |||||
#ifndef THINK_C | #ifndef THINK_C | ||||
typedef double Double; | typedef double Double; | ||||
#else THINK_C | #else THINK_C |
/* 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 |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "translate.h" | #include "translate.h" | ||||
/* Note this module is mostly old code that needs to be rewritten to | /* Note this module is mostly old code that needs to be rewritten to | ||||
n_primary = 0; | n_primary = 0; | ||||
for (ix = 0; ix < (n_phoneme_list-1); ix++) { | for (ix = 0; ix < (n_phoneme_list-1); ix++) { | ||||
p = &phoneme_list[ix]; | p = &phoneme_list[ix]; | ||||
syllable_tab[ix].flags = 0; | |||||
if (p->synthflags & SFLAG_SYLLABLE) { | if (p->synthflags & SFLAG_SYLLABLE) { | ||||
syllable_tab[n_st].flags = 0; | |||||
syllable_tab[n_st].env = PITCHfall; | syllable_tab[n_st].env = PITCHfall; | ||||
syllable_tab[n_st].nextph_type = phoneme_list[ix+1].type; | syllable_tab[n_st].nextph_type = phoneme_list[ix+1].type; | ||||
syllable_tab[n_st++].stress = p->stresslevel; | syllable_tab[n_st++].stress = p->stresslevel; |
#include <espeak-ng/speak_lib.h> | #include <espeak-ng/speak_lib.h> | ||||
#include "speech.h" | #include "speech.h" | ||||
#include "klatt.h" | |||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "klatt.h" | |||||
extern unsigned char *out_ptr; | extern unsigned char *out_ptr; | ||||
extern unsigned char *out_start; | extern unsigned char *out_start; | ||||
static double klattp1[N_KLATTP]; | static double klattp1[N_KLATTP]; | ||||
static double klattp_inc[N_KLATTP]; | static double klattp_inc[N_KLATTP]; | ||||
int Wavegen_Klatt(int resume) | |||||
static int Wavegen_Klatt(int resume) | |||||
{ | { | ||||
int pk; | int pk; | ||||
int x; | int x; | ||||
return 0; | 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; | int ix; | ||||
DOUBLEX next; | DOUBLEX next; |
/* | /* | ||||
* Copyright (C) 2008 by Jonathan Duddington | * Copyright (C) 2008 by Jonathan Duddington | ||||
* email: [email protected] | * email: [email protected] | ||||
* Copyright (C) 2015 Reece H. Dunn | |||||
* Copyright (C) 2015-2017 Reece H. Dunn | |||||
* | * | ||||
* Based on a re-implementation by: | * Based on a re-implementation by: | ||||
* (c) 1993,94 Jon Iles and Nick Ing-Simmons | * (c) 1993,94 Jon Iles and Nick Ing-Simmons | ||||
DOUBLEX bp_inc; | DOUBLEX bp_inc; | ||||
} klatt_peaks_t; | } 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 | #ifdef __cplusplus | ||||
} | } |
#include "config.h" | #include "config.h" | ||||
#if defined(_WIN32) || defined(_WIN64) | #if defined(_WIN32) || defined(_WIN64) | ||||
#include <windows.h> | #include <windows.h> | ||||
#endif | |||||
#include "mbrowrap.h" | #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; | HINSTANCE hinstDllMBR = NULL; | ||||
BOOL load_MBR() | BOOL load_MBR() | ||||
#include <unistd.h> | #include <unistd.h> | ||||
#include <espeak-ng/espeak_ng.h> | #include <espeak-ng/espeak_ng.h> | ||||
#include "mbrowrap.h" | |||||
#include "speech.h" | #include "speech.h" | ||||
/* | /* | ||||
* API functions. | * API functions. | ||||
*/ | */ | ||||
int init_mbrola(char *voice_path) | |||||
static int init_mbrola(char *voice_path) | |||||
{ | { | ||||
int error, result; | int error, result; | ||||
unsigned char wavhdr[45]; | unsigned char wavhdr[45]; | ||||
return 0; | return 0; | ||||
} | } | ||||
void close_mbrola(void) | |||||
static void close_mbrola(void) | |||||
{ | { | ||||
stop_mbrola(); | stop_mbrola(); | ||||
free_pending_data(); | free_pending_data(); | ||||
mbr_volume = 1.0; | mbr_volume = 1.0; | ||||
} | } | ||||
void reset_mbrola(void) | |||||
static void reset_mbrola(void) | |||||
{ | { | ||||
int result, success = 1; | int result, success = 1; | ||||
char dummybuf[4096]; | char dummybuf[4096]; | ||||
mbr_state = MBR_IDLE; | 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); | int result = receive_from_mbrola(buffer, nb_samples * 2); | ||||
if (result > 0) | if (result > 0) | ||||
return result; | return result; | ||||
} | } | ||||
int write_mbrola(char *data) | |||||
static int write_mbrola(char *data) | |||||
{ | { | ||||
mbr_state = MBR_NEWDATA; | mbr_state = MBR_NEWDATA; | ||||
return send_to_mbrola(data); | return send_to_mbrola(data); | ||||
} | } | ||||
int flush_mbrola(void) | |||||
static int flush_mbrola(void) | |||||
{ | { | ||||
return send_to_mbrola("\n#\n") == 3; | return send_to_mbrola("\n#\n") == 3; | ||||
} | } | ||||
int getFreq_mbrola(void) | |||||
static int getFreq_mbrola(void) | |||||
{ | { | ||||
return mbr_samplerate; | return mbr_samplerate; | ||||
} | } | ||||
void setVolumeRatio_mbrola(float value) | |||||
static void setVolumeRatio_mbrola(float value) | |||||
{ | { | ||||
if (value == mbr_volume) | if (value == mbr_volume) | ||||
return; | return; | ||||
init_MBR(mbr_voice_path); | init_MBR(mbr_voice_path); | ||||
} | } | ||||
char *lastErrorStr_mbrola(char *buffer, int bufsize) | |||||
static char *lastErrorStr_mbrola(char *buffer, int bufsize) | |||||
{ | { | ||||
if (mbr_pid) | if (mbr_pid) | ||||
mbrola_has_errors(); | mbrola_has_errors(); | ||||
return buffer; | return buffer; | ||||
} | } | ||||
void setNoError_mbrola(int no_error) | |||||
static void setNoError_mbrola(int no_error) | |||||
{ | { | ||||
(void)no_error; // unused | (void)no_error; // unused | ||||
} | } |
* error reason. If this is successful, then close_MBR() must be called | * error reason. If this is successful, then close_MBR() must be called | ||||
* before init_MBR() can be called again. | * 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 | * Stop mbrola and release any resources. It is necessary to call | ||||
* this after a successful call to init_MBR() before init_MBR() can be | * this after a successful call to init_MBR() before init_MBR() can be | ||||
* called again. | * called again. | ||||
*/ | */ | ||||
void (WINAPI *close_MBR)(void); | |||||
extern void (WINAPI *close_MBR)(void); | |||||
/* | /* | ||||
* Stop any ongoing processing and flush all buffers. After this call | * Stop any ongoing processing and flush all buffers. After this call | ||||
* any synthesis request will start afresh. | * 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 | * Return at most 'nb_samples' audio samples into 'buffer'. The returned | ||||
* If not successful, lastErrorStr_MBR() will provide the error reason. | * If not successful, lastErrorStr_MBR() will provide the error reason. | ||||
* Samples are always 16-bit little endian. | * 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. | * Write a NULL terminated string of phoneme in the input buffer. | ||||
* Return the number of chars actually written, or -1 on error. | * Return the number of chars actually written, or -1 on error. | ||||
* If not successful, lastErrorStr_MBR() will provide the error reason. | * 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. | * Send a flush command to the mbrola input stream. | ||||
* or 0 on failure. If not successful, lastErrorStr_MBR() will provide | * or 0 on failure. If not successful, lastErrorStr_MBR() will provide | ||||
* the error reason. | * the error reason. | ||||
*/ | */ | ||||
int (WINAPI *flush_MBR)(void); | |||||
extern int (WINAPI *flush_MBR)(void); | |||||
/* | /* | ||||
* Return the audio sample frequency of the used voice database. | * Return the audio sample frequency of the used voice database. | ||||
*/ | */ | ||||
int (WINAPI *getFreq_MBR)(void); | |||||
extern int (WINAPI *getFreq_MBR)(void); | |||||
/* | /* | ||||
* Overall volume. | * 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 | * Copy into 'buffer' at most 'bufsize' bytes from the latest error | ||||
* no error message is pending then an empty string is returned. | * no error message is pending then an empty string is returned. | ||||
* Consecutive calls to lastErrorStr_MBR() will return the same message. | * 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. | * Tolerance to missing diphones. | ||||
*/ | */ | ||||
void (WINAPI *setNoError_MBR)(int no_error); | |||||
extern void (WINAPI *setNoError_MBR)(int no_error); | |||||
BOOL load_MBR(void); | BOOL load_MBR(void); | ||||
void unload_MBR(void); | void unload_MBR(void); |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "translate.h" | #include "translate.h" | ||||
#define M_LIGATURE 0x8000 | #define M_LIGATURE 0x8000 | ||||
0 | 0 | ||||
}; | }; | ||||
int NonAsciiNumber(int letter) | |||||
static int NonAsciiNumber(int letter) | |||||
{ | { | ||||
// Change non-ascii digit into ascii digit '0' to '9', (or -1 if not) | // Change non-ascii digit into ascii digit '0' to '9', (or -1 if not) | ||||
const int *p; | const int *p; | ||||
return 0; | 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? | // Is this a group of 3 digits which looks like a thousands group? | ||||
int ix; | int ix; |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "voice.h" | |||||
#include "synthesize.h" | #include "synthesize.h" | ||||
#include "translate.h" | #include "translate.h" | ||||
#include <espeak-ng/espeak_ng.h> | #include <espeak-ng/espeak_ng.h> | ||||
#include <espeak-ng/speak_lib.h> | #include <espeak-ng/speak_lib.h> | ||||
#include <espeak-ng/encoding.h> | #include <espeak-ng/encoding.h> | ||||
#include <ucd/ucd.h> | |||||
#include "error.h" | #include "error.h" | ||||
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "translate.h" | #include "translate.h" | ||||
#define N_XML_BUF 500 | #define N_XML_BUF 500 | ||||
static int speech_parameters[N_SPEECH_PARAM]; // current values, from 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 | 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] = { | const int param_defaults[N_SPEECH_PARAM] = { | ||||
0, // silence (internal use) | 0, // silence (internal use) | ||||
175, // rate wpm | 175, // rate wpm | ||||
if (c == 'I' && translator->langopts.dotless_i) | if (c == 'I' && translator->langopts.dotless_i) | ||||
return 0x131; // I -> ı | return 0x131; // I -> ı | ||||
return towlower(c); | |||||
return ucd_tolower(c); | |||||
} | } | ||||
static int IsRomanU(unsigned int c) | static int IsRomanU(unsigned int c) | ||||
static int GetC(void) | static int GetC(void) | ||||
{ | { | ||||
int c1; | int c1; | ||||
static int ungot2 = 0; | |||||
if ((c1 = ungot_char) != 0) { | if ((c1 = ungot_char) != 0) { | ||||
ungot_char = 0; | ungot_char = 0; | ||||
while (IsDigit09(*pw)) | while (IsDigit09(*pw)) | ||||
value = value*10 + *pw++ - '0'; | value = value*10 + *pw++ - '0'; | ||||
if ((type == 1) && (towlower(*pw) == 's')) { | |||||
if ((type == 1) && (ucd_tolower(*pw) == 's')) { | |||||
// time: seconds rather than ms | // time: seconds rather than ms | ||||
value *= 1000; | value *= 1000; | ||||
} | } | ||||
return sign; // -1, 0, or 1 | 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 | // Add the name to the namedata and return its position | ||||
// (Used by the Windows SAPI wrapper) | // (Used by the Windows SAPI wrapper) |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "translate.h" | #include "translate.h" | ||||
extern int GetAmplitude(void); | |||||
extern void DoSonicSpeed(int value); | |||||
extern int saved_parameters[]; | extern int saved_parameters[]; | ||||
// convert from words-per-minute to internal speed factor | // convert from words-per-minute to internal speed factor |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "spect.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 unsigned char pk_shape1[]; | ||||
extern int pk_select; | extern int pk_select; | ||||
{ | { | ||||
unsigned char bytes[10]; | unsigned char bytes[10]; | ||||
fread(bytes, sizeof(char), 10, stream); | fread(bytes, sizeof(char), 10, stream); | ||||
return ConvertFromIeeeExtended(bytes); | |||||
return ConvertFromIeeeExtended((char *)bytes); | |||||
} | } | ||||
float polint(float xa[], float ya[], int n, float x) | float polint(float xa[], float ya[], int n, float x) |
{ | { | ||||
#endif | #endif | ||||
float polint(float xa[], float ya[], int n, float x); | |||||
#define FRAME_WIDTH 1000 // max width for 8000kHz frame | #define FRAME_WIDTH 1000 // max width for 8000kHz frame | ||||
#define MAX_DISPLAY_FREQ 9500 | #define MAX_DISPLAY_FREQ 9500 | ||||
#define FRAME_HEIGHT 240 | #define FRAME_HEIGHT 240 | ||||
int file_format; | int file_format; | ||||
} SpectSeq; | } SpectSeq; | ||||
SpectSeq *SpectSeqCreate(); | |||||
SpectSeq *SpectSeqCreate(void); | |||||
void SpectSeqDestroy(SpectSeq *spect); | void SpectSeqDestroy(SpectSeq *spect); | ||||
espeak_ng_STATUS LoadSpectSeq(SpectSeq *spect, const char *filename); | espeak_ng_STATUS LoadSpectSeq(SpectSeq *spect, const char *filename); | ||||
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "translate.h" | #include "translate.h" | ||||
#include "espeak_command.h" | #include "espeak_command.h" | ||||
#include "fifo.h" | #include "fifo.h" | ||||
espeak_ng_STATUS status; | espeak_ng_STATUS status; | ||||
if (translator == NULL) { | if (translator == NULL) { | ||||
status = espeak_SetVoiceByName("en"); | |||||
status = espeak_ng_SetVoiceByName("en"); | |||||
if (status != ENS_OK) | if (status != ENS_OK) | ||||
return status; | return status; | ||||
} | } | ||||
return berr; | return berr; | ||||
} | } | ||||
extern void FreePhData(void); | |||||
extern void FreeVoiceList(void); | |||||
ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Terminate(void) | ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Terminate(void) | ||||
{ | { | ||||
#ifdef USE_ASYNC | #ifdef USE_ASYNC |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "voice.h" | |||||
#include "synthesize.h" | #include "synthesize.h" | ||||
#include "translate.h" | #include "translate.h" | ||||
#include "voice.h" | |||||
#ifdef INCLUDE_MBROLA | #ifdef INCLUDE_MBROLA | ||||
extern int Read4Bytes(FILE *f); | 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; | extern unsigned char *outbuf; | ||||
#if defined(_WIN32) || defined(_WIN64) | #if defined(_WIN32) || defined(_WIN64) | ||||
espeak_ng_STATUS LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int *srate) | 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; | return ENS_NOT_SUPPORTED; | ||||
} | } | ||||
int MbrolaGenerate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | 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; | return 0; | ||||
} | } | ||||
int MbrolaFill(int length, int resume, int amplitude) | int MbrolaFill(int length, int resume, int amplitude) | ||||
{ | { | ||||
(void)length; // unused parameter | |||||
(void)resume; // unused parameter | |||||
(void)amplitude; // unused parameter | |||||
return 0; | return 0; | ||||
} | } | ||||
#include "error.h" | #include "error.h" | ||||
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "translate.h" | #include "translate.h" | ||||
const char *version_string = PACKAGE_VERSION; | const char *version_string = PACKAGE_VERSION; | ||||
int vowel_transition0; | int vowel_transition0; | ||||
int vowel_transition1; | 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) | static espeak_ng_STATUS ReadPhFile(void **ptr, const char *fname, int *size, espeak_ng_ERROR_CONTEXT *context) | ||||
{ | { | ||||
if (!ptr) return EINVAL; | if (!ptr) return EINVAL; | ||||
FILE *f_in; | FILE *f_in; | ||||
unsigned int length; | |||||
int length; | |||||
char buf[sizeof(path_home)+40]; | char buf[sizeof(path_home)+40]; | ||||
sprintf(buf, "%s%c%s", path_home, PATHSEP, fname); | sprintf(buf, "%s%c%s", path_home, PATHSEP, fname); | ||||
int length = 0; | int length = 0; | ||||
int rate; | int rate; | ||||
unsigned char *p; | unsigned char *p; | ||||
int *pw; | |||||
espeak_ng_STATUS status; | espeak_ng_STATUS status; | ||||
if ((status = ReadPhFile((void **)&phoneme_tab_data, "phontab", NULL, context)) != ENS_OK) | if ((status = ReadPhFile((void **)&phoneme_tab_data, "phontab", NULL, context)) != ENS_OK) | ||||
unsigned int data; | unsigned int data; | ||||
int instn; | int instn; | ||||
int instn2; | int instn2; | ||||
int count; | |||||
int check_endtype = 0; | int check_endtype = 0; | ||||
PHONEME_TAB *ph; | PHONEME_TAB *ph; | ||||
PHONEME_LIST *plist_this; | PHONEME_LIST *plist_this; | ||||
// This instruction is followed by addWav(), 2 more words | // This instruction is followed by addWav(), 2 more words | ||||
return 4; | return 4; | ||||
} | } | ||||
if (instn2 == OPCODE_CONTINUE) | |||||
if (instn2 == INSTN_CONTINUE) | |||||
return 3; | return 3; | ||||
return 2; | return 2; | ||||
} | } | ||||
// instructions with no operand | // instructions with no operand | ||||
switch (data) | switch (data) | ||||
{ | { | ||||
case OPCODE_RETURN: | |||||
case INSTN_RETURN: | |||||
end_flag = 1; | end_flag = 1; | ||||
break; | break; | ||||
case OPCODE_CONTINUE: | |||||
case INSTN_CONTINUE: | |||||
break; | break; | ||||
default: | default: | ||||
InvalidInstn(ph, instn); | InvalidInstn(ph, instn); | ||||
param_sc = phdata->sound_param[instn2] = (instn >> 4) & 0xff; | param_sc = phdata->sound_param[instn2] = (instn >> 4) & 0xff; | ||||
prog++; | prog++; | ||||
if (prog[1] != OPCODE_CONTINUE) { | |||||
if (prog[1] != INSTN_CONTINUE) { | |||||
if (instn2 < 2) { | if (instn2 < 2) { | ||||
// FMT() and WAV() imply Return | // FMT() and WAV() imply Return | ||||
end_flag = 1; | end_flag = 1; |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "translate.h" | #include "translate.h" | ||||
extern FILE *f_log; | extern FILE *f_log; |
extern int embedded_value[N_EMBEDDED_VALUES]; | extern int embedded_value[N_EMBEDDED_VALUES]; | ||||
extern int embedded_default[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_PEAKS2 9 // plus Notch and Fill (not yet implemented) | ||||
#define N_MARKERS 8 | #define N_MARKERS 8 | ||||
// instructions | // 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 | // Group 0 instrcutions with 8 bit operand. These values go into bits 8-15 of the instruction | ||||
#define i_CHANGE_PHONEME 0x01 | #define i_CHANGE_PHONEME 0x01 | ||||
extern int wcmdq_tail; | extern int wcmdq_tail; | ||||
// from Wavegen file | // 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); | 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); | 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 unsigned char *wavefile_data; | ||||
extern int samplerate; | extern int samplerate; | ||||
// from synthdata file | // from synthdata file | ||||
unsigned int LookupSound(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int *match_level, int control); | 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); | 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); | unsigned char *LookupEnvelope(int ix); | ||||
espeak_ng_STATUS LoadPhData(int *srate, espeak_ng_ERROR_CONTEXT *context); | espeak_ng_STATUS LoadPhData(int *srate, espeak_ng_ERROR_CONTEXT *context); | ||||
void SetEmbedded(int control, int value); | void SetEmbedded(int control, int value); | ||||
void SelectPhonemeTable(int number); | void SelectPhonemeTable(int number); | ||||
int SelectPhonemeTableName(const char *name); | 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); | void Write4Bytes(FILE *f, int value); | ||||
int Read4Bytes(FILE *f); | int Read4Bytes(FILE *f); | ||||
int Reverse4Bytes(int word); | int Reverse4Bytes(int word); | ||||
#if HAVE_SONIC_H | |||||
void DoSonicSpeed(int value); | |||||
#endif | |||||
#define ENV_LEN 128 // length of pitch envelopes | #define ENV_LEN 128 // length of pitch envelopes | ||||
#define PITCHfall 0 // standard pitch envelopes | #define PITCHfall 0 // standard pitch envelopes | ||||
#define PITCHrise 2 | #define PITCHrise 2 | ||||
void InitBreath(void); | void InitBreath(void); | ||||
void KlattInit(); | |||||
void KlattReset(int control); | |||||
int Wavegen_Klatt2(int length, int resume, frame_t *fr1, frame_t *fr2); | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
} | } | ||||
#endif | #endif |
/* 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 |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "voice.h" | |||||
#include "synthesize.h" | #include "synthesize.h" | ||||
#include "translate.h" | #include "translate.h" | ||||
// ignore these characters | // ignore these characters | ||||
static const unsigned short chars_ignore_default[] = { | 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) | // alternatively, ignore characters but allow zero-width-non-joiner (lang-fa) | ||||
static const unsigned short chars_ignore_zwnj_hyphen[] = { | 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 | const unsigned char utf8_ordinal[] = { 0xc2, 0xba, 0 }; // masculine ordinal character, UTF-8 | ||||
SetLetterBits(tr, LETTERGP_VOWEL2, (char *)ru_vowels); | 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 | // 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 }; | static const char dev_consonants2[] = { 0x02, 0x03, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x7b, 0x7c, 0x7e, 0x7f, 0 }; | ||||
tr->langopts.suffix_add_e = tr->letter_bits_offset + 0x4d; // virama | 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) | if (lengths != NULL) | ||||
memcpy(tr->stress_lengths, lengths, sizeof(tr->stress_lengths)); | memcpy(tr->stress_lengths, lengths, sizeof(tr->stress_lengths)); |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "translate.h" | #include "translate.h" | ||||
Translator *translator = NULL; // the main translator | Translator *translator = NULL; // the main translator | ||||
return 0; | return 0; | ||||
} | } | ||||
int IsSpace(unsigned int c) | |||||
static int IsSpace(unsigned int c) | |||||
{ | { | ||||
if (c == 0) | if (c == 0) | ||||
return 0; | return 0; | ||||
return iswspace(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) | void DeleteTranslator(Translator *tr) | ||||
{ | { | ||||
if (tr->data_dictlist != NULL) | if (tr->data_dictlist != NULL) | ||||
} | } | ||||
#pragma GCC visibility pop | #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) | char *strchr_w(const char *s, int c) | ||||
{ | { | ||||
// return NULL for any non-ascii character | // return NULL for any non-ascii character | ||||
return strchr((char *)s, c); // (char *) is needed for Borland compiler | 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) | static char *SpeakIndividualLetters(Translator *tr, char *word, char *phonemes, int spell_word) | ||||
{ | { | ||||
int posn = 0; | int posn = 0; | ||||
int more_suffixes; | int more_suffixes; | ||||
int confirm_prefix; | int confirm_prefix; | ||||
int spell_word; | int spell_word; | ||||
int stress_bits; | |||||
int emphasize_allcaps = 0; | int emphasize_allcaps = 0; | ||||
int wflags; | int wflags; | ||||
int wmark; | int wmark; | ||||
char word[N_WORD_BYTES+1]; | char word[N_WORD_BYTES+1]; | ||||
word[0] = 0; | word[0] = 0; | ||||
word[1] = ' '; | word[1] = ' '; | ||||
memcpy(word+2, word_out, strlen(word_out)); | |||||
strcpy(word+2, word_out); | |||||
word_out = word+2; | word_out = word+2; | ||||
while (*word_out && available > 1) { | while (*word_out && available > 1) { | ||||
return count; | return count; | ||||
} | } | ||||
void Word_EmbeddedCmd() | |||||
static void Word_EmbeddedCmd() | |||||
{ | { | ||||
// Process embedded commands for emphasis, sayas, and break | // Process embedded commands for emphasis, sayas, and break | ||||
int embedded_cmd; | int embedded_cmd; | ||||
// don't convert the case of the second character unless the next letter is also upper case | // don't convert the case of the second character unless the next letter is also upper case | ||||
c2 = new_c >> 16; | c2 = new_c >> 16; | ||||
if (upper_case && iswupper(next_in)) | if (upper_case && iswupper(next_in)) | ||||
c2 = towupper(c2); | |||||
c2 = ucd_toupper(c2); | |||||
*insert = c2; | *insert = c2; | ||||
new_c &= 0xffff; | new_c &= 0xffff; | ||||
} | } | ||||
if (upper_case) | if (upper_case) | ||||
new_c = towupper(new_c); | |||||
new_c = ucd_toupper(new_c); | |||||
*wordflags |= FLAG_CHAR_REPLACED; | *wordflags |= FLAG_CHAR_REPLACED; | ||||
return new_c; | return new_c; | ||||
static const char *UCase_ga[] = { "bp", "bhf", "dt", "gc", "hA", "mb", "nd", "ng", "ts", "tA", "nA", NULL }; | 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 ix; | ||||
int len; | int len; |
/* | /* | ||||
* Copyright (C) 2005 to 2014 by Jonathan Duddington | * Copyright (C) 2005 to 2014 by Jonathan Duddington | ||||
* email: [email protected] | * 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 | * 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 | * it under the terms of the GNU General Public License as published by | ||||
void LoadConfig(void); | void LoadConfig(void); | ||||
int TransposeAlphabet(Translator *tr, char *text); | 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); | ESPEAK_NG_API int utf8_in(int *c, const char *buf); | ||||
int utf8_in2(int *c, const char *buf, int backwards); | int utf8_in2(int *c, const char *buf, int backwards); | ||||
int utf8_out(unsigned int c, char *buf); | int utf8_out(unsigned int c, char *buf); | ||||
int utf8_nbytes(const char *buf); | int utf8_nbytes(const char *buf); | ||||
int lookupwchar(const unsigned short *list, int c); | int lookupwchar(const unsigned short *list, int c); | ||||
int lookupwchar2(const unsigned short *list, int c); | int lookupwchar2(const unsigned short *list, int c); | ||||
int Eof(void); | int Eof(void); | ||||
int LoadDictionary(Translator *tr, const char *name, int no_error); | 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 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); | 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); | int ChangePhonemes_ru(Translator *tr, PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch); |
{ | { | ||||
#endif | #endif | ||||
#define N_PEAKS 9 | |||||
typedef struct { | typedef struct { | ||||
char v_name[40]; | char v_name[40]; | ||||
char language_name[20]; | char language_name[20]; | ||||
void WavegenSetVoice(voice_t *v); | void WavegenSetVoice(voice_t *v); | ||||
void ReadTonePoints(char *string, int *tone_pts); | void ReadTonePoints(char *string, int *tone_pts); | ||||
void VoiceReset(int control); | void VoiceReset(int control); | ||||
void FreeVoiceList(void); | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
} | } |
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#include "translate.h" | #include "translate.h" | ||||
MNEM_TAB genders[] = { | MNEM_TAB genders[] = { | ||||
&data[0], &data[1], &data[2], &data[3], &data[4], &data[5], &data[6], &data[7]); | &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) | voice_t *LoadVoice(const char *vname, int control) | ||||
{ | { | ||||
// control, bit 0 1= no_default | // control, bit 0 1= no_default | ||||
return NULL; | return NULL; | ||||
} else { | } else { | ||||
if (voicename[0] == 0) | if (voicename[0] == 0) | ||||
strcpy(voicename, "en"); | |||||
strcpy(voicename, ESPEAKNG_DEFAULT_VOICE); | |||||
sprintf(path_voices, "%s%cvoices%c", path_home, PATHSEP, PATHSEP); | sprintf(path_voices, "%s%cvoices%c", path_home, PATHSEP, PATHSEP); | ||||
sprintf(buf, "%s%s", path_voices, voicename); // look in the main voices directory | sprintf(buf, "%s%s", path_voices, voicename); // look in the main voices directory | ||||
break; | break; | ||||
case V_INTONATION: // intonation | case V_INTONATION: // intonation | ||||
sscanf(p, "%d %d", &option_tone_flags, &option_tone2); | 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; | break; | ||||
case V_TUNES: | case V_TUNES: | ||||
n = sscanf(p, "%s %s %s %s %s %s", names[0], names[1], names[2], names[3], names[4], names[5]); | 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; | break; | ||||
case V_DICTRULES: // conditional dictionary rules and list entries | case V_DICTRULES: // conditional dictionary rules and list entries | ||||
case V_NUMBERS: | case V_NUMBERS: | ||||
case V_STRESSOPT: | 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; | break; | ||||
case V_REPLACE: | case V_REPLACE: | ||||
if (phonemes_set == 0) { | if (phonemes_set == 0) { | ||||
PhonemeReplacement(p); | PhonemeReplacement(p); | ||||
break; | break; | ||||
case V_WORDGAP: // words | 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; | break; | ||||
case V_STRESSRULE: | 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; | break; | ||||
case V_OPTION: | 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 | } else | ||||
fprintf(stderr, "Bad voice option: %s %s\n", buf, p); | |||||
fprintf(stderr, "Cannot set option: language not set, or is invalid.\n"); | |||||
break; | break; | ||||
case V_ECHO: | case V_ECHO: | ||||
// echo. suggest: 135mS 11% | // echo. suggest: 135mS 11% | ||||
case V_STATUS: | case V_STATUS: | ||||
break; | break; | ||||
default: | 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); | fprintf(stderr, "Bad voice attribute: %s\n", buf); | ||||
break; | break; | ||||
} | } | ||||
if (voice_select2.name == NULL) { | if (voice_select2.name == NULL) { | ||||
if ((voice_select2.name = voice_select2.identifier) == 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)); | strncpy0(buf, voice_select2.name, sizeof(buf)); | ||||
if (nv == 0) { | if (nv == 0) { | ||||
// no matching voice, choose the default | // no matching voice, choose the default | ||||
*found = 0; | *found = 0; | ||||
if ((voices[0] = SelectVoiceByName(voices_list, "default")) != NULL) | |||||
if ((voices[0] = SelectVoiceByName(voices_list, ESPEAKNG_DEFAULT_VOICE)) != NULL) | |||||
nv = 1; | nv = 1; | ||||
} | } | ||||
#include "speech.h" | #include "speech.h" | ||||
#include "phoneme.h" | #include "phoneme.h" | ||||
#include "synthesize.h" | |||||
#include "voice.h" | #include "voice.h" | ||||
#include "synthesize.h" | |||||
#ifdef INCLUDE_KLATT | |||||
#include "klatt.h" | |||||
#endif | |||||
#if HAVE_SONIC_H | #if HAVE_SONIC_H | ||||
#include "sonic.h" | #include "sonic.h" | ||||
return value; | return value; | ||||
} | } | ||||
int Wavegen() | |||||
static int Wavegen() | |||||
{ | { | ||||
if (wvoice == NULL) | if (wvoice == NULL) | ||||
return 0; | return 0; | ||||
*pitch_range = base + (pitch2 * range)/2 - *pitch_base; | *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) | if (wvoice == NULL) | ||||
return; | return; | ||||
flutter_amp = wvoice->flutter; | 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) | if (wvoice == NULL || v == NULL) | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
int WavegenFill2() | |||||
static int WavegenFill2() | |||||
{ | { | ||||
// Pick up next wavegen commands from the queue | // Pick up next wavegen commands from the queue | ||||
// return: 0 output buffer has been filled | // return: 0 output buffer has been filled |
.*.swp | .*.swp | ||||
*~ | |||||
# intermediate files: | # intermediate files: | ||||
install-sh | install-sh | ||||
libtool | libtool | ||||
ltmain.sh | ltmain.sh | ||||
m4/ | |||||
missing | missing | ||||
Makefile | Makefile | ||||
Makefile.in | Makefile.in | ||||
stamp-h1 | stamp-h1 | ||||
m4/* | |||||
!m4/ax_check_compile_flag.m4 | |||||
# emscripten: | # emscripten: | ||||
a.out.js | a.out.js | ||||
a.out.js.mem | a.out.js.mem |
* `data/espeak-ng` data files for eSpeak NG extended data. | * `data/espeak-ng` data files for eSpeak NG extended data. | ||||
* espeak-ng PropList property lookup as part of the `ucd_property` API. | * 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. | * Add `iswblank` and `iswxdigit` compatibility. | ||||
* Improve ctype 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 | ## 9.0.0 - 2016-12-28 | ||||
############################# Unicode Data #################################### | ############################# Unicode Data #################################### | ||||
EMOJI_VERSION=4.0 | |||||
EMOJI_VERSION=5.0 | |||||
UCD_VERSION=@UCD_VERSION@ | UCD_VERSION=@UCD_VERSION@ | ||||
UCD_ROOTDIR=data/ucd | UCD_ROOTDIR=data/ucd | ||||
UCD_SRCDIR=http://www.unicode.org/Public | UCD_SRCDIR=http://www.unicode.org/Public | ||||
data/emoji/emoji-data.txt: | data/emoji/emoji-data.txt: | ||||
mkdir -pv data/emoji | 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: | data/ucd/PropList.txt: | ||||
mkdir -pv data/ucd | 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: | data/ucd/DerivedCoreProperties.txt: | ||||
mkdir -pv data/ucd | 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: | data/ucd/PropertyValueAliases.txt: | ||||
mkdir -pv data/ucd | 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: | data/ucd/Scripts.txt: | ||||
mkdir -pv data/ucd | 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: | data/ucd/UnicodeData.txt: | ||||
mkdir -pv data/ucd | mkdir -pv data/ucd | ||||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/UnicodeData.txt > $@ | |||||
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/UnicodeData.txt -o $@ | |||||
############################# documentation ################################### | ############################# documentation ################################### | ||||
AC_PREREQ([2.65]) | 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() | AM_INIT_AUTOMAKE() | ||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES]) | m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES]) | ||||
dnl ================================================================ | dnl ================================================================ | ||||
AC_CHECK_HEADERS([stddef.h]) dnl C89 | AC_CHECK_HEADERS([stddef.h]) dnl C89 | ||||
AC_CHECK_FUNCS([iswblank]) dnl C99 | |||||
AC_TYPE_UINT8_T | AC_TYPE_UINT8_T | ||||
AC_TYPE_UINT32_T | AC_TYPE_UINT32_T | ||||
dnl ================================================================ | dnl ================================================================ | ||||
AC_ARG_WITH([unicode-version], | 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], | [AS_IF([test x"$withval" != x], | ||||
[UCD_VERSION="$withval"])], | [UCD_VERSION="$withval"])], | ||||
[UCD_VERSION="9.0.0"]) | |||||
[UCD_VERSION="10.0.0"]) | |||||
AC_SUBST(UCD_VERSION) | 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 ================================================================ | ||||
dnl Generate output. | dnl Generate output. | ||||
dnl ================================================================ | dnl ================================================================ |
# =========================================================================== | |||||
# 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 | |||||
* along with ucd-tools. If not, see <http://www.gnu.org/licenses/>. | * 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 "ucd/ucd.h" | ||||
#include <stddef.h> | #include <stddef.h> | ||||
// Unicode Character Data 9.0.0 | |||||
/* Unicode Character Data 10.0.0 */ | |||||
struct case_conversion_entry | struct case_conversion_entry | ||||
{ | { |