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

@@ -66,11 +66,13 @@ depcomp
install-sh
libtool
ltmain.sh
m4/
missing
stamp-h1
.dirstamp

m4/*
!m4/ax_check_compile_flag.m4

# libraries

docs/speak_lib.h
@@ -96,6 +98,7 @@ src/speak-ng

tests/*.test
!tests/languages.test
!tests/phoneme-output.test

espeak-ng.pc


+ 22
- 2
CHANGELOG.md View File

@@ -7,7 +7,21 @@

The espeak-ng project is a fork of the espeak project.

### 1.49.2 - (In Development)
### 1.49.3 - (In Development)

bug fixes:

* Fix several issues with the emoji support.

updated languages:

* af (Afrikaans) -- Christo de Klerk
* fi (Finnish) -- Juho Hiltunen
* it (Italian) -- chrislm
* lv (Latvian) -- Valdis Vitolins
* ur (Urdu) -- Ejaz Shah

### 1.49.2 - 2017-09-24

* Provide more validation when reading phoneme tables and voice/language files.
* Removed support for phoneme equivalence tables. These were disabled in the
@@ -25,6 +39,7 @@ bug fixes:
* Fix running `make clean ; make`.
* Fix reading stdin buffers larger than 1000.
* Fixed various language and parent BCP 47 codes (`jp` is now `ja`).
* Fixed several crashes and bugs in `espeak_SetVoiceByName/Properties`.

new languages:

@@ -32,7 +47,7 @@ new languages:
* fr-CH (French (Switzerland)) -- Claude Beazley
* kok (Konkani) -- Vardhan
* mi (Māori) -- Graham Oliver
* sd (Sindhi, Arabic script) -- Vardhan
* sd (Sindhi, Arabic script) -- Vardhan, Ejaz Shah

updated languages:

@@ -90,10 +105,14 @@ Unicode Emoji support (from the Unicode Emoji 5.0, and CLDR 31.0.1 data files):
* lt (Lithuanian)
* lv (Latvian)
* mk (Macedonian)
* ml (Malayalam)
* mr (Marathi)
* ms (Malay)
* my (Myanmar/Burmese)
* ne (Nepali)
* nl (Dutch)
* or (Oriya)
* pa (Punjabi)
* pl (Polish)
* pt (Portuguese) -- Brazil
* ro (Romanian)
@@ -105,6 +124,7 @@ Unicode Emoji support (from the Unicode Emoji 5.0, and CLDR 31.0.1 data files):
* sr (Serbian)
* sv (Swedish)
* sw (Swahili)
* ta (Tamil)
* te (Telugu)
* tr (Turkish)
* ur (Urdu)

+ 8
- 15
Makefile.am View File

@@ -131,8 +131,7 @@ espeak_ng_includedir = $(includedir)/espeak-ng
espeak_ng_include_HEADERS = \
src/include/espeak-ng/encoding.h \
src/include/espeak-ng/espeak_ng.h \
src/include/espeak-ng/speak_lib.h \
src/include/espeak-ng/tokenizer.h
src/include/espeak-ng/speak_lib.h

lib_LTLIBRARIES += src/libespeak-ng.la

@@ -171,7 +170,6 @@ src_libespeak_ng_la_SOURCES = \
src/libespeak-ng/synthdata.c \
src/libespeak-ng/synthesize.c \
src/libespeak-ng/synth_mbrola.c \
src/libespeak-ng/tokenizer.c \
src/libespeak-ng/translate.c \
src/libespeak-ng/tr_languages.c \
src/libespeak-ng/voices.c \
@@ -233,12 +231,6 @@ noinst_bin_PROGRAMS += tests/encoding.test
tests_encoding_test_LDADD = src/libespeak-ng.la
tests_encoding_test_SOURCES = tests/encoding.c

noinst_bin_PROGRAMS += tests/tokenizer.test

tests_tokenizer_test_CFLAGS = -Isrc/libespeak-ng ${AM_CFLAGS}
tests_tokenizer_test_LDADD = src/libespeak-ng.la
tests_tokenizer_test_SOURCES = tests/tokenizer.c

noinst_bin_PROGRAMS += tests/readclause.test

tests_readclause_test_CFLAGS = -Isrc/libespeak-ng ${AM_CFLAGS}
@@ -256,9 +248,9 @@ tests_api_test_SOURCES = tests/api.c
@ESPEAK_DATA_PATH=$(PWD) $< && echo " PASSED $<"

check: tests/encoding.check \
tests/tokenizer.check \
tests/readclause.check \
tests/api.check \
tests/phoneme-output.check \
tests/languages.check

##### phoneme data:
@@ -398,6 +390,7 @@ android/res/raw/espeakdata.zip: espeak-ng-data/phontab dictionaries
rm -f $@
find espeak-ng-data/{intonations,phondata,phonindex,phontab} | zip -@ $@
find espeak-ng-data/*_dict | zip -@ $@
find espeak-ng-data/lang -type f | zip -@ $@
find espeak-ng-data/voices -type f | grep -vF "/mb/" | zip -@ $@

android/res/raw/espeakdata_version: android/res/raw/espeakdata.zip
@@ -672,7 +665,7 @@ mk: espeak-ng-data/mk_dict
espeak-ng-data/mk_dict: dictsource/mk_list dictsource/mk_rules dictsource/mk_extra dictsource/mk_emoji

ml: espeak-ng-data/ml_dict
espeak-ng-data/ml_dict: dictsource/ml_list dictsource/ml_rules dictsource/ml_extra
espeak-ng-data/ml_dict: dictsource/ml_list dictsource/ml_rules dictsource/ml_extra dictsource/ml_emoji

mr: espeak-ng-data/mr_dict
espeak-ng-data/mr_dict: dictsource/mr_list dictsource/mr_rules dictsource/mr_extra dictsource/mr_emoji
@@ -684,13 +677,13 @@ mt: espeak-ng-data/mt_dict
espeak-ng-data/mt_dict: dictsource/mt_list dictsource/mt_rules dictsource/mt_extra

my: espeak-ng-data/my_dict
espeak-ng-data/my_dict: dictsource/my_list dictsource/my_rules dictsource/my_extra
espeak-ng-data/my_dict: dictsource/my_list dictsource/my_rules dictsource/my_extra dictsource/my_emoji

nci: espeak-ng-data/nci_dict
espeak-ng-data/nci_dict: dictsource/nci_list dictsource/nci_rules dictsource/nci_extra

ne: espeak-ng-data/ne_dict
espeak-ng-data/ne_dict: dictsource/ne_list dictsource/ne_rules dictsource/ne_extra
espeak-ng-data/ne_dict: dictsource/ne_list dictsource/ne_rules dictsource/ne_extra dictsource/ne_emoji

nl: espeak-ng-data/nl_dict
espeak-ng-data/nl_dict: dictsource/nl_list dictsource/nl_rules dictsource/nl_extra dictsource/nl_emoji
@@ -705,7 +698,7 @@ or: espeak-ng-data/or_dict
espeak-ng-data/or_dict: dictsource/or_list dictsource/or_rules dictsource/or_extra dictsource/or_emoji

pa: espeak-ng-data/pa_dict
espeak-ng-data/pa_dict: dictsource/pa_list dictsource/pa_rules dictsource/pa_extra
espeak-ng-data/pa_dict: dictsource/pa_list dictsource/pa_rules dictsource/pa_extra dictsource/pa_emoji

pap: espeak-ng-data/pap_dict
espeak-ng-data/pap_dict: dictsource/pap_list dictsource/pap_rules dictsource/pap_extra
@@ -761,7 +754,7 @@ sw: espeak-ng-data/sw_dict
espeak-ng-data/sw_dict: dictsource/sw_list dictsource/sw_rules dictsource/sw_extra dictsource/sw_emoji

ta: espeak-ng-data/ta_dict
espeak-ng-data/ta_dict: dictsource/ta_list dictsource/ta_rules dictsource/ta_extra
espeak-ng-data/ta_dict: dictsource/ta_list dictsource/ta_rules dictsource/ta_extra dictsource/ta_emoji

te: espeak-ng-data/te_dict
espeak-ng-data/te_dict: dictsource/te_list dictsource/te_rules dictsource/te_extra dictsource/te_emoji

+ 8
- 8
README.md View File

@@ -49,11 +49,11 @@ The following platforms are supported:

### Binaries

The Windows version of eSpeak NG 1.49.1 is available as:
The Windows version of eSpeak NG 1.49.2 is available as:

* [espeak-ng-x64.msi](https://github.com/espeak-ng/espeak-ng/releases/download/1.49.1/espeak-ng-x64.msi) --
* [espeak-ng-x64.msi](https://github.com/espeak-ng/espeak-ng/releases/download/1.49.2/espeak-ng-x64.msi) --
64-bit Windows installer
* [espeak-ng-x86.msi](https://github.com/espeak-ng/espeak-ng/releases/download/1.49.1/espeak-ng-x86.msi) --
* [espeak-ng-x86.msi](https://github.com/espeak-ng/espeak-ng/releases/download/1.49.2/espeak-ng-x86.msi) --
32-bit Windows installer

You also need to install the [Visual C++ Redistributable for Visual Studio 2015](https://www.microsoft.com/en-us/download/details.aspx?id=48145).
@@ -69,7 +69,7 @@ To build eSpeak NG on Windows, you will need:
1. a copy of Visual Studio 2013 or later, such as the Community Edition;
2. the Windows 8.1 SDK;
3. the [WiX installer](http://wixtoolset.org) plugin;
4. the [pcaudiolib](http://github.com/rhdunn/pcaudiolib) project checked out to
4. the [pcaudiolib](https://github.com/espeak-ng/pcaudiolib) project checked out to
`src` (as `src/pcaudiolib`).

You can then open and build the `src/windows/espeak-ng.sln` solution in Visual
@@ -104,9 +104,9 @@ In order to build eSpeak NG, you need:

Optionally, you need:

1. the [pcaudiolib](https://github.com/rhdunn/pcaudiolib) development library
1. the [pcaudiolib](https://github.com/espeak-ng/pcaudiolib) development library
to enable audio output;
3. the [sonic](https://github.com/waywardgeek/sonic) development library to
3. the [sonic](https://github.com/espeak-ng/sonic) development library to
enable sonic audio speed up support;
4. the `ronn` man-page markdown processor to build the man pages.

@@ -391,8 +391,8 @@ The `ieee80.c` implementation is taken directly from
[ToFromIEEE.c.txt](http://www.realitypixels.com/turk/opensource/ToFromIEEE.c.txt)
which has been made available for use in Open Source applications per the
[license statement](COPYING.IEEE) on http://www.realitypixels.com/turk/opensource/.
The only modification made to the code is to comment out the `TEST_FP` define
to make it useable in the eSpeak NG library.
The only modifications made to the code is to comment out the `TEST_FP` define
to make it useable in the eSpeak NG library, and to fix compiler warnings.

The `getopt.c` compatibility implementation for getopt support on Windows is
taken from the NetBSD `getopt_long` implementation, which is licensed under a

+ 5
- 9
android/build.gradle View File

@@ -3,7 +3,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.android.tools.build:gradle:2.3.3'
}
}

@@ -18,12 +18,12 @@ dependencies {
}

android {
buildToolsVersion '19.1'
compileSdkVersion 23
buildToolsVersion '25.0.3'
compileSdkVersion 26

defaultConfig {
minSdkVersion 14
targetSdkVersion 23
targetSdkVersion 26
versionCode 20
versionName "1.48.15"
}
@@ -33,6 +33,7 @@ android {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
jniLibs.srcDir 'libs'
}
androidTest.setRoot('eSpeakTests')
androidTest {
@@ -44,8 +45,3 @@ android {
abortOnError false
}
}

tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
pkgTask -> pkgTask.jniFolders = new HashSet<File>()
pkgTask.jniFolders.add(new File(projectDir, 'libs'))
}

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

@@ -260,7 +260,7 @@ public class SpeechSynthesisTest extends TextToSpeechTestCase

public void testMatchVoiceWithLanguageAndCountry()
{
final Voice voice = getVoice("fr-fr"); // language="fr" country="fr" variant=""
final Voice voice = getVoice("fr-be"); // language="fr" country="BE" variant=""
assertThat(voice, is(notNullValue()));

assertThat(voice.match(de), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED));
@@ -269,23 +269,23 @@ public class SpeechSynthesisTest extends TextToSpeechTestCase
assertThat(voice.match(de_CH_1901), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED));

assertThat(voice.match(fr), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fr_FR), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
assertThat(voice.match(fr_BE), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fr_FR), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fr_BE), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
assertThat(voice.match(fr_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fr_FR_1694acad), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
assertThat(voice.match(fr_BE_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fr_FR_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fr_BE_1694acad), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));

assertThat(voice.match(fra), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fra_FRA), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
assertThat(voice.match(fra_BEL), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fra_FRA), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fra_BEL), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
assertThat(voice.match(fra_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fra_FRA_1694acad), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
assertThat(voice.match(fra_BEL_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fra_FRA_1694acad), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(fra_BEL_1694acad), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
}

public void testMatchVoiceWithLanguageCountryAndVariant()
{
final Voice voice = getVoice("en-sc"); // language="en" country="GB" variant="scotland"
final Voice voice = getVoice("en-gb-scotland"); // language="en" country="GB" variant="scotland"
assertThat(voice, is(notNullValue()));

assertThat(voice.match(de), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED));

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

@@ -99,10 +99,10 @@ public class TextToSpeechServiceTest extends AndroidTestCase
}

public void testOnLoadLanguage() {
assertThat(mService.onLoadLanguage("eng", "", ""), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "eng", "", "");
assertThat(mService.onLoadLanguage("eng", "", ""), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "eng", "GBR", "");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("en"));
assertThat(mService.getActiveVoice().name, is("en-gb"));

assertThat(mService.onLoadLanguage("eng", "USA", ""), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "eng", "USA", "");
@@ -112,120 +112,120 @@ public class TextToSpeechServiceTest extends AndroidTestCase
assertThat(mService.onLoadLanguage("eng", "GBR", "scotland"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "eng", "GBR", "scotland");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("en-sc"));
assertThat(mService.getActiveVoice().name, is("en-gb-scotland"));

assertThat(mService.onLoadLanguage("eng", "USA", "rp"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "eng", "USA", "");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("en-us"));

assertThat(mService.onLoadLanguage("eng", "", "scotland"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "eng", "", "");
assertThat(mService.onLoadLanguage("eng", "", "scotland"), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "eng", "GBR", "");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("en"));
assertThat(mService.getActiveVoice().name, is("en-gb"));

assertThat(mService.onLoadLanguage("eng", "FRA", "rp"), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "eng", "", "");
checkLanguage(mService.onGetLanguage(), "eng", "GBR", "");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("en"));
assertThat(mService.getActiveVoice().name, is("en-gb"));

assertThat(mService.onLoadLanguage("eng", "FRA", ""), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "eng", "", "");
checkLanguage(mService.onGetLanguage(), "eng", "GBR", "");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("en"));
assertThat(mService.getActiveVoice().name, is("en-gb"));

assertThat(mService.onLoadLanguage("ine", "", ""), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED));
checkLanguage(mService.onGetLanguage(), "eng", "", "");
checkLanguage(mService.onGetLanguage(), "eng", "GBR", "");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("en"));
assertThat(mService.getActiveVoice().name, is("en-gb"));
}

public void testOnIsLanguageAvailable() {
assertThat(mService.onLoadLanguage("vie", "VNM", "saigon"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
assertThat(mService.onLoadLanguage("vie", "VNM", "central"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));

assertThat(mService.onIsLanguageAvailable("eng", "", ""), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
assertThat(mService.onIsLanguageAvailable("eng", "", ""), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onIsLanguageAvailable("eng", "USA", ""), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onIsLanguageAvailable("eng", "GBR", "scotland"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onIsLanguageAvailable("eng", "USA", "rp"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onIsLanguageAvailable("eng", "", "scotland"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
assertThat(mService.onIsLanguageAvailable("eng", "", "scotland"), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onIsLanguageAvailable("eng", "FRA", "rp"), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onIsLanguageAvailable("eng", "FRA", ""), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onIsLanguageAvailable("ine", "", ""), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));
}

public void testOnGetDefaultVoiceNameFor() {
assertThat(mService.onLoadLanguage("vie", "VNM", "saigon"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
assertThat(mService.onLoadLanguage("vie", "VNM", "central"), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));

assertThat(mService.onGetDefaultVoiceNameFor("eng", "", ""), is("en"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
assertThat(mService.onGetDefaultVoiceNameFor("eng", "", ""), is("en-gb"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onGetDefaultVoiceNameFor("eng", "USA", ""), is("en-us"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onGetDefaultVoiceNameFor("eng", "GBR", "scotland"), is("en-sc"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
assertThat(mService.onGetDefaultVoiceNameFor("eng", "GBR", "scotland"), is("en-gb-scotland"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onGetDefaultVoiceNameFor("eng", "USA", "rp"), is("en-us"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onGetDefaultVoiceNameFor("eng", "", "scotland"), is("en"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
assertThat(mService.onGetDefaultVoiceNameFor("eng", "", "scotland"), is("en-gb"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onGetDefaultVoiceNameFor("eng", "FRA", "rp"), is("en"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
assertThat(mService.onGetDefaultVoiceNameFor("eng", "FRA", "rp"), is("en-gb"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onGetDefaultVoiceNameFor("eng", "FRA", ""), is("en"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
assertThat(mService.onGetDefaultVoiceNameFor("eng", "FRA", ""), is("en-gb"));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));

assertThat(mService.onGetDefaultVoiceNameFor("ine", "", ""), is(nullValue()));
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "saigon");
checkLanguage(mService.onGetLanguage(), "vie", "VNM", "central");
assertThat(mService.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("vi-sgn"));
assertThat(mService.getActiveVoice().name, is("vi-vn-x-central"));
}

public void testLanguages() {

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

@@ -72,7 +72,7 @@ public class TextToSpeechTestCase extends AndroidTestCase
Log.d("TextToSpeechTestCase", "setUp: available = " + available);
}

assertThat(available, isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
assertThat(available, isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
}
catch (Exception e)
{

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

@@ -75,90 +75,101 @@ public class VoiceData
}

public static final Voice[] voices = new Voice[] {
new Voice("af", "other/af", "af", "afr", "", "", "", SpeechSynthesis.GENDER_MALE, "Afrikaans", "afr", "Hierdie is 'n voorbeeld van gesproke teks in Afrikaans"),
new Voice("am", "test/am", "am", "amh", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Amharic", "amh", "ይሄ በአማርኛ ላይ የተነገረ ጽሑፍ ናሙና ነው።", "ይሄ በAmharic ላይ የተነገረ ጽሑፍ ናሙና ነው።"),
new Voice("an", "europe/an", "an", "arg", "", "", "", SpeechSynthesis.GENDER_MALE, "Aragonese", "arg", "This is a sample of text spoken in Aragonese"),
new Voice("as", "test/as", "as", "asm", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Assamese", "asm", "This is a sample of text spoken in Assamese", "This is a sample of text spoken in অসমীয়া"),
new Voice("az", "test/az", "az", "aze", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Azerbaijani", "aze", "This is a sample of text spoken in Azerbaijani", "This is a sample of text spoken in azərbaycan"),
new Voice("bg", "europe/bg", "bg", "bul", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Bulgarian", "bul", "Това е откъс от изговорен текст на български"),
new Voice("bn", "asia/bn", "bn", "ben", "", "", "", SpeechSynthesis.GENDER_MALE, "Bengali", "ben", "This is a sample of text spoken in বাংলা", "This is a sample of text spoken in Bengali"),
new Voice("bs", "europe/bs", "bs", "bos", "", "", "", SpeechSynthesis.GENDER_MALE, "Bosnian", "bos", "This is a sample of text spoken in Bosnian", "This is a sample of text spoken in bosanski"),
new Voice("ca", "europe/ca", "ca", "cat", "", "", "", SpeechSynthesis.GENDER_MALE, "Catalan", "cat", "Aquesta és una mostra de text llegit en veu alta en català"),
new Voice("cs", "europe/cs", "cs", "ces", "", "", "", SpeechSynthesis.GENDER_MALE, "Czech", "ces", "Toto je ukázkový text namluvený v jazyce čeština"),
new Voice("cy", "europe/cy", "cy", "cym", "", "", "", SpeechSynthesis.GENDER_MALE, "Welsh", "cym", "This is a sample of text spoken in Welsh", "This is a sample of text spoken in Cymraeg"),
new Voice("da", "europe/da", "da", "dan", "", "", "", SpeechSynthesis.GENDER_MALE, "Danish", "dan", "Dette er et eksempel på talt tekst på dansk"),
new Voice("de", "de", "de", "deu", "", "", "", SpeechSynthesis.GENDER_MALE, "German", "deu", "Dies ist ein Beispieltext auf Deutsch"),
new Voice("el", "europe/el", "el", "ell", "", "", "", SpeechSynthesis.GENDER_MALE, "Greek (Modern)", "ell", "Αυτό είναι ένα δείγμα κειμένου που εκφέρεται στα Ελληνικά"),
new Voice("en", "default", "en", "eng", "", "", "", SpeechSynthesis.GENDER_MALE, "English", "eng", "This is a sample of text spoken in English"),
new Voice("en-sc", "other/en-sc", "en", "eng", "GB", "GBR", "scotland", SpeechSynthesis.GENDER_MALE, "English (Scotland)", "eng-GBR-scotland", "This is a sample of text spoken in English (United Kingdom,Scottish Standard English)"),
new Voice("en-gb", "en", "en", "eng", "GB", "GBR", "", SpeechSynthesis.GENDER_MALE, "English (UK)", "eng-GBR", "This is a sample of text spoken in English (United Kingdom)"),
new Voice("en-uk-north", "other/en-n", "en", "eng", "GB", "GBR", "north", SpeechSynthesis.GENDER_MALE, "English (Lancashire)", "eng-GBR-north", "This is a sample of text spoken in English (United Kingdom,NORTH)"),
new Voice("en-uk-rp", "other/en-rp", "en", "eng", "GB", "GBR", "rp", SpeechSynthesis.GENDER_MALE, "English (Received Pronunciation)", "eng-GBR-rp", "This is a sample of text spoken in English (United Kingdom,RP)", "This is a sample of text spoken in English (United Kingdom,rp)"),
new Voice("en-uk-wmids", "other/en-wm", "en", "eng", "GB", "GBR", "wmids", SpeechSynthesis.GENDER_MALE, "English (West Midlands)", "eng-GBR-wmids", "This is a sample of text spoken in English (United Kingdom,WMIDS)"),
new Voice("en-us", "en-us", "en", "eng", "US", "USA", "", SpeechSynthesis.GENDER_MALE, "English (US)", "eng-USA", "This is a sample of text spoken in English (United States)"),
new Voice("en-wi", "other/en-wi", "en", "eng", "JM", "JAM", "", SpeechSynthesis.GENDER_MALE, "English (Caribbean)", "eng-JAM", "This is a sample of text spoken in English (Jamaica)"),
new Voice("eo", "other/eo", "eo", "epo", "", "", "", SpeechSynthesis.GENDER_MALE, "Esperanto", "epo", "This is a sample of text spoken in Esperanto", "This is a sample of text spoken in esperanto"),
new Voice("es", "europe/es", "es", "spa", "", "", "", SpeechSynthesis.GENDER_MALE, "Spanish", "spa", "Esto es un ejemplo de texto hablado en español."),
new Voice("es-la", "es-la", "es", "spa", "MX", "MEX", "", SpeechSynthesis.GENDER_MALE, "Spanish (Latin America)", "spa-MEX", "Esto es un ejemplo de texto hablado en español (México)."),
new Voice("et", "europe/et", "et", "est", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Estonian", "est", "This is a sample of text spoken in eesti", "This is a sample of text spoken in Estonian"),
new Voice("eu", "europe/eu", "eu", "eus", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Basque", "eus", "This is a sample of text spoken in Basque", "This is a sample of text spoken in euskara"),
new Voice("fa", "asia/fa", "fa", "fas", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Farsi (Persian)", "fas", "این یک نمونه از نوشتار گفته شده در فارسی است"),
new Voice("fi", "europe/fi", "fi", "fin", "", "", "", SpeechSynthesis.GENDER_MALE, "Finnish", "fin", "Tämä on näyte puhutusta tekstistä kielellä suomi"),
new Voice("fr-be", "europe/fr-be", "fr", "fra", "BE", "BEL", "", SpeechSynthesis.GENDER_MALE, "French (Belgium)", "fra-BEL", "Voici un exemple de texte énoncé en français (Belgique)."),
new Voice("fr-fr", "fr", "fr", "fra", "FR", "FRA", "", SpeechSynthesis.GENDER_MALE, "French (France)", "fra-FRA", "Voici un exemple de texte énoncé en français (France)."),
new Voice("ga", "europe/ga", "ga", "gle", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Irish", "gle", "This is a sample of text spoken in Irish", "This is a sample of text spoken in Gaeilge"),
new Voice("gd", "test/gd", "gd", "gla", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Scottish Gaelic", "gla", "This is a sample of text spoken in Scottish Gaelic", "This is a sample of text spoken in Gàidhlig"),
new Voice("grc", "other/grc", "grc", "grc", "", "", "", SpeechSynthesis.GENDER_MALE, "Greek (Ancient)", "grc", "This is a sample of text spoken in Ancient Greek"),
new Voice("gu", "asia/gu", "gu", "guj", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Gujarati", "guj", "This is a sample of text spoken in Gujarati", "This is a sample of text spoken in ગુજરાતી"),
new Voice("hi", "asia/hi", "hi", "hin", "", "", "", SpeechSynthesis.GENDER_MALE, "Hindi", "hin", "यह हिन्दी में बोले गए पाठ का नमूना है"),
new Voice("hr", "europe/hr", "hr", "hrv", "", "", "", SpeechSynthesis.GENDER_MALE, "Croatian", "hrv", "Ovo je primjer teksta izgovorenog na hrvatski"),
new Voice("hu", "europe/hu", "hu", "hun", "", "", "", SpeechSynthesis.GENDER_MALE, "Hungarian", "hun", "Ez egy magyar nyelven felolvasott szöveg mintája."),
new Voice("hy", "asia/hy", "hy", "hye", "", "", "", SpeechSynthesis.GENDER_MALE, "Armenian", "hye", "This is a sample of text spoken in Armenian", "This is a sample of text spoken in հայերեն"),
new Voice("hy-west", "asia/hy-west", "hy", "hye", "AM", "ARM", "arevmda", SpeechSynthesis.GENDER_MALE, "Armenian (Western)", "hye-ARM-arevmda", "This is a sample of text spoken in Armenian (Armenia,Western Armenian)", "This is a sample of text spoken in հայերեն (Հայաստան,AREVMDA)", "This is a sample of text spoken in հայերեն (Հայաստան,արեւմտահայերէն)"),
new Voice("ia", "other/ia", "ia", "ina", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Interlingua", "ina", "This is a sample of text spoken in Interlingua"),
new Voice("id", "asia/id", "in", "ind", "", "", "", SpeechSynthesis.GENDER_MALE, "Indonesia", "ind", "Ini adalah sebuah contoh teks yang diucapkan di Bahasa Indonesia"), // NOTE: 'id' is the correct ISO 639-1 code, but Android/Java uses 'in'.
new Voice("is", "europe/is", "is", "isl", "", "", "", SpeechSynthesis.GENDER_MALE, "Icelandic", "isl", "This is a sample of text spoken in íslenska", "This is a sample of text spoken in Icelandic"),
new Voice("it", "europe/it", "it", "ita", "", "", "", SpeechSynthesis.GENDER_MALE, "Italian", "ita", "Questo è un esempio di testo parlato in italiano"),
new Voice("jbo", "other/jbo", "jbo", "jbo", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Lojban", "jbo", "This is a sample of text spoken in Lojban"),
new Voice("ka", "asia/ka", "ka", "kat", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Georgian", "kat", "This is a sample of text spoken in Georgian", "This is a sample of text spoken in ქართული"),
new Voice("kl", "test/kl", "kl", "kal", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Greenlandic", "kal", "This is a sample of text spoken in Kalaallisut", "This is a sample of text spoken in kalaallisut"),
new Voice("kn", "asia/kn", "kn", "kan", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Kannada", "kan", "This is a sample of text spoken in Kannada", "This is a sample of text spoken in ಕನ್ನಡ"),
new Voice("ko", "asia/ko", "ko", "kor", "", "", "", SpeechSynthesis.GENDER_MALE, "Korean", "kor", "한국어로 읽은 텍스트 샘플입니다."),
new Voice("ku", "asia/ku", "ku", "kur", "", "", "", SpeechSynthesis.GENDER_MALE, "Kurdish", "kur", "This is a sample of text spoken in Kurdish"),
new Voice("la", "other/la", "la", "lat", "", "", "", SpeechSynthesis.GENDER_MALE, "Latin", "lat", "This is a sample of text spoken in Latin"),
new Voice("lt", "europe/lt", "lt", "lit", "", "", "", SpeechSynthesis.GENDER_MALE, "Lithuanian", "lit", "Tai teksto, sakomo lietuvių, pavyzdys"),
new Voice("lv", "europe/lv", "lv", "lav", "", "", "", SpeechSynthesis.GENDER_MALE, "Latvian", "lav", "Šis ir izrunāta teksta paraugs šādā valodā: latviešu."),
new Voice("mk", "europe/mk", "mk", "mkd", "", "", "", SpeechSynthesis.GENDER_MALE, "Macedonian", "mkd", "This is a sample of text spoken in Macedonian", "This is a sample of text spoken in македонски"),
new Voice("ml", "asia/ml", "ml", "mal", "", "", "", SpeechSynthesis.GENDER_MALE, "Malayalam", "mal", "This is a sample of text spoken in Malayalam", "This is a sample of text spoken in മലയാളം"),
new Voice("mr", "test/mr", "mr", "mar", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Marathi", "mar", "This is a sample of text spoken in Marathi", "This is a sample of text spoken in मराठी"),
new Voice("ms", "asia/ms", "ms", "msa", "", "", "", SpeechSynthesis.GENDER_MALE, "Malay", "msa", "Ini adalah sampel teks yang dilafazkan dalam Bahasa Melayu", "Ini adalah sampel teks yang dilafazkan dalam Malay"),
new Voice("ne", "asia/ne", "ne", "nep", "", "", "", SpeechSynthesis.GENDER_MALE, "Nepali", "nep", "This is a sample of text spoken in Nepali", "This is a sample of text spoken in नेपाली"),
new Voice("nl", "europe/nl", "nl", "nld", "", "", "", SpeechSynthesis.GENDER_MALE, "Dutch", "nld", "Dit is een voorbeeld van tekst die is uitgesproken in het Nederlands"),
new Voice("no", "europe/no", "nb", "nob", "", "", "", SpeechSynthesis.GENDER_MALE, "Norwegian (Bokmål)", "nob", "Dette er et teksteksempel lest opp på norsk bokmål"),
new Voice("om", "test/om", "om", "orm", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Oromoo", "orm", "This is a sample of text spoken in Oromo", "This is a sample of text spoken in Oromoo"),
new Voice("or", "test/or", "or", "ori", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Oriya", "ori", "This is a sample of text spoken in Oriya", "This is a sample of text spoken in ଓଡ଼ିଆ"),
new Voice("pa", "asia/pa", "pa", "pan", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Panjabi", "pan", "This is a sample of text spoken in Punjabi", "This is a sample of text spoken in ਪੰਜਾਬੀ"),
new Voice("pap", "test/pap", "pap", "pap", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Papiamento", "pap", "This is a sample of text spoken in Papiamento"),
new Voice("pl", "europe/pl", "pl", "pol", "", "", "", SpeechSynthesis.GENDER_MALE, "Polish", "pol", "To jest przykład tekstu mówionego przy ustawieniu polski"),
new Voice("pt-br", "pt", "pt", "por", "BR", "BRA", "", SpeechSynthesis.GENDER_MALE, "Portuguese (Brazil)", "por-BRA", "Esta é uma amostra de texto falado em português (Brasil)"),
new Voice("pt-pt", "europe/pt-pt", "pt", "por", "PT", "PRT", "", SpeechSynthesis.GENDER_MALE, "Portuguese (Portugal)", "por-PRT", "Este é um exemplo de texto falado em português (Portugal)"),
new Voice("ro", "europe/ro", "ro", "ron", "", "", "", SpeechSynthesis.GENDER_MALE, "Romanian", "ron", "Aceasta este o mostră de text vorbit în română"),
new Voice("ru", "europe/ru", "ru", "rus", "", "", "", SpeechSynthesis.GENDER_MALE, "Russian", "rus", "Так синтезатор речи озвучивает русский текст"),
new Voice("si", "test/si", "si", "sin", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Sinhalese", "sin", "This is a sample of text spoken in Sinhala", "This is a sample of text spoken in සිංහල"),
new Voice("sk", "europe/sk", "sk", "slk", "", "", "", SpeechSynthesis.GENDER_MALE, "Slovak", "slk", "Toto je ukážkový text nahovorený v jazyku slovenčina"),
new Voice("sl", "test/sl", "sl", "slv", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Slovenian", "slv", "To je vzorec besedila, izgovorjen v slovenščina"),
new Voice("sq", "europe/sq", "sq", "sqi", "", "", "", SpeechSynthesis.GENDER_MALE, "Albanian", "sqi", "This is a sample of text spoken in Albanian", "This is a sample of text spoken in Shqip", "This is a sample of text spoken in shqip"),
new Voice("sr", "europe/sr", "sr", "srp", "", "", "", SpeechSynthesis.GENDER_MALE, "Serbian", "srp", "Ово је пример текста који је изговорен на језику Српски", "Ово је пример текста који је изговорен на језику српски"),
new Voice("sv", "europe/sv", "sv", "swe", "", "", "", SpeechSynthesis.GENDER_MALE, "Swedish", "swe", "Detta är ett textexempel som läses på svenska"),
new Voice("sw", "other/sw", "sw", "swa", "", "", "", SpeechSynthesis.GENDER_MALE, "Swahili", "swa", "Hii ni sampuli ya maandishi yaliyonenwa katika Kiswahili", "Hii ni sampuli ya maandishi yaliyonenwa katika Swahili"),
new Voice("ta", "asia/ta", "ta", "tam", "", "", "", SpeechSynthesis.GENDER_MALE, "Tamil", "tam", "This is a sample of text spoken in தமிழ்", "This is a sample of text spoken in Tamil"),
new Voice("te", "asia/te", "te", "tel", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Telugu", "tel", "This is a sample of text spoken in Telugu", "This is a sample of text spoken in తెలుగు"),
new Voice("tr", "asia/tr", "tr", "tur", "", "", "", SpeechSynthesis.GENDER_MALE, "Turkish", "tur", "Bu, Türkçe dilinde seslendirilen örnek bir metindir"),
new Voice("ur", "test/ur", "ur", "urd", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED, "Urdu", "urd", "This is a sample of text spoken in Urdu", "This is a sample of text spoken in اردو"),
new Voice("vi", "asia/vi", "vi", "vie", "", "", "", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie", "Đây là mẫu văn bản được đọc bằng Tiếng Việt"),
new Voice("vi-hue", "asia/vi-hue", "vi", "vie", "VN", "VNM", "hue", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie-VNM-hue", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,HUE)", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,hue)"),
new Voice("vi-sgn", "asia/vi-sgn", "vi", "vie", "VN", "VNM", "saigon", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie-VNM-saigon", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,SAIGON)"),
new Voice("zh", "asia/zh", "zh", "zho", "", "", "", SpeechSynthesis.GENDER_MALE, "Chinese (Mandarin)", "zho", "This is a sample of text spoken in 中文"),
new Voice("zh-yue", "asia/zh-yue", "zh", "zho", "HK", "HKG", "", SpeechSynthesis.GENDER_MALE, "Chinese (Cantonese)", "zho-HKG", "This is a sample of text spoken in 中文 (中華人民共和國香港特別行政區)", "This is a sample of text spoken in 中文 (香港)"),
new Voice("af", "gmw/af", "af", "afr", "", "", "", SpeechSynthesis.GENDER_MALE, "Afrikaans", "afr", "Hierdie is 'n voorbeeld van gesproke teks in Afrikaans"),
new Voice("am", "sem/am", "am", "amh", "", "", "", SpeechSynthesis.GENDER_MALE, "Amharic", "amh", "ይሄ በአማርኛ ላይ የተነገረ ጽሑፍ ናሙና ነው።", "ይሄ በAmharic ላይ የተነገረ ጽሑፍ ናሙና ነው።"),
new Voice("an", "roa/an", "an", "arg", "", "", "", SpeechSynthesis.GENDER_MALE, "Aragonese", "arg", "This is a sample of text spoken in Aragonese"),
new Voice("ar", "sem/ar", "ar", "ara", "", "", "", SpeechSynthesis.GENDER_MALE, "Arabic", "ara", "هذه عينة من النص الذي تم نطقه في العربية"),
new Voice("as", "inc/as", "as", "asm", "", "", "", SpeechSynthesis.GENDER_MALE, "Assamese", "asm", "This is a sample of text spoken in Assamese", "This is a sample of text spoken in অসমীয়া"),
new Voice("az", "trk/az", "az", "aze", "", "", "", SpeechSynthesis.GENDER_MALE, "Azerbaijani", "aze", "This is a sample of text spoken in Azerbaijani", "This is a sample of text spoken in azərbaycan"),
new Voice("bg", "zls/bg", "bg", "bul", "", "", "", SpeechSynthesis.GENDER_MALE, "Bulgarian", "bul", "Това е откъс от изговорен текст на български"),
new Voice("bn", "inc/bn", "bn", "ben", "", "", "", SpeechSynthesis.GENDER_MALE, "Bengali", "ben", "This is a sample of text spoken in বাংলা", "This is a sample of text spoken in Bengali"),
new Voice("bs", "zls/bs", "bs", "bos", "", "", "", SpeechSynthesis.GENDER_MALE, "Bosnian", "bos", "This is a sample of text spoken in Bosnian", "This is a sample of text spoken in bosanski"),
new Voice("ca", "roa/ca", "ca", "cat", "", "", "", SpeechSynthesis.GENDER_MALE, "Catalan", "cat", "Aquesta és una mostra de text llegit en veu alta en català"),
new Voice("cs", "zlw/cs", "cs", "ces", "", "", "", SpeechSynthesis.GENDER_MALE, "Czech", "ces", "Toto je ukázkový text namluvený v jazyce čeština"),
new Voice("cy", "cel/cy", "cy", "cym", "", "", "", SpeechSynthesis.GENDER_MALE, "Welsh", "cym", "This is a sample of text spoken in Welsh", "This is a sample of text spoken in Cymraeg"),
new Voice("da", "gmq/da", "da", "dan", "", "", "", SpeechSynthesis.GENDER_MALE, "Danish", "dan", "Dette er et eksempel på talt tekst på dansk"),
new Voice("de", "gmw/de", "de", "deu", "", "", "", SpeechSynthesis.GENDER_MALE, "German", "deu", "Dies ist ein Beispieltext auf Deutsch"),
new Voice("el", "grk/el", "el", "ell", "", "", "", SpeechSynthesis.GENDER_MALE, "Greek (Modern)", "ell", "Αυτό είναι ένα δείγμα κειμένου που εκφέρεται στα Ελληνικά"),
new Voice("en-gb-scotland", "gmw/en-GB-scotland", "en", "eng", "GB", "GBR", "scotland", SpeechSynthesis.GENDER_MALE, "English (Scotland)", "eng-GBR-scotland", "This is a sample of text spoken in English (United Kingdom,Scottish Standard English)"),
new Voice("en-gb", "gmw/en", "en", "eng", "GB", "GBR", "", SpeechSynthesis.GENDER_MALE, "English (UK)", "eng-GBR", "This is a sample of text spoken in English (United Kingdom)"),
new Voice("en-gb-x-gbclan", "gmw/en-GB-x-gbclan", "en", "eng", "GB", "GBR", "gbclan", SpeechSynthesis.GENDER_MALE, "English (Lancashire)", "eng-GBR-gbclan", "This is a sample of text spoken in English (United Kingdom,GBCLAN)"),
new Voice("en-gb-x-rp", "gmw/en-GB-x-rp", "en", "eng", "GB", "GBR", "rp", SpeechSynthesis.GENDER_MALE, "English (Received Pronunciation)", "eng-GBR-rp", "This is a sample of text spoken in English (United Kingdom,RP)", "This is a sample of text spoken in English (United Kingdom,rp)"),
new Voice("en-gb-x-gbcwmd", "gmw/en-GB-x-gbcwmd", "en", "eng", "GB", "GBR", "gbcwmd", SpeechSynthesis.GENDER_MALE, "English (West Midlands)", "eng-GBR-gbcwmd", "This is a sample of text spoken in English (United Kingdom,GBCWMD)"),
new Voice("en-us", "gmw/en-US", "en", "eng", "US", "USA", "", SpeechSynthesis.GENDER_MALE, "English (US)", "eng-USA", "This is a sample of text spoken in English (United States)"),
new Voice("en-029", "gmw/en-029", "en", "eng", "JM", "JAM", "", SpeechSynthesis.GENDER_MALE, "English (Caribbean)", "eng-JAM", "This is a sample of text spoken in English (Jamaica)"),
new Voice("eo", "art/eo", "eo", "epo", "", "", "", SpeechSynthesis.GENDER_MALE, "Esperanto", "epo", "This is a sample of text spoken in Esperanto", "This is a sample of text spoken in esperanto"),
new Voice("es", "roa/es", "es", "spa", "", "", "", SpeechSynthesis.GENDER_MALE, "Spanish", "spa", "Esto es un ejemplo de texto hablado en español."),
new Voice("es-419", "roa/es-419", "es", "spa", "MX", "MEX", "", SpeechSynthesis.GENDER_MALE, "Spanish (Latin America)", "spa-MEX", "Esto es un ejemplo de texto hablado en español (México)."),
new Voice("et", "urj/et", "et", "est", "", "", "", SpeechSynthesis.GENDER_MALE, "Estonian", "est", "This is a sample of text spoken in eesti", "This is a sample of text spoken in Estonian"),
new Voice("eu", "eu", "eu", "eus", "", "", "", SpeechSynthesis.GENDER_MALE, "Basque", "eus", "This is a sample of text spoken in Basque", "This is a sample of text spoken in euskara"),
new Voice("fa", "ira/fa", "fa", "fas", "", "", "", SpeechSynthesis.GENDER_MALE, "Farsi (Persian)", "fas", "این یک نمونه از نوشتار گفته شده در فارسی است"),
new Voice("fi", "urj/fi", "fi", "fin", "", "", "", SpeechSynthesis.GENDER_MALE, "Finnish", "fin", "Tämä on näyte puhutusta tekstistä kielellä suomi"),
new Voice("fr-be", "roa/fr-BE", "fr", "fra", "BE", "BEL", "", SpeechSynthesis.GENDER_MALE, "French (Belgium)", "fra-BEL", "Voici un exemple de texte énoncé en français (Belgique)."),
new Voice("fr-ch", "roa/fr-CH", "fr", "fra", "CH", "CHE", "", SpeechSynthesis.GENDER_MALE, "French (Switzerland)", "fra-CHE", "Voici un exemple de texte énoncé en français (Suisse)."),
new Voice("fr-fr", "roa/fr", "fr", "fra", "FR", "FRA", "", SpeechSynthesis.GENDER_MALE, "French (France)", "fra-FRA", "Voici un exemple de texte énoncé en français (France)."),
new Voice("ga", "cel/ga", "ga", "gle", "", "", "", SpeechSynthesis.GENDER_MALE, "Irish", "gle", "This is a sample of text spoken in Irish", "This is a sample of text spoken in Gaeilge"),
new Voice("gd", "cel/gd", "gd", "gla", "", "", "", SpeechSynthesis.GENDER_MALE, "Scottish Gaelic", "gla", "This is a sample of text spoken in Scottish Gaelic", "This is a sample of text spoken in Gàidhlig"),
new Voice("gn", "sai/gn", "gn", "grn", "", "", "", SpeechSynthesis.GENDER_MALE, "Guarani", "grn", "This is a sample of text spoken in Guarani"),
new Voice("grc", "grk/grc", "grc", "grc", "", "", "", SpeechSynthesis.GENDER_MALE, "Greek (Ancient)", "grc", "This is a sample of text spoken in Ancient Greek"),
new Voice("gu", "inc/gu", "gu", "guj", "", "", "", SpeechSynthesis.GENDER_MALE, "Gujarati", "guj", "This is a sample of text spoken in Gujarati", "This is a sample of text spoken in ગુજરાતી"),
new Voice("hi", "inc/hi", "hi", "hin", "", "", "", SpeechSynthesis.GENDER_MALE, "Hindi", "hin", "यह हिन्दी में बोले गए पाठ का नमूना है"),
new Voice("hr", "zls/hr", "hr", "hrv", "", "", "", SpeechSynthesis.GENDER_MALE, "Croatian", "hrv", "Ovo je primjer teksta izgovorenog na hrvatski"),
new Voice("hu", "urj/hu", "hu", "hun", "", "", "", SpeechSynthesis.GENDER_MALE, "Hungarian", "hun", "Ez egy magyar nyelven felolvasott szöveg mintája."),
new Voice("hy", "ine/hy", "hy", "hye", "", "", "", SpeechSynthesis.GENDER_MALE, "Armenian", "hye", "This is a sample of text spoken in Armenian", "This is a sample of text spoken in հայերեն"),
new Voice("hy-arevmda", "ine/hy-arevmda", "hy", "hye", "AM", "ARM", "arevmda", SpeechSynthesis.GENDER_MALE, "Armenian (Western)", "hye-ARM-arevmda", "This is a sample of text spoken in Armenian (Armenia,Western Armenian)", "This is a sample of text spoken in հայերեն (Հայաստան,AREVMDA)", "This is a sample of text spoken in հայերեն (Հայաստան,արեւմտահայերէն)"),
new Voice("ia", "art/ia", "ia", "ina", "", "", "", SpeechSynthesis.GENDER_MALE, "Interlingua", "ina", "This is a sample of text spoken in Interlingua"),
new Voice("id", "poz/id", "in", "ind", "", "", "", SpeechSynthesis.GENDER_MALE, "Indonesia", "ind", "Ini adalah sebuah contoh teks yang diucapkan di Bahasa Indonesia"), // NOTE: 'id' is the correct ISO 639-1 code, but Android/Java uses 'in'.
new Voice("is", "gmq/is", "is", "isl", "", "", "", SpeechSynthesis.GENDER_MALE, "Icelandic", "isl", "This is a sample of text spoken in íslenska", "This is a sample of text spoken in Icelandic"),
new Voice("it", "roa/it", "it", "ita", "", "", "", SpeechSynthesis.GENDER_MALE, "Italian", "ita", "Questo è un esempio di testo parlato in italiano"),
new Voice("ja", "jpx/ja", "ja", "jpn", "", "", "", SpeechSynthesis.GENDER_MALE, "Japanese", "jpn", "日本語で話すテキストサンプルです。"),
new Voice("jbo", "art/jbo", "jbo", "jbo", "", "", "", SpeechSynthesis.GENDER_MALE, "Lojban", "jbo", "This is a sample of text spoken in Lojban"),
new Voice("ka", "ccs/ka", "ka", "kat", "", "", "", SpeechSynthesis.GENDER_MALE, "Georgian", "kat", "This is a sample of text spoken in Georgian", "This is a sample of text spoken in ქართული"),
new Voice("kl", "esx/kl", "kl", "kal", "", "", "", SpeechSynthesis.GENDER_MALE, "Greenlandic", "kal", "This is a sample of text spoken in Kalaallisut", "This is a sample of text spoken in kalaallisut"),
new Voice("kn", "dra/kn", "kn", "kan", "", "", "", SpeechSynthesis.GENDER_MALE, "Kannada", "kan", "This is a sample of text spoken in Kannada", "This is a sample of text spoken in ಕನ್ನಡ"),
new Voice("ko", "ko", "ko", "kor", "", "", "", SpeechSynthesis.GENDER_MALE, "Korean", "kor", "한국어로 읽은 텍스트 샘플입니다."),
new Voice("kok", "inc/kok", "kok", "kok", "", "", "", SpeechSynthesis.GENDER_MALE, "Konkani", "kok", "This is a sample of text spoken in कोंकणी"),
new Voice("ku", "ira/ku", "ku", "kur", "", "", "", SpeechSynthesis.GENDER_MALE, "Kurdish", "kur", "This is a sample of text spoken in Kurdish"),
new Voice("ky", "trk/ky", "ky", "kir", "", "", "", SpeechSynthesis.GENDER_MALE, "Kyrgyz", "kir", "This is a sample of text spoken in кыргызча"),
new Voice("la", "itc/la", "la", "lat", "", "", "", SpeechSynthesis.GENDER_MALE, "Latin", "lat", "This is a sample of text spoken in Latin"),
new Voice("lt", "bat/lt", "lt", "lit", "", "", "", SpeechSynthesis.GENDER_MALE, "Lithuanian", "lit", "Tai teksto, sakomo lietuvių, pavyzdys"),
new Voice("lv", "bat/lv", "lv", "lav", "", "", "", SpeechSynthesis.GENDER_MALE, "Latvian", "lav", "Šis ir izrunāta teksta paraugs šādā valodā: latviešu."),
new Voice("mi", "poz/mi", "mi", "mri", "", "", "", SpeechSynthesis.GENDER_MALE, "Māori", "mri", "This is a sample of text spoken in Maori"),
new Voice("mk", "zls/mk", "mk", "mkd", "", "", "", SpeechSynthesis.GENDER_MALE, "Macedonian", "mkd", "This is a sample of text spoken in Macedonian", "This is a sample of text spoken in македонски"),
new Voice("ml", "dra/ml", "ml", "mal", "", "", "", SpeechSynthesis.GENDER_MALE, "Malayalam", "mal", "This is a sample of text spoken in Malayalam", "This is a sample of text spoken in മലയാളം"),
new Voice("mr", "inc/mr", "mr", "mar", "", "", "", SpeechSynthesis.GENDER_MALE, "Marathi", "mar", "This is a sample of text spoken in Marathi", "This is a sample of text spoken in मराठी"),
new Voice("ms", "poz/ms", "ms", "msa", "", "", "", SpeechSynthesis.GENDER_MALE, "Malay", "msa", "Ini adalah sampel teks yang dilafazkan dalam Bahasa Melayu", "Ini adalah sampel teks yang dilafazkan dalam Malay"),
new Voice("mt", "sem/mt", "mt", "mlt", "", "", "", SpeechSynthesis.GENDER_MALE, "Maltese", "mlt", "This is a sample of text spoken in Malti"),
new Voice("my", "sit/my", "my", "mya", "", "", "", SpeechSynthesis.GENDER_MALE, "Myanmar", "mya", "This is a sample of text spoken in Telugu", "This is a sample of text spoken in ဗမာ"),
new Voice("ne", "inc/ne", "ne", "nep", "", "", "", SpeechSynthesis.GENDER_MALE, "Nepali", "nep", "This is a sample of text spoken in Nepali", "This is a sample of text spoken in नेपाली"),
new Voice("nl", "gmw/nl", "nl", "nld", "", "", "", SpeechSynthesis.GENDER_MALE, "Dutch", "nld", "Dit is een voorbeeld van tekst die is uitgesproken in het Nederlands"),
new Voice("nb", "gmq/nb", "nb", "nob", "", "", "", SpeechSynthesis.GENDER_MALE, "Norwegian (Bokmål)", "nob", "Dette er et teksteksempel lest opp på norsk bokmål"),
new Voice("om", "cus/om", "om", "orm", "", "", "", SpeechSynthesis.GENDER_MALE, "Oromoo", "orm", "This is a sample of text spoken in Oromo", "This is a sample of text spoken in Oromoo"),
new Voice("or", "inc/or", "or", "ori", "", "", "", SpeechSynthesis.GENDER_MALE, "Oriya", "ori", "This is a sample of text spoken in Oriya", "This is a sample of text spoken in ଓଡ଼ିଆ"),
new Voice("pa", "inc/pa", "pa", "pan", "", "", "", SpeechSynthesis.GENDER_MALE, "Panjabi", "pan", "This is a sample of text spoken in Punjabi", "This is a sample of text spoken in ਪੰਜਾਬੀ"),
new Voice("pap", "roa/pap", "pap", "pap", "", "", "", SpeechSynthesis.GENDER_MALE, "Papiamento", "pap", "This is a sample of text spoken in Papiamento"),
new Voice("pl", "zlw/pl", "pl", "pol", "", "", "", SpeechSynthesis.GENDER_MALE, "Polish", "pol", "To jest przykład tekstu mówionego przy ustawieniu polski"),
new Voice("pt", "roa/pt", "pt", "por", "", "", "", SpeechSynthesis.GENDER_MALE, "Portuguese", "por", "Este é um exemplo de texto falado em português"),
new Voice("pt-br", "roa/pt-BR", "pt", "por", "BR", "BRA", "", SpeechSynthesis.GENDER_MALE, "Portuguese (Brazil)", "por-BRA", "Esta é uma amostra de texto falado em português (Brasil)"),
new Voice("ro", "roa/ro", "ro", "ron", "", "", "", SpeechSynthesis.GENDER_MALE, "Romanian", "ron", "Aceasta este o mostră de text vorbit în română"),
new Voice("ru", "zle/ru", "ru", "rus", "", "", "", SpeechSynthesis.GENDER_MALE, "Russian", "rus", "Так синтезатор речи озвучивает русский текст"),
new Voice("sd", "inc/sd", "sd", "snd", "", "", "", SpeechSynthesis.GENDER_MALE, "Sindhi", "snd", "This is a sample of text spoken in Sindhi"),
new Voice("si", "inc/si", "si", "sin", "", "", "", SpeechSynthesis.GENDER_MALE, "Sinhalese", "sin", "This is a sample of text spoken in Sinhala", "This is a sample of text spoken in සිංහල"),
new Voice("sk", "zlw/sk", "sk", "slk", "", "", "", SpeechSynthesis.GENDER_MALE, "Slovak", "slk", "Toto je ukážkový text nahovorený v jazyku slovenčina"),
new Voice("sl", "zls/sl", "sl", "slv", "", "", "", SpeechSynthesis.GENDER_MALE, "Slovenian", "slv", "To je vzorec besedila, izgovorjen v slovenščina"),
new Voice("sq", "ine/sq", "sq", "sqi", "", "", "", SpeechSynthesis.GENDER_MALE, "Albanian", "sqi", "This is a sample of text spoken in Albanian", "This is a sample of text spoken in Shqip", "This is a sample of text spoken in shqip"),
new Voice("sr", "zls/sr", "sr", "srp", "", "", "", SpeechSynthesis.GENDER_MALE, "Serbian", "srp", "Ово је пример текста који је изговорен на језику Српски", "Ово је пример текста који је изговорен на језику српски"),
new Voice("sv", "gmq/sv", "sv", "swe", "", "", "", SpeechSynthesis.GENDER_MALE, "Swedish", "swe", "Detta är ett textexempel som läses på svenska"),
new Voice("sw", "bnt/sw", "sw", "swa", "", "", "", SpeechSynthesis.GENDER_MALE, "Swahili", "swa", "Hii ni sampuli ya maandishi yaliyonenwa katika Kiswahili", "Hii ni sampuli ya maandishi yaliyonenwa katika Swahili"),
new Voice("ta", "dra/ta", "ta", "tam", "", "", "", SpeechSynthesis.GENDER_MALE, "Tamil", "tam", "This is a sample of text spoken in தமிழ்", "This is a sample of text spoken in Tamil"),
new Voice("te", "dra/te", "te", "tel", "", "", "", SpeechSynthesis.GENDER_MALE, "Telugu", "tel", "This is a sample of text spoken in Telugu", "This is a sample of text spoken in తెలుగు"),
new Voice("tn", "bnt/tn", "tn", "tsn", "", "", "", SpeechSynthesis.GENDER_MALE, "Setswana", "tsn", "This is a sample of text spoken in Tswana"),
new Voice("tr", "trk/tr", "tr", "tur", "", "", "", SpeechSynthesis.GENDER_MALE, "Turkish", "tur", "Bu, Türkçe dilinde seslendirilen örnek bir metindir"),
new Voice("tt", "trk/tt", "tt", "tat", "", "", "", SpeechSynthesis.GENDER_MALE, "Tatar", "tat", "This is a sample of text spoken in Tatar"),
new Voice("ur", "inc/ur", "ur", "urd", "", "", "", SpeechSynthesis.GENDER_MALE, "Urdu", "urd", "This is a sample of text spoken in Urdu", "This is a sample of text spoken in اردو"),
new Voice("vi", "aav/vi", "vi", "vie", "", "", "", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie", "Đây là mẫu văn bản được đọc bằng Tiếng Việt"),
new Voice("vi-vn-x-central", "aav/vi-VN-x-central", "vi", "vie", "VN", "VNM", "central", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie-VNM-central", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,CENTRAL)", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,central)"),
new Voice("vi-vn-x-south", "aav/vi-VN-x-south", "vi", "vie", "VN", "VNM", "south", SpeechSynthesis.GENDER_MALE, "Vietnamese", "vie-VNM-south", "Đây là mẫu văn bản được đọc bằng Tiếng Việt (Việt Nam,SOUTH)"),
new Voice("cmn", "sit/cmn", "zh", "zho", "", "", "", SpeechSynthesis.GENDER_MALE, "Chinese (Mandarin)", "zho", "This is a sample of text spoken in 中文"),
new Voice("yue", "sit/yue", "zh", "zho", "HK", "HKG", "", SpeechSynthesis.GENDER_MALE, "Chinese (Cantonese)", "zho-HKG", "This is a sample of text spoken in 中文 (中華人民共和國香港特別行政區)", "This is a sample of text spoken in 中文 (香港)"),
};
}

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

@@ -5,7 +5,7 @@ LOCAL_CFLAGS = -std=c11

# ucd-tools wide-character compatibility support:

UCDTOOLS_SRC_PATH := ../../ucd-tools/src
UCDTOOLS_SRC_PATH := ../../src/ucd-tools/src
UCDTOOLS_SRC_FILES := \
$(subst $(LOCAL_PATH)/$(UCDTOOLS_SRC_PATH),$(UCDTOOLS_SRC_PATH),$(wildcard $(LOCAL_PATH)/$(UCDTOOLS_SRC_PATH)/*.c*))

@@ -33,7 +33,6 @@ ESPEAK_SOURCES := \
src/libespeak-ng/synthdata.c \
src/libespeak-ng/synthesize.c \
src/libespeak-ng/synth_mbrola.c \
src/libespeak-ng/tokenizer.c \
src/libespeak-ng/translate.c \
src/libespeak-ng/tr_languages.c \
src/libespeak-ng/voices.c \

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

@@ -1,4 +1,4 @@
APP_OPTIM := release
APP_PLATFORM := android-8
APP_PLATFORM := android-14
APP_TOOLCHAIN_VERSION := 4.6.3
APP_ABI := mips armeabi armeabi-v7a x86

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

@@ -1,2 +1,2 @@
// This is created by autoconf on POSIX-compatibe build environments.
#define PACKAGE_VERSION "1.49.2-dev"
#define PACKAGE_VERSION "1.49.3-dev"

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

@@ -114,6 +114,8 @@ public class SpeechSynthesis {
return new Locale(parts[0], parts[1]);
case 3: // language-country-variant
return new Locale(parts[0], parts[1], parts[2]);
case 4: // language-country-x-privateuse
return new Locale(parts[0], parts[1], parts[3]);
default:
return null;
}
@@ -355,6 +357,7 @@ public class SpeechSynthesis {
static {
mJavaToIanaLanguageCode.put("afr", "af");
mJavaToIanaLanguageCode.put("amh", "am");
mJavaToIanaLanguageCode.put("ara", "ar");
mJavaToIanaLanguageCode.put("arg", "an");
mJavaToIanaLanguageCode.put("asm", "as");
mJavaToIanaLanguageCode.put("aze", "az");
@@ -377,6 +380,7 @@ public class SpeechSynthesis {
mJavaToIanaLanguageCode.put("fra", "fr");
mJavaToIanaLanguageCode.put("gle", "ga");
mJavaToIanaLanguageCode.put("gla", "gd");
mJavaToIanaLanguageCode.put("grn", "gn");
mJavaToIanaLanguageCode.put("guj", "gu");
mJavaToIanaLanguageCode.put("hin", "hi");
mJavaToIanaLanguageCode.put("hrv", "hr");
@@ -386,9 +390,11 @@ public class SpeechSynthesis {
mJavaToIanaLanguageCode.put("ind", "in"); // NOTE: The deprecated 'in' code is used by Java/Android.
mJavaToIanaLanguageCode.put("isl", "is");
mJavaToIanaLanguageCode.put("ita", "it");
mJavaToIanaLanguageCode.put("jpn", "ja");
mJavaToIanaLanguageCode.put("kat", "ka");
mJavaToIanaLanguageCode.put("kal", "kl");
mJavaToIanaLanguageCode.put("kan", "kn");
mJavaToIanaLanguageCode.put("kir", "ky");
mJavaToIanaLanguageCode.put("kor", "ko");
mJavaToIanaLanguageCode.put("kur", "ku");
mJavaToIanaLanguageCode.put("lat", "la");
@@ -397,7 +403,10 @@ public class SpeechSynthesis {
mJavaToIanaLanguageCode.put("mkd", "mk");
mJavaToIanaLanguageCode.put("mal", "ml");
mJavaToIanaLanguageCode.put("mar", "mr");
mJavaToIanaLanguageCode.put("mlt", "mt");
mJavaToIanaLanguageCode.put("mri", "mi");
mJavaToIanaLanguageCode.put("msa", "ms");
mJavaToIanaLanguageCode.put("mya", "my");
mJavaToIanaLanguageCode.put("nep", "ne");
mJavaToIanaLanguageCode.put("nld", "nl");
mJavaToIanaLanguageCode.put("nob", "nb");
@@ -412,12 +421,15 @@ public class SpeechSynthesis {
mJavaToIanaLanguageCode.put("sin", "si");
mJavaToIanaLanguageCode.put("slk", "sk");
mJavaToIanaLanguageCode.put("slv", "sl");
mJavaToIanaLanguageCode.put("snd", "sd");
mJavaToIanaLanguageCode.put("sqi", "sq");
mJavaToIanaLanguageCode.put("srp", "sr");
mJavaToIanaLanguageCode.put("swe", "sv");
mJavaToIanaLanguageCode.put("swa", "sw");
mJavaToIanaLanguageCode.put("tam", "ta");
mJavaToIanaLanguageCode.put("tel", "te");
mJavaToIanaLanguageCode.put("tat", "tt");
mJavaToIanaLanguageCode.put("tsn", "tn");
mJavaToIanaLanguageCode.put("tur", "tr");
mJavaToIanaLanguageCode.put("urd", "ur");
mJavaToIanaLanguageCode.put("vie", "vi");
@@ -426,6 +438,7 @@ public class SpeechSynthesis {
mJavaToIanaCountryCode.put("ARM", "AM");
mJavaToIanaCountryCode.put("BEL", "BE");
mJavaToIanaCountryCode.put("BRA", "BR");
mJavaToIanaCountryCode.put("CHE", "CH");
mJavaToIanaCountryCode.put("FRA", "FR");
mJavaToIanaCountryCode.put("GBR", "GB");
mJavaToIanaCountryCode.put("HKG", "HK");
@@ -435,18 +448,11 @@ public class SpeechSynthesis {
mJavaToIanaCountryCode.put("USA", "US");
mJavaToIanaCountryCode.put("VNM", "VN");

// Map eSpeak locales to their correct BCP47 locales supported by Android:
mLocaleFixes.put("en-sc", new Locale("en", "GB", "scotland"));
mLocaleFixes.put("en-uk-north", new Locale("en", "GB", "north"));
mLocaleFixes.put("en-uk-rp", new Locale("en", "GB", "rp"));
mLocaleFixes.put("en-uk-wmids", new Locale("en", "GB", "wmids"));
mLocaleFixes.put("en-wi", new Locale("en", "JM"));
mLocaleFixes.put("es-la", new Locale("es", "MX"));
mLocaleFixes.put("fa-pin", null); // Script tags not supported.
mLocaleFixes.put("hy-west", new Locale("hy", "AM", "arevmda")); // hy-arevmda crashes on Android 5.0
mLocaleFixes.put("no", new Locale("nb")); // 'no' is valid, but the system uses the more specific 'nb' and 'nn'
mLocaleFixes.put("vi-hue", new Locale("vi", "VN", "hue"));
mLocaleFixes.put("vi-sgn", new Locale("vi", "VN", "saigon"));
mLocaleFixes.put("zh-yue", new Locale("zh", "HK"));
// Fix up BCP47 locales not handled correctly by Android:
mLocaleFixes.put("cmn", new Locale("zh"));
mLocaleFixes.put("en-029", new Locale("en", "JM"));
mLocaleFixes.put("es-419", new Locale("es", "MX"));
mLocaleFixes.put("hy-arevmda", new Locale("hy", "AM", "arevmda")); // hy-arevmda crashes on Android 5.0
mLocaleFixes.put("yue", new Locale("zh", "HK"));
}
}

+ 31
- 1
configure.ac View File

@@ -1,5 +1,5 @@
AC_PREREQ([2.63])
AC_INIT([eSpeak NG], [1.49.2-dev], [https://github.com/espeak-ng/espeak-ng/issues], [espeak-ng], [https://github.com/espeak-ng/espeak-ng])
AC_INIT([eSpeak NG], [1.49.3-dev], [https://github.com/espeak-ng/espeak-ng/issues], [espeak-ng], [https://github.com/espeak-ng/espeak-ng])
AM_INIT_AUTOMAKE()
LT_INIT

@@ -83,6 +83,23 @@ else
AC_MSG_ERROR([C99 is not supported by $CC.])
fi

dnl ================================================================
dnl FreeBSD check.
dnl ================================================================
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#if ! defined(__FreeBSD__)
#error macro not defined
#endif
]])], [FREEBSD_FOUND="yes"], [FREEBSD_FOUND="no"])

AC_MSG_CHECKING([if targeting FreeBSD])
if test "$FREEBSD_FOUND" = "yes" ; then
AC_MSG_RESULT([-D__BSD_VISIBLE])
CFLAGS="$CFLAGS -D__BSD_VISIBLE"
else
AC_MSG_RESULT([no])
fi

dnl ================================================================
dnl library checks.
dnl ================================================================
@@ -252,6 +269,19 @@ AM_CONDITIONAL(HAVE_RU_EXTENDED_DICTIONARY, [test x"$have_extdict_ru" = xyes])
AM_CONDITIONAL(HAVE_ZH_EXTENDED_DICTIONARY, [test x"$have_extdict_zh" = xyes])
AM_CONDITIONAL(HAVE_ZHY_EXTENDED_DICTIONARY, [test x"$have_extdict_zhy" = xyes])

dnl ================================================================
dnl Compiler warnings.
dnl
dnl Reference: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
dnl ================================================================

AX_CHECK_COMPILE_FLAG([-Wimplicit], [CFLAGS="-Wimplicit $CFLAGS"])
AX_CHECK_COMPILE_FLAG([-Wmissing-prototypes], [CFLAGS="-Wmissing-prototypes $CFLAGS"])
AX_CHECK_COMPILE_FLAG([-Wreturn-type], [CFLAGS="-Wreturn-type $CFLAGS"])
AX_CHECK_COMPILE_FLAG([-Wuninitialized], [CFLAGS="-Wuninitialized $CFLAGS"])
AX_CHECK_COMPILE_FLAG([-Wunused], [CFLAGS="-Wunused $CFLAGS"])
AX_CHECK_COMPILE_FLAG([-Wunused-parameter], [CFLAGS="-Wunused-parameter $CFLAGS"])

dnl ================================================================
dnl Generate output.
dnl ================================================================

+ 42
- 2
dictsource/af_list View File

@@ -218,7 +218,9 @@ afganistan afg'anistan
alaska al'aska
albanië alb'A:ne@:@-
algerië alx2'e@re@:@-
alhambra al'ambra
amanzimtoti $4
amstel amst@l
antwerpen antv&rp@n
avignon _^_FR
babilon babilOn
@@ -333,6 +335,7 @@ oberammergau o@b@r'am@rgaU
oklahoma @Ukl@h'@Uma
outeniekwa @Ut@n'ikwa
oxford _^_EN
paardeneiland pA:rd@n_'eIlant
palermo pal'&rmu
pelindaba p&l@nd'A:ba
perú p@ru
@@ -342,6 +345,7 @@ portugal pOrtyx2al
potchefstroom pOtSIfstr'o@m
rhône _^_FR
richardsbaai ritS@dsb'AI
riversdal r@v@rsdal
riviersonderend r@fi:rsOn@r_'Ent
robertson _^_EN
salvador salvadO:r
@@ -380,7 +384,7 @@ uruguay urugwaI
wakloof vA:klo@f
zimbabwe zI:mb'ab_wE
zulu zulu // Kwazulu-Natal
zürich _^_DE

// People names
abdullah abd'ula
@@ -585,6 +589,7 @@ james _^_EN
jane _^_EN
janine dZ@ni:n
Jean ZA~n $capital
jeff _^_EN
jesebel je@s@b&l
jessica _^_EN
jimmy _^_EN
@@ -603,6 +608,7 @@ julia _^_EN
jung juN
khayyam kaj'am
kelvin _^_EN
kennedy _^_EN
kim _^_EN $capital
kleopatra kliu:p'A:tra
krige krix2@
@@ -769,9 +775,11 @@ stockenström stOk@nstro@m
stuart _^_EN
suzanne suz'A:n
suzette suz'Et
sylvia _^_EN
tania tanja
telemann te@l@man
terblanche t@rblA:nS
thelma _^_EN
theo tiu
theron tr'On
thessalonicense tEsalo@nis'E:ns@
@@ -816,6 +824,7 @@ vivaldi viv'aldi
viviers v@v@je@
wilhelm v@lh&l@-m
williston _^_EN
woltemade vOlt@mA:d@
khumalo kum'A:lu
zuma zu:ma

@@ -825,6 +834,7 @@ alibama $3
antares $2
beatles _^_EN
boeing _^_EN
cadillac _^_EN
checkers tSEk@rs
chevrolet _^_FR
chrysler kraIsl@r
@@ -1044,7 +1054,8 @@ fides _^_LA
forma _^_LA
grata _^_LA
habitatio _^_LA
inclusio _^_LA
inclusio _^_LA
(in camera) @n||kam@ra
(in debiti) _^_LA
(in absentia) _^_LA
(in extremis) _^_LA
@@ -1075,7 +1086,9 @@ vivos _^_LA
// main word list

aangaande $2
aanmerklik $2
aanstaande $2
aanswel A:nsw&l
(a cappella) a||kap'&la
adagio ad'A:dZi;%@U
afgaanse afg'A:ns@
@@ -1091,6 +1104,7 @@ algaande $2
alge alx2@
algehele alx2@h,e@l@
allegro al'Egru
allengs alENs
allergene $3
almiskie $3
alom al_'Om
@@ -1116,11 +1130,13 @@ aversie av'&rsi

babelaas bab@lA:s
barrikade $3
beaming b@_A:m@N
bedewete be@d@ve@t@
beide beId@
bekaf b&kaf
belangriker b@laNr@k,Ir
bene be@n@
beringde b@rINd@
beswil bEsv@l
besnedene b@sne@d@n@
bestes bEst@s
@@ -1130,6 +1146,7 @@ bewe be@v@
bewebeen be@v@be@n
bewend be@v@nt
bewering b@ve@rIN
bilharzia b@lharsia
biopsie bi'Opsi
bomaat bo@mA:t
bordegoed bO:rd@x2ut
@@ -1155,6 +1172,7 @@ cedille s@dIl@
charisma kar'Isma
cinsaut s@nso@
cliché kliS'eI:
clientèle _^_FR
clivia klIvija
cognac kOn^ak
confetti $2
@@ -1173,6 +1191,7 @@ dawidster dA:v@tst&r
déjà _^_FR
dekade dEk'A:d@
dekreling dEkre@l@N
demensie d@me~nsi
deurentyd dy@r@nteIt
deurgaans $1
deurkruis $2
@@ -1183,6 +1202,7 @@ diffuus d@fy:s
dikwels dIkv@ls
diplomasie d@plo@mas'i
disleksie $2
dissiplinering d@s@plin'e@r@N
divan div'an
doktore $2
doyen dO:j'En
@@ -1219,12 +1239,14 @@ ewentwil e@v@ntv@l
exodus Eks'o@dWs

factotum $2
faktotum $2
fakture $2
fetakaas fEtakA:s
figuur f@x2yr
filippense f@l@pEns@
finalis $3
finaliste $3
fluktuasie $3
fort fOrt
forte fOrt@

@@ -1269,6 +1291,7 @@ hekke h&k@
helaas he@l'A:s
here he@r@
herero hEr'E:ru
herontmoeting h&r_Ontmut@N
herrysenis h&r'eIs@n@s
hierso hi:rsO
hippie _^_EN
@@ -1294,8 +1317,10 @@ inkatha iNk'A:ta
inkluis $2
innestel InnEst@l
insomnia @nsOmnija
inteling Inte@l@N
intens @nt'Ens
intensiteit $4
inwegery Inve@x2@reI
ironieë irun'i:@

jantwak jantw'ak
@@ -1306,12 +1331,14 @@ kafee kaf'e@
kaliefa kal'ifa
kameraderie kam@rA:d@r'i
kapittel kap'It@l
karolie kar_o@li
kateter kat'e@t@r
katswink katsv@nk
kaviaar kavi'A:r
kennisvaardig $1
kimono $2
klaasvakie $2
kliënteel $3
klimeid klImeIt
knapsekêrel knaps@k&:r@l
kolossense kOl@s'e~ns@
@@ -1325,11 +1352,13 @@ kopiereg kup'ir&x2
korswel kOrsv@l
kotiljons kOt@lj'o~ns
kritiek krIt'ik
kruisteling krYyste@l@N
kulture $2
kunsmatige kWnsm'A:t@x2@
kwansuis $2
kweekwal kwe@kval

landswye lantsveI@
lasagne las'anj@
legaat l@x2A:t
legate l@x2A:t@
@@ -1337,6 +1366,7 @@ libido l@bidu
liefdespel lifd@sp&l
lipstiek lIpstik
lisensiaat l@se~nsi;'A:t
logieserwys lo@x2is@rveIs
lokaas lOk_A:s
londense lOnd@ns@
lord _^_EN
@@ -1448,6 +1478,7 @@ oorsee $2
oorsese $2
oorval $2 $verb
opend Op_Ent
opwindends Opv'Ind@nts
oraal o@r'A:l
orale o@r'A:l@
oranjepers o@r'anj@p&:rs
@@ -1472,6 +1503,7 @@ pinotage pinut'A:Z
pirouette p@ru:'Et
plaasjaap plA:sjA:p
plasenta plas'Enta
platwaai platvAI
poinsettia pOIns'Etia
pond po~nt
poniepers po@nip&rs
@@ -1504,6 +1536,7 @@ salute sal'yt@
samelewing sA:m@l,e@v@N
sanhedrin sanh'e@dr@n
sangemeenskap sanx2@me@nskap
sedeles se@d@lEs
sedertdien $3
sektore $2
sinagoge s@n@x2o@x2@
@@ -1532,6 +1565,7 @@ sonore sun'o@r@
sonure sOn_yr@
sover so@f&r
staccato $2
steekhoudendheid $2
sterwens st&rv@ns
stilswye $1
strydros streIt_rOs
@@ -1554,7 +1588,10 @@ tesourus t@s@UrWs
tevrede t@fre@d@
thula tu:la
toegee tux2e@
toegeklik tux2@klIk
toemessel tumEs@l
toereken ture@k@n
toleransie tOl@r'ansi
tornado $2
totale tut'A:l@
totsiens $2
@@ -1566,6 +1603,7 @@ tsoenami tsun'A:mi
uitdaging YydA:x2@N
uiteraard Yyt@r_'A:rt
uitermate $3
uitgeslotene Yytx2@slo@t@n@
uniforme $3

vaarwel fA:rv'&l
@@ -1622,6 +1660,7 @@ voëlent fo@@l_Ent
vraprys frA:preIs
vrek fr&k
vroeërig fru:@r@x2
vrygelatene freIx2@lA:t@n@
vu _^_FR

waarskynlik $2
@@ -1638,6 +1677,7 @@ welaf v&l_af
weleer v&l_'e@r
wentaktiek $1
willens vIl@ns
wydoog veIt_o@x2
wysgere veIsx2e@r@

êrenster &:r@nst@r

+ 49
- 8
dictsource/af_rules View File

@@ -73,6 +73,7 @@
@@@smokkel) ary %ar%eI // default stress: diamant-/drank-/dwelm-/goud-/kokaïensmokkelary, etc.
amarula %am%arul%a // fix stress and a sounds: amarula and compounds
a (ment %a // shorten a sound: perkament/testament and compounds
_) arendag (CAC %A:r@ntax2 // fix e sound: arendagtig/-e/-heid
arends A:r@nts_ // fix e sound: arendsoog/-kloue/-nes
argen (tA %arx2@n // move default stress: Argentinië/Argentyns/-e
a (riA 'A: // akwarium/barium/estuarium/herbarium/seminaria
@@ -310,7 +311,7 @@
attaché _%at%aSe@ // correct pronunciation: (handels-/inligtings-)attaché
attrib (u %atr@b // move default stress: attribuut/bute/attributêr
K) au @U // trauma/-ties/Aucamp/Paul/-a/-us
auer aU@r //Sauer etc. fixed au and e sounds in compounds.
auer aU@r //Sauer etc. fix au and e sounds in compounds.
augustus %Ox2WstWs
avokado %af%ukA:du // stress and o sounds
avokade %af%ukA:d@ // variant form of avokado
@@ -431,7 +432,8 @@
bo (grond bo@ // fix 1st o sound: bogronds/-e
_) bo (kle bo@ // fix o sound: bokleed/boklere
bokma (kier b%Okm%a // fix stress and a sound: bokmakierie/-s/-tjie
bom (AA bOm_ // fix a sound, pause: bomaanval/-aanslag/-aard/-eenheid and compounds
bom (AA bOm_ // fix a sound, pause: bomaanval/-aard/-eenheid and compounds
bomaans (la bOm_A:ns // fix o sound: bomaanslag/-aanslae
bomaans bo@mA:ns // but fix O sound: bomaans/-e
bonde (C bOnd@ // verbondenheid/bondeldraer/gebondene/saambondelend
boos (aardig b%o@s_ // move default stress: boosaardig/-e/-heid
@@ -526,6 +528,7 @@
bakate (l b%ak@t& // fix stress and vowel sounds: bakatel/-le/-letjie
baken bA:k@n // fix e sound: afbakening and compounds
bakte (ri b%akte@ // fix stress and e sound: bakterie/-ë
balalaika b%al%alaIk%a // fix a sounds and stress: balalaika/-s/-musiek
_) bam (boes b%am // move default stress: bamboes/-e/bamboesfluit...
ba (nalA b%a // fix stress and 1st a sound: banale/banaliteit
band (Alier b,and // fix stress and d sound: band(e/o)lier/-e
@@ -547,6 +550,7 @@
ba (sieli b%a // fix stress and 1st a sound: basielie/-kruit, etc.
basotho b%asut%u // fix stress and vowel sounds: Basotho/-0ponie and similar
basi (s bA:s@ // basis and compounds
basilie b%asil%i // fix a sound and stress: basilie/-kruid, etc.
bastille b%asti:l // Bastille and compounds like Bastilledag
batal (jon b%at%al // shorten 1st a sound, moved stress: bataljon and compounds
ba (tik b%a // fix stress and a sound: batik/-doek/-kuns/-werk
@@ -646,6 +650,8 @@
bere (_ be@r@ //tediebere pandabere etc.
_) ber (C b&r // fix e sound: Bert/Berta/Bertie/Bertus/berke/-boom
beste (_ bEst@ // fix e sound: beste/allerbeste/naasbeste/-s
beton (C@ b@tOn // split ng sounds: betongebou/-gietsel/-gruis
beton (inC@ b@t'On // fix O sound: betoninrigting/-ingenieur
be (weging b@ // draaibeweging/swaaibeweging
bewende be@v@nd@ // first e pronounced long
bewe (rig be@v@ // fix e sound and stress: bewerig/-e/-heid
@@ -749,6 +755,7 @@
dia (C d%i%a // diabeet/diafragma/diagnose/dialek/dialoog/diamant
diaken d%iA:k@n // diaken and compounds
diako (nie d%i%ak%u // fix stress and o sound: diakonie/-ë
diende dind@ // fix last e sound in many compounds of bediende: bediendekamer
diens (willi d%ins // move default stress: dienswillig/-e/-heid
dieper (@ dip@r // fix e sound: diepere/dieperliggend/-e
digi (ta d%ix2%i // move default stress: digitaal/digitale
@@ -983,6 +990,7 @@
@C) e (reekK @ // fix e sound: duine-/rotsereeks
aai) e (C @ // fix e sound: baaierd/waaierstert/paaiement/compounds starting with baaiers-
lat) eres @r@s //lateres
@C) erm (K &r@-m // a catch-all for words ending in -erm(s)
fp) ers (_ &rs // fix e sound: dof-/gif-/olyf-/tydskrifpers, etc.
bloup) ers &:rs // fix e sound: bloupers
iew) ers (ter @rs // fix e sound: (l)iewerster
@@ -1074,6 +1082,7 @@
p) e (talje @ // fix stress and 1st e sound: petalje and compounds
l) e (moen @ //fix lemoen and compounds
Cy) e (C+ @ // fix connecting e sound in compounds like byekorf/skilderyemuseum, etc.
effe (kleur Ef@ // fix stress and 2nd e sound: effekleur(ig/-e)
eier eI@r // eiergeel/eierwit/leierfiguur/leiergroep
@C) ei (land _,eI // insert short pause: skiereiland and many -eiland compounds
@) ei (sen _'eI // (on)veeleisend/spoedeisend
@@ -1451,6 +1460,7 @@
een (Cjie e@:iN // eendjie/Leentjie/steentjies
een (vorm %e@n // move default stress: eenvormig/-e/-heid
_) een (voud@ %e@n // stress on 2nd slb: eenvoudig, but on 1st: eenvoud
eend (agtig %e@nt_ // fix d sound, insert pause: eendagtig/-e/-heid
eerbied (A e@rb'id // eerbiedig/ing
eerbiedw %e@rb%itv // eerbiedwaardig/eerbiedwekkend
_) eerw %e@rv // stress: eerwaarde
@@ -1589,6 +1599,7 @@
flu (we fl%y // move default stress: fluweel/fluwele and compounds
_) fok (o fOk_ // fix o sound, insert short break: fokop/fokof
folio fo@li_u // fix o sounds: folio and compounds
fondsw fOntsv // fix v sound: fondswerwing & compounds/-waardes
fondue f%Ondy // fix stress and ue sound: fondue and compounds
fone (tiek f%o@n@ // fix e sound: fonetiek and compounds
fone (tie f%une@ // fix stress and o sound: foneties/-e
@@ -1602,6 +1613,7 @@
formi (da f%Orm%i // move default stress: formidabel/-e
formu (lier f%Orm%y // move default stress: formulier/-e/-boek
_) for (se_ f'Or // stress back to 1st slb; se rule: _) for (C
forse (nd fOrs@ // fix e sound: forsend/-e
fos (fa f%Os // move default stress: fosfaat/fosfate
fo (ssiel f%O // move default stress: fossiel/-e and compounds
foto fo@tu
@@ -1694,6 +1706,7 @@
_) gra (na x2r@ // granaat(boom)/granate
grandi (o x2r%and%i // move default stress: grandioos/-ose
_) gra (vA x2r%a // fix stress and a sound: gravin/-ne/gravure
grenadella gr@n@d&la // fix stress and vowels: grenadella and compounds like -heining
griekwa x2rikwa // fix w sound and a sound in compounds: Griekwa/-land, etc.
ouCa) gr (ootjie x2r' // move default stress: ouma/oupagrootjie/-s
_) graad (e x2r%A:t_ // fix stress and d sound: graadeen(tjies)/-elfs
@@ -1726,6 +1739,7 @@
gegesel x2@x2e@s@l // fix middle e sound
K) gele (_ x2e@l@ // fix stress and e sound: (eier)gele
_) geler x2e@l@r // stress and 1st e sound: geler/gelerig
_) gell x2&l
gemel (d x2@m&l // fix e sound: bo-/bowe-/laas-/meergemeld/-e
gems x2Ems // fix e sound: (baster)gemsbok/-bul/-ooi, etc.
gene (_ x2e@n@ // gene/diegene
@@ -1741,7 +1755,7 @@
_) ge (ossP2 x2@ // but ge- prefix: geossilleer/geossifiseer, etc.
ni) ge (ri x2'e@ //nigeriese etc.
gese (_ x2'e@s@ //Portugese, and others
gesp (etjie x2Esp // fix e sounds: gespetjie/-s
gespe (_ x2Esp@ // gespe and compounds
gespes (_ x2Esp@s // gespes and compounds
gewens (g x2e@v@ns // (on)vergewensgesind/-e/-heid
@@ -1847,6 +1861,7 @@
hart (stogte_ h%art // move default stress: hartstogtelik
hart (stogte_N hart // restore default stress: hartstogte
ha (we hA: // fix stress and a sound: hawearbeider/lewendehaweafdeling
_) hef (a hEf_ // fix e sound, insert break: hefapparaat/-arm(s)
hia (sint h%ij%a // fix stress: hiasint/-e and compounds
_) hi (bis h%i // move default stress: hibiskus/-se and compounds
hierna (maal h%i:rnA: // fix stress and a sound: hiernamaals/-e
@@ -1984,6 +1999,7 @@
_) idi (o %id%i // idioom/idiome/idioot
_) id (A %id // idille/idillies/ideëryk
&l) iker (C @k@r // fix i sound: menslikerwys/redelikerwyse, etc.
&l) iker (_ @k@r // fix i sound: afstootliker/(ge)redeliker/onberispeliker
illumi (nA %il%um%i // fix stress and vowel sounds: illuminasie/illumineer/illuminati
illu (si %ily // illusie/-s/illusief
illu (strA %il%W // fix i sound: illustreer/illustrering/illustrasie
@@ -2114,6 +2130,7 @@
_) in (a@P2 In // inakkuraat/inaktief/inaktiwiteit
_) inbe (lC Inb%& // fix e sound in compounds like inbelprogram
indone (si @nd%uni: // fix stress and vowel sounds: Indonesië/Indonesiese
s) in (gestel @n // split n g: compounds with ingesteldheid/winsingestelde
_) in (oe In_ // fix i sound, pause: inoefen/-oes and derivatives
invest (eer @nv%Est // fix stress, v and e sounds: investeer/-der
investe (r@ @nv%Este@ // fix e sound: (kapitaal)investering/investerende
@@ -2269,7 +2286,7 @@
klaarblyklik klA:rbl'eIkl@k // klaarblyklik/e
kla (kous klA: // fix stress and long a sound: klakous/-e
klande (sti kl%and@ // move default stress: klandestien/-e
_) kla (sA@@ kla // klasaantekeninge/klasonderwyser and other compounds
_) klas (A@ klas_ // klasaantekeninge/klasonderwyser/-opdrag(te)/-ure and other compounds
kla (ssiek kl%a // move default stress: klassiek/-e
klavesimbel klA:v@s@mb@l // fix v and e sounds: klavesimbel and compounds
kla (vier kl%a // klavier and many compounds
@@ -2324,10 +2341,11 @@
krieketw krik@tv //krieket followed by w in compounds always v

krokodi (l kr%Ok@dI // (wyfie)krokodil/-le
kro (niek kr%u // fix stress and o sound: kroniek and many compounds
kruger kr'Y@@r
ku (ba@ k%y // move default stress: kubaan/kubane
ku (biek k%y // move default stress: kubiek/-e/-getal
_) kuber kyb@r // fixed e sound: kuberruim(te)
_) kuber kyb@r // fix e sound: kuberruim(te)
kulin k%Wl%in // Move default stress and fix u sound: kulinër/-e
@) kundi (g k'Wnd@ // wiskundige/onoordeelkundigheid and many similar
kurwe kWrv@ // fix e sound: kurwes/skurwebas/skurwebek/skurwepadda
@@ -2359,11 +2377,13 @@

kabine (t k%ab%inE // kabinet/drankkabinet/-te/kabinetsvergadering
_) ka (d@ k%a // stress and 1st a: kadawer-/kadet-/kado/kadot(jie)/kadriel,etc.
kadet (A k%adEt_ // fix e sound, insert pause: kadetorkes/-offisier/-oefening, etc.
ka (der kA: // restore stress on long a: kader/-s and compounds
kad (mium kad // fix stress and d sound: kadmium and compounds
kafe (te k%af@ // fix stress and vowel sounds: kafeteria and compounds
kafe (ï k%af%i // fix stress and vowel sounds: kafeïene and compounds
ka (jak k%a // fix stress and 1st a sound: kajak/-ke/-vaarder
kakao k%akA:w // fix stress and vowel sounds: kakao and many compounds
kake (C kA:k@ // kakebeen/skakelaar/skakelbord/skakelfunksie
kalahari kalah'A:ri // stress: Kalahari/-sand/-woestyn
_) ka (lAnC k%a // kalender and compounds/kalant/kalander and compounds
@@ -2544,6 +2564,7 @@
kontrasep k%Ontr%asEp // fix stress and e sound: kontrasepsie and derivatives
kontrover (s k%Ontr%uv&r // o and v sounds: kontroversie/kontroversieel
kop (o kOp? // fix o sound: koponderstebo/kopomdraai/kopoperasie/gryskoponderwyser/poenskopolifant
kop (agtig k%Op_ // fix o sound, insert break: hamer-/spinnekop-/penkopagtig(e(s))
kopu (lA k%Op%y // fix o sound: kopulasie/kopuleer and derivatives
_) kor (dA k%Or // kordaat/kordon
ko (rint k%u // fix stress and o sound: korint/-e and compounds
@@ -2656,6 +2677,7 @@
loboto (mie l%ub%Ot%u // fix stress and o sounds: lobotomie
lo (ja l%u // fix stress and o sound: lojale/lojaliteit
lo (kalA l%u // fix stress and o sound: lokale/ontvangslokale, etc.
loke (t l%ukE // fix stress and vowel sounds: many compounds with loket
lom (bardA l%Om // move default stress: Lombardies/-e/Lombarde
_) lore (C@ lo@r@ // fix e sound: verloregaan/verloregoederekantoor/Verlorerivier
_) losge (@P5 l'Osx2@
@@ -2738,6 +2760,7 @@
mando (lien m%and%u // fix stress and o sound: mandolien and compounds
mane (l m%an& // fix stress and e sound: (kerk)manel(le)punte, etc.
mane (wale m%an@ // fix stress and shorten a sound: manewale/-s and compounds
maneuvers m%anY@f@rs // fix last e sound: (krygs)maneuvers, etc.
_) mango maNg%u // fix g and o sounds: mangoboord/-sap/-'s
man (haft m%an // move default stress: manhaftig/-e/-heid
mani (akK mA:n%i // fix stress and 1st a sound: maniak/-ke and compounds
@@ -2805,6 +2828,7 @@
medisyne m@d@seIn@ //medisyne and compounds
meganies m@x2'A:nis
_) meege (@P5 m'e@x2@
_) meegewe (nd me@x2e@v@ // fix e sounds and stress: meegewend(e)
me (juf m@ // move default stress and shorten e sound
me (laats m@ // fix stress and e sound: melaats/-e/-heid
melancholie (_N m%El%aNk%o@li // fix stress and 1st e sound: melancholie
@@ -2946,6 +2970,7 @@
morf (otomie m%Orf // move default stress: morfotomie
_) morr (i mOr // restore default stress: morrig/morrie/-doring
_) mors (@ mOrs // restore default stress: morsaf/morsdood/morsig
mos (agtig mOs_ // fix o sound, insert break: (kos)mosagtig(e)
mosam (biek m%o@s%am // move default stress: Mosambiek/-er/-se
mosa (ïek m%o@s%a // move default stress: mosaïek and compounds
mo (skee m%O // move default stress: moskee/-s and compounds
@@ -3035,7 +3060,8 @@
ne (anderCa n%i // move default stress: Neander(d/t)al/-ler
neger (in n%e@x2@r // move default stress: negerin/-ne
ne (gosie n@ // fix stress and e sound: negosie/-ware, etc.
nek (om n&k_ // fix e sound, insert pause: nekom(ge)draai
nek (_ n&k // catch-all for words ending in -nek: koedoe-/swaannek
_) nek (A n&k_ // fix e sound, insert pause: nekom(ge)draai/-operasie
nekta (rien n%Ekt%a // fix stress and a sound: nektarien/-perske, etc.
neo (li n%i%u // fix stress and vowel sounds: neolities/-e/neolitikum
ner (veu n%&r // move default stress: nerveus/-e
@@ -3080,6 +3106,7 @@
nood (lotti n%o@t // move default stress: noodlottig/-e
nood (saak n%o@t // move default stress: noodsaaklik/-e/-heid, vs. noodsaak
nood (saak_N no@t // restore default stress: (ge)noodsaak
nooien (tjie noIN // remove the e sound: nooientjie(s) and compounds
noord (oos n%o@rt_ // move default stress: noordoos/-te/-telik/-e
nor (ma@ n%Or // normaal/normaalweg/normale/abnormaal/-ale
nostal (gie_N n%Ost%al // stress on last slb.: nostalgie
@@ -3196,6 +3223,7 @@
ofoon uf'o@n // mikrofoon/sakso(saxo)foon
ofone uf'o@n@ // mikrofone/sakso(saxo)fone
ograaf ux2r'A:f // biograaf/demograaf/fotograaf
ografeer ux2raf'e@r // fix o sound: (ge)fotografeer
ografie ux2raf'i // biografie/demografie/fotografie
ografies ux2r'A:fis // biografies/demografies/fotografies
ograwe ux2r'A:v@ // biograwe/demograwe/fotograwe
@@ -3417,6 +3445,7 @@
ooi oI
ooy oI
oodjie oIci
CC) ool (A o@l_ // insert break: skooluur/-ure, steenkooluitvoer, but not: Karoolug
ootjie oIci
oontjie oINki
oondjie oINki
@@ -3483,6 +3512,7 @@
oot (moedig %o@t // move default stress: ootmoedig/-e/-heid

.group op
_) opaal %o@pA:l // fix o sound, remove break: opaal and compounds
opaat up'A:t // homeopaat/psigopaat and similar
opatie upat'i // homeopatie/neuropatie and similar
opaties up'A:tis // psigopaties/osteopaties and similar
@@ -3578,6 +3608,7 @@
pol (vy p%Ol // move default stress: polvy/-e and compounds
pomelo p%ume@l%u // fix stress and o sounds: pomelo(sap/-drankie...)
_) pon (dok p%On // move default stress: pondok/-ke/-kie
pop (agtig p%Op_ // fix o sound, insert break: popagtig(e) and compounds
popu ,pOpy
_) por (C %pOr //portret portaal etc.
por (ie p%o@r // move default stress: porie/-ë
@@ -4101,6 +4132,7 @@
sirene s@re@n@ // move default stress and fix vowel sounds: sirene/-s/-lied/-sang
si (troen s@ // move default stress: sitroen and compounds
sitronella s@tr%un&l%a // fix stress and vowel sounds: sitronella and compounds
s (juffrou s // fix s sound: kuns-/kos-/geselskapsjuffrou, etc.
skade skA:d@ // elik suffix rule breaks a sound of (on)skadelik
skadu skA:dy // skaduagtig/skadutjie
skaker (ing sk%ake@r // skakering/-s/kleurskakering
@@ -4118,6 +4150,7 @@
sker (muts sk%&r // move default stress: (ge)skermutsel/skermutseling/-e
skerpi (oen sk%&rp%i // move default stress: skerpioen/-e and compounds
skilder (y sk@ld@r // move stress to y: skildery and compounds like skilderymuseum
skim (agtig sk@m_ // fix i sound, insert break: skimagtig(e)
skisofr (e sk%is%ufr // fix stress and o sound: skisofreen/skisofrene
skle (rose skl@ // fix stress and e sound: sklerose and compounds
_) skok (AP4 sk''Ok_ // fix o sound and stress: skokaankondiging/-effek/-insluiting/-onthulling...
@@ -4252,6 +4285,7 @@
_) su (meri s%u // fix stress and u sound: sumeries/-e
su (mmier s%W // move default stress: sumier/-e
super (A s''yp@r_ // fix stress, break in compounds like superintelligent
superi (A s%up%e@r%i // fix stress and vowel sounds: superieur/superioriteit
superintendent s,upr@nt%EndEnt // fix stress and vowel sounds: superintendent and compounds
surro (ga s%Wr%u // fix stress and o sound: surrogaat/surrogate and compounds
su (saC s%u // fix stress and u sound: susan/-na/susara
@@ -4271,6 +4305,7 @@
swepe swe@p@ // fix w sound: rubberswepe
sw (erm sw // fix e sound: naderswerm
switser swIts@r // fix e sound: Switserland/Switserse
sypel (end seIp@l // fix e sound: sypelend/-e

.group se
se (_ s@ //the word se and some ending in se
@@ -4411,6 +4446,7 @@

stede (_ ste@d@ //voorstede, hoofstede etc.
stele (_ ste@l@ //kastele lepelstele etc.
stema (_ ste@ma // fix e sound: doods-/gespreks/-herhalingstema and many similar
stene (_ ste@n@ //skoorstene, bakstene etc.
sten (sil stEn // fix e sound in compounds like wolbaalstensil
chri) stene (_ st@n@ //fix christene and compounds
@@ -4561,7 +4597,7 @@
toe (riste@ t%u // move default stress: toeristebedryf/-sentrum and similar
toer (n t%ur // move default stress: compounds of toernooi
toere (_ tu:r@ // restore default stress
toi (let t%OI // move default stress: toilet and compounds
toilet t%OIlEt // move default stress: toilet and compounds: toiletartikel/-emmer/-opsigter
tokke (lo t%Ok@ // move default stress: tokkelos/-sie/tokkelok and compounds
tok (tokk t%Ok // move default stress: toktokkie/-s/-spelery, etc.
tombola t%Ombo@l%a // move default stress: tombola and compounds
@@ -4574,6 +4610,7 @@
@) toris (_ t'o@r@s // fix stress: pectoris/klitoris
_) tor (nyn t%Or // move default stress: tornyn/-e and compounds
_) tos (ka t%Os // move default stress: Toskaanse/Toskane
tser (tjie ts@r // fix e sound: (skoen)poetsertjie/weerkaatsertjie
ttel t@l // many compounds of bottel/skottelgoed
tuberkulose t%yb@rk%ylo@s@ // fix stress; e sound in compounds: tuberkulose/-behandeling
tug (A tWx2_ // fix u sound: (on)tugondersoek/-oortreding/-ordonnansie
@@ -4875,6 +4912,7 @@
_) vanklik faNkl@k // (on)ontvanklik/-e/-er/-heid
vanself (spr f%ans%&lf // move default stress: vanselfsprekend/-e/-heid
vari (A v%ar%i // fix v sound and stress: variasie/-s/varieer
va (sal v%a // fix stress and v and a sounds: vasal/-le
vaseline v%as@lin // fix stress, v and vowel sounds: vaseline/-bottel, etc.
vasste (l fast& // fix e sound: vasstel(ling/-lende)
_) vat (A@ fat_ // fix a sound: vatafstand/-orgaan
@@ -4943,9 +4981,11 @@

ve (l f& // maagvel, stress on 1st slb
@) vel (A fe@l // aanbeveling/aanbevelingsbrief
vel (djie f&l // fix -djie sound: veldjie(s) and compounds
veld (C f&lt // fix d sound: veldreuk/-radio/-rantsoen, etc.
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 (t f&l // eliminate double t sound: veldtog and many compounds, Langeveldt, Springveldt
vele f'e@l@
ven (detta v%En // fix stress and v sound: vendatta and compounds
ven (dusie f@n // fix stress and e sound: vendusie and compounds
@@ -5048,7 +5088,7 @@
vol (kome f%Ol
vo (llA_ fO // volle/vollê/Volla - exception to: vo (lC f%O
volle (dig f%Ole@ // fix stress and e sound: (on)volledig/-e/-heid...
voll (engte fOlE
volle (ngte fOlE
vo (ller fO // exception to: vo (lC f%O
volles (_ fOl@s // fix stress and e sound: volles/passievolles, etc.
vol (hou_ fOl // exception to: vo (lC f%O
@@ -5204,6 +5244,7 @@
waardeer vard'e@r // waardeer/waardeerder
waarder (@ vard'e@r // waarderend/e/waardering
&) waardig v'A:rd@x2 // stress on -waardig: merkwaardig/besienswaardigheid, etc.
waar (din v%A:r // fix stress: waardin/-ne
waar (neemba v%A:r // move default stress: waarneembaar/-bare
C) waarts vA:rts // fix w sound: dakwaarts/huiswaarts/kerkwaarts/noordwaarts/weswaarts
wêrel (djie v&:r@l // fix -djie in wêreldjie and compounds

+ 6
- 5
dictsource/ar_list View File

@@ -251,11 +251,12 @@ $ duulaar
كغم kiluu||gHraam
طن t[un
كم kiiluu||mitar
سا saaAa
م mitar
س su?aal
ج dZawaab
ص s[afHah
سا saaAa
// Units below conflict with single letter name
// م mitar
// س su?aal
// ج dZawaab
// ص s[afHah
// العملات
د.ج diinaar||dZazaa?irij
$ duulaar

+ 12
- 11
dictsource/en_list View File

@@ -1047,6 +1047,7 @@ autocracy O:t'0kr@si
automobile O:t@m@bi@l
automaton O:t'0m@t@n
autopsy O:t20psi
?3 aurora $2
avalanche av@laanS
avast $alt3
avatar ava#tA@
@@ -1668,7 +1669,7 @@ derogative $2
descant dEskant
descry dI#skreI
desert dI#z3:t
desert dEz3t $only
desert dEz3t $onlys
desert dI#z3:t $verb
desi deIsi
desolate dEs@l@t $only
@@ -2228,7 +2229,7 @@ idevice $alt6
idly aIdlI
idiocy IdI@si
ifrog $alt6
ignoramus Igno@r'eIm@s
ignoramus IgnO@r'eIm@s
illiterate $alt2
illumine $alt2
imagery ImIdZri
@@ -2716,6 +2717,7 @@ nonsense n0ns@ns
nonetheless nVnD@l'Es
nosedive noUzdaIv
nosir noUs3:
?5 nosir noUsIR
not noUt // for noted, notable, etc
nots n0ts
(nôtre dame) noUtr@'dA:m
@@ -3420,7 +3422,7 @@ sincerest sIns'i@r@st
sinus saIn@s
siphon $alt2
sir s,3: $only
?5 sir s,VR $only
?5 sir s,IR $only
siren saIr@n
site saIt // for sited
ski ski:
@@ -3455,12 +3457,13 @@ sommelier s0m'Eli@
son sVn
sonar soUnA@
sonny sVnI
sooth su:T $only
sopapilla soUp@p'i:@
sope soUpeI
sorbet sO@beI
souffle su:fl'eI
soundbite saUndbaIt
souvenir su:v@n'i@3
sopapilla soUp@p'i:@
sorbet sO@beI
soyabean sOI@bi:n
specific sp@sIfIk
specimen spEsI2m@n
@@ -3568,7 +3571,6 @@ tallyho talI'hoU
tamale ta#mA:li
tampon tamp0n
tangerine tandZ@r'i:n
taoiseach ti:S@x
tapestry tapI#stri
tarantula t@rantS@l@
tardis $alt1
@@ -3913,6 +3915,7 @@ yer j3 $u+
ye ji: $u+
yea jeI
yessir jEss3:
?5 yessir jEssIR
yoghurt j0g3t
?3 yoghurt joUg3t
?3 yogurt joUg3t
@@ -4042,6 +4045,7 @@ Assam A:s'A:m
Assamese A:sA:m'i:z
Audubon O:d@b0n
Augusta $2
Austen O2stI2n
Baghdad $2
Bahawalpur $alt3
Bahia ba'i:@
@@ -4546,8 +4550,6 @@ Annise a#ni:s
?!3 Anthony ant@ni
Anton ant0n
Anya anj@
Aoife i:f@
Aoiffe i:f@
Aphrodite afr@d'aIti
Archibald A@tSIbO:ld
Archie A@tSi
@@ -4898,7 +4900,6 @@ Sabine sa#b'i:n
Salman sa#lmA:n
Samantha sa#manT@
(Santa claus) s'ant@||kl'O:z
Saoirse si@S@
Sarah se@r@
Sarisa $alt3
Seamus SeIm@s
@@ -4912,8 +4913,8 @@ Sheila Si:l@
Simon saIm@n
Sinead SI2neId
Sinéad SI2neId
Siobhan S@vO:n
Siobhán S@vO:n
Siobhan SI2vO:n
Siobhán SI2vO:n
Sonia s0nj@
Sophia soUf'i@
Sophie soUfi

+ 38
- 10
dictsource/en_rules View File

@@ -150,12 +150,16 @@
sw) a (m_ a
sw) a (nk a
ao eI0
mh) ao eI // Irish, e.g. 'mhaol' /weIl/
m) ao aU
p) ao aU
t) ao aU
ao (_ =aU
aois (_ i:S
aoise (_ i:S@
ao (ism aU
ao (ist aU
aoi (C i: // Irish, e.g. 'Aoife' /i:f@/
aoir (C e@ // Irish, e.g. 'Saoirse' /se@S@/
?3 aoir (C 3: // Irish, e.g. 'Saoirse' /s3:S@/
g) ao (l eI@
aor eI'o@
m) ao (ri aU
@@ -180,7 +184,8 @@
_n) a (tional a
@) a (tious 'eI
ell) a (trix @
a (triC 'eI
a (trix 'eI
a (trice 'eI
n) a (tur eI
n) a (tura a
&) a (ture_ @
@@ -512,7 +517,7 @@
_m) ag (ell a#dZ
Cp) age (_ eIdZ
pp) age (_ I2dZ
_ant) ag 'ag
_ant) ag (on 'ag
enr) ag (e_ 'eIdZ
outr) ag (e_ eIdZ
der) ag (e_ eIdZ
@@ -847,6 +852,7 @@
_) anony (m a#n0n@
_c) an (ood a#n
&) an (_ @n
&) an (ize @n
&) an (_$w_alt1+ an
?8 &) an (_ a#n
@u) an (_S1 n
@@ -1202,6 +1208,7 @@ calend) ar 3
_) as (in as
as (k aas
_) as (k aas
s) as (k as
_) as (n az
_) as (oc eIs
C) as (p aas
@@ -1227,6 +1234,7 @@ calend) ar 3
ass (u @S
ass (ump a#s
assur @SU@
_) ass (wh as
C) as (t aas
C) ast (ell aas
_bl) as (to as //not aa
@@ -1391,7 +1399,7 @@ _it_separ) ate (_ @t
au (m_ aU
_) au (nt aa
aur (_ O@
_) au (ror a#
?!3 _) au (rora a#
s) au (rus_ 'O:
@) au (ri 'O:
C) aus (_ aUs
@@ -1463,7 +1471,7 @@ _it_separ) ate (_ @t
may) be (_ bi:
_) be (CA bI#
_) bete (lg bi:t@
_) be (C% bE
_) be (C%+ bE
_) be (atiC b%i:
_) be (b bi:
_) be (cl bI#
@@ -1477,7 +1485,7 @@ _it_separ) ate (_ @t
_) be (kn bI#
_) belarus bEl@r'u:s
_) be (lC bE
_) be (llig bI#
_) be (llig+ bI#
_) be (re bE
_) be (sC bI#
_) be (stia bE
@@ -2150,6 +2158,8 @@ _it_separ) ate (_ @t
e (Cical 'E
e (CiuB i:
&) e (_
aoiC) e (_ @ // Irish, e.g. 'Aoife' /i:fe/
aoiCC) e (_ @ // Irish, e.g. 'Saoirse' /se@S@/
acB) e (_ %I
XC) e (_N i:
vert) e (b I
@@ -2377,7 +2387,9 @@ _it_separ) ate (_ @t
@x) ed (_S2vi d#
y) ed (_S2v d#
debut) ed (_S2 d#
edly (_S4m I#dl%i
edly (_S3m I#dl%i
nt) edly (_S4m I#dl%i
tur) edly (_S3v d#l%i
c) ed (e_ 'i:d
p) ed (e_ i:d
p) edal Ed@L
@@ -2567,6 +2579,8 @@ _it_separ) ate (_ @t
en (core 0n
&) ency (_ @ns%i
ency (cli %EnsI
_) en (dg@ %En
_) en (dp@ %En
k) en (d_ En
s) en (d_ En
t) en (d_ En
@@ -2771,7 +2785,7 @@ _it_separ) ate (_ @t
exp) eri (en i@rI2
XC) er 3:
th) er (@ 3:
h) er (@ %3
h) er (nan %3
X) er (A E#r
_h) eretical I#rEtIk@L
_qu) er 3:
@@ -2890,6 +2904,7 @@ _it_separ) ate (_ @t
&z) es (_S2 %I#z
&C) es (_S1i z
xus) es (_S2 %I#z
tamus) es (_S2 %I#z // hippopotamuses
es (carp I2s
es (cape %Es
es (capi %Es
@@ -3099,7 +3114,7 @@ _it_separ) ate (_ @t
&) ford (_S4 f3d
&f) ford (_S4 3d
for (see f%O@
for (ward f'o@ // straightforward
for (ward f'O@
ft (en f
&) ful (_S3i f@L

@@ -4288,6 +4303,8 @@ multip) ly laI
_) metall (ic m@tal
metabo m@t'ab0
_) meta (llu m%Eta
mh (ao w // Irish, e.g. 'mhaol' /weIl/
aoi) mh (e v // Irish, e.g. 'Caoimhe' /ki:v@/
&) mobile m@bi:l
_) mocha moUk@
mono (ga m@n'0
@@ -4299,6 +4316,7 @@ multip) ly laI
&) mouth (_ m@T
&) mouth (_$w_alt1 maUT
_) multi mVlti
_) multi (pl m,VltI
_) multi (@@P5 m,VltI

.group mi
@@ -5622,6 +5640,7 @@ multip) ly laI

.group re
_) re (C@ rI#
_) re (collec rE
_) reflex ri:flE2ks
_) reflexive rI#fl'EksIv
&Ct) red (_ @d
@@ -5847,6 +5866,10 @@ multip) ly laI
Co) s (Er z
Co) s (En z
e) s (d z
aoi) s (e S // Irish, e.g. 'Laoise'
aoi) seach S@x // Irish, e.g. 'Taoiseach'
aoi) sigh Si // Irish, e.g. 'Taoisigh'
aoir) s (e S // Irish, e.g. 'Saoirse'
_) se (clu sI#
secur sI#kjU@
_) se (duc sI#
@@ -5861,6 +5884,7 @@ multip) ly laI
@) s (head_ s
@) s (hill_ s
@) s (hous s
@) s (hors s
_) she' %Si:
A) sh (A_ =S
&) ship (_S4 SIp
@@ -5878,6 +5902,7 @@ multip) ly laI
&) s (ic_ z
n) s (ic_ s
ss (ic s
mu) s (e z
mu) s (ic z
ea) s (ie z
ea) s (il z
@@ -6082,6 +6107,8 @@ multip) ly laI
th (ill th
gh) th (A th
ee) thing DI2N
soo) th D
soo) th (say T
the (_ D
&) th (L03_ =T
ou) thed (_ Dd
@@ -6411,6 +6438,7 @@ contin) u ju:
j) ui (c u:
uir (_ jU@
n) ui (s ju:
?3 n) ui (s u:
r) uis (A u:z
r) ui (t u:
gr) ui (t u:I2

+ 4
- 4
dictsource/fa_list View File

@@ -1,5 +1,5 @@
// * Farsi Language fa (or Parsi or Persian) fa_list Version 3.133
// * This file writen by Shadyar Khodayari and Ehsan Esmaili who has managed collecting exceptional words. 05-10-2017
// * Farsi Language fa (or Parsi or Persian) fa_list Version 3.134
// * This file writen by Shadyar Khodayari and Ehsan Esmaili who has managed collecting exceptional words. 06-24-2017
//*********
// * This program is free software; you can redistribute it and/or modify *
// * it under the terms of the GNU General Public License as published by *
@@ -554,6 +554,7 @@ _) paRAntezbaste:
آموخت Amuxt
آموزد Amuzad
آموزش AmuzeS
آمپر AmpeR
آمپرمتر AmpeRmetR
آمپلیفایر AmpelifAjeR
آمپیریسم AmpiRism
@@ -5055,7 +5056,6 @@ _) paRAntezbaste:
درایه deRAje
درایو deRAjv
درایور deRAjveR
درباره daR'bAReje:
دربازکن daRbAzkon
دربدر daRbedaR
دربندکشیده daRbandkeSide
@@ -6809,6 +6809,7 @@ _) paRAntezbaste:
شدیدا Sadidan
شدیداللحن Sadidollahn
شدیم Sodim
شراادی SA:_d:jA:_R
شرافت SeRAfat
شراپنل SeRApnel
شراکت SeRAkat
@@ -6816,7 +6817,6 @@ _) paRAntezbaste:
شربت SaRbat
شرت 'SoRt
شرتکات SoRtkAt
شراادی SA:_d:jA:_R
شرشر SeRSeR
شرطه SoRte:
شرعا SaR?an

+ 3
- 3
dictsource/fa_rules View File

@@ -1,5 +1,5 @@
// * Farsi Language fa (or Parsi or Persian) fa_rules Version 3.133
// * This file writen by Shadyar Khodayari 05-10-2017
// * Farsi Language fa (or Parsi or Persian) fa_rules Version 3.134
// * This file writen by Shadyar Khodayari 06-24-2017
//*********
// * This program is free software; you can redistribute it and/or modify *
// * it under the terms of the GNU General Public License as published by *
@@ -4843,7 +4843,7 @@ L09L04) السّادات (_Sm8 ossAdAt
L09L09L09L09) م (L03L09L09L09_ ma

// Prefixes م
_) م (L03L09L03_$noprefixP1@ ma
_) م (L03L04L03_$noprefixP1@ ma
_) می (L03L09+$noprefixP2@ mi
_) می (آL09L09$noprefixP2@ mi
_) می (وL09L09$noprefixP2@ mi

+ 27
- 9
dictsource/fi_list View File

@@ -29,7 +29,7 @@ n &n
o o:
ö Y:
p pe:
q ku:
q qu:
r &r
s &s
t te:
@@ -370,22 +370,40 @@ yogurt jogurt:i

// Abbreviations

(à la) 'ala $dot // jonka mukaan
abc $abbrev
adhd $abbrev
os $abbrev $dot
ad $abbrev $dot // anno Domini, Herran vuonna
atk $abbrev
ay $abbrev // ammaatiyhdistys
ca $abbrev $dot // circa
dna $abbrev // elinkeinoelämän keskusliitto
eg esimerkiksi $dot // exempli gratia, esimerkiksi
em $abbrev $dot
ek $abbrev // elinkeinoelämän keskusliitto
ekr $abbrev $dot // ennen Kristuksen syntymää
etc et_setera $dot // et cetera, ym., jne.
ym ynn&_mu:ta $dot // ynnä muuta (etc)
eg esimerkiksi $dot // exempli gratia, esimerkiksi
eu $abbrev
hiv $abbrev
ict $abbrev
isbn $abbrev
it $abbrev
jne $abbrev $dot // ja niin edelleen
(à la) 'ala $dot // jonka mukaan
ky $abbrev $dot // kommandiittiyhtiö
oy $abbrev // osakeyhtiö
nro numero $dot
nvda $abbrev
os $abbrev $dot
oy $abbrev // osakeyhtiö
ry $abbrev $dot // rekisteröity yhdistys
usb $abbrev
utf $abbrev
ym ynn&_mu:ta $dot // ynnä muuta (etc)




// foreign words
blindsquare _^_EN
bluetooth _^_EN
daisy _^_EN
facebook _^_EN
talkback _^_EN
voiceover _^_EN
youtube _^_EN

+ 9
- 6
dictsource/fi_rules View File

@@ -165,13 +165,16 @@


.group q
q k
qq k:
q q
qq q:


.group r
r r

CA) rg (_ Rj // follow swedish pronunciation
_CA) rg (C Rj // follow swedish pronunciation
ruoan ru:an // Pronounce ruoan as ruuan. Include all inflections and compound words.
// eg. ruoanlaitto, ruoankin, arkiruoan

.group s
s s
@@ -197,9 +200,9 @@
.group u
u u
uu u:
ui wi
_) ui ui
_j) ui ui // [ui] sounds better than [wi] when stressed. Especially <jui> at the beginning of the word sounds bad if pronounced [jwi]
ui ui
// _) ui ui
// _j) ui ui // [ui] sounds better than [wi] when stressed. Especially <jui> at the beginning of the word sounds bad if pronounced [jwi]
uii u|i:
uo uo
uoo u|o:

+ 16
- 8
dictsource/it_list View File

@@ -1,6 +1,6 @@

// This file is UTF-8 encoded
// Updated 2017 april 28 by Christian Leo M, <[email protected]>
// Updated 2017 october 3 by Christian Leo M, <[email protected]>

// $alt change [e] or [o] in the stressed syllable to [E] or [O]
// $alt2 change [E] or [O] in the stressed syllable to [e] or [o]
@@ -102,6 +102,10 @@ _< min'oRe||d'I
_> madZ:'oRe||d'I
_〈 ap'E@-*ta||,angol'aRe
_〉 kj'uza||,angol'aRe
_〈 ap'E@-*ta||angol'ata
_〉 kj'uza||angol'ata
_【 ap'E@-*ta||lentikol'aRe
_】 kj'uza||lentikol'aRe
* aste@-*'isko $max3
$ d'Ol:aRI
% pe@-*tS'ENto $max3
@@ -111,7 +115,6 @@ $ d'Ol:aRI
\ kont@-*ob'a:R*a $max3
_| b'aR*a||ve@-*tik'ale
& 'a/nd
© k'O:pi||raIt
# kantSellet:o
@ ki'otS:ola
~ tilde
@@ -137,7 +140,6 @@ _‡ k@-*'otSe||lat'ina||d'Op:ia
_′ p@-*'imi
_″ d'Op:io||'apitSe
_‴ t@-*'iplo||'apitSe
_‼ esklamatsi'One
§ setsi'One
¶ pa*'ag@-*afo
_‐ legat'u:Ra
@@ -150,6 +152,8 @@ _‑ t@-*at:,ino||duni'one
ʔ glotalst'Op
ɡ dZ'i||vel'aRe||ok:luz'iva // U+0261
ɣ g'am:a||min'uskola // U+0263 voiced velar fricative
ß 'esse||ak'uta
ɑ 'alfa

_‣ punt'ato
◦ punt'ato
@@ -159,8 +163,6 @@ _‣ punt'ato
↓ f@-*'etS:a||_dZ'u
♭ bem'Ol:e
♯ dI'ezis
♥ 'asso||di||kw'ORI
❓ p'unto||inteR*ogat'ivo
_‧ sepaRat'oRe/

∞ infin'Ito
@@ -787,6 +789,7 @@ black bl'E:k
blackout bl'Ek'aUt
blind bl'aInd $onlys
blues bl'u:z
bluff bl'ef: $only
boiler $1
bonjour b,O:_Z'u:r
brioche b@-*I'oS
@@ -1020,7 +1023,7 @@ logging l'Oging
lord $alt $only
love l'O:v $onlys
lover $1
manche m'a:nS $only
manche m'a:nS $onlys
my _^_EN
myspace m'aI||sp'Eis
machine maS'in $onlys
@@ -2381,6 +2384,7 @@ ivano $2
jace _^_en $only
jack dZ'E:k
jackson _^_EN
jefferson $1
jacopo j'a:kopo
james _^_EN
jane _^_EN
@@ -2477,6 +2481,7 @@ paul p'O:l $only
peggy p'Eg:I
pericle $1
peter $1 $onlys
peterson p'Ete@-*s,on
pettarin $3 $only
peugeot p,EZ'o
piquet pik'E $only
@@ -3206,6 +3211,7 @@ distino $1
distintesi $2
disturbano $2
disturbino $2
dissuadere dissuad'eRe
divaghino $2
divaricano $2
diventino $2
@@ -4330,6 +4336,7 @@ situino $1
sloggiano $1
smagnetizzino $3
smascher $1
smascherano $1
smercino $1
sniffano $1
snodano $1
@@ -4673,6 +4680,8 @@ zuccherano $1
(quando capita) kw'ando||k'apita
(se capita) se||k'a:pita
(me capita) me||k'apita
(cosa capita) k'oza||k'a:pita
(come capita) k'ome||k'a:pita
(capitano tutte) k'apitano||t'ut:e
(che capitano) ke||k'apitano
(quando capitano) kw'ando||k'a:pitano
@@ -4775,6 +4784,7 @@ espellerl $2
esprimiti $2
evolverci $2
evolversi $2
facendomici fatS'endom,itSi
fammel $1
fattel f'at:el
fattoci $1
@@ -4825,7 +4835,6 @@ orientaci $3
pensaci $1
perdonatel $3
permettigli $2
pervenutaci $3
pizzical $1
pizzicami $1
portala $1
@@ -4841,7 +4850,6 @@ pulisciti $2
redigerl $2
raddrizzarl @-*ad:@-*its2:'a@-*l
rafforzal $2
regalaci $2
regalati $2 $atstart
regalavi $3
reinseritasi $4

+ 2
- 0
dictsource/it_listx View File

@@ -81,6 +81,7 @@ afonie afon'i;e
agadez $3
agapit $2
agave $1
agendine $3
agenzia $3
agenzie adZents'ie
agerol $2
@@ -137,6 +138,7 @@ allodol $2
alloggi $alt
allora al:'oRa
alluce 'al:utSe
alluci $1
almen $alt2
alope $1
alopecia alopetS'i:a

+ 18
- 4
dictsource/it_rules View File

@@ -1,7 +1,7 @@

// Italian translation rules
// This file is UTF-8 encoded
// Last update: 2017 march 31 by Christian Leo Mameli <[email protected]>
// Last update: 2017 october 3 by Christian Leo Mameli <[email protected]>
// letter groups
// A any vowel
// C any consonant
@@ -28,7 +28,7 @@
au a|%U
@C) a (_S1q a/ // lookup it_list without suffix
@i) a (_S1q a // lookup it_list without suffix
C) a (cY_ 'a
// C) a (cY_ 'a
@) a (co_ =a
@) a (ca_ =a
@) a (che_ =a/
@@ -37,14 +37,15 @@
@) a (bile_ 'a
@) a (ggine_ 'a
_) ae (r aE
avano (_ 'avano
avano (_ 'avano // verbs
a (tterA_ 'a
_) all' (P4t all
_) anch' (P5t ank
@) amo (L04_ 'amo // Pron.s verbs
Ci) amo (L04_ 'amo
@) ander (L04_ 'andE@-*
ate (L04_+ 'ate
ate (L04_+ 'ate
abb) assa (L07_ 'assa
_L04Z) auguri (_ 'awguRI
astano (_ 'astano // verbs

@@ -59,6 +60,7 @@
bbano (_ =b:ano // verbs
bacia (L07_ b'atSa
_) bagna (L07_ b'an^a
a) bbraccia (L07_ b:@-*'atS:a

.group c
c k
@@ -90,6 +92,7 @@
in) cer (L04_ =tSe@-*
cuocer (L04_ kU'OtSe@-*
compra (L07_ k'omp@-*a
_L04Z) capite (_ kap'ite/
_L04Z) capit (A_ k'a:p,it
_L04Z) capit (ano_ k'a:p,it
correr (L04_ k'o:R*eR
@@ -208,6 +211,8 @@
fob (A_ =fob
farma (ci_ f'a@-*ma
ferma (L07_ f'e@-*ma/
_) fatt (AL04_ f'at:
_ri) fatt (AL04_ f'at:

.group g
g g
@@ -504,6 +509,7 @@
qui (A kwj
_) quell' (P6t kwEll
_) quest' (P6t kwest
_) quant' (P6t kwant

.group r
r @-*
@@ -522,6 +528,7 @@
_) ripeter (L04_ @-*ip'E:te@-*
_) romper (L04_ @-*'ompe@-*
ca) re (zzaL07_ R'e
_) regala (tAL04_ @-*egal'a
C) rai (_ @-*'a:I
A) rai (_ R'a:I
rrai (_ R*'a:I
@@ -563,6 +570,8 @@
_) segna (L05_ s'en^a
in) segna (L07_ s'En^a
_)segnala (L07_ sen^'ala
specifica (L07_ spetS'ifika
stringi (L04_ st@-*'indZi/
A) scano (_ =skano // verbs
sciano (_ =Sano
A) schiano (_ =skiano
@@ -596,6 +605,7 @@
au) tentica (L07_ t'ENtIka/
a) ttiva (L07_ t:'iva
taglia (L07_ t'al^a
tira (L07_ t'iRa
L02) tre (_ t@-*'e
_) tutt' (P5t tut:

@@ -619,6 +629,7 @@
ustano (_ 'u:stano
C) uo (tano_ U'O
uomini (_ w2'Omini
fanc) u (lA_ 'u:

.group v
v v
@@ -636,6 +647,8 @@
_) vota (L07_ v'Ota
s) veglia (L07_ v'el^a
volta (L07_ v'Olta
venut (AL04_ ven'ut
_) v' (P2t v

.group w
w w2
@@ -696,6 +709,7 @@
man) zie (_ ts'i;e
me) zz dz:
amma) zziamo (L04_ _tsi'a:mo
sbara) zz (arL04_ ts:

.group


+ 4
- 2
dictsource/ka_emoji View File

@@ -926,7 +926,8 @@ $textmode
😖 შეცბუნებული სახე // [1F616]
😗 კოცნის გამომხატველი სახე // [1F617]
😘 სახე, რომელიც კოცნას აგზავნის // [1F618]
😙 კოცნის გამომხატველი სახე მომღიმარე თვალებით // [1F619]
😗 kissing face // [1F617]
//😙 კოცნის გამომხატველი სახე მომღიმარე თვალებით // [1F619] TODO: This breaks speaking "7".
😚 კოცნის გამომხატველი სახე დახუჭული თვალებით // [1F61A]
😛 სახე გამოყოფილი ენით // [1F61B]
😜 სახე გამოყოფილი ენითა და ჩაკრული თვალით // [1F61C]
@@ -938,7 +939,8 @@ $textmode
😢 მტირალა სახე // [1F622]
😣 შეუპოვარი სახე // [1F623]
😤 სახე ცხვირიდან გამომავალი ორთქლით // [1F624]
😥 იმედგაცრუებული, მაგრამ შვების გამომხატველი სახე // [1F625]
😥 disappointed but relieved face // [1F625]
//😥 იმედგაცრუებული, მაგრამ შვების გამომხატველი სახე // [1F625] TODO: This breaks speaking "3".
😦 შეჭმუხნილი სახე ღია პირით // [1F626]
😧 ტანჯული სახე // [1F627]
😨 შეშინებული სახე // [1F628]

+ 1
- 0
dictsource/lv_list View File

@@ -423,6 +423,7 @@ tikpat $2
tikvien $u2+
turpat $u2+
turpretī $u2
uzreiz $2
vienalga $2
vismaz $2


+ 31
- 11
dictsource/lv_rules View File

@@ -38,6 +38,7 @@
.L17 ai ais am ā ām ās ie iem o os // suffixes of certain adjectives finishing with ..ējais
.L18 am āk i u ot ēt os // suffixes of adverbs (apstākļa vārdi)

.L10 ~ at ie iz jā jā jāat jāie jāiz jāno jāsa ne no no pa pār pie pie sa vis // optional verb prefixes
.L20 ~ ne // optional negation prefix

// +---------------------------+
@@ -62,7 +63,6 @@
// +---------------------------+
// | Pronunciation of o |
// +---------------------------+
.L30 ō ȯ // uo pre/post fixes. If facultative writing is used, o is spelled as uo

// Default rules for o with succeeding consonants
.L40 č ģ ķ ļ ņ ŗ š ž // uo indicators — o is spelled as uo in words with Latvian soft consonants
@@ -204,7 +204,7 @@

// wide e ------------------------------------------------------------------------ //
// widening consonants follow
e (L25 E
e (L25< E
e (L25L25 E
// widening vowels follow
e (L25L24+ E
@@ -253,6 +253,7 @@
_L20) e (sat_+ _!e // esat
_L20) e (si_ _!e // esi
_L20) e (smu_ _!e // esmu
_L20) e (sot_ _!e // esot
_m) e (dūzL04_ e
_m) e (kL04_ e // Meka
m) e (lL88 E
@@ -261,6 +262,7 @@
_n) ere (tL04_ ERE // Nereta
n) e (rv E
p) e (rs e
pr) e (cL52z e
pr) e (L71L05_ e // prece
_pr) e (t e
pr) etē (@ ete:
@@ -287,6 +289,7 @@
t) ermo eRmo
t) e (st e
_t) e (v_ e // tev
_t) e (vi_ e // tevi
_v) e (lgL04_ e // Velga
_v) e (ltL04_ e // Velta
_v) e (ntL04_ E // Venta
@@ -337,7 +340,7 @@

// wide ē --------------------------------------------------------------------------- //
// widening consonants follow
ē (L25 E:
ē (L25< E:
ē (L25L25 E:
// widening vowels follow
ē (L25L24+ E:
@@ -372,6 +375,7 @@
gr) ē (kL01_ E:
izp) ē (t e:
_kāp) ē (c_ e: // kāpēc
_l) ē (L83+ e: // lēst
m) ēne (L83 e:ne
m) ē (rķ e:
_m) ē (s_ e: // mēs
@@ -425,7 +429,6 @@
ī i:

.group j
// A) j (@ :j
j j
_) jebk j%ebk // stress on 2nd syllable

@@ -483,11 +486,6 @@
o (L41+ o // o indicators after
o (JL41+ o

L30J) o uo // uo indicators before (facultative writing)
L30) o (+ uo
o (JL30 uo // uo indicators after (facultative writing)
o (L30+ uo

o uo // words with Latvian roots are more common
o (_++ uo // common ending for Latvian words
o (L40 uo // usually uo before soft (Latvian) consonants
@@ -541,6 +539,7 @@ L46L45L45) o (<< uo
arist) o o
ater) o o:
_aut) o (< o
bals) o uo
bandr) o o:
_bar) o (L12_ uo
bar) o (L65 uo // barot
@@ -575,12 +574,12 @@ L46L45L45) o (<< uo
dinam) o o:
disp) o o
eg) o o>
eir) o o
_ek) o o
eks) o o
ekspl) o o
ekvin) o o
elektr) o o:
ez) o o>
energ) o o:
enL87) o o
ent) o (@ o
@@ -588,6 +587,7 @@ L46L45L45) o (<< uo
epr) o o
ept) o (@ o
eur) o o
ez) o o>
gen) o o
get) o o
glik) o o
@@ -692,6 +692,7 @@ L46L45L45) o (<< uo
pomp) o o:
por) o o
pr) o (L90 o
_pr) o o
prop) o o
pseid) o o
raps) o o:
@@ -720,6 +721,7 @@ L46L45L45) o (<< uo
sol) o o:
son) o o
spid) o o
sp) o (L77++ uo
sport) o uo
sten) o (L65 uo
_sten) o o
@@ -763,6 +765,8 @@ L46L45L45) o (<< uo
gl) ob ob
g) ob (e ob
k) ob ob
l) ob (ē ob
l) oboto (m oboto
m) ob ob
_) ob (amL01_ ob // Obama
ob (je ob
@@ -806,6 +810,7 @@ L46L45L45) o (<< uo
m) od (u od
m) od (uš uod
n) od (L05_ o:d // ..node
n) od uod
_) od (ek od
od (erL51 uod
_) od (esL04_ od // Odesa
@@ -878,6 +883,7 @@ L46L45L45) o (<< uo
_d) ok (L01_ ok // doks
d) ok (u ok
fil) okok okok
gl) ok (sīn ok
g) ok ok
_k) okako (lL04_ okako: // kokakola
k) ok (L01 uo`k // koks with short uo, because of ambiguity
@@ -1063,6 +1069,7 @@ L46L45L45) o (<< uo
pr) om om
_pr) om (_ uom // prom
pt) om (L01_ o:m // ..ptoms
pt) om o>m
rd) om (L01_ o:m
r) om (b om
_r) om (L04_ uom // Roma
@@ -1217,6 +1224,7 @@ L46L45L45) o (<< uo
m) op op
net) op (_ uop
n) op (er+++ uop
n) opo (st uopuo
op (c op
op (en op
_) op (erL04_++++ o:p // opera
@@ -1320,6 +1328,7 @@ L46L45L45) o (<< uo
or (ien oR
_) origo (_ oRigo: // Origo
or (iģ oR
or (kā oR
or (ķest oR
or (L01_+ o:R // ..ors
_) or (L02_+ uoR // ore
@@ -1387,6 +1396,7 @@ L46L45L45) o (<< uo
p) os (tC@ os
p) os (te os
p) os (ter os
p) os (tind os
p) os (tī uos
p) os (tL01 uos
p) os (tL55m os
@@ -1402,17 +1412,22 @@ L46L45L45) o (<< uo
š) os (ej os
_t) os (te os
_t) os (tL01_ os // tosts
v) osto (k osto
_z) os (L06_ uos // zoss

.group ot

an) ot ot
ast) ot uot
av) ot uot
_bal) ot (ē ot
bankr) ot ot
b) ot (ān ot
d) ot (āc ot
d) ot (ē ot
er) ot (iL67 o:t
er) ot (is o:t
_er) ot (L01_ ot // Erots
_ez) ot ot
f) oto (_ oto:
g) ot (ik o:t
@@ -1423,6 +1438,7 @@ L46L45L45) o (<< uo
k) ot (an ot
k) ot (L51 ot
k) ot (l ot
_L10pr) ot (L13_ uot // (ne|sa..)prot(i|u)
lin) ot (ip ot
_l) ot (iņL04 ot // Lotiņa
l) ot (L05_ ot // ..lote
@@ -1433,22 +1449,25 @@ L46L45L45) o (<< uo
nepr) ot uot
_n) ot (L04_ ot // nota
n) ot (L50r ot
ot (āj uot
ot (k ot
m) otō oto:
_) oto (C< oto
pil) ot ot
_p) ot (ašL04 ot // potaša
p) ot (eL68 ot
pr) ot (am uot
pr) ot (e ot
pr) ot (o ot
pr) oto (š uotuo // protoš..
pr) otot (ip otot
pr) oto (t uotuo // ..protot
pr) ot (u_ uot
publisk) ot uot
r) ot (āc ot
r) ot (b ot
r) ot (er ot
r) ot (ē ot
r) ot (kaL77 o`t
sab) ot ot
sk) ot (L01_ ot
sl) ot (L04_ uot // slota
@@ -1566,6 +1585,7 @@ L46L45L45) o (<< uo
v v
// unstressed if starts as vis.. prefix
// except for words where vis.. is part of root
vecvec vetsvets
_) vi (sād v'i // visād
_) vi (sēd v'i // visēd
_) vi (skijL01_ v'i // viskijs

+ 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

@@ -1,170 +1,194 @@
sindhi
// This file is UTF8 encoded
// Letter Names, Numbers and exceptional pronounciation of Urdu


// The Letter names
ا alIf
ب be:
پ pe:
ت te:
ٹ te:
ث se:
ج Ji:m
چ ce:
ح bar.i:||
خ xe:
د da:l
ڈ da:l
ذ za:l
ر Re:
ڑ r.e:
ز ze:
ژ Ze:
س si:n
ش Si:n
ص sUa:d
ض zUa:d
ط tOe:
ظ zOe:
ع aIn
غ QaIn
ف fe:
ق qa:f
ک ka:f
گ ga:f
ل la:m
م mi:m
ن nu:n
_و va:O
ہ he:
ں ghUnna
ﮨ cho:ti:||he:
ھ dO||caSmi:||he:
ء hamzah
ی c#o:ti:||je:
ے bar.i:||je:
ئ h'amza
ۂ he:h'amza
_ؤ va:Oh'amza

َ z@b@R
ِ ze:R
ُ pe:S
ٰ ,alIfmaqs'u:r,a
ّ t,aSd'i:d
ً d'o:zab'ar


// The numbers
_0 bu're
_1 hi'ku
_2 ba:
_3 te
_4 ca:r
_5 pan'ja:
_6 ch'aha:
_7 sa'ta:
_8 ath'a:
_9 na'va:
_10 da'ha:
_11 jara:ha
_12 bara:ha
_13 tera:ha
_14 cOda:ha
_15 pa'dra:ha
_16 sora:ha
_17 satira:ha
_18 ari'rahan
_19 una'via
_20 viha:
_21 ek'kie
_22 bavi'a
_23 tevi'a
_24 cO'via
_25 panc'via
_26 cha'via
_27 sat'avia
_28 at:avia
_29 una:tie
_30 ti'ha
_31 ek'atiha
_32 battiha
_33 tettiha
_34 cO'tiha
_35 panc:tiha
_36 chat'tiha
_37 sat'tatiha
_38 att:atiha
_39 unuta:vie
_40 ca'li:
_41 ek'eta:rie
_42 ba:ite'rie
_43 te'ta:rie
_44 cOt'erie
_45 panci'terie
_46 cai'terieh
_47 sati'terie
_48 ati'terie
_49 urur'ja
_50 pan'ja
_51 ekvan'ja
_52 bavan'ja
_53 tevan'ja
_54 cOvanja
_55 pa:van'ja
_56 ca'vaja:
_57 sat:ur'ja
_58 at:ur'ja
_59 una:hat:i
_60 sa:thi
_61 eka:thi
_62 ba:hathi
_63 teha:thi
_64 cO'hathi
_65 panja'hathi
_66 ca:hathi
_67 sat'tathi
_68 at'thati
_69 un'ha't:har
_70 sata:ri
_71 ek'hat:ar
_72 ba'hat'ar
_73 te'hat'ar
_74 cOhat'ar
_75 pan'jat'ar
_76 cha'hat'ar
_77 sat'ta'tar
_78 at:hat'ar
_79 un'a:si
_80 a:si
_81 ek'ea'si
_82 bea'si
_83 tea'si
_84 cO'rasi
_85 panc'a:si
_86 chhajasi
_87 sat'tea:si
_88 at:ha:si
_89 ur'ra:nave
_90 nave
_91 ek'ka'navi
_92 bea'navi
_93 tea'navi
_94 cOra:navi
_95 panca:navi
_96 cha:navi
_97 sat'ta:navi
_98 at:tha:navi
_99 nava:navi
_100 sO

_0M1 haz'a:r
_0M2 l'a:kh
_0M3 kaR'o:R
_0M4 'aRab
_0M5 'k#aRab

_dpt _da:he_


// This file is UTF8 encoded
// Letter Names, Numbers and exceptional pronounciation of Sindhi
// The Letter names
ا alIf
ب be:
ٻ bE
ڀ b#e:
پ pe:
ت te:
ٿ t#e:
ٽ t.e:
ٺ t.#e:
ث se:
ج Ji:m
ڄ Je:
جھ J#e:
ڃ n^e:
چ ce:
ڇ c#e:
ح vad.i:||he:
خ xe:
د da:l
ڌ d#a:l
ڊ d.a:l
ڏ d.e:
ڍ d.#a:l
ذ za:l
ر Re:
ڙ r.e:
ز ze:
ژ Ze:
س si:n
ش Si:n
ص sUa:d
ض zUa:d
ط tOe:
ظ zOe:
ع aIn
غ QaIn
ف fe:
ڦ p#e:
ڪ ka:f
ق qa:f
ک k#e:
گ ga:f
گھ g#e:
ڳ ge:
ڱ N-e:
ل la:m
م mi:m
ن nu:n
ڻ n.u:n.
و va:O
ه he:
ہ Urdu:||he:
ھ dO||caSmi:||he:
ء hamzah
ي je:
ئ h'amza||je:
ۂ he:h'amza
ؤ va:Oh'amza
َ z@b@R
ِ ze:R
ُ pe:S
ٰ ,alIfmaqs'u:r,a
ّ t,aSd'i:d
ً d'o:zab'ar
ٗ Ubto:pe:S
// The numbers
_0 bUr.i:
_1 hIkU
_2 ba:
_3 t.e
_4 ca:R
_5 panJa
_6 c#aha
_7 sat:a
_8 at.#a
_9 nava
_10 d.aha
_11 jaraha
_12 baraha
_13 te:raha
_14 cOd.aha
_15 pandraha
_16 soraha
_17 satraha
_18 arr.aha
_19 Un.vi:ha
_20 vi:ha
_21 Ikvi:ha
_22 ba:vi:ha
_23 t.e:vi:ha
_24 co:vi:ha
_25 panJvi:ha
_26 c#avi:ha
_27 sata:vi:ha
_28 at.#a:vi:ha
_29 Un.at.i:ha
_30 t.i:ha
_31 Ikat.i:ha
_32 bat.i:ha
_33 t.e:t.i:ha
_34 co:t.i:ha
_35 panJati:ha
_36 c#at.i:ha
_37 satati:ha
_38 at.#ati:ha
_39 Un.ta:li:ha
_40 ca:li:ha
_41 Ikta:li:ha
_42 ba:Ita:li:ha
_43 t.e:ta:li:ha
_44 co:Ita:li:ha
_45 panJe:ta:li:ha
_46 c#a:Ita:li:ha
_47 sate:ta:li:ha
_48 at.#e:ta:li:ha
_49 Un.vanJa:h
_50 panJa:h
_51 IkvanJa:h
_52 ba:vanJa:h
_53 t.e:vanJa:h
_54 co:vanJa:h
_55 panJvanJa:h
_56 c#a:vanJa:h
_57 satvanJa:h
_58 at.#vanJa:h
_59 Un.ahat.#I
_60 sat.#I
_61 Ikahat.#I
_62 bahat.#I
_63 t.e:hat.#I
_64 co:hat.#I
_65 panJahat.#I
_66 c#a:hat.#I
_67 satahat.#I
_68 at.#ahat.#I
_69 Un.hat:aR
_70 sat:aR
_71 Ikahat:aR
_72 ba:hataR
_73 t.e:hataR
_74 co:hataR
_75 panJataR
_76 c#a:hataR
_77 satat:aR
_78 at.#ahataR
_79 Un.Ia:si:
_80 assi:
_81 IkIa:si:
_82 bIa:si:
_83 t.e:a:si
_84 cOo:ra:si:
_85 panJa:si:
_86 c#aha:si:
_87 satIa:si:
_88 at.#Ia:si:
_89 Un.Ia:nave:
_90 navve:
_91 IkIanave:
_92 bIa:nave:
_93 t.Ia:navE:
_94 co:Ra:nave:
_95 panJa:nave:
_96 c#aha:nave:
_97 satIa:nave:
_98 at.#Ia:nave:
_99 nava:nave:
_0C s'aU
_0M1 haz'a:r
_0M2 l'a:kh
_0M3 kaR'o:R
_0M4 'aRab
_0M5 'k#aRab
_dpt _d.aha:i:_
// word exceptions
آھي a:he: $u
آهن a:hIn $u
هن hIna
۾ me~ $u
۽ ae~ $brk
آهي a:he: $u
هڪ HIk
ٿي t#i: $u
ئي i:

+ 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

@@ -30,7 +30,7 @@ t tE
u u
ü y
v vE
w tS'ift||vE
w d'ab@LjU
x iks
y jE
z zE

+ 280
- 7
dictsource/ur_list View File

@@ -1,4 +1,4 @@
// This ur_list file is prepared by Him Prasad Gautam (Kathmandu, Nepal)
// This ur_list file is prepared by Him Prasad Gautam (Kathmandu, Nepal) and Ejaz Shah (Pakistan)
// This file is UTF8 encoded
// Letter Names, Numbers and exceptional pronounciation of Urdu

@@ -55,6 +55,8 @@ _ؤ va:Oh'amza
ّ t,aSd'i:d
ً d'o:zab'aR
ْ sUk'u:n
ٗ Ult.a:||pe:S
ٓ mada


// The numbers
@@ -190,8 +192,11 @@ _dpt _ISaRI'Ia_
جن J'In $u
جنھیں J,InH'e:n $u
انہوں ,UnH'o:n $u
انھوں UnHo:n $u
انہیں ,UnH'e:n $u
انھیں ,UnH'e:n $u
انھی UnHi $u
انہی UnHi: $u

// unstressed prepositions
کا $u
@@ -199,7 +204,7 @@ _dpt _ISaRI'Ia_
کے $u
سے $u

اور OR $u $brk
اور aUR $u $brk
کہ k'e:H $u
نے $u

@@ -329,7 +334,7 @@ _dpt _ISaRI'Ia_
حفاظت H,Ifa:z.'at
ہمت HIm'at
سمیت sam'e:t
اگرچہ ,agaRc'e:H
اگرچہ ,agaRc'e:H $pause
بلکہ b,alk'e:H
حصہ H'Is.,a
حصے H'Is.e:
@@ -677,14 +682,13 @@ _dpt _ISaRI'Ia_
کلک klIk
فکسنگ f,Iks'Ing
مانند ma:n'Ind $1
اتار Ut'a:R
آرکائیو ,a:Rk'a:jv
لنک lInk
فہرست fEHRIst
کیلئے ke:li:;e:
اگر agaR $u
اگر agaR $pause
ضرورت zaRu:Rat
مگر magaR $u
مگر magaR $pause
دیگر digaR
اہم EHEm
فیصد fis.ad
@@ -718,4 +722,273 @@ _dpt _ISaRI'Ia_
نصرت nUs.Rat
خاتون xa:tu:n
برتری baRtaRi
برتر baRtaR
برتر baRtaR
سن sUn
انھتر UnHataR
انیس Uni:s
ورلڈ vaRld.
فرق faRq
اوپر u:paR $1
اوپری u:pRi:
دودھ du:d#
اورئینٹل o:Ri;e:nt.al
انکار Inka:R
انکاری Inka:Ri
انیک ane:k
اونگ u:ng
اوک u:k
اویس ave:s
اویسی ave:si
اٹوٹ at.u:t.
اٹھ Ut.#
اٹھان Ut.#a:n
اک Ik
اکا Ika:
دکا dUka:
اکائی Ik'a:i
اکبر akbaR $1
وکی vIki
اکرم akRam $1
اکزیکٹیو Ikze:kIt.Iv
اکتا Ukta:
اکتایا Ukta:ja:
اکتاہٹ Ukta:Hat.
اکلو Iklo:
اکمل akmal $1
مملکت mamlIkat
قربت qURbat $1
مٹا mIt.a:
ٹیوب t.ju:b
سیہون sEHvan
عرس URs
اکھاڑ Uk#a:r.
اکے Ike:
آمیزش a:me:zIS
واحد va:HId
آنت a:nt
آنچل a:ncal
حجاب HIJa:b
حلقہ Halqa
لحاظ lIHa:z.
کیچڑ kicar.
گردش gaRdIS
مروت mURavvat
مزاج mIza:J
غربت QURbat $1
آویزش a:ve:zIS
پہر pEHER
آہ a:H
جگر JIgaR
دلدوز dIldo:z $1
رحمت REHmat
ابجد abJad
(رسم الخط) RasmUlxat
ابجدی abJadi
حروف HURu:f
ابر abR
ابراہیم IbRa:Hi:m
ابراہیمی IbRa:Hi:mi
ابرق abRaq
ابرنا UbaRna:
ابرو abRu:
کنول kV~val $2
ابل Ubal
ابلا Ubla:
ابلی Ubli:
ابلیس Ibli:s
الغرض alQaRaz
الوقت Ulvaqt
دہر dEHER
ظلم z.Ulm
ابو abu:
طالب ta:lIb
اپج UpaJ
اپچار Upca:R
اپدیش Upde:S
اپواس Upva:s
اپکار Upka:R
سرسری saRsaRi $1
متخالف mUtaxa:lIf
اتصالی ,ItIs.a:li
اتمام ItIma:m
حجت HUJat
اتھل Ut#al
پتھل pUt#al
اجازت IJa:zat $2
اجرا IJRa:
اجرت IJRa:
اجگر aJgaR
اجلا UJla:
اجلی UJli:
اجلے UJle:
اجماع IJma:
اجمل aJmal
اجنبی aJnabi
اجنٹ IJant.
اجنڈا IJand.a:
اچک Ucak
اچکا Ucka:
اجنب aJnab
اچھوت ac#u:t
اچھوتا ac#u:ta:
اچھوتی ac#u:ti
اچھوتے ac#u:te:
پرسی pURsi:
بالغیب bIlQEb $2
نگار nIga:R
کاغذ ka:QaD
اختری axtaRi:
اخذ axaD
جرات JURat
اخوت Uxu:vat
فہم fEHEm
جرمنی JaRmani
خدمت xIdmat
شریعت SaRi;at
ادت Idat
ادراک IdRa:k
تردد taRaddUd
خدمات xIdma:t
ادریس IdRi:s
ادب adab
ادغام IdQa:m
ادلال Idla:l
موا mu:a:
ادھر Id#aR
(ادھر ادھر) Id#aR||Ud#aR
ادھم Ud#am
اذالہ IDa:la
ارتھ aRt#
معلیٰ mUalla:
ارسال IRsa:l
ملیں mIle:n
ارشاد IRSa:d
ارض aRz
سلطنت saltanat
استاد Usta:d
استادی Usta:di
استر staR
بخدا baxUda:
بندش bandIS
خرد xURd
خردار xURda:R
خردہ xURda
خرشید xURSi:d
تبرک tabaRUk
خرم xURRam
خزاں xIza:n
پروردہ paRvaRda
خشک xUSk
خصوص xUs.u:s.
زمرد zamaRUd
جبلت JIbIll'at $2
بالآخر bIla:xIR
شعاع SUa:
حصار HIs.a:R
شدگی SUdgi:
بالاتفاق bIlItIfa:q
بالاجماع bIlIJma:
بالاجمال bIlIJma:l
بالاشتراک bIlIStIRa:k
بالاعلان bIle:la:n
بالجبر bIlJabR
بالعوض bIlIvaz
بالغرض bIlQaRaz
مرکزی maRkazi
بالفرض bIlfaRz
حکمت HIkmat
بالفعل bIlfe:l
بالمثل bIlmIsl
بالمختصر bIlmUxtas.aR
بالمشافہ bIlmUSa:fa
بالمعنی bIlma:ni
بالمقابل bIlmUqa:bIl
بالواسطہ bIlva:sta
نیند ni:nd
باوجودیکہ ba:vUJu:de:ke:
کتا kUt:a: $2
دکھاؤ dIk#a:o:
کتے kUt:e: $2
کتوں kUt:o:n
بپھر bIp#aR
شکن SIkan
بتکرار batakRa:R
بچھ bIc#
منجمد mUnJamId
بحر bEHER
بخدمت baxIdmat
منکشف mUnkaSIf
بخش baxS
بخشش baxSIS
جدت JIdat
بخوشی baxUSi:
بخیر baxE:R
بچپن bacpan
بچپنا bacpana:
قطب qUtUb
ذہن zEHEn
سلوک sUlu:k
انڈین Ind.i;an
متنبہ mUtanabe:
قیمتی qi:mti:
بدک bIdak
بذریعہ baDaRi:;a:
برا bURa:
نسبتی nIsbati
برتن baRtan
برج bURJ
برد bURd
بردہ bURda
رغبت RaQbat
برضا baRaza:
علاج Ila:J
الفت Ulfat
برگزیدہ baRgUzi:da
برہمن bRaHman
الذمہ UzzIma
صحبت s.OHbat
برے bURe:
بز bUz
بزم bazm
بستر bIstaR
مرگ maRg
بسکٹ bIskIt.
(بسم اللہ) bIsmIl:a:H
بسم bIsm
بسنت basant
بضد bazId
بعید bai:d
بغض bUQz
بقید baqE:d
(بلا واسطہ) bIla:||va:sta
بلال bIla:l
بلبل bUlbUl
بلبلے bUlbUle:
بلک bIlak
بلیک ble:k
مارکٹ ma:RkIt.
(بن بلائے) bIn||bUla:e:
(بن مول) bIn||mo:l
بنت bInt
سنور sV~vaR
بو bu: $only
بورڈنگ bo:Rd.Ing
بولنگ bo:lIng
امرت amRIt
(ان بجھا) anbUJ#a:
(ان بن) anban
(ان پڑھ) anpar.h
(ان گنت) an||gInat
قدرت qUdRat
انسلٹ Insalt.
انسیت Unsi;at
اللہ al:a:H
انصاف Ins.a:f
انصافی Ins.a:fi
تپش tapIS
انثیت Unsi;at
انجم anJUm
انجمن anJUman
الجھن UlJ#an
الحمد alHamd
التفات IltIfa:t

+ 110
- 28
dictsource/ur_rules View File

@@ -1,5 +1,5 @@

// This ur_rules file is written by Him Prasad Gautam (Kathmandu, Nepal).
// This ur_rules file is written by Him Prasad Gautam (Kathmandu, Nepal) and Ejaz Shah (Pakistan).
// This file is UTF8 encoded
// phoneme rules for Urdu
// Letter group - l01: Vowels
@@ -17,16 +17,18 @@
٩ 9
ي ی
یٰ ا
ٰی ا
آ آ


// vowel signs, alif acts as consonants at start of word if these follow
.L01 َ ِ ُ و ی ع ا ے

// Consonants
.L02 ب پ ت ٹ ث ج چ ح خ د ڈ ذ ر ڑ ز ژ س ش ص ض ط ظ غ ف ق ک گ ل م ن ہ ئ
.L02 ب بھ پ پھ ت تھ ٹ ٹھ ث ج جھ چ چھ ح خ د دھ ڈ ڈھ ذ ر ڑ ز ژ س ش ص ض ط ظ غ ف ق ک کھ گ گھ ل م ن ہ ئ

// Letter group - L03: Most of the letters
.L03 ا ب پ ت ٹ ث ج چ ح خ د ڈ ذ ر ڑ ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ہ ئ ی ے
.L03 ا ب بھ پ پھ ت تھ ٹ ٹھ ث ج جھ چ چھ ح خ د دھ ڈ ڈھ ذ ر ڑ ز ژ س ش ص ض ط ظ ع غ ف ق ک کھ گ گھ ل م ن و ہ ئ ی ے ٰ

// VOWELS

@@ -34,7 +36,7 @@
َ a
َی E
َے E
َو O
َو aU
َع a:

.group ِ
@@ -48,6 +50,9 @@
ُو u:
ُع O

.group ٗ
ٗ u:

.group ھ
ھ HV
ھ (_ H:
@@ -80,7 +85,7 @@ _) ای e:
افتتاح ,ItIt'a:H
اسلام ,Isl'a:m
_) انسان Ins'a:n
_) انت (L02 'Int,a
_) انت (L02L01 'Int,a
_) امید Um'i:d
اً(_S2 'an
_) امکان ,Imk'a:n
@@ -123,12 +128,65 @@ _) ای e:
_) است (L02 ,IstI
_) ارت (L02 ,IRtI
_) ادار Ida:R
_)انک(L02L01 InkI
_)انہتر UnHataR
_)او(ا av
_)انہ(L02L01 InHI
_)اٹھتال at.#ta:l
_)اٹھتر at.#at:aR
_)اٹھتیس at.#ti:s
_)اٹھلا It.#la:
_)اٹھ(و Ut.#
_)اکت(L02L01 IktI
_)اکسا Uksa:
_)اکٹھ(L01 Ikat.t.#
_)اکہر IkEHR
_)اکیل ake:l
_)ائ aI
_)ابال Uba:l
_)ابوال(P5 abUl
L02)او(L02 a:vV
_)ابھار Ub#a:R
_)اتار Uta:R
_)اترو(L01 UtaRv
_)ابکائ Ubka:
_)اجت(L02L01 IJtI
_)اجا(ر IJa:
_)اجال UJa:l
_)اجاڑ UJa:r.
_)اچھال Uc#a:l
_)اداس Uda:s
_)ادھار Ud#a:R
_)ادھڑ(L01 Ud#r.
_)ادھڑ Ud#ar.
_)ادھیڑ Ud#e:r.
_)ارا(د IRa:
_)اونچ u:nc
اں a~
_)انج(L02L01 InJI
_)امت(L02L01 ImtI
_)انح(L02L01 InHI
_)انخ(L02L01 InxI
_)انس(پ Ins
_)انس(L02L01 InsI
_)انس(ٹ Ins
_)انسٹھ Unsat.#
_)انشا InSa:
_)انش(L02L01 InSI
_)انص(L02L01 Ins.I
_)انض(L02L01 InzI
_)انق(L02L01 InqI
_)الت(L02L01 IltI
_)انف(L02L01 InfI
_)ال(L03L03L03P2 al

.group آ
آ a:
آتش 'a:tIS
آہست a:H'Ist
آئ (L02 'a:I
آمیز a:me:z
آویز a:ve:z


.group ع
@@ -141,6 +199,8 @@ _) ای e:
_) عمر 'UmR
L02) عی (_ 'ai:
علیحد 'alEHd
عُ 'U
عِ I

.group و
و o:
@@ -152,8 +212,11 @@ _) ای e:
وّ vv
L02L02L02) و (L02 u:
L02) ونکہ (_ u:nk'e:H
L02L01) و (L02 vV
L01) و (L01 v
_L02)و(L01 av
L01)و(L01 v
وؤ u:o:
L03L03L03L03)وں(S2 o:n
_L02L01)و(L02_ vV

.group ی
ی e:
@@ -162,12 +225,17 @@ _) ای e:
_) ی jV
یع(_ i:
@) ی i:
@) یں (_ e:n
@) یں (_ e~
یّ jj
@) یت (_S2 i:;'at
_) یو jO
ی (و e:
L02)یوں i;o:n
L03)یکشن e:kSan
L03L03L03L03)یں(S2 e~
یں e~
L03)یک(ٹ e:k
L03L01)یا(_S2 ja:

.group ے // yeh barree
ے e:
@@ -180,7 +248,7 @@ _) ای e:
ئ

.group ؤ
ؤ aU // ??
ؤ o:

.group أ
أ // ??
@@ -220,6 +288,12 @@ _) ای e:
بوڑھ b'u:r.h
_) بے (P2 b'e:
بحران b,OHR'a:n
_)بپھر(L01 bIp#R
_)بچھ bIc#
_)بخار bUxa:R
_)برائی bURa:i
_)بوا(ئ boa:
_)بزدل bUzdIl


.group پ
@@ -237,6 +311,7 @@ _) ای e:
پیچھ p'i:c#
پھونک p#'u:nk
_) پور (L01 p'u:R
_)پچھل(L01 pIc#l

.group ت
ت tV
@@ -254,10 +329,11 @@ _) ای e:
تجرب taJ'aRb
_) تیار t,ai:;'a:R
_) تیسر t'i:sR
L03L03) تا (_S2 ta:
L03L03)تا(_S2 ta:
L03L03) تی (_S2 ti:
L03L03) تے (_S2 te:
_) توا t'ava:
تہ(_ ta

.group ٹ
ٹ t.V
@@ -295,6 +371,7 @@ _) ای e:
_) جمل J'Uml
_) جہ (L02 J'EH
_) جدا J'Uda:
_)جذب JaDb

.group چ
چ cV
@@ -320,6 +397,7 @@ _) ای e:

حّ HHV
حّ (L01 HH
_)حیا Haja:

.group خ
خ xV
@@ -331,6 +409,8 @@ _) ای e:
_) خود x'Ud
_) خواہش xv'a:HIS
_) خیا x'aja:
_)خوا xva:
_)خدا xUda:


.group د
@@ -353,6 +433,7 @@ _) ای e:
_) دوسر d'u:sR
_) دین de:n
_) دیت de:t
دہ(_ da

.group ڈ
ڈ d.V
@@ -366,11 +447,9 @@ _) ای e:
ڈرائیور d.R'a:jvaR

.group ذ
ذ DV
ذ (L01 D
ذّ DDV
ذّ (L01 DD
_) ذہ (L02 D'EH
ذ zV
ذ (L01 z
_) ذہ (L02 z'EH

.group ر
ر RV
@@ -446,6 +525,7 @@ _) ای e:
_) شخص S'axs.
_) شہ (L02 S'EH
شرمند S,aRm'Ind
_)شمار SUma:R

.group ص
ص s.V
@@ -529,12 +609,13 @@ _) ای e:
_) گہ (L02 g'EH
گزارش gUz'a:RIS
_) گیت g'i:t
_)گزار gUza:R

.group ل
ل lV
ل (L01 l
لّ llV
لّ (L01 ll
لّ l:V
لّ (L01 l:
لکھ l'Ik#
_) لہ (L02 l'EH
_) لیت le:t
@@ -596,12 +677,12 @@ _) ای e:
_) نمٹ nIm'at.
_) نمٹ (L01 nImt.
@) ن (پ n
@) نچل n'Icl
_) نچل n'Icl
نشان nIS'a:n
@) ن (ڈ n
_) نظر naz.'aR
_) نظام nIz.'a:m
_) نہ (L02 n'H
_) نہ (L02 nEHE
L01) نٹ n't.
نھ nH
_) نکت n'Ukt
@@ -626,8 +707,8 @@ _) ای e:
ہ H
_) ہ (L01 H
_) ہ (ند HI
ہّ HHV
ہّ (L01 HH
ہّ H:V
ہّ (L01 H:

ہ (_ a
_) ہلن H'Iln
@@ -636,24 +717,25 @@ _) ای e:
_) ہم (L02L02L02P2 H'am

.group ّ
ّ
ّ :

.group ً
ً
ً an


// Common symbols

.group
$ do:l@R
, sVkat.Vh // Sakata سکتہ
! f'iJa:ja //Fijaya فجائیہ
; w'ak't'a //Waqfa وقفہ
, sakta // Sakta سکتہ
! f'iJa:ja //Fijaya فجائیہ
; vakfa //Waqfa وقفہ
: r'a:b'tah//Rabtar رابطہ
? saw'a:l'i:ja:n'is'a:nV // Sawaliya Nishan سوالیہ نشان
% f'i:sVd //Fisad فیصد
% f'i:sVd //Fisad فیصد
۔ xatma //Khatma ختمہ
؟ sava:li:;a:||nISa:n //Sawalya Nishan سوالیہ نشان


.group 0xe0a4 // devanagari
0xe0a4 _^_NE // switch to Nepali voice

+ 3
- 3
docs/dictionary.md View File

@@ -55,9 +55,9 @@ The utility 'phonemes' are:
| `=` | put the primary stress on the preceding syllable |
| `_:` | short pause |
| `_` | a shorter pause |
| `||` | indicates a word boundary within a phoneme string |
| `|` | can be used to separate two adjacent characters, to prevent them from being considered as a multi-character phoneme mnemonic |
| <code>&#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
markers are only needed in order to change the effect of the language's
default stress rule.

+ 2
- 1
docs/languages.md View File

@@ -8,7 +8,7 @@ and dialects,
[private-use extensions](https://raw.githubusercontent.com/espeak-ng/bcp47-data/master/bcp47-extensions)
have been used.

The supported languages are:
The 100 supported languages and accents are:

| Family Code | Identifier | Language Family | Language | Accent/Dialect |
|-------------|-------------------|-----------------------|-----------------------------|------------------------|
@@ -75,6 +75,7 @@ The supported languages are:
| `art` | `lfn` | Constructed | Lingua Franca Nova | |
| `bat` | `lt` | Baltic | Lithuanian | |
| `art` | `jbo` | Constructed | Lojban | |
| `poz` | `mi` | Malayo-Polynesian | Māori | |
| `zls` | `mk` | South Slavic | Macedonian | |
| `poz` | `ms` | Malayo-Polynesian | Malay | |
| `dra` | `ml` | Dravidian | Malayalam | |

+ 8
- 1
emscripten/demo.html View File

@@ -52,6 +52,12 @@
display: block;
margin-bottom: 1rem;
}
#ipaarea {
width: 100%;
height: 8rem;
display: block;
margin-bottom: 1rem;
}
p.gh {
color: #333;
text-align: right;
@@ -100,6 +106,7 @@
<h1>espeakng.js 1.49.1 Demo</h1>
<form>
<textarea id="texttospeak">Call me Ishmael. Some years ago --- never mind how long precisely --- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving off the spleen and regulating the circulation.</textarea>
<textarea readonly="true" placeholder="IPA" id="ipaarea"></textarea>
<div class="speecharg">
<label for="pitch">Pitch</label><input id="pitch" type="range" value="50" min="0" max="100" /><button type="button" aria-label="Reset pitch" title="Reset pitch" onclick="resetPitch();">&#x21b6;</button>
</div>
@@ -110,7 +117,7 @@
<label for="voice">Voice</label><select id="voice"></select><button type="button" aria-label="Reset voice" title="Reset voice" onclick="resetVoice();">&#x21b6;</button>
</div>
<div class="bottom">
<button type="button" onmousedown="speak();">Speak</button>
<button type="button" onmousedown="speakAndIpa();">Speak</button>
<button type="button" onmousedown="stop();">Stop</button>
</div>
<p class="gh"><a href="https://github.com/eeejay/espeak/tree/emscripten">Original Code for eSpeak: Eitan Isaacson</a></p>

+ 29
- 0
emscripten/espeakng_glue.cpp View File

@@ -50,6 +50,35 @@ public:
espeak_SetSynthCallback(NULL);
}

int synth_ipa_(const char* aText, const char* virtualFileName) {

/* phoneme_mode
bit 1: 0=eSpeak's ascii phoneme names, 1= International Phonetic Alphabet (as UTF-8 characters).
bit 7: use (bits 8-23) as a tie within multi-letter phonemes names
bits 8-23: separator character, between phoneme names
*/
espeak_SetSynthCallback(NULL);
int phoneme_options = (1 << 1); // Use IPA
int use_custom_phoneme_separator = (0 << 7);
int phonemes_separator = ' '; // Use a default value

int phoneme_conf = phoneme_options | (phonemes_separator << 8);
FILE* f_phonemes_out = fopen(virtualFileName,"wb");
if(!f_phonemes_out)
return -1;
//espeak_ng_InitializeOutput(ENOUTPUT_MODE_SYNCHRONOUS, 0, NULL);
espeak_SetPhonemeTrace(phoneme_conf, f_phonemes_out);
espeak_Synth(aText, 0, 0, POS_CHARACTER, 0, 0, NULL, NULL);
espeak_SetPhonemeTrace(0, NULL);
fclose(f_phonemes_out);
return 0;
}

long set_voice(
const char* aName,
const char* aLang=NULL,

+ 1
- 0
emscripten/espeakng_glue.idl View File

@@ -52,6 +52,7 @@ interface espeak_EVENT {
interface eSpeakNGWorker {
void eSpeakNGWorker();
void synth_(DOMString aText, VoidPtr aCallback);
long synth_ipa_(DOMString aText, DOMString virtualFileName);
long getSizeOfEventStruct_();
long set_voice(DOMString aName, DOMString aLang, optional octet gender=0, optional octet age=0, optional octet aVariant=0);
[Const] attribute espeak_VOICE[] voices;

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

@@ -179,10 +179,12 @@ function speak() {
pusher.connect(ctx.destination);
console.log(' Creating pusher... done');

var user_text = document.getElementById('texttospeak').value;
// actual synthesis
console.log(' Calling synthesize...');
tts.synthesize(
document.getElementById('texttospeak').value,
user_text,
function cb(samples, events) {
//console.log(' Inside synt cb');
if (!samples) {
@@ -203,11 +205,32 @@ function speak() {
//console.log(' Leaving synt cb');
} // end of function cb
); // end of tts.synthesize()
console.log(' Calling synthesize... done');

console.log(' Calling synthesize... done');
console.log('Leaving speak()');

} // end of speak()

function ipa() {
console.log("Synthesizing ipa ... ");
var ts = new Date();
var user_text = document.getElementById('texttospeak').value;

//user_text = user_text.repeat(50);
tts.set_voice(document.getElementById('voice').value);
tts.synthesize_ipa(user_text, function(result) {
var te = new Date();
document.getElementById('ipaarea').value = result.ipa;
console.log("Ipa synthesis done in " + (te-ts) + " ms.")
});
}

function speakAndIpa() {
speak();
ipa();
}

function resetPitch() {
document.getElementById('pitch').value = 50;
}
@@ -254,5 +277,6 @@ function initializeDemo() {
console.log('Leaving cb1');
} // end of function cb1
);
console.log('Creating eSpeakNG instance... done');
}

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

@@ -63,7 +63,8 @@ for (var method of [
'set_rate',
'set_pitch',
'set_voice',
'synthesize'
'synthesize',
'synthesize_ipa'
]) {
eSpeakNG.prototype[method] = _createAsyncMethod(method);
}

+ 23
- 0
emscripten/post.js View File

@@ -93,6 +93,28 @@ eSpeakNGWorker.prototype.synthesize = function (aText, aCallback) {
Runtime.removeFunction(fp);
};

eSpeakNGWorker.prototype.synthesize_ipa = function (aText, aCallback) {
// Use a unique temp file for the worker. Avoid collisions, just in case.
var ipaVirtualFileName = "espeak-ng-ipa-tmp-" + Math.random().toString().substring(2);
var res = "";
var code = this.synth_ipa_(aText, ipaVirtualFileName);

if(code == 0)
res = FS.readFile(ipaVirtualFileName, { encoding: 'utf8' })
// Clean up the tmp file
FS.unlink(ipaVirtualFileName);
var ret = {
code: code,
ipa: res
}
return ret;
};

// Make this a worker

if (typeof WorkerGlobalScope !== 'undefined') {
@@ -104,6 +126,7 @@ if (typeof WorkerGlobalScope !== 'undefined') {
});

onmessage = function(e) {
if (!worker) {
throw 'eSpeakNGWorker worker not initialized';
}

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

@@ -1,2 +1,3 @@
name Sindhi
language sd
maintainer Ejaz Shah <[email protected]>

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

@@ -1,3 +1,4 @@
name Māori
language mi
status testing


+ 75
- 0
m4/ax_check_compile_flag.m4 View File

@@ -0,0 +1,75 @@
# ===========================================================================
# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
# Check whether the given FLAG works with the current language's compiler
# or gives an error. (Warnings, however, are ignored)
#
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
# success/failure.
#
# If EXTRA-FLAGS is defined, it is added to the current language's default
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
# force the compiler to issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <[email protected]>
# Copyright (c) 2011 Maarten Bosmans <[email protected]>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <https://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.

#serial 5

AC_DEFUN([AX_CHECK_COMPILE_FLAG],
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
[AS_VAR_SET(CACHEVAR,[yes])],
[AS_VAR_SET(CACHEVAR,[no])])
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
AS_VAR_IF(CACHEVAR,yes,
[m4_default([$2], :)],
[m4_default([$3], :)])
AS_VAR_POPDEF([CACHEVAR])dnl
])dnl AX_CHECK_COMPILE_FLAGS


+ 19
- 10
phsource/ph_latvian View File

@@ -198,6 +198,25 @@ phoneme n- // more voiced variant of n
FMT(n/n-syl)
endphoneme

phoneme h // more quiet version of standard h
vls glt apr
lengthmod 3
ipa h

IF nextPh(#a) THEN
WAV(h/ha, 20)
ELIF nextPh(#e) THEN
WAV(h/he, 20)
ELIF nextPh(#i) THEN
WAV(h/hi, 20)
ELIF nextPh(#o) THEN
WAV(h/ho, 20)
ELIF nextPh(#u) THEN
WAV(h/hu, 20)
ENDIF
WAV(h/h_, 20) // no vowel following
endphoneme

phoneme R // Latvian hard r
liquid trl
lengthmod 6
@@ -336,15 +355,6 @@ phoneme } // Tiny, 5ms non-linked pause (used between phonemes in word)
length 5
endphoneme

// TODO should use this with correct lengthening
//phoneme l
// liquid
// unstressed
// dnt
// length 150
// FMT(vwl_hi/l-voc)
//endphoneme

phoneme s
vls alv frc sib
voicingswitch z
@@ -422,4 +432,3 @@ phoneme l
endphoneme




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

@@ -126,7 +126,7 @@ FILE *f_wavfile = NULL;
char filetype[5];
char wavefile[200];

void DisplayVoices(FILE *f_out, char *language)
static void DisplayVoices(FILE *f_out, char *language)
{
int ix;
const char *p;
@@ -197,7 +197,7 @@ static void Write4Bytes(FILE *f, int value)
}
}

int OpenWavFile(char *path, int rate)
static int OpenWavFile(char *path, int rate)
{
static unsigned char wave_hdr[44] = {
'R', 'I', 'F', 'F', 0x24, 0xf0, 0xff, 0x7f, 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ',
@@ -598,7 +598,7 @@ int main(int argc, char **argv)
}

if (voicename[0] == 0)
strcpy(voicename, "en");
strcpy(voicename, ESPEAKNG_DEFAULT_VOICE);

result = espeak_ng_SetVoiceByName(voicename);
if (result != ENS_OK) {

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

@@ -32,7 +32,4 @@

#include <ucd/ucd.h>

#define towlower ucd_tolower
#define towupper ucd_toupper

#endif

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

@@ -17,6 +17,8 @@
#ifndef ESPEAK_NG_ENCODING_H
#define ESPEAK_NG_ENCODING_H

#include <stdint.h>

#ifdef __cplusplus
extern "C"
{

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

@@ -36,6 +36,8 @@ extern "C"
#define ESPEAK_NG_API
#endif

#define ESPEAKNG_DEFAULT_VOICE "en"

typedef enum {
ENS_GROUP_MASK = 0x70000000,
ENS_GROUP_ERRNO = 0x00000000, /* Values 0-255 map to errno error codes. */

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

@@ -38,7 +38,7 @@
#define ESPEAK_API
#endif

#define ESPEAK_API_REVISION 10
#define ESPEAK_API_REVISION 12
/*
Revision 2
Added parameter "options" to eSpeakInitialize()
@@ -68,6 +68,12 @@ Revision 9 30.May.2013
Revision 10 29.Aug.2014
Changed phonememode parameter to espeak_TextToPhonemes() and espeak_SetPhonemeTrace

Revision 11 (espeak-ng)
Made ESPEAK_API import/export symbols correctly on Windows.

Revision 12 (espeak-ng)
Exposed espeak_SetPhonemeCallback. This is available in eSpeak, but was not exposed in this header.

*/
/********************/
/* Initialization */
@@ -260,6 +266,11 @@ int UriCallback(int type, const char *uri, const char *base);
occurs. The calling program can then play the sound at that point.
*/

#ifdef __cplusplus
extern "C"
#endif
ESPEAK_API void espeak_SetPhonemeCallback(int (*PhonemeCallback)(const char *));


/********************/
/* Synthesis */

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

@@ -1,75 +0,0 @@
/*
* Copyright (C) 2017 Reece H. Dunn
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see: <http://www.gnu.org/licenses/>.
*/
#ifndef ESPEAK_NG_TOKENIZER_H
#define ESPEAK_NG_TOKENIZER_H

#ifdef __cplusplus
extern "C"
{
#endif

typedef struct espeak_ng_TOKENIZER_ espeak_ng_TOKENIZER;

ESPEAK_NG_API espeak_ng_TOKENIZER *
create_tokenizer(void);

ESPEAK_NG_API void
destroy_tokenizer(espeak_ng_TOKENIZER *tokenizer);

typedef enum
{
ESPEAKNG_TOKENIZER_OPTION_TEXT = 0,
} espeak_ng_TOKENIZER_OPTIONS;

ESPEAK_NG_API int
tokenizer_reset(espeak_ng_TOKENIZER *tokenizer,
espeak_ng_TEXT_DECODER *decoder,
espeak_ng_TOKENIZER_OPTIONS options);

typedef enum
{
ESPEAKNG_TOKEN_END_OF_BUFFER,
ESPEAKNG_TOKEN_UNKNOWN,
ESPEAKNG_TOKEN_NEWLINE,
ESPEAKNG_TOKEN_PARAGRAPH,
ESPEAKNG_TOKEN_WHITESPACE,
ESPEAKNG_TOKEN_WORD_UPPERCASE,
ESPEAKNG_TOKEN_WORD_LOWERCASE,
ESPEAKNG_TOKEN_WORD_MIXEDCASE,
ESPEAKNG_TOKEN_WORD_CAPITALIZED,
ESPEAKNG_TOKEN_FULL_STOP,
ESPEAKNG_TOKEN_QUESTION_MARK,
ESPEAKNG_TOKEN_EXCLAMATION_MARK,
ESPEAKNG_TOKEN_COMMA,
ESPEAKNG_TOKEN_COLON,
ESPEAKNG_TOKEN_SEMICOLON,
ESPEAKNG_TOKEN_ELLIPSIS,
ESPEAKNG_TOKEN_PUNCTUATION,
ESPEAKNG_TOKEN_SYMBOL,
} espeak_ng_TOKEN_TYPE;

ESPEAK_NG_API espeak_ng_TOKEN_TYPE
tokenizer_read_next_token(espeak_ng_TOKENIZER *tokenizer);

ESPEAK_NG_API const char *
tokenizer_get_token_text(espeak_ng_TOKENIZER *tokenizer);

#ifdef __cplusplus
}
#endif

#endif

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

@@ -33,13 +33,15 @@

#include <espeak-ng/espeak_ng.h>
#include <espeak-ng/speak_lib.h>
#include <espeak-ng/encoding.h>

#include "error.h"
#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "spect.h"
#include "translate.h"

typedef struct {
unsigned int value;
@@ -50,9 +52,6 @@ NAMETAB *manifest = NULL;
int n_manifest;
char phsrc[sizeof(path_home)+40]; // Source: path to the 'phonemes' source file.

extern ESPEAK_NG_API int utf8_in(int *c, const char *buf);
extern int utf8_out(unsigned int c, char *buf);

typedef struct {
const char *mnem;
int type;
@@ -722,7 +721,7 @@ static void unget_char(unsigned int c)
linenum--;
}

int CheckNextChar()
static int CheckNextChar()
{
int c;
while (((c = get_char()) == ' ') || (c == '\t'))
@@ -893,7 +892,7 @@ static int Range(int value, int divide, int min, int max)
return value - min;
}

int CompileVowelTransition(int which)
static int CompileVowelTransition(int which)
{
// Compile a vowel transition
int key;
@@ -999,7 +998,7 @@ int CompileVowelTransition(int which)
return 0;
}

espeak_ng_STATUS LoadSpect(const char *path, int control, int *addr)
static espeak_ng_STATUS LoadSpect(const char *path, int control, int *addr)
{
SpectSeq *spectseq;
int peak;
@@ -1401,15 +1400,17 @@ static int LoadEnvelope2(FILE *f, const char *fname)
n_points++;
}
}
env_x[n_points] = env_x[n_points-1];
env_y[n_points] = env_y[n_points-1];
if (n_points > 0) {
env_x[n_points] = env_x[n_points-1];
env_y[n_points] = env_y[n_points-1];
}

ix = -1;
ix2 = 0;
for (x = 0; x < ENV_LEN; x++) {
if (x > env_x[ix+4])
if (n_points > 0) for (x = 0; x < ENV_LEN; x++) {
if (n_points > 3 && x > env_x[ix+4])
ix++;
if (x >= env_x[ix2+1])
if (n_points > 2 && x >= env_x[ix2+1])
ix2++;

if (env_lin[ix2] > 0) {
@@ -1612,7 +1613,7 @@ static void CompileSound(int keyword, int isvowel)
=8 data = stress bitmap
=9 special tests
*/
int CompileIf(int elif)
static int CompileIf(int elif)
{
int key;
int finish = 0;
@@ -1721,7 +1722,7 @@ int CompileIf(int elif)
return 0;
}

void FillThen(int add)
static void FillThen(int add)
{
USHORT *p;
int offset;
@@ -1749,7 +1750,7 @@ void FillThen(int add)
then_count = 0;
}

int CompileElse(void)
static int CompileElse(void)
{
USHORT *ref;
USHORT *p;
@@ -1776,7 +1777,7 @@ int CompileElse(void)
return 0;
}

int CompileElif(void)
static int CompileElif(void)
{
if (if_level < 1) {
error("ELIF not expected");
@@ -1788,7 +1789,7 @@ int CompileElif(void)
return 0;
}

int CompileEndif(void)
static int CompileEndif(void)
{
USHORT *p;
int chain;
@@ -1951,7 +1952,7 @@ static void DecThenCount()
then_count--;
}

int CompilePhoneme(int compile_phoneme)
static int CompilePhoneme(int compile_phoneme)
{
int endphoneme = 0;
int keyword;
@@ -2231,11 +2232,11 @@ int CompilePhoneme(int compile_phoneme)
CompileToneSpec();
break;
case kCONTINUE:
*prog_out++ = OPCODE_CONTINUE;
*prog_out++ = INSTN_CONTINUE;
DecThenCount();
break;
case kRETURN:
*prog_out++ = OPCODE_RETURN;
*prog_out++ = INSTN_RETURN;
DecThenCount();
break;
case kINCLUDE:
@@ -2248,7 +2249,7 @@ int CompilePhoneme(int compile_phoneme)
if (if_level > 0)
error("Missing ENDIF");
if ((prog_out > prog_buf) && (if_stack[0].returned == 0))
*prog_out++ = OPCODE_RETURN;
*prog_out++ = INSTN_RETURN;
break;
}
break;
@@ -2357,8 +2358,6 @@ static void WritePhonemeTables()
static void EndPhonemeTable()
{
int ix;
int *pw;
int length;

if (n_phoneme_tabs == 0)
return;
@@ -2697,7 +2696,7 @@ MNEM_TAB envelope_names[] = {
{ NULL, -1 }
};

int LookupEnvelopeName(const char *name)
static int LookupEnvelopeName(const char *name)
{
return LookupMnem(envelope_names, name);
}
@@ -2717,7 +2716,7 @@ espeak_ng_STATUS espeak_ng_CompileIntonation(FILE *log, espeak_ng_ERROR_CONTEXT
int done_onset = 0;
int done_last = 0;
int n_preset_tunes = 0;
int found;
int found = 0;
int tune_number = 0;
FILE *f_out;
TUNE *tune_data;
@@ -2825,6 +2824,7 @@ espeak_ng_STATUS espeak_ng_CompileIntonation(FILE *log, espeak_ng_ERROR_CONTEXT
error("Bad tune name: '%s;", new_tune.name);
break;
case kENDTUNE:
if (!found) continue;
if (done_onset == 0) {
new_tune.unstr_start[0] = new_tune.unstr_start[1];
new_tune.unstr_end[0] = new_tune.unstr_end[1];

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

@@ -35,11 +35,11 @@
#include "error.h"
#include "speech.h"
#include "phoneme.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

extern void Write4Bytes(FILE *f, int value);
int HashDictionary(const char *string);

static FILE *f_log = NULL;
extern char *dir_dictionary;
@@ -52,8 +52,15 @@ static int text_mode = 0;
static int debug_flag = 0;
static int error_need_dictionary = 0;

static int hash_counts[N_HASH_DICT];
// A hash chain is a linked-list of hash chain entry objects:
// struct hash_chain_entry {
// hash_chain_entry *next_entry;
// // dict_line output from compile_line:
// uint8_t length;
// char contents[length];
// };
static char *hash_chains[N_HASH_DICT];

static char letterGroupsDefined[N_LETTER_GROUPS];

MNEM_TAB mnem_rules[] = {
@@ -164,16 +171,6 @@ typedef struct {
int group3_ix;
} RGROUP;

int isspace2(unsigned int c)
{
// can't use isspace() because on Windows, isspace(0xe1) gives TRUE !
int c2;

if (((c2 = (c & 0xff)) == 0) || (c > ' '))
return 0;
return 1;
}

void print_dictionary_flags(unsigned int *flags, char *buf, int buf_len)
{
int stress;
@@ -411,8 +408,8 @@ static int compile_line(char *linebuf, char *dict_line, int n_dict_line, int *ha

step = LINE_PARSER_WORD;

c = 0;
while (c != '\n') {
c = *p;
while (c != '\n' && c != '\0') {
c = *p;

if ((c == '?') && (step == 0)) {
@@ -649,7 +646,7 @@ static int compile_line(char *linebuf, char *dict_line, int n_dict_line, int *ha
length += ix;
}
}
dict_line[0] = length;
*((uint8_t *)dict_line) = (uint8_t)length;

return length;
}
@@ -669,7 +666,6 @@ static void compile_dictlist_start(void)
p = p2;
}
hash_chains[ix] = NULL;
hash_counts[ix] = 0;
}
}

@@ -682,10 +678,9 @@ static void compile_dictlist_end(FILE *f_out)

for (hash = 0; hash < N_HASH_DICT; hash++) {
p = hash_chains[hash];
hash_counts[hash] = (int)ftell(f_out);

while (p != NULL) {
length = *(p+sizeof(char *));
length = *(uint8_t *)(p+sizeof(char *));
fwrite(p+sizeof(char *), length, 1, f_out);
memcpy(&p, p, sizeof(char *));
}
@@ -702,7 +697,7 @@ static int compile_dictlist_file(const char *path, const char *filename)
FILE *f_in;
char buf[200];
char fname[sizeof(path_home)+45];
char dict_line[200];
char dict_line[256]; // length is uint8_t, so an entry can't take up more than 256 bytes

text_mode = 0;

@@ -725,8 +720,6 @@ static int compile_dictlist_file(const char *path, const char *filename)
length = compile_line(buf, dict_line, sizeof(dict_line), &hash);
if (length == 0) continue; // blank line

hash_counts[hash]++;

p = (char *)malloc(length+sizeof(char *));
if (p == NULL) {
if (f_log != NULL) {
@@ -738,6 +731,7 @@ static int compile_dictlist_file(const char *path, const char *filename)

memcpy(p, &hash_chains[hash], sizeof(char *));
hash_chains[hash] = p;
// NOTE: dict_line[0] is the entry length (0-255)
memcpy(p+sizeof(char *), dict_line, length);
count++;
}
@@ -758,7 +752,7 @@ static int group3_ix;

#define N_RULES 3000 // max rules for each group

int isHexDigit(int c)
static int isHexDigit(int c)
{
if ((c >= '0') && (c <= '9'))
return c - '0';
@@ -1165,7 +1159,7 @@ static char *compile_rule(char *input)
return prule;
}

int __cdecl string_sorter(char **a, char **b)
static int __cdecl string_sorter(char **a, char **b)
{
char *pa, *pb;
int ix;

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

@@ -31,6 +31,7 @@
#include "error.h"
#include "phoneme.h"
#include "speech.h"
#include "voice.h"
#include "synthesize.h"

static const char *basename(const char *filename)

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

@@ -33,15 +33,13 @@

#include "speech.h"
#include "phoneme.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

int dictionary_skipwords;
char dictionary_name[40];

extern void print_dictionary_flags(unsigned int *flags, char *buf, int buf_len);
extern char *DecodeRule(const char *group_chars, int group_length, char *rule, int control);

// accented characters which indicate (in some languages) the start of a separate syllable
static const unsigned short diereses_list[7] = { 0xe4, 0xeb, 0xef, 0xf6, 0xfc, 0xff, 0 };

@@ -198,7 +196,7 @@ int LoadDictionary(Translator *tr, const char *name, int no_error)
int *pw;
int length;
FILE *f;
unsigned int size;
int size;
char fname[sizeof(path_home)+20];

strncpy(dictionary_name, name, 40); // currently loaded dictionary name
@@ -254,7 +252,7 @@ int LoadDictionary(Translator *tr, const char *name, int no_error)

for (hash = 0; hash < N_HASH_DICT; hash++) {
tr->dict_hashtab[hash] = p;
while ((length = *p) != 0)
while ((length = *(uint8_t *)p) != 0)
p += length;
p++; // skip over the zero which terminates the list for this hash value
}
@@ -1571,7 +1569,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
int letter_w; // current letter, wide character
int last_letter_w; // last letter, wide character
int letter_xbytes; // number of extra bytes of multibyte character (num bytes - 1)
unsigned char last_letter;

char *pre_ptr;
char *post_ptr; // pointer to first character after group
@@ -1627,7 +1624,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
unpron_ignore = word_flags & FLAG_UNPRON_TEST;
match_type = 0;
consumed = 0;
letter = 0;
letter_w = 0;
distance_right = -6; // used to reduce points for matches further away the current letter
distance_left = -2;
@@ -1732,7 +1728,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
distance_right += 6;
if (distance_right > 18)
distance_right = 19;
last_letter = letter;
last_letter_w = letter_w;
letter_xbytes = utf8_in(&letter_w, post_ptr)-1;
letter = *post_ptr++;
@@ -1939,7 +1934,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
if (distance_left > 18)
distance_left = 19;

last_letter = *pre_ptr;
utf8_in(&last_letter_w, pre_ptr);
pre_ptr--;
letter_xbytes = utf8_in2(&letter_w, pre_ptr, 1)-1;
@@ -2719,7 +2713,7 @@ static const char *LookupDict2(Translator *tr, const char *word, const char *wor
continue;
}

if ((dictionary_flags2 & FLAG_ATSTART) && !(wtab->flags & FLAG_FIRST_WORD)) {
if ((dictionary_flags2 & FLAG_ATSTART) && !(wflags & FLAG_FIRST_WORD)) {
// only use this pronunciation if it's the first word of a clause
continue;
}
@@ -2894,7 +2888,7 @@ int LookupDictList(Translator *tr, char **wordptr, char *ph_out, unsigned int *f
found = word2 + len;
}

if (found == 0) {
if (found == 0 && length >= 2) {
ph_out[0] = 0;

// try modifications to find a recognised word
@@ -3003,7 +2997,7 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy)
int end_flags;
const char *p;
int len;
char ending[50];
char ending[50] = {0};

// these lists are language specific, but are only relevent if the 'e' suffix flag is used
static const char *add_e_exceptions[] = {

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

@@ -26,43 +26,10 @@
#include <espeak-ng/encoding.h>

#include "speech.h"

#define LEADING_2_BITS 0xC0 // 0b11000000
#define UTF8_TAIL_BITS 0x80 // 0b10000000

int utf8_out(unsigned int c, char *buf)
{
// write a unicode character into a buffer as utf8
// returns the number of bytes written

int n_bytes;
int j;
int shift;
static char unsigned code[4] = { 0, 0xc0, 0xe0, 0xf0 };

if (c < 0x80) {
buf[0] = c;
return 1;
}
if (c >= 0x110000) {
buf[0] = ' '; // out of range character code
return 1;
}
if (c < 0x0800)
n_bytes = 1;
else if (c < 0x10000)
n_bytes = 2;
else
n_bytes = 3;

shift = 6*n_bytes;
buf[0] = code[n_bytes] | (c >> shift);
for (j = 0; j < n_bytes; j++) {
shift -= 6;
buf[j+1] = 0x80 + ((c >> shift) & 0x3f);
}
return n_bytes+1;
}
#include "phoneme.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

// http://www.iana.org/assignments/character-sets/character-sets.xhtml
MNEM_TAB mnem_encoding[] = {
@@ -654,6 +621,7 @@ string_decoder_getc_auto(espeak_ng_TEXT_DECODER *decoder)
static uint32_t
null_decoder_getc(espeak_ng_TEXT_DECODER *decoder)
{
(void)decoder; // unused parameter
return 0;
}


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

@@ -29,6 +29,7 @@
#include "error.h"
#include "speech.h"
#include "phoneme.h"
#include "voice.h"
#include "synthesize.h"

espeak_ng_STATUS

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

@@ -29,6 +29,7 @@

#include "speech.h"
#include "phoneme.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"
#include "event.h"

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

@@ -66,8 +66,8 @@ static node *head = NULL;
static node *tail = NULL;
static int node_counter = 0;
static espeak_ng_STATUS push(void *data);
static void *pop();
static void init();
static void *pop(void);
static void init(void);
static void *polling_thread(void *);

void event_set_callback(t_espeak_callback *SynthCallback)
@@ -257,7 +257,7 @@ static void *polling_thread(void *p)
while (1) {
int a_stop_is_required = 0;

int a_status = pthread_mutex_lock(&my_mutex);
(void)pthread_mutex_lock(&my_mutex);
my_event_is_running = 0;

while (my_start_is_required == 0) {
@@ -284,16 +284,16 @@ static void *polling_thread(void *p)
event->user_data = NULL;
}

a_status = pthread_mutex_lock(&my_mutex);
(void)pthread_mutex_lock(&my_mutex);
event_delete((espeak_EVENT *)pop());
a_stop_is_required = my_stop_is_required;
if (a_stop_is_required > 0)
my_stop_is_required = 0;

a_status = pthread_mutex_unlock(&my_mutex);
(void)pthread_mutex_unlock(&my_mutex);
}

a_status = pthread_mutex_lock(&my_mutex);
(void)pthread_mutex_lock(&my_mutex);

my_event_is_running = 0;

@@ -303,7 +303,7 @@ static void *polling_thread(void *p)
my_stop_is_required = 0;
}

a_status = pthread_mutex_unlock(&my_mutex);
(void)pthread_mutex_unlock(&my_mutex);

if (a_stop_is_required > 0) {
// no mutex required since the stop command is synchronous
@@ -311,10 +311,10 @@ static void *polling_thread(void *p)
init();

// acknowledge the stop request
espeak_ng_STATUS a_status = pthread_mutex_lock(&my_mutex);
(void)pthread_mutex_lock(&my_mutex);
my_stop_is_acknowledged = 1;
a_status = pthread_cond_signal(&my_cond_stop_is_acknowledged);
a_status = pthread_mutex_unlock(&my_mutex);
(void)pthread_cond_signal(&my_cond_stop_is_acknowledged);
(void)pthread_mutex_unlock(&my_mutex);
}
}


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

@@ -52,14 +52,14 @@ void event_init(void);
void event_set_callback(t_espeak_callback *cb);

// Clear any pending event.
espeak_ng_STATUS event_clear_all();
espeak_ng_STATUS event_clear_all(void);

// Declare a future event
espeak_ng_STATUS event_declare(espeak_EVENT *event);

// Terminate the event component.
// Last function to be called.
void event_terminate();
void event_terminate(void);

// general functions
void clock_gettime2(struct timespec *ts);

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

@@ -58,7 +58,7 @@ static int my_stop_is_acknowledged = 0;
static void *say_thread(void *);

static espeak_ng_STATUS push(t_espeak_command *the_command);
static t_espeak_command *pop();
static t_espeak_command *pop(void);
static void init(int process_parameters);
static int node_counter = 0;


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

@@ -29,7 +29,7 @@ extern "C"

// Initialize the fifo component.
// First function to be called.
void fifo_init();
void fifo_init(void);

// Add an espeak command.
//
@@ -44,15 +44,15 @@ espeak_ng_STATUS fifo_add_command(t_espeak_command *c);
espeak_ng_STATUS fifo_add_commands(t_espeak_command *c1, t_espeak_command *c2);

// The current running command must be stopped and the awaiting commands are cleared.
espeak_ng_STATUS fifo_stop();
espeak_ng_STATUS fifo_stop(void);

// Is there a running command?
// Returns 1 if yes; 0 otherwise.
int fifo_is_busy();
int fifo_is_busy(void);

// Terminate the fifo component.
// Last function to be called.
void fifo_terminate();
void fifo_terminate(void);

// Indicates if the running command is still enabled.
//
@@ -61,7 +61,7 @@ void fifo_terminate();
// stopping speech as soon as a cancel command is applied.
//
// Returns 1 if yes, or 0 otherwise.
int fifo_is_command_enabled();
int fifo_is_command_enabled(void);

#ifdef __cplusplus
}

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

@@ -49,15 +49,10 @@

#include <stdio.h>
#include <math.h>
#include "ieee80.h"

typedef float Single;

#ifndef applec
typedef double defdouble;
#else applec
typedef long double defdouble;
#endif applec

#ifndef THINK_C
typedef double Double;
#else THINK_C

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

@@ -0,0 +1,62 @@
/* Copyright (C) 1989-1991 Apple Computer, Inc.
*
* All rights reserved.
*
* Warranty Information
* Even though Apple has reviewed this software, Apple makes no warranty
* or representation, either express or implied, with respect to this
* software, its quality, accuracy, merchantability, or fitness for a
* particular purpose. As a result, this software is provided "as is,"
* and you, its user, are assuming the entire risk as to its quality
* and accuracy.
*
* This code may be used and freely distributed as long as it includes
* this copyright notice and the above warranty information.
*
* Machine-independent I/O routines for IEEE floating-point numbers.
*
* NaN's and infinities are converted to HUGE_VAL or HUGE, which
* happens to be infinity on IEEE machines. Unfortunately, it is
* impossible to preserve NaN's in a machine-independent way.
* Infinities are, however, preserved on IEEE machines.
*
* These routines have been tested on the following machines:
* Apple Macintosh, MPW 3.1 C compiler
* Apple Macintosh, THINK C compiler
* Silicon Graphics IRIS, MIPS compiler
* Cray X/MP and Y/MP
* Digital Equipment VAX
* Sequent Balance (Multiprocesor 386)
* NeXT
*
*
* Implemented by Malcolm Slaney and Ken Turkowski.
*
* Malcolm Slaney contributions during 1988-1990 include big- and little-
* endian file I/O, conversion to and from Motorola's extended 80-bit
* floating-point format, and conversions to and from IEEE single-
* precision floating-point format.
*
* In 1991, Ken Turkowski implemented the conversions to and from
* IEEE double-precision format, added more precision to the extended
* conversions, and accommodated conversions involving +/- infinity,
* NaN's, and denormalized numbers.
*/
#ifndef IEEE_H
#define IEEE_H

#ifndef applec
typedef double defdouble;
#else applec
typedef long double defdouble;
#endif applec

defdouble ConvertFromIeeeSingle( char *bytes);
defdouble ConvertFromIeeeDouble( char *bytes);
defdouble ConvertFromIeeeExtended(char *bytes);

void ConvertToIeeeSingle( defdouble num, char *bytes);
void ConvertToIeeeDouble( defdouble num, char *bytes);
void ConvertToIeeeExtended(defdouble num, char *bytes);

#endif

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

@@ -30,8 +30,8 @@

#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

/* Note this module is mostly old code that needs to be rewritten to
@@ -949,8 +949,8 @@ void CalcPitches(Translator *tr, int clause_type)
n_primary = 0;
for (ix = 0; ix < (n_phoneme_list-1); ix++) {
p = &phoneme_list[ix];
syllable_tab[ix].flags = 0;
if (p->synthflags & SFLAG_SYLLABLE) {
syllable_tab[n_st].flags = 0;
syllable_tab[n_st].env = PITCHfall;
syllable_tab[n_st].nextph_type = phoneme_list[ix+1].type;
syllable_tab[n_st++].stress = p->stresslevel;

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

@@ -35,10 +35,10 @@
#include <espeak-ng/speak_lib.h>

#include "speech.h"
#include "klatt.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "klatt.h"

extern unsigned char *out_ptr;
extern unsigned char *out_start;
@@ -846,7 +846,7 @@ static int klattp[N_KLATTP];
static double klattp1[N_KLATTP];
static double klattp_inc[N_KLATTP];

int Wavegen_Klatt(int resume)
static int Wavegen_Klatt(int resume)
{
int pk;
int x;
@@ -935,7 +935,7 @@ int Wavegen_Klatt(int resume)
return 0;
}

void SetSynth_Klatt(int length, frame_t *fr1, frame_t *fr2, voice_t *v, int control)
static void SetSynth_Klatt(int length, frame_t *fr1, frame_t *fr2, voice_t *v, int control)
{
int ix;
DOUBLEX next;

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

@@ -1,7 +1,7 @@
/*
* Copyright (C) 2008 by Jonathan Duddington
* email: [email protected]
* Copyright (C) 2015 Reece H. Dunn
* Copyright (C) 2015-2017 Reece H. Dunn
*
* Based on a re-implementation by:
* (c) 1993,94 Jon Iles and Nick Ing-Simmons
@@ -171,6 +171,10 @@ typedef struct {
DOUBLEX bp_inc;
} klatt_peaks_t;

void KlattInit(void);
void KlattReset(int control);
int Wavegen_Klatt2(int length, int resume, frame_t *fr1, frame_t *fr2);


#ifdef __cplusplus
}

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

@@ -20,11 +20,24 @@
#include "config.h"

#if defined(_WIN32) || defined(_WIN64)

#include <windows.h>
#endif

#include "mbrowrap.h"

int (WINAPI *init_MBR)(char *voice_path);
void (WINAPI *close_MBR)(void);
void (WINAPI *reset_MBR)(void);
int (WINAPI *read_MBR)(short *buffer, int nb_samples);
int (WINAPI *write_MBR)(char *data);
int (WINAPI *flush_MBR)(void);
int (WINAPI *getFreq_MBR)(void);
void (WINAPI *setVolumeRatio_MBR)(float value);
char * (WINAPI *lastErrorStr_MBR)(char *buffer, int bufsize);
void (WINAPI *setNoError_MBR)(int no_error);

#if defined(_WIN32) || defined(_WIN64)

HINSTANCE hinstDllMBR = NULL;

BOOL load_MBR()
@@ -69,8 +82,6 @@ void unload_MBR()
#include <unistd.h>

#include <espeak-ng/espeak_ng.h>

#include "mbrowrap.h"
#include "speech.h"

/*
@@ -508,7 +519,7 @@ static ssize_t receive_from_mbrola(void *buffer, size_t bufsize)
* API functions.
*/

int init_mbrola(char *voice_path)
static int init_mbrola(char *voice_path)
{
int error, result;
unsigned char wavhdr[45];
@@ -551,7 +562,7 @@ int init_mbrola(char *voice_path)
return 0;
}

void close_mbrola(void)
static void close_mbrola(void)
{
stop_mbrola();
free_pending_data();
@@ -560,7 +571,7 @@ void close_mbrola(void)
mbr_volume = 1.0;
}

void reset_mbrola(void)
static void reset_mbrola(void)
{
int result, success = 1;
char dummybuf[4096];
@@ -584,7 +595,7 @@ void reset_mbrola(void)
mbr_state = MBR_IDLE;
}

int read_mbrola(short *buffer, int nb_samples)
static int read_mbrola(short *buffer, int nb_samples)
{
int result = receive_from_mbrola(buffer, nb_samples * 2);
if (result > 0)
@@ -592,23 +603,23 @@ int read_mbrola(short *buffer, int nb_samples)
return result;
}

int write_mbrola(char *data)
static int write_mbrola(char *data)
{
mbr_state = MBR_NEWDATA;
return send_to_mbrola(data);
}

int flush_mbrola(void)
static int flush_mbrola(void)
{
return send_to_mbrola("\n#\n") == 3;
}

int getFreq_mbrola(void)
static int getFreq_mbrola(void)
{
return mbr_samplerate;
}

void setVolumeRatio_mbrola(float value)
static void setVolumeRatio_mbrola(float value)
{
if (value == mbr_volume)
return;
@@ -623,7 +634,7 @@ void setVolumeRatio_mbrola(float value)
init_MBR(mbr_voice_path);
}

char *lastErrorStr_mbrola(char *buffer, int bufsize)
static char *lastErrorStr_mbrola(char *buffer, int bufsize)
{
if (mbr_pid)
mbrola_has_errors();
@@ -631,7 +642,7 @@ char *lastErrorStr_mbrola(char *buffer, int bufsize)
return buffer;
}

void setNoError_mbrola(int no_error)
static void setNoError_mbrola(int no_error)
{
(void)no_error; // unused
}

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

@@ -37,20 +37,20 @@ typedef int BOOL;
* error reason. If this is successful, then close_MBR() must be called
* before init_MBR() can be called again.
*/
int (WINAPI *init_MBR)(char *voice_path);
extern int (WINAPI *init_MBR)(char *voice_path);

/*
* Stop mbrola and release any resources. It is necessary to call
* this after a successful call to init_MBR() before init_MBR() can be
* called again.
*/
void (WINAPI *close_MBR)(void);
extern void (WINAPI *close_MBR)(void);

/*
* Stop any ongoing processing and flush all buffers. After this call
* any synthesis request will start afresh.
*/
void (WINAPI *reset_MBR)(void);
extern void (WINAPI *reset_MBR)(void);

/*
* Return at most 'nb_samples' audio samples into 'buffer'. The returned
@@ -58,14 +58,14 @@ void (WINAPI *reset_MBR)(void);
* If not successful, lastErrorStr_MBR() will provide the error reason.
* Samples are always 16-bit little endian.
*/
int (WINAPI *read_MBR)(short *buffer, int nb_samples);
extern int (WINAPI *read_MBR)(short *buffer, int nb_samples);

/*
* Write a NULL terminated string of phoneme in the input buffer.
* Return the number of chars actually written, or -1 on error.
* If not successful, lastErrorStr_MBR() will provide the error reason.
*/
int (WINAPI *write_MBR)(char *data);
extern int (WINAPI *write_MBR)(char *data);

/*
* Send a flush command to the mbrola input stream.
@@ -73,17 +73,17 @@ int (WINAPI *write_MBR)(char *data);
* or 0 on failure. If not successful, lastErrorStr_MBR() will provide
* the error reason.
*/
int (WINAPI *flush_MBR)(void);
extern int (WINAPI *flush_MBR)(void);

/*
* Return the audio sample frequency of the used voice database.
*/
int (WINAPI *getFreq_MBR)(void);
extern int (WINAPI *getFreq_MBR)(void);

/*
* Overall volume.
*/
void (WINAPI *setVolumeRatio_MBR)(float value);
extern void (WINAPI *setVolumeRatio_MBR)(float value);

/*
* Copy into 'buffer' at most 'bufsize' bytes from the latest error
@@ -91,12 +91,12 @@ void (WINAPI *setVolumeRatio_MBR)(float value);
* no error message is pending then an empty string is returned.
* Consecutive calls to lastErrorStr_MBR() will return the same message.
*/
char * (WINAPI *lastErrorStr_MBR)(char *buffer, int bufsize);
extern char * (WINAPI *lastErrorStr_MBR)(char *buffer, int bufsize);

/*
* Tolerance to missing diphones.
*/
void (WINAPI *setNoError_MBR)(int no_error);
extern void (WINAPI *setNoError_MBR)(int no_error);

BOOL load_MBR(void);
void unload_MBR(void);

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

@@ -33,8 +33,8 @@

#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

#define M_LIGATURE 0x8000
@@ -548,7 +548,7 @@ static const int number_ranges[] = {
0
};

int NonAsciiNumber(int letter)
static int NonAsciiNumber(int letter)
{
// Change non-ascii digit into ascii digit '0' to '9', (or -1 if not)
const int *p;
@@ -1711,7 +1711,7 @@ static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null
return 0;
}

bool CheckThousandsGroup(char *word, int group_len)
static bool CheckThousandsGroup(char *word, int group_len)
{
// Is this a group of 3 digits which looks like a thousands group?
int ix;

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

@@ -30,6 +30,7 @@

#include "speech.h"
#include "phoneme.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"


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

@@ -34,12 +34,13 @@
#include <espeak-ng/espeak_ng.h>
#include <espeak-ng/speak_lib.h>
#include <espeak-ng/encoding.h>
#include <ucd/ucd.h>

#include "error.h"
#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

#define N_XML_BUF 500
@@ -89,6 +90,55 @@ PARAM_STACK param_stack[N_PARAM_STACK];
static int speech_parameters[N_SPEECH_PARAM]; // current values, from param_stack
int saved_parameters[N_SPEECH_PARAM]; // Parameters saved on synthesis start

#define ESPEAKNG_CLAUSE_TYPE_PROPERTY_MASK 0xFFF0000000000000ull

int clause_type_from_codepoint(uint32_t c)
{
ucd_category cat = ucd_lookup_category(c);
ucd_property props = ucd_properties(c, cat);

switch (props & ESPEAKNG_CLAUSE_TYPE_PROPERTY_MASK)
{
case ESPEAKNG_PROPERTY_FULL_STOP:
return CLAUSE_PERIOD;
case ESPEAKNG_PROPERTY_FULL_STOP | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
return CLAUSE_PERIOD | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_QUESTION_MARK:
return CLAUSE_QUESTION;
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
return CLAUSE_QUESTION | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_PUNCTUATION_IN_WORD:
return CLAUSE_QUESTION | CLAUSE_PUNCTUATION_IN_WORD;
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK:
return CLAUSE_EXCLAMATION;
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
return CLAUSE_EXCLAMATION | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_PUNCTUATION_IN_WORD:
return CLAUSE_EXCLAMATION | CLAUSE_PUNCTUATION_IN_WORD;
case ESPEAKNG_PROPERTY_COMMA:
return CLAUSE_COMMA;
case ESPEAKNG_PROPERTY_COMMA | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
return CLAUSE_COMMA | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_COLON:
return CLAUSE_COLON;
case ESPEAKNG_PROPERTY_COLON | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
return CLAUSE_COLON | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_SEMI_COLON:
case ESPEAKNG_PROPERTY_EXTENDED_DASH:
return CLAUSE_SEMICOLON;
case ESPEAKNG_PROPERTY_SEMI_COLON | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER | ESPEAKNG_PROPERTY_INVERTED_TERMINAL_PUNCTUATION:
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER | ESPEAKNG_PROPERTY_INVERTED_TERMINAL_PUNCTUATION:
return CLAUSE_SEMICOLON | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_ELLIPSIS:
return CLAUSE_SEMICOLON | CLAUSE_SPEAK_PUNCTUATION_NAME | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_PARAGRAPH_SEPARATOR:
return CLAUSE_PARAGRAPH;
}

return CLAUSE_NONE;
}

const int param_defaults[N_SPEECH_PARAM] = {
0, // silence (internal use)
175, // rate wpm
@@ -113,7 +163,7 @@ int towlower2(unsigned int c)
if (c == 'I' && translator->langopts.dotless_i)
return 0x131; // I -> ı

return towlower(c);
return ucd_tolower(c);
}

static int IsRomanU(unsigned int c)
@@ -134,7 +184,6 @@ int Eof(void)
static int GetC(void)
{
int c1;
static int ungot2 = 0;

if ((c1 = ungot_char) != 0) {
ungot_char = 0;
@@ -792,7 +841,7 @@ static int attrnumber(const wchar_t *pw, int default_value, int type)

while (IsDigit09(*pw))
value = value*10 + *pw++ - '0';
if ((type == 1) && (towlower(*pw) == 's')) {
if ((type == 1) && (ucd_tolower(*pw) == 's')) {
// time: seconds rather than ms
value *= 1000;
}
@@ -869,7 +918,7 @@ static int attr_prosody_value(int param_type, const wchar_t *pw, int *value_out)
return sign; // -1, 0, or 1
}

int AddNameData(const char *name, int wide)
static int AddNameData(const char *name, int wide)
{
// Add the name to the namedata and return its position
// (Used by the Windows SAPI wrapper)

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

@@ -30,12 +30,10 @@

#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

extern int GetAmplitude(void);
extern void DoSonicSpeed(int value);
extern int saved_parameters[];

// convert from words-per-minute to internal speed factor

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

@@ -32,12 +32,10 @@

#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "spect.h"

extern double ConvertFromIeeeExtended(unsigned char *bytes);
extern int PeaksToHarmspect(wavegen_peaks_t *peaks, int pitch, int *htab, int control);
#include "ieee80.h"

extern unsigned char pk_shape1[];
extern int pk_select;
@@ -57,7 +55,7 @@ static double read_double(FILE *stream)
{
unsigned char bytes[10];
fread(bytes, sizeof(char), 10, stream);
return ConvertFromIeeeExtended(bytes);
return ConvertFromIeeeExtended((char *)bytes);
}

float polint(float xa[], float ya[], int n, float x)

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

@@ -22,6 +22,8 @@ extern "C"
{
#endif

float polint(float xa[], float ya[], int n, float x);

#define FRAME_WIDTH 1000 // max width for 8000kHz frame
#define MAX_DISPLAY_FREQ 9500
#define FRAME_HEIGHT 240
@@ -124,7 +126,7 @@ typedef struct {
int file_format;
} SpectSeq;

SpectSeq *SpectSeqCreate();
SpectSeq *SpectSeqCreate(void);
void SpectSeqDestroy(SpectSeq *spect);
espeak_ng_STATUS LoadSpectSeq(SpectSeq *spect, const char *filename);


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

@@ -50,8 +50,8 @@

#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"
#include "espeak_command.h"
#include "fifo.h"
@@ -400,7 +400,7 @@ static espeak_ng_STATUS Synthesize(unsigned int unique_identifier, const void *t

espeak_ng_STATUS status;
if (translator == NULL) {
status = espeak_SetVoiceByName("en");
status = espeak_ng_SetVoiceByName("en");
if (status != ENS_OK)
return status;
}
@@ -876,9 +876,6 @@ ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Synchronize(void)
return berr;
}

extern void FreePhData(void);
extern void FreeVoiceList(void);

ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Terminate(void)
{
#ifdef USE_ASYNC

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

@@ -33,14 +33,13 @@

#include "speech.h"
#include "phoneme.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"
#include "voice.h"

#ifdef INCLUDE_MBROLA

extern int Read4Bytes(FILE *f);
extern void SetPitch2(voice_t *voice, int pitch1, int pitch2, int *pitch_base, int *pitch_range);
extern unsigned char *outbuf;

#if defined(_WIN32) || defined(_WIN64)
@@ -573,16 +572,25 @@ void MbrolaReset(void)

espeak_ng_STATUS LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int *srate)
{
(void)mbrola_voice; // unused parameter
(void)phtrans; // unused parameter
(void)srate; // unused parameter
return ENS_NOT_SUPPORTED;
}

int MbrolaGenerate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
{
(void)phoneme_list; // unused parameter
(void)n_ph; // unused parameter
(void)resume; // unused parameter
return 0;
}

int MbrolaFill(int length, int resume, int amplitude)
{
(void)length; // unused parameter
(void)resume; // unused parameter
(void)amplitude; // unused parameter
return 0;
}


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

@@ -34,8 +34,8 @@
#include "error.h"
#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

const char *version_string = PACKAGE_VERSION;
@@ -66,14 +66,12 @@ int vowel_transition[4];
int vowel_transition0;
int vowel_transition1;

int FormantTransition2(frameref_t *seq, int *n_frames, unsigned int data1, unsigned int data2, PHONEME_TAB *other_ph, int which);

static espeak_ng_STATUS ReadPhFile(void **ptr, const char *fname, int *size, espeak_ng_ERROR_CONTEXT *context)
{
if (!ptr) return EINVAL;

FILE *f_in;
unsigned int length;
int length;
char buf[sizeof(path_home)+40];

sprintf(buf, "%s%c%s", path_home, PATHSEP, fname);
@@ -112,7 +110,6 @@ espeak_ng_STATUS LoadPhData(int *srate, espeak_ng_ERROR_CONTEXT *context)
int length = 0;
int rate;
unsigned char *p;
int *pw;

espeak_ng_STATUS status;
if ((status = ReadPhFile((void **)&phoneme_tab_data, "phontab", NULL, context)) != ENS_OK)
@@ -508,7 +505,6 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist,
unsigned int data;
int instn;
int instn2;
int count;
int check_endtype = 0;
PHONEME_TAB *ph;
PHONEME_LIST *plist_this;
@@ -760,7 +756,7 @@ int NumInstnWords(USHORT *prog)
// This instruction is followed by addWav(), 2 more words
return 4;
}
if (instn2 == OPCODE_CONTINUE)
if (instn2 == INSTN_CONTINUE)
return 3;
return 2;
}
@@ -817,10 +813,10 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_
// instructions with no operand
switch (data)
{
case OPCODE_RETURN:
case INSTN_RETURN:
end_flag = 1;
break;
case OPCODE_CONTINUE:
case INSTN_CONTINUE:
break;
default:
InvalidInstn(ph, instn);
@@ -958,7 +954,7 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_
param_sc = phdata->sound_param[instn2] = (instn >> 4) & 0xff;
prog++;

if (prog[1] != OPCODE_CONTINUE) {
if (prog[1] != INSTN_CONTINUE) {
if (instn2 < 2) {
// FMT() and WAV() imply Return
end_flag = 1;

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

@@ -33,8 +33,8 @@

#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

extern FILE *f_log;

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

@@ -74,7 +74,6 @@ extern "C"
extern int embedded_value[N_EMBEDDED_VALUES];
extern int embedded_default[N_EMBEDDED_VALUES];

#define N_PEAKS 9
#define N_PEAKS2 9 // plus Notch and Fill (not yet implemented)
#define N_MARKERS 8

@@ -268,8 +267,8 @@ typedef struct {

// instructions

#define OPCODE_RETURN 0x0001
#define OPCODE_CONTINUE 0x0002
#define INSTN_RETURN 0x0001
#define INSTN_CONTINUE 0x0002

// Group 0 instrcutions with 8 bit operand. These values go into bits 8-15 of the instruction
#define i_CHANGE_PHONEME 0x01
@@ -453,14 +452,16 @@ extern int wcmdq_head;
extern int wcmdq_tail;

// from Wavegen file
int WcmdqFree();
void WcmdqStop();
int WcmdqUsed();
void WcmdqInc();
int WcmdqFree(void);
void WcmdqStop(void);
int WcmdqUsed(void);
void WcmdqInc(void);
void WavegenInit(int rate, int wavemult_fact);
float polint(float xa[], float ya[], int n, float x);
int WavegenFill();
int WavegenFill(void);
void MarkerEvent(int type, unsigned int char_position, int value, int value2, unsigned char *out_ptr);
int GetAmplitude(void);
void SetPitch2(voice_t *voice, int pitch1, int pitch2, int *pitch_base, int *pitch_range);
int PeaksToHarmspect(wavegen_peaks_t *peaks, int pitch, int *htab, int control);

extern unsigned char *wavefile_data;
extern int samplerate;
@@ -485,6 +486,7 @@ extern char mbrola_name[20];
// from synthdata file
unsigned int LookupSound(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int *match_level, int control);
frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, int *n_frames, PHONEME_LIST *plist);
void FreePhData(void);

unsigned char *LookupEnvelope(int ix);
espeak_ng_STATUS LoadPhData(int *srate, espeak_ng_ERROR_CONTEXT *context);
@@ -497,11 +499,16 @@ void SetSpeed(int control);
void SetEmbedded(int control, int value);
void SelectPhonemeTable(int number);
int SelectPhonemeTableName(const char *name);
int FormantTransition2(frameref_t *seq, int *n_frames, unsigned int data1, unsigned int data2, PHONEME_TAB *other_ph, int which);

void Write4Bytes(FILE *f, int value);
int Read4Bytes(FILE *f);
int Reverse4Bytes(int word);

#if HAVE_SONIC_H
void DoSonicSpeed(int value);
#endif

#define ENV_LEN 128 // length of pitch envelopes
#define PITCHfall 0 // standard pitch envelopes
#define PITCHrise 2
@@ -545,10 +552,6 @@ int NumInstnWords(USHORT *prog);

void InitBreath(void);

void KlattInit();
void KlattReset(int control);
int Wavegen_Klatt2(int length, int resume, frame_t *fr1, frame_t *fr2);

#ifdef __cplusplus
}
#endif

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

@@ -1,410 +0,0 @@
/* Tokenizer APIs.
*
* Copyright (C) 2017 Reece H. Dunn
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see: <http://www.gnu.org/licenses/>.
*/

#include "config.h"

#include <errno.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <espeak-ng/espeak_ng.h>
#include <espeak-ng/encoding.h>
#include <espeak-ng/tokenizer.h>
#include <ucd/ucd.h>

#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "translate.h"

#define ESPEAKNG_CLAUSE_TYPE_PROPERTY_MASK 0xFFF0000000000000ull

int clause_type_from_codepoint(uint32_t c)
{
ucd_category cat = ucd_lookup_category(c);
ucd_property props = ucd_properties(c, cat);

switch (props & ESPEAKNG_CLAUSE_TYPE_PROPERTY_MASK)
{
case ESPEAKNG_PROPERTY_FULL_STOP:
return CLAUSE_PERIOD;
case ESPEAKNG_PROPERTY_FULL_STOP | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
return CLAUSE_PERIOD | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_QUESTION_MARK:
return CLAUSE_QUESTION;
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
return CLAUSE_QUESTION | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_PUNCTUATION_IN_WORD:
return CLAUSE_QUESTION | CLAUSE_PUNCTUATION_IN_WORD;
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK:
return CLAUSE_EXCLAMATION;
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
return CLAUSE_EXCLAMATION | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_PUNCTUATION_IN_WORD:
return CLAUSE_EXCLAMATION | CLAUSE_PUNCTUATION_IN_WORD;
case ESPEAKNG_PROPERTY_COMMA:
return CLAUSE_COMMA;
case ESPEAKNG_PROPERTY_COMMA | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
return CLAUSE_COMMA | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_COLON:
return CLAUSE_COLON;
case ESPEAKNG_PROPERTY_COLON | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
return CLAUSE_COLON | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_SEMI_COLON:
case ESPEAKNG_PROPERTY_EXTENDED_DASH:
return CLAUSE_SEMICOLON;
case ESPEAKNG_PROPERTY_SEMI_COLON | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER:
case ESPEAKNG_PROPERTY_QUESTION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER | ESPEAKNG_PROPERTY_INVERTED_TERMINAL_PUNCTUATION:
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK | ESPEAKNG_PROPERTY_OPTIONAL_SPACE_AFTER | ESPEAKNG_PROPERTY_INVERTED_TERMINAL_PUNCTUATION:
return CLAUSE_SEMICOLON | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_ELLIPSIS:
return CLAUSE_SEMICOLON | CLAUSE_SPEAK_PUNCTUATION_NAME | CLAUSE_OPTIONAL_SPACE_AFTER;
case ESPEAKNG_PROPERTY_PARAGRAPH_SEPARATOR:
return CLAUSE_PARAGRAPH;
}

return CLAUSE_NONE;
}

typedef enum {
ESPEAKNG_CTYPE_OTHER,
ESPEAKNG_CTYPE_CARRIAGE_RETURN,
ESPEAKNG_CTYPE_NEWLINE,
ESPEAKNG_CTYPE_END_OF_STRING,
ESPEAKNG_CTYPE_PARAGRAPH,
ESPEAKNG_CTYPE_WHITESPACE,
ESPEAKNG_CTYPE_LOWERCASE,
ESPEAKNG_CTYPE_UPPERCASE,
ESPEAKNG_CTYPE_FULL_STOP,
ESPEAKNG_CTYPE_QUESTION_MARK,
ESPEAKNG_CTYPE_EXCLAMATION_MARK,
ESPEAKNG_CTYPE_COMMA,
ESPEAKNG_CTYPE_COLON,
ESPEAKNG_CTYPE_SEMICOLON,
ESPEAKNG_CTYPE_ELLIPSIS,
ESPEAKNG_CTYPE_PUNCTUATION,
ESPEAKNG_CTYPE_SYMBOL,
} espeakng_CTYPE;

#define ESPEAKNG_CTYPE_PROPERTY_MASK 0xFE0000000000C001ull

// Reference: http://www.unicode.org/reports/tr14/tr14-32.html -- Unicode Line Breaking Algorithm
static espeakng_CTYPE codepoint_type(uint32_t c)
{
// 1. Detect and classify specific codepoints.

switch (c)
{
case 0x0000: return ESPEAKNG_CTYPE_END_OF_STRING; // NULL
case 0x000A: return ESPEAKNG_CTYPE_NEWLINE; // LINE FEED (LF)
case 0x000C: return ESPEAKNG_CTYPE_NEWLINE; // FORM FEED (FF)
case 0x000D: return ESPEAKNG_CTYPE_CARRIAGE_RETURN; // CARRIAGE RETURN (CR)
case 0x0085: return ESPEAKNG_CTYPE_NEWLINE; // NEW LINE (NEL)
}

// 2. Override property types for codepoints by their Unicode General Category.

ucd_category cat = ucd_lookup_category(c);
switch (cat)
{
case UCD_CATEGORY_Zl: return ESPEAKNG_CTYPE_NEWLINE;
case UCD_CATEGORY_Zp: return ESPEAKNG_CTYPE_PARAGRAPH;
}

// 3. Classify codepoints by their Unicode properties.

ucd_property props = ucd_properties(c, cat);
switch (props & ESPEAKNG_CTYPE_PROPERTY_MASK)
{
case UCD_PROPERTY_WHITE_SPACE:
return ESPEAKNG_CTYPE_WHITESPACE;
case UCD_PROPERTY_OTHER_LOWERCASE:
return ESPEAKNG_CTYPE_LOWERCASE;
case UCD_PROPERTY_OTHER_UPPERCASE:
return ESPEAKNG_CTYPE_UPPERCASE;
case ESPEAKNG_PROPERTY_FULL_STOP:
return ESPEAKNG_CTYPE_FULL_STOP;
case ESPEAKNG_PROPERTY_QUESTION_MARK:
return ESPEAKNG_CTYPE_QUESTION_MARK;
case ESPEAKNG_PROPERTY_EXCLAMATION_MARK:
return ESPEAKNG_CTYPE_EXCLAMATION_MARK;
case ESPEAKNG_PROPERTY_COMMA:
return ESPEAKNG_CTYPE_COMMA;
case ESPEAKNG_PROPERTY_COLON:
return ESPEAKNG_CTYPE_COLON;
case ESPEAKNG_PROPERTY_SEMI_COLON:
return ESPEAKNG_CTYPE_SEMICOLON;
case ESPEAKNG_PROPERTY_ELLIPSIS:
return ESPEAKNG_CTYPE_ELLIPSIS;
}

// 4. Classify codepoints by their Unicode General Category.

switch (cat)
{
case UCD_CATEGORY_Lu: return ESPEAKNG_CTYPE_UPPERCASE;
case UCD_CATEGORY_Ll: return ESPEAKNG_CTYPE_LOWERCASE;
case UCD_CATEGORY_Pc: return ESPEAKNG_CTYPE_PUNCTUATION;
case UCD_CATEGORY_Pd: return ESPEAKNG_CTYPE_PUNCTUATION;
case UCD_CATEGORY_Pe: return ESPEAKNG_CTYPE_PUNCTUATION;
case UCD_CATEGORY_Pf: return ESPEAKNG_CTYPE_PUNCTUATION;
case UCD_CATEGORY_Pi: return ESPEAKNG_CTYPE_PUNCTUATION;
case UCD_CATEGORY_Po: return ESPEAKNG_CTYPE_PUNCTUATION;
case UCD_CATEGORY_Ps: return ESPEAKNG_CTYPE_PUNCTUATION;
case UCD_CATEGORY_Sc: return ESPEAKNG_CTYPE_SYMBOL;
case UCD_CATEGORY_Sk: return ESPEAKNG_CTYPE_SYMBOL;
case UCD_CATEGORY_Sm: return ESPEAKNG_CTYPE_SYMBOL;
case UCD_CATEGORY_So: return ESPEAKNG_CTYPE_SYMBOL;
}

// 5. Classify the remaining codepoints.

return ESPEAKNG_CTYPE_OTHER;
}

#define ESPEAKNG_CODEPOINT_INVALID 0xFFFFFFFF

struct espeak_ng_TOKENIZER_
{
espeak_ng_TEXT_DECODER *decoder;
char token[256];
uint32_t keepc;

espeak_ng_TOKEN_TYPE (*read)(espeak_ng_TOKENIZER *tokenizer);
};

static espeak_ng_TOKEN_TYPE
tokenizer_state_end_of_buffer(espeak_ng_TOKENIZER *tokenizer)
{
*tokenizer->token = '\0';
return ESPEAKNG_TOKEN_END_OF_BUFFER;
}

static espeak_ng_TOKEN_TYPE
tokenizer_read_word_token(espeak_ng_TOKENIZER *tokenizer, char *current, espeak_ng_TOKEN_TYPE type)
{
char *end = tokenizer->token + sizeof(tokenizer->token) - 5; // allow for UTF-8 trailing bytes
int initial_state = 1;

while (current < end && !text_decoder_eof(tokenizer->decoder)) {
uint32_t c = text_decoder_getc(tokenizer->decoder);
switch (codepoint_type(c))
{
case ESPEAKNG_CTYPE_LOWERCASE:
current += utf8_out(c, current);
switch (type)
{
case ESPEAKNG_TOKEN_WORD_LOWERCASE:
case ESPEAKNG_TOKEN_WORD_MIXEDCASE:
case ESPEAKNG_TOKEN_WORD_CAPITALIZED:
break;
case ESPEAKNG_TOKEN_WORD_UPPERCASE:
type = initial_state
? ESPEAKNG_TOKEN_WORD_CAPITALIZED
: ESPEAKNG_TOKEN_WORD_MIXEDCASE;
break;
}
initial_state = 0;
break;
case ESPEAKNG_CTYPE_UPPERCASE:
current += utf8_out(c, current);
switch (type)
{
case ESPEAKNG_TOKEN_WORD_UPPERCASE:
case ESPEAKNG_TOKEN_WORD_MIXEDCASE:
break;
case ESPEAKNG_TOKEN_WORD_LOWERCASE:
case ESPEAKNG_TOKEN_WORD_CAPITALIZED:
type = ESPEAKNG_TOKEN_WORD_MIXEDCASE;
break;
}
initial_state = 0;
break;
default:
tokenizer->keepc = c;
*current = '\0';
return type;
}
}

*current = '\0';
return type;
}

static espeak_ng_TOKEN_TYPE
tokenizer_state_default(espeak_ng_TOKENIZER *tokenizer)
{
if (text_decoder_eof(tokenizer->decoder)) {
tokenizer->read = tokenizer_state_end_of_buffer;
return tokenizer_state_end_of_buffer(tokenizer);
}

char *current = tokenizer->token;
char *end = tokenizer->token + sizeof(tokenizer->token) - 5; // allow for UTF-8 trailing bytes

uint32_t c;
if (tokenizer->keepc != ESPEAKNG_CODEPOINT_INVALID) {
c = tokenizer->keepc;
tokenizer->keepc = ESPEAKNG_CODEPOINT_INVALID;
} else {
c = text_decoder_getc(tokenizer->decoder);
}

switch (codepoint_type(c))
{
case ESPEAKNG_CTYPE_END_OF_STRING: // '\0'
tokenizer->read = tokenizer_state_end_of_buffer;
return tokenizer_state_end_of_buffer(tokenizer);
case ESPEAKNG_CTYPE_CARRIAGE_RETURN: // '\r'
if (text_decoder_peekc(tokenizer->decoder) == '\n') {
current += utf8_out(c, current);
c = text_decoder_getc(tokenizer->decoder);
}
// fallthrough
case ESPEAKNG_CTYPE_NEWLINE:
current += utf8_out(c, current);
*current = '\0';
return ESPEAKNG_TOKEN_NEWLINE;
case ESPEAKNG_CTYPE_PARAGRAPH:
current += utf8_out(c, current);
*current = '\0';
return ESPEAKNG_TOKEN_PARAGRAPH;
case ESPEAKNG_CTYPE_WHITESPACE:
current += utf8_out(c, current);
while (!text_decoder_eof(tokenizer->decoder) &&
current < end &&
codepoint_type(c = text_decoder_getc(tokenizer->decoder)) == ESPEAKNG_CTYPE_WHITESPACE)
{
current += utf8_out(c, current);
}
tokenizer->keepc = c;
*current = '\0';
return ESPEAKNG_TOKEN_WHITESPACE;
case ESPEAKNG_CTYPE_LOWERCASE:
current += utf8_out(c, current);
return tokenizer_read_word_token(tokenizer, current, ESPEAKNG_TOKEN_WORD_LOWERCASE);
case ESPEAKNG_CTYPE_UPPERCASE:
current += utf8_out(c, current);
return tokenizer_read_word_token(tokenizer, current, ESPEAKNG_TOKEN_WORD_UPPERCASE);
case ESPEAKNG_CTYPE_FULL_STOP:
current += utf8_out(c, current);
if (c == '.' && text_decoder_peekc(tokenizer->decoder) == '.') {
c = text_decoder_getc(tokenizer->decoder);
if (text_decoder_peekc(tokenizer->decoder) == '.') {
c = text_decoder_getc(tokenizer->decoder);
current += utf8_out('.', current);
current += utf8_out('.', current);
*current = '\0';
return ESPEAKNG_TOKEN_ELLIPSIS;
} else {
tokenizer->keepc = c;
}
}
*current = '\0';
return ESPEAKNG_TOKEN_FULL_STOP;
case ESPEAKNG_CTYPE_QUESTION_MARK:
current += utf8_out(c, current);
*current = '\0';
return ESPEAKNG_TOKEN_QUESTION_MARK;
case ESPEAKNG_CTYPE_EXCLAMATION_MARK:
current += utf8_out(c, current);
*current = '\0';
return ESPEAKNG_TOKEN_EXCLAMATION_MARK;
case ESPEAKNG_CTYPE_COMMA:
current += utf8_out(c, current);
*current = '\0';
return ESPEAKNG_TOKEN_COMMA;
case ESPEAKNG_CTYPE_COLON:
current += utf8_out(c, current);
*current = '\0';
return ESPEAKNG_TOKEN_COLON;
case ESPEAKNG_CTYPE_SEMICOLON:
current += utf8_out(c, current);
*current = '\0';
return ESPEAKNG_TOKEN_SEMICOLON;
case ESPEAKNG_CTYPE_ELLIPSIS:
current += utf8_out(c, current);
*current = '\0';
return ESPEAKNG_TOKEN_ELLIPSIS;
case ESPEAKNG_CTYPE_PUNCTUATION:
current += utf8_out(c, current);
*current = '\0';
return ESPEAKNG_TOKEN_PUNCTUATION;
case ESPEAKNG_CTYPE_SYMBOL:
current += utf8_out(c, current);
*current = '\0';
return ESPEAKNG_TOKEN_SYMBOL;
default:
current += utf8_out(c, current);
*current = '\0';
return ESPEAKNG_TOKEN_UNKNOWN;
}

return ESPEAKNG_TOKEN_END_OF_BUFFER;
}

#pragma GCC visibility push(default)

espeak_ng_TOKENIZER *
create_tokenizer(void)
{
espeak_ng_TOKENIZER *tokenizer = malloc(sizeof(espeak_ng_TOKENIZER));
if (!tokenizer) return NULL;

tokenizer->decoder = NULL;
tokenizer->keepc = ESPEAKNG_CODEPOINT_INVALID;
tokenizer->read = tokenizer_state_end_of_buffer;

*tokenizer->token = '\0';
return tokenizer;
}

void
destroy_tokenizer(espeak_ng_TOKENIZER *tokenizer)
{
if (tokenizer) free(tokenizer);
}

int
tokenizer_reset(espeak_ng_TOKENIZER *tokenizer,
espeak_ng_TEXT_DECODER *decoder,
espeak_ng_TOKENIZER_OPTIONS options)
{
if (!tokenizer) return 0;

tokenizer->decoder = decoder;
tokenizer->keepc = ESPEAKNG_CODEPOINT_INVALID;
tokenizer->read = decoder ? tokenizer_state_default : tokenizer_state_end_of_buffer;
return 1;
}

espeak_ng_TOKEN_TYPE
tokenizer_read_next_token(espeak_ng_TOKENIZER *tokenizer)
{
return tokenizer->read(tokenizer);
}

const char *
tokenizer_get_token_text(espeak_ng_TOKENIZER *tokenizer)
{
return tokenizer->token;
}

#pragma GCC visibility pop

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

@@ -32,6 +32,7 @@

#include "speech.h"
#include "phoneme.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

@@ -158,19 +159,44 @@ static void SetLetterBitsRange(Translator *tr, int group, int first, int last)

// ignore these characters
static const unsigned short chars_ignore_default[] = {
0xad, 1, // soft hyphen
0x200c, 1, // zero width non-joiner
0x200d, 1, // zero width joiner
0, 0
// U+00AD SOFT HYPHEN
// Used to mark hyphenation points in words for where to split a
// word at the end of a line to provide readable justified text.
0xad, 1,
// U+200C ZERO WIDTH NON-JOINER
// Used to prevent combined ligatures being displayed in their
// combined form.
0x200c, 1,
// U+200D ZERO WIDTH JOINER
// Used to indicate an alternative connected form made up of the
// characters surrounding the ZWJ in Devanagari, Kannada, Malayalam
// and Emoji.
// 0x200d, 1, // Not ignored.
// End of the ignored character list.
0, 0
};

// alternatively, ignore characters but allow zero-width-non-joiner (lang-fa)
static const unsigned short chars_ignore_zwnj_hyphen[] = {
0xad, 1, // soft hyphen
0x640, 1, // igniore Arabic Tatweel (lang=FA)
0x200c, '-', // zero width non-joiner, replace with hyphen
0x200d, 1, // zero width joiner
0, 0
// U+00AD SOFT HYPHEN
// Used to mark hyphenation points in words for where to split a
// word at the end of a line to provide readable justified text.
0xad, 1,
// U+0640 TATWEEL (KASHIDA)
// Used in Arabic scripts to stretch characters for justifying
// the text.
0x640, 1,
// U+200C ZERO WIDTH NON-JOINER
// Used to prevent combined ligatures being displayed in their
// combined form.
0x200c, '-',
// U+200D ZERO WIDTH JOINER
// Used to indicate an alternative connected form made up of the
// characters surrounding the ZWJ in Devanagari, Kannada, Malayalam
// and Emoji.
// 0x200d, 1, // Not ignored.
// End of the ignored character list.
0, 0
};

const unsigned char utf8_ordinal[] = { 0xc2, 0xba, 0 }; // masculine ordinal character, UTF-8
@@ -387,7 +413,7 @@ static void SetCyrillicLetters(Translator *tr)
SetLetterBits(tr, LETTERGP_VOWEL2, (char *)ru_vowels);
}

void SetIndicLetters(Translator *tr)
static void SetIndicLetters(Translator *tr)
{
// Set letter types for Indic scripts, Devanagari, Tamill, etc
static const char dev_consonants2[] = { 0x02, 0x03, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x7b, 0x7c, 0x7e, 0x7f, 0 };
@@ -412,7 +438,7 @@ void SetIndicLetters(Translator *tr)
tr->langopts.suffix_add_e = tr->letter_bits_offset + 0x4d; // virama
}

void SetupTranslator(Translator *tr, const short *lengths, const unsigned char *amps)
static void SetupTranslator(Translator *tr, const short *lengths, const unsigned char *amps)
{
if (lengths != NULL)
memcpy(tr->stress_lengths, lengths, sizeof(tr->stress_lengths));

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

@@ -33,8 +33,8 @@

#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

Translator *translator = NULL; // the main translator
@@ -254,7 +254,7 @@ int IsDigit(unsigned int c)
return 0;
}

int IsSpace(unsigned int c)
static int IsSpace(unsigned int c)
{
if (c == 0)
return 0;
@@ -265,6 +265,16 @@ int IsSpace(unsigned int c)
return iswspace(c);
}

int isspace2(unsigned int c)
{
// can't use isspace() because on Windows, isspace(0xe1) gives TRUE !
int c2;

if (((c2 = (c & 0xff)) == 0) || (c > ' '))
return 0;
return 1;
}

void DeleteTranslator(Translator *tr)
{
if (tr->data_dictlist != NULL)
@@ -388,6 +398,40 @@ int utf8_in(int *c, const char *buf)
}
#pragma GCC visibility pop

int utf8_out(unsigned int c, char *buf)
{
// write a unicode character into a buffer as utf8
// returns the number of bytes written

int n_bytes;
int j;
int shift;
static char unsigned code[4] = { 0, 0xc0, 0xe0, 0xf0 };

if (c < 0x80) {
buf[0] = c;
return 1;
}
if (c >= 0x110000) {
buf[0] = ' '; // out of range character code
return 1;
}
if (c < 0x0800)
n_bytes = 1;
else if (c < 0x10000)
n_bytes = 2;
else
n_bytes = 3;

shift = 6*n_bytes;
buf[0] = code[n_bytes] | (c >> shift);
for (j = 0; j < n_bytes; j++) {
shift -= 6;
buf[j+1] = 0x80 + ((c >> shift) & 0x3f);
}
return n_bytes+1;
}

char *strchr_w(const char *s, int c)
{
// return NULL for any non-ascii character
@@ -396,17 +440,6 @@ char *strchr_w(const char *s, int c)
return strchr((char *)s, c); // (char *) is needed for Borland compiler
}

int IsAllUpper(const char *word)
{
int c;
while ((*word != 0) && !isspace2(*word)) {
word += utf8_in(&c, word);
if (!iswupper(c))
return 0;
}
return 1;
}

static char *SpeakIndividualLetters(Translator *tr, char *word, char *phonemes, int spell_word)
{
int posn = 0;
@@ -525,7 +558,6 @@ static int TranslateWord3(Translator *tr, char *word_start, WORD_TAB *wtab, char
int more_suffixes;
int confirm_prefix;
int spell_word;
int stress_bits;
int emphasize_allcaps = 0;
int wflags;
int wmark;
@@ -1139,7 +1171,7 @@ int TranslateWord(Translator *tr, char *word_start, WORD_TAB *wtab, char *word_o
char word[N_WORD_BYTES+1];
word[0] = 0;
word[1] = ' ';
memcpy(word+2, word_out, strlen(word_out));
strcpy(word+2, word_out);
word_out = word+2;

while (*word_out && available > 1) {
@@ -1195,7 +1227,7 @@ static int CountSyllables(unsigned char *phonemes)
return count;
}

void Word_EmbeddedCmd()
static void Word_EmbeddedCmd()
{
// Process embedded commands for emphasis, sayas, and break
int embedded_cmd;
@@ -1791,13 +1823,13 @@ static int SubstituteChar(Translator *tr, unsigned int c, unsigned int next_in,
// don't convert the case of the second character unless the next letter is also upper case
c2 = new_c >> 16;
if (upper_case && iswupper(next_in))
c2 = towupper(c2);
c2 = ucd_toupper(c2);
*insert = c2;
new_c &= 0xffff;
}

if (upper_case)
new_c = towupper(new_c);
new_c = ucd_toupper(new_c);

*wordflags |= FLAG_CHAR_REPLACED;
return new_c;
@@ -1874,7 +1906,7 @@ static int TranslateChar(Translator *tr, char *ptr, int prev_in, unsigned int c,

static const char *UCase_ga[] = { "bp", "bhf", "dt", "gc", "hA", "mb", "nd", "ng", "ts", "tA", "nA", NULL };

int UpperCaseInWord(Translator *tr, char *word, int c)
static int UpperCaseInWord(Translator *tr, char *word, int c)
{
int ix;
int len;

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

@@ -1,7 +1,7 @@
/*
* Copyright (C) 2005 to 2014 by Jonathan Duddington
* email: [email protected]
* Copyright (C) 2015 Reece H. Dunn
* Copyright (C) 2015-2017 Reece H. Dunn
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -706,10 +706,15 @@ extern void SetLengthMods(Translator *tr, int value);

void LoadConfig(void);
int TransposeAlphabet(Translator *tr, char *text);

#define LEADING_2_BITS 0xC0 // 0b11000000
#define UTF8_TAIL_BITS 0x80 // 0b10000000

ESPEAK_NG_API int utf8_in(int *c, const char *buf);
int utf8_in2(int *c, const char *buf, int backwards);
int utf8_out(unsigned int c, char *buf);
int utf8_nbytes(const char *buf);

int lookupwchar(const unsigned short *list, int c);
int lookupwchar2(const unsigned short *list, int c);
int Eof(void);
@@ -747,6 +752,10 @@ void LookupAccentedLetter(Translator *tr, unsigned int letter, char *ph_buf);

int LoadDictionary(Translator *tr, const char *name, int no_error);
int LookupDictList(Translator *tr, char **wordptr, char *ph_out, unsigned int *flags, int end_flags, WORD_TAB *wtab);
int HashDictionary(const char *string);

void print_dictionary_flags(unsigned int *flags, char *buf, int buf_len);
char *DecodeRule(const char *group_chars, int group_length, char *rule, int control);

void MakePhonemeList(Translator *tr, int post_pause, int new_sentence);
int ChangePhonemes_ru(Translator *tr, PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch);

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

@@ -22,6 +22,8 @@ extern "C"
{
#endif

#define N_PEAKS 9

typedef struct {
char v_name[40];
char language_name[20];
@@ -86,6 +88,7 @@ espeak_ng_STATUS DoVoiceChange(voice_t *v);
void WavegenSetVoice(voice_t *v);
void ReadTonePoints(char *string, int *tone_pts);
void VoiceReset(int control);
void FreeVoiceList(void);

#ifdef __cplusplus
}

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

@@ -40,8 +40,8 @@

#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"
#include "translate.h"

MNEM_TAB genders[] = {
@@ -474,18 +474,6 @@ static int Read8Numbers(char *data_in, int *data)
&data[0], &data[1], &data[2], &data[3], &data[4], &data[5], &data[6], &data[7]);
}

static unsigned int StringToWord2(const char *string)
{
// Convert a language name string to a word such as L('e','n')
int ix;
int c;
unsigned int value = 0;

for (ix = 0; (ix < 4) && ((c = string[ix]) != 0); ix++)
value = (value << 8) | (c & 0xff);
return value;
}

voice_t *LoadVoice(const char *vname, int control)
{
// control, bit 0 1= no_default
@@ -544,7 +532,7 @@ voice_t *LoadVoice(const char *vname, int control)
return NULL;
} else {
if (voicename[0] == 0)
strcpy(voicename, "en");
strcpy(voicename, ESPEAKNG_DEFAULT_VOICE);

sprintf(path_voices, "%s%cvoices%c", path_home, PATHSEP, PATHSEP);
sprintf(buf, "%s%s", path_voices, voicename); // look in the main voices directory
@@ -705,47 +693,57 @@ voice_t *LoadVoice(const char *vname, int control)
break;
case V_INTONATION: // intonation
sscanf(p, "%d %d", &option_tone_flags, &option_tone2);
if ((option_tone_flags & 0xff) != 0)
langopts->intonation_group = option_tone_flags & 0xff;
if ((option_tone_flags & 0xff) != 0) {
if (langopts)
langopts->intonation_group = option_tone_flags & 0xff;
else
fprintf(stderr, "Cannot set intonation: language not set, or is invalid.\n");
}
break;
case V_TUNES:
n = sscanf(p, "%s %s %s %s %s %s", names[0], names[1], names[2], names[3], names[4], names[5]);
langopts->intonation_group = 0;
for (ix = 0; ix < n; ix++) {
if (strcmp(names[ix], "NULL") == 0)
continue;

if ((value = LookupTune(names[ix])) < 0)
fprintf(stderr, "Unknown tune '%s'\n", names[ix]);
else
langopts->tunes[ix] = value;
}
if (langopts) {
langopts->intonation_group = 0;
for (ix = 0; ix < n; ix++) {
if (strcmp(names[ix], "NULL") == 0)
continue;

if ((value = LookupTune(names[ix])) < 0)
fprintf(stderr, "Unknown tune '%s'\n", names[ix]);
else
langopts->tunes[ix] = value;
}
} else
fprintf(stderr, "Cannot set tunes: language not set, or is invalid.\n");
break;
case V_DICTRULES: // conditional dictionary rules and list entries
case V_NUMBERS:
case V_STRESSOPT:
// expect a list of numbers
while (*p != 0) {
while (isspace(*p)) p++;
if ((n = atoi(p)) > 0) {
p++;
if (n < 32) {
if (key == V_DICTRULES)
conditional_rules |= (1 << n);
else if (key == V_NUMBERS)
langopts->numbers |= (1 << n);
else if (key == V_STRESSOPT)
langopts->stress_flags |= (1 << n);
} else {
if ((key == V_NUMBERS) && (n < 64))
langopts->numbers2 |= (1 << (n-32));
else
fprintf(stderr, "Bad option number %d\n", n);
if (langopts) {
// expect a list of numbers
while (*p != 0) {
while (isspace(*p)) p++;
if ((n = atoi(p)) > 0) {
p++;
if (n < 32) {
if (key == V_DICTRULES)
conditional_rules |= (1 << n);
else if (key == V_NUMBERS)
langopts->numbers |= (1 << n);
else if (key == V_STRESSOPT)
langopts->stress_flags |= (1 << n);
} else {
if ((key == V_NUMBERS) && (n < 64))
langopts->numbers2 |= (1 << (n-32));
else
fprintf(stderr, "Bad option number %d\n", n);
}
}
while (isalnum(*p)) p++;
}
while (isalnum(*p)) p++;
}
ProcessLanguageOptions(langopts);
ProcessLanguageOptions(langopts);
} else
fprintf(stderr, "Cannot set stressopt: language not set, or is invalid.\n");
break;
case V_REPLACE:
if (phonemes_set == 0) {
@@ -756,22 +754,31 @@ voice_t *LoadVoice(const char *vname, int control)
PhonemeReplacement(p);
break;
case V_WORDGAP: // words
sscanf(p, "%d %d", &langopts->word_gap, &langopts->vowel_pause);
if (langopts)
sscanf(p, "%d %d", &langopts->word_gap, &langopts->vowel_pause);
else
fprintf(stderr, "Cannot set wordgap: language not set, or is invalid.\n");
break;
case V_STRESSRULE:
sscanf(p, "%d %d %d %d", &langopts->stress_rule,
&langopts->stress_flags,
&langopts->unstressed_wd1,
&langopts->unstressed_wd2);
if (langopts)
sscanf(p, "%d %d %d %d", &langopts->stress_rule,
&langopts->stress_flags,
&langopts->unstressed_wd1,
&langopts->unstressed_wd2);
else
fprintf(stderr, "Cannot set stressrule: language not set, or is invalid.\n");
break;
case V_OPTION:
value2 = 0;
if (((sscanf(p, "%s %d %d", option_name, &value, &value2) >= 2) && ((ix = LookupMnem(options_tab, option_name)) >= 0)) ||
((sscanf(p, "%d %d %d", &ix, &value, &value2) >= 2) && (ix < N_LOPTS))) {
langopts->param[ix] = value;
langopts->param2[ix] = value2;
if (langopts) {
value2 = 0;
if (((sscanf(p, "%s %d %d", option_name, &value, &value2) >= 2) && ((ix = LookupMnem(options_tab, option_name)) >= 0)) ||
((sscanf(p, "%d %d %d", &ix, &value, &value2) >= 2) && (ix < N_LOPTS))) {
langopts->param[ix] = value;
langopts->param2[ix] = value2;
} else
fprintf(stderr, "Bad voice option: %s %s\n", buf, p);
} else
fprintf(stderr, "Bad voice option: %s %s\n", buf, p);
fprintf(stderr, "Cannot set option: language not set, or is invalid.\n");
break;
case V_ECHO:
// echo. suggest: 135mS 11%
@@ -852,9 +859,12 @@ voice_t *LoadVoice(const char *vname, int control)
case V_STATUS:
break;
default:
if ((key & 0xff00) == 0x100)
sscanf(p, "%d", &langopts->param[key &0xff]);
else
if ((key & 0xff00) == 0x100) {
if (langopts)
sscanf(p, "%d", &langopts->param[key &0xff]);
else
fprintf(stderr, "Cannot set voice attribute: language not set, or is invalid.\n");
} else
fprintf(stderr, "Bad voice attribute: %s\n", buf);
break;
}
@@ -1272,7 +1282,7 @@ char const *SelectVoice(espeak_VOICE *voice_select, int *found)

if (voice_select2.name == NULL) {
if ((voice_select2.name = voice_select2.identifier) == NULL)
voice_select2.name = "default";
voice_select2.name = ESPEAKNG_DEFAULT_VOICE;
}

strncpy0(buf, voice_select2.name, sizeof(buf));
@@ -1299,7 +1309,7 @@ char const *SelectVoice(espeak_VOICE *voice_select, int *found)
if (nv == 0) {
// no matching voice, choose the default
*found = 0;
if ((voices[0] = SelectVoiceByName(voices_list, "default")) != NULL)
if ((voices[0] = SelectVoiceByName(voices_list, ESPEAKNG_DEFAULT_VOICE)) != NULL)
nv = 1;
}


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

@@ -33,8 +33,12 @@

#include "speech.h"
#include "phoneme.h"
#include "synthesize.h"
#include "voice.h"
#include "synthesize.h"

#ifdef INCLUDE_KLATT
#include "klatt.h"
#endif

#if HAVE_SONIC_H
#include "sonic.h"
@@ -665,7 +669,7 @@ static int ApplyBreath(void)
return value;
}

int Wavegen()
static int Wavegen()
{
if (wvoice == NULL)
return 0;
@@ -1117,7 +1121,7 @@ void SetPitch2(voice_t *voice, int pitch1, int pitch2, int *pitch_base, int *pit
*pitch_range = base + (pitch2 * range)/2 - *pitch_base;
}

void SetPitch(int length, unsigned char *env, int pitch1, int pitch2)
static void SetPitch(int length, unsigned char *env, int pitch1, int pitch2)
{
if (wvoice == NULL)
return;
@@ -1140,7 +1144,7 @@ void SetPitch(int length, unsigned char *env, int pitch1, int pitch2)
flutter_amp = wvoice->flutter;
}

void SetSynth(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v)
static void SetSynth(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v)
{
if (wvoice == NULL || v == NULL)
return;
@@ -1246,7 +1250,7 @@ void Write4Bytes(FILE *f, int value)
}
}

int WavegenFill2()
static int WavegenFill2()
{
// Pick up next wavegen commands from the queue
// return: 0 output buffer has been filled

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

@@ -1,4 +1,5 @@
.*.swp
*~

# intermediate files:

@@ -52,12 +53,15 @@ depcomp
install-sh
libtool
ltmain.sh
m4/
missing
Makefile
Makefile.in
stamp-h1

m4/*
!m4/ax_check_compile_flag.m4

# emscripten:

a.out.js
a.out.js.mem

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

@@ -7,11 +7,14 @@ These are eSpeak NG specific modifications to the `ucd-tools` project:
* `data/espeak-ng` data files for eSpeak NG extended data.
* espeak-ng PropList property lookup as part of the `ucd_property` API.

## 9.0.0.1 - (In Progress)
## 10.0.0 - 2017-06-25

* Add `iswblank` and `iswxdigit` compatibility.
* Improve ctype compatibility.
* PropList property lookup.
* PropList and emoji-data property lookup.
* Support building with a C89 compiler.
* Update to Unicode Character Data 10.0.0.
* Unicode Emoji 5.0.

## 9.0.0 - 2016-12-28


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

@@ -55,34 +55,34 @@ EXTRA_DIST += ChangeLog

############################# Unicode Data ####################################

EMOJI_VERSION=4.0
EMOJI_VERSION=5.0
UCD_VERSION=@UCD_VERSION@
UCD_ROOTDIR=data/ucd
UCD_SRCDIR=http://www.unicode.org/Public

data/emoji/emoji-data.txt:
mkdir -pv data/emoji
curl ${UCD_SRCDIR}/emoji/${EMOJI_VERSION}/emoji-data.txt > $@
curl ${UCD_SRCDIR}/emoji/${EMOJI_VERSION}/emoji-data.txt -o $@

data/ucd/PropList.txt:
mkdir -pv data/ucd
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/PropList.txt > $@
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/PropList.txt -o $@

data/ucd/DerivedCoreProperties.txt:
mkdir -pv data/ucd
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/DerivedCoreProperties.txt > $@
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/DerivedCoreProperties.txt -o $@

data/ucd/PropertyValueAliases.txt:
mkdir -pv data/ucd
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/PropertyValueAliases.txt > $@
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/PropertyValueAliases.txt -o $@

data/ucd/Scripts.txt:
mkdir -pv data/ucd
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/Scripts.txt > $@
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/Scripts.txt -o $@

data/ucd/UnicodeData.txt:
mkdir -pv data/ucd
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/UnicodeData.txt > $@
curl ${UCD_SRCDIR}/${UCD_VERSION}/ucd/UnicodeData.txt -o $@

############################# documentation ###################################


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

@@ -1,5 +1,5 @@
AC_PREREQ([2.65])
AC_INIT([Unicode Character Database Tools], [9.0.0], [https://github.com/rhdunn/ucd-tools/issues], [ucd-tools], [https://github.com/rhdunn/ucd-tools])
AC_INIT([Unicode Character Database Tools], [10.0.0], [https://github.com/rhdunn/ucd-tools/issues], [ucd-tools], [https://github.com/rhdunn/ucd-tools])
AM_INIT_AUTOMAKE()

m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES])
@@ -24,6 +24,7 @@ dnl library checks.
dnl ================================================================

AC_CHECK_HEADERS([stddef.h]) dnl C89
AC_CHECK_FUNCS([iswblank]) dnl C99

AC_TYPE_UINT8_T
AC_TYPE_UINT32_T
@@ -33,13 +34,22 @@ dnl UCD data configuration.
dnl ================================================================

AC_ARG_WITH([unicode-version],
[AS_HELP_STRING([--with-unicode-version], [Unicode version to support @<:@default=9.0.0@:>@])],
[AS_HELP_STRING([--with-unicode-version], [Unicode version to support @<:@default=10.0.0@:>@])],
[AS_IF([test x"$withval" != x],
[UCD_VERSION="$withval"])],
[UCD_VERSION="9.0.0"])
[UCD_VERSION="10.0.0"])

AC_SUBST(UCD_VERSION)

dnl ================================================================
dnl Compiler warnings.
dnl
dnl Reference: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
dnl ================================================================

AX_CHECK_COMPILE_FLAG([-Wmissing-prototypes], [CFLAGS="-Wmissing-prototypes $CFLAGS"])
AX_CHECK_COMPILE_FLAG([-Wreturn-type], [CFLAGS="-Wreturn-type $CFLAGS"])

dnl ================================================================
dnl Generate output.
dnl ================================================================

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

@@ -0,0 +1,75 @@
# ===========================================================================
# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
# Check whether the given FLAG works with the current language's compiler
# or gives an error. (Warnings, however, are ignored)
#
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
# success/failure.
#
# If EXTRA-FLAGS is defined, it is added to the current language's default
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
# force the compiler to issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <[email protected]>
# Copyright (c) 2011 Maarten Bosmans <[email protected]>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <https://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.

#serial 5

AC_DEFUN([AX_CHECK_COMPILE_FLAG],
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
[AS_VAR_SET(CACHEVAR,[yes])],
[AS_VAR_SET(CACHEVAR,[no])])
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
AS_VAR_IF(CACHEVAR,yes,
[m4_default([$2], :)],
[m4_default([$3], :)])
AS_VAR_POPDEF([CACHEVAR])dnl
])dnl AX_CHECK_COMPILE_FLAGS


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

@@ -18,14 +18,15 @@
* along with ucd-tools. If not, see <http://www.gnu.org/licenses/>.
*/

// NOTE: This file is automatically generated from the UnicodeData.txt file in
// the Unicode Character database by the ucd-tools/tools/categories.py script.
/* NOTE: This file is automatically generated from the UnicodeData.txt file in
* the Unicode Character database by the ucd-tools/tools/categories.py script.
*/

#include "ucd/ucd.h"

#include <stddef.h>

// Unicode Character Data 9.0.0
/* Unicode Character Data 10.0.0 */

struct case_conversion_entry
{

+ 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