| 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 | ||||
| { | { |