Browse Source

Merge branch 'master' into latvian

master
Valdis Vitolins 7 years ago
parent
commit
3c30a57e8b
100 changed files with 10840 additions and 1984 deletions
  1. 4
    1
      .gitignore
  2. 22
    2
      CHANGELOG.md
  3. 8
    15
      Makefile.am
  4. 8
    8
      README.md
  5. 5
    9
      android/build.gradle
  6. 10
    10
      android/eSpeakTests/src/com/reecedunn/espeak/test/SpeechSynthesisTest.java
  7. 54
    54
      android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechServiceTest.java
  8. 1
    1
      android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechTestCase.java
  9. 96
    85
      android/eSpeakTests/src/com/reecedunn/espeak/test/VoiceData.java
  10. 1
    2
      android/jni/Android.mk
  11. 1
    1
      android/jni/Application.mk
  12. 1
    1
      android/jni/include/config.h
  13. 19
    13
      android/src/com/reecedunn/espeak/SpeechSynthesis.java
  14. 31
    1
      configure.ac
  15. 42
    2
      dictsource/af_list
  16. 49
    8
      dictsource/af_rules
  17. 6
    5
      dictsource/ar_list
  18. 12
    11
      dictsource/en_list
  19. 38
    10
      dictsource/en_rules
  20. 4
    4
      dictsource/fa_list
  21. 3
    3
      dictsource/fa_rules
  22. 27
    9
      dictsource/fi_list
  23. 9
    6
      dictsource/fi_rules
  24. 16
    8
      dictsource/it_list
  25. 2
    0
      dictsource/it_listx
  26. 18
    4
      dictsource/it_rules
  27. 4
    2
      dictsource/ka_emoji
  28. 1
    0
      dictsource/lv_list
  29. 31
    11
      dictsource/lv_rules
  30. 1678
    0
      dictsource/ml_emoji
  31. 1678
    0
      dictsource/my_emoji
  32. 1678
    0
      dictsource/ne_emoji
  33. 1678
    0
      dictsource/pa_emoji
  34. 194
    170
      dictsource/sd_list
  35. 559
    668
      dictsource/sd_rules
  36. 1678
    0
      dictsource/ta_emoji
  37. 1
    1
      dictsource/tr_list
  38. 280
    7
      dictsource/ur_list
  39. 110
    28
      dictsource/ur_rules
  40. 3
    3
      docs/dictionary.md
  41. 2
    1
      docs/languages.md
  42. 8
    1
      emscripten/demo.html
  43. 29
    0
      emscripten/espeakng_glue.cpp
  44. 1
    0
      emscripten/espeakng_glue.idl
  45. 27
    3
      emscripten/js/demo.js
  46. 2
    1
      emscripten/js/espeakng.js
  47. 23
    0
      emscripten/post.js
  48. 1
    0
      espeak-ng-data/lang/inc/sd
  49. 1
    0
      espeak-ng-data/lang/poz/mi
  50. 75
    0
      m4/ax_check_compile_flag.m4
  51. 19
    10
      phsource/ph_latvian
  52. 3
    3
      src/espeak-ng.c
  53. 0
    3
      src/include/compat/wchar.h
  54. 2
    0
      src/include/espeak-ng/encoding.h
  55. 2
    0
      src/include/espeak-ng/espeak_ng.h
  56. 12
    1
      src/include/espeak-ng/speak_lib.h
  57. 0
    75
      src/include/espeak-ng/tokenizer.h
  58. 25
    25
      src/libespeak-ng/compiledata.c
  59. 17
    23
      src/libespeak-ng/compiledict.c
  60. 1
    0
      src/libespeak-ng/compilembrola.c
  61. 6
    12
      src/libespeak-ng/dictionary.c
  62. 5
    37
      src/libespeak-ng/encoding.c
  63. 1
    0
      src/libespeak-ng/error.c
  64. 1
    0
      src/libespeak-ng/espeak_api.c
  65. 10
    10
      src/libespeak-ng/event.c
  66. 2
    2
      src/libespeak-ng/event.h
  67. 1
    1
      src/libespeak-ng/fifo.c
  68. 5
    5
      src/libespeak-ng/fifo.h
  69. 1
    6
      src/libespeak-ng/ieee80.c
  70. 62
    0
      src/libespeak-ng/ieee80.h
  71. 2
    2
      src/libespeak-ng/intonation.c
  72. 4
    4
      src/libespeak-ng/klatt.c
  73. 5
    1
      src/libespeak-ng/klatt.h
  74. 24
    13
      src/libespeak-ng/mbrowrap.c
  75. 10
    10
      src/libespeak-ng/mbrowrap.h
  76. 3
    3
      src/libespeak-ng/numbers.c
  77. 1
    0
      src/libespeak-ng/phonemelist.c
  78. 54
    5
      src/libespeak-ng/readclause.c
  79. 1
    3
      src/libespeak-ng/setlengths.c
  80. 3
    5
      src/libespeak-ng/spect.c
  81. 3
    1
      src/libespeak-ng/spect.h
  82. 2
    5
      src/libespeak-ng/speech.c
  83. 10
    2
      src/libespeak-ng/synth_mbrola.c
  84. 6
    10
      src/libespeak-ng/synthdata.c
  85. 1
    1
      src/libespeak-ng/synthesize.c
  86. 16
    13
      src/libespeak-ng/synthesize.h
  87. 0
    410
      src/libespeak-ng/tokenizer.c
  88. 37
    11
      src/libespeak-ng/tr_languages.c
  89. 51
    19
      src/libespeak-ng/translate.c
  90. 10
    1
      src/libespeak-ng/translate.h
  91. 3
    0
      src/libespeak-ng/voice.h
  92. 72
    62
      src/libespeak-ng/voices.c
  93. 9
    5
      src/libespeak-ng/wavegen.c
  94. 5
    1
      src/ucd-tools/.gitignore
  95. 5
    2
      src/ucd-tools/CHANGELOG.md
  96. 7
    7
      src/ucd-tools/Makefile.am
  97. 13
    3
      src/ucd-tools/configure.ac
  98. 75
    0
      src/ucd-tools/m4/ax_check_compile_flag.m4
  99. 4
    3
      src/ucd-tools/src/case.c
  100. 0
    0
      src/ucd-tools/src/categories.c

+ 4
- 1
.gitignore View File

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



+ 22
- 2
CHANGELOG.md View File



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)

+ 8
- 15
Makefile.am View File

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

+ 8
- 8
README.md View File



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

+ 5
- 9
android/build.gradle View File

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'))
}

+ 10
- 10
android/eSpeakTests/src/com/reecedunn/espeak/test/SpeechSynthesisTest.java View File



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));

+ 54
- 54
android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechServiceTest.java View File

} }


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

+ 1
- 1
android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechTestCase.java View File

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

+ 96
- 85
android/eSpeakTests/src/com/reecedunn/espeak/test/VoiceData.java View File

} }


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 中文 (香港)"),
}; };
} }

+ 1
- 2
android/jni/Android.mk View File



# 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 \

+ 1
- 1
android/jni/Application.mk View File

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

+ 1
- 1
android/jni/include/config.h View File

// 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"

+ 19
- 13
android/src/com/reecedunn/espeak/SpeechSynthesis.java View File

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"));
} }
} }

+ 31
- 1
configure.ac View File

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

+ 42
- 2
dictsource/af_list View File

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

+ 49
- 8
dictsource/af_rules View File

@@@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&lt // fix d sound: veldreuk/-radio/-rantsoen, etc. veld (C f&lt // fix d sound: veldreuk/-radio/-rantsoen, etc.
veld (eks f&lt_ // fix d sound, pause: veldekskursie/-ekspedisie/-s veld (eks f&lt_ // fix d sound, pause: veldekskursie/-ekspedisie/-s
veld (o f&lt_ // fix d sound, pause: veldorgideë/-opsigter/-oppervlakte/-opname, etc. veld (o f&lt_ // 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

+ 6
- 5
dictsource/ar_list View File

كغم 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

+ 12
- 11
dictsource/en_list View File

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

+ 38
- 10
dictsource/en_rules View File

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

+ 4
- 4
dictsource/fa_list View File

// * 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

+ 3
- 3
dictsource/fa_rules View File

// * 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

+ 27
- 9
dictsource/fi_list View File

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

+ 9
- 6
dictsource/fi_rules View File





.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:

+ 16
- 8
dictsource/it_list View File

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

+ 2
- 0
dictsource/it_listx View File

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

+ 18
- 4
dictsource/it_rules View File



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



+ 4
- 2
dictsource/ka_emoji View File

😖 შეცბუნებული სახე // [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]

+ 1
- 0
dictsource/lv_list View File

tikvien $u2+ tikvien $u2+
turpat $u2+ turpat $u2+
turpretī $u2 turpretī $u2
uzreiz $2
vienalga $2 vienalga $2
vismaz $2 vismaz $2



+ 31
- 11
dictsource/lv_rules View File

.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

+ 1678
- 0
dictsource/ml_emoji
File diff suppressed because it is too large
View File


+ 1678
- 0
dictsource/my_emoji
File diff suppressed because it is too large
View File


+ 1678
- 0
dictsource/ne_emoji
File diff suppressed because it is too large
View File


+ 1678
- 0
dictsource/pa_emoji
File diff suppressed because it is too large
View File


+ 194
- 170
dictsource/sd_list View File

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:

+ 559
- 668
dictsource/sd_rules
File diff suppressed because it is too large
View File


+ 1678
- 0
dictsource/ta_emoji
File diff suppressed because it is too large
View File


+ 1
- 1
dictsource/tr_list View File

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

+ 280
- 7
dictsource/ur_list View File

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

+ 110
- 28
dictsource/ur_rules View File

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

+ 3
- 3
docs/dictionary.md View File

| `=` | 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>&#124;</code> | indicates a word boundary within a phoneme string |
| <code>&#124;&#124;</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.

+ 2
- 1
docs/languages.md View File

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

+ 8
- 1
emscripten/demo.html View File

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();">&#x21b6;</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();">&#x21b6;</button>
</div> </div>
<label for="voice">Voice</label><select id="voice"></select><button type="button" aria-label="Reset voice" title="Reset voice" onclick="resetVoice();">&#x21b6;</button> <label for="voice">Voice</label><select id="voice"></select><button type="button" aria-label="Reset voice" title="Reset voice" onclick="resetVoice();">&#x21b6;</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>

+ 29
- 0
emscripten/espeakng_glue.cpp View File

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,

+ 1
- 0
emscripten/espeakng_glue.idl View File

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;

+ 27
- 3
emscripten/js/demo.js View File

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');
} }

+ 2
- 1
emscripten/js/espeakng.js View File

'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);
} }

+ 23
- 0
emscripten/post.js View File

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';
} }

+ 1
- 0
espeak-ng-data/lang/inc/sd View File

name Sindhi name Sindhi
language sd language sd
maintainer Ejaz Shah <[email protected]>

+ 1
- 0
espeak-ng-data/lang/poz/mi View File

name Māori
language mi language mi
status testing status testing



+ 75
- 0
m4/ax_check_compile_flag.m4 View File

# ===========================================================================
# 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


+ 19
- 10
phsource/ph_latvian View File

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






+ 3
- 3
src/espeak-ng.c View File

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

+ 0
- 3
src/include/compat/wchar.h View File



#include <ucd/ucd.h> #include <ucd/ucd.h>


#define towlower ucd_tolower
#define towupper ucd_toupper

#endif #endif

+ 2
- 0
src/include/espeak-ng/encoding.h View File

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

+ 2
- 0
src/include/espeak-ng/espeak_ng.h View File

#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. */

+ 12
- 1
src/include/espeak-ng/speak_lib.h View File

#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 */

+ 0
- 75
src/include/espeak-ng/tokenizer.h View File

/*
* 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

+ 25
- 25
src/libespeak-ng/compiledata.c View File



#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];

+ 17
- 23
src/libespeak-ng/compiledict.c View File

#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;

+ 1
- 0
src/libespeak-ng/compilembrola.c View File

#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)

+ 6
- 12
src/libespeak-ng/dictionary.c View File



#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[] = {

+ 5
- 37
src/libespeak-ng/encoding.c View File

#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;
} }



+ 1
- 0
src/libespeak-ng/error.c View File

#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

+ 1
- 0
src/libespeak-ng/espeak_api.c View File



#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"

+ 10
- 10
src/libespeak-ng/event.c View File

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);
} }
} }



+ 2
- 2
src/libespeak-ng/event.h View File

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);

+ 1
- 1
src/libespeak-ng/fifo.c View File

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;



+ 5
- 5
src/libespeak-ng/fifo.h View File



// 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
} }

+ 1
- 6
src/libespeak-ng/ieee80.c View File



#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

+ 62
- 0
src/libespeak-ng/ieee80.h View File

/* 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

+ 2
- 2
src/libespeak-ng/intonation.c View File



#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;

+ 4
- 4
src/libespeak-ng/klatt.c View File

#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;

+ 5
- 1
src/libespeak-ng/klatt.h View File

/* /*
* 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
} }

+ 24
- 13
src/libespeak-ng/mbrowrap.c View File

#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
} }

+ 10
- 10
src/libespeak-ng/mbrowrap.h View File

* 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);

+ 3
- 3
src/libespeak-ng/numbers.c View File



#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;

+ 1
- 0
src/libespeak-ng/phonemelist.c View File



#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"



+ 54
- 5
src/libespeak-ng/readclause.c View File

#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)

+ 1
- 3
src/libespeak-ng/setlengths.c View File



#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

+ 3
- 5
src/libespeak-ng/spect.c View File



#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)

+ 3
- 1
src/libespeak-ng/spect.h View File

{ {
#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);



+ 2
- 5
src/libespeak-ng/speech.c View File



#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

+ 10
- 2
src/libespeak-ng/synth_mbrola.c View File



#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;
} }



+ 6
- 10
src/libespeak-ng/synthdata.c View File

#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;

+ 1
- 1
src/libespeak-ng/synthesize.c View File



#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;

+ 16
- 13
src/libespeak-ng/synthesize.h View File

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

+ 0
- 410
src/libespeak-ng/tokenizer.c View File

/* 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

+ 37
- 11
src/libespeak-ng/tr_languages.c View File



#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));

+ 51
- 19
src/libespeak-ng/translate.c View File



#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;

+ 10
- 1
src/libespeak-ng/translate.h View File

/* /*
* 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);

+ 3
- 0
src/libespeak-ng/voice.h View File

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

+ 72
- 62
src/libespeak-ng/voices.c View File



#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;
} }



+ 9
- 5
src/libespeak-ng/wavegen.c View File



#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

+ 5
- 1
src/ucd-tools/.gitignore View File

.*.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

+ 5
- 2
src/ucd-tools/CHANGELOG.md View File

* `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



+ 7
- 7
src/ucd-tools/Makefile.am View File



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



+ 13
- 3
src/ucd-tools/configure.ac View File

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

+ 75
- 0
src/ucd-tools/m4/ax_check_compile_flag.m4 View File

# ===========================================================================
# 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


+ 4
- 3
src/ucd-tools/src/case.c View File

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

+ 0
- 0
src/ucd-tools/src/categories.c View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save