Browse Source

Merge branch 'android'

master
Reece H. Dunn 8 years ago
parent
commit
66ac27a94e
100 changed files with 5866 additions and 1 deletions
  1. 23
    1
      .gitignore
  2. 4
    0
      .settings/org.eclipse.jdt.core.prefs
  3. 15
    0
      .tx/config
  4. 202
    0
      COPYING.APACHE
  5. 31
    0
      Makefile.am
  6. 8
    0
      android/.classpath
  7. 33
    0
      android/.project
  8. 4
    0
      android/.settings/org.eclipse.jdt.core.prefs
  9. 76
    0
      android/AndroidManifest.xml
  10. 51
    0
      android/build.gradle
  11. 9
    0
      android/eSpeakTests/.classpath
  12. 34
    0
      android/eSpeakTests/.project
  13. 4
    0
      android/eSpeakTests/.settings/org.eclipse.jdt.core.prefs
  14. 17
    0
      android/eSpeakTests/AndroidManifest.xml
  15. 20
    0
      android/eSpeakTests/proguard-project.txt
  16. 14
    0
      android/eSpeakTests/project.properties
  17. BIN
      android/eSpeakTests/res/drawable-hdpi/ic_launcher.png
  18. BIN
      android/eSpeakTests/res/drawable-ldpi/ic_launcher.png
  19. BIN
      android/eSpeakTests/res/drawable-mdpi/ic_launcher.png
  20. BIN
      android/eSpeakTests/res/drawable-xhdpi/ic_launcher.png
  21. 6
    0
      android/eSpeakTests/res/values/strings.xml
  22. 149
    0
      android/eSpeakTests/src/com/reecedunn/espeak/test/CheckVoiceDataTest.java
  23. 346
    0
      android/eSpeakTests/src/com/reecedunn/espeak/test/SpeechSynthesisTest.java
  24. 257
    0
      android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechServiceTest.java
  25. 242
    0
      android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechTest.java
  26. 106
    0
      android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechTestCase.java
  27. 59
    0
      android/eSpeakTests/src/com/reecedunn/espeak/test/TtsMatcher.java
  28. 164
    0
      android/eSpeakTests/src/com/reecedunn/espeak/test/VoiceData.java
  29. 691
    0
      android/eSpeakTests/src/com/reecedunn/espeak/test/VoiceSettingsTest.java
  30. 109
    0
      android/eSpeakTests/src/com/reecedunn/espeak/test/VoiceVariantTest.java
  31. 95
    0
      android/icons/feature-graphic.svg
  32. 27
    0
      android/icons/launcher.svg
  33. 36
    0
      android/icons/promo-graphic.svg
  34. 64
    0
      android/jni/Android.mk
  35. 4
    0
      android/jni/Application.mk
  36. 26
    0
      android/jni/include/Log.h
  37. 354
    0
      android/jni/jni/eSpeakService.cpp
  38. 13
    0
      android/mkicons.sh
  39. 11
    0
      android/project.properties
  40. 13
    0
      android/remove_string.sh
  41. BIN
      android/res/drawable-hdpi/icon.png
  42. BIN
      android/res/drawable-ldpi/icon.png
  43. BIN
      android/res/drawable-mdpi/icon.png
  44. BIN
      android/res/drawable-xhdpi/icon.png
  45. 24
    0
      android/res/layout/download_voice_data.xml
  46. 14
    0
      android/res/layout/import_voice_preference.xml
  47. 27
    0
      android/res/layout/information_view.xml
  48. 80
    0
      android/res/layout/main.xml
  49. 37
    0
      android/res/layout/seekbar_preference.xml
  50. 45
    0
      android/res/layout/speak_punctuation_preference.xml
  51. 52
    0
      android/res/layout/voice_variant_preference.xml
  52. 7
    0
      android/res/menu/options.xml
  53. 42
    0
      android/res/values-af/strings.xml
  54. 42
    0
      android/res/values-am/strings.xml
  55. 42
    0
      android/res/values-ar/strings.xml
  56. 71
    0
      android/res/values-bg/strings.xml
  57. 70
    0
      android/res/values-ca/strings.xml
  58. 42
    0
      android/res/values-cs/strings.xml
  59. 42
    0
      android/res/values-da/strings.xml
  60. 71
    0
      android/res/values-de/strings.xml
  61. 42
    0
      android/res/values-el/strings.xml
  62. 53
    0
      android/res/values-en-rGB/strings.xml
  63. 53
    0
      android/res/values-es-rUS/strings.xml
  64. 53
    0
      android/res/values-es/strings.xml
  65. 42
    0
      android/res/values-fa/strings.xml
  66. 71
    0
      android/res/values-fi/strings.xml
  67. 42
    0
      android/res/values-fr/strings.xml
  68. 42
    0
      android/res/values-hi/strings.xml
  69. 42
    0
      android/res/values-hr/strings.xml
  70. 42
    0
      android/res/values-hu/strings.xml
  71. 71
    0
      android/res/values-in/strings.xml
  72. 53
    0
      android/res/values-it/strings.xml
  73. 42
    0
      android/res/values-iw/strings.xml
  74. 42
    0
      android/res/values-ja/strings.xml
  75. 42
    0
      android/res/values-ko/strings.xml
  76. 42
    0
      android/res/values-lt/strings.xml
  77. 42
    0
      android/res/values-lv/strings.xml
  78. 42
    0
      android/res/values-ms/strings.xml
  79. 42
    0
      android/res/values-nb/strings.xml
  80. 42
    0
      android/res/values-nl/strings.xml
  81. 42
    0
      android/res/values-pl/strings.xml
  82. 53
    0
      android/res/values-pt-rBR/strings.xml
  83. 42
    0
      android/res/values-pt/strings.xml
  84. 42
    0
      android/res/values-ro/strings.xml
  85. 71
    0
      android/res/values-ru/strings.xml
  86. 71
    0
      android/res/values-sk/strings.xml
  87. 71
    0
      android/res/values-sl/strings.xml
  88. 42
    0
      android/res/values-sr/strings.xml
  89. 42
    0
      android/res/values-sv/strings.xml
  90. 42
    0
      android/res/values-sw/strings.xml
  91. 42
    0
      android/res/values-th/strings.xml
  92. 42
    0
      android/res/values-tl/strings.xml
  93. 71
    0
      android/res/values-tr/strings.xml
  94. 42
    0
      android/res/values-uk/strings.xml
  95. 5
    0
      android/res/values-v21/styles.xml
  96. 53
    0
      android/res/values-vi/strings.xml
  97. 42
    0
      android/res/values-zh-rCN/strings.xml
  98. 42
    0
      android/res/values-zh-rTW/strings.xml
  99. 42
    0
      android/res/values-zu/strings.xml
  100. 0
    0
      android/res/values/donottranslate.xml

+ 23
- 1
.gitignore View File

@@ -3,7 +3,8 @@
*~
.*.swp

#Eclipse project files
# Eclipse project files:

.cproject
.project

@@ -12,6 +13,27 @@
*.o
*.lo

# android build output:

bin/
obj/
gen/
android/icons/*.png

libttsespeak.so

android/res/raw/espeakdata.zip
android/res/raw/espeakdata_version

local.properties

# android gradle output:

.gradle/
.idea/
build/
espeak.iml

# autotools

AUTHORS

+ 4
- 0
.settings/org.eclipse.jdt.core.prefs View File

@@ -0,0 +1,4 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.source=1.6

+ 15
- 0
.tx/config View File

@@ -0,0 +1,15 @@
[main]
host = https://www.transifex.com

[espeak-for-android.stringsxml]
file_filter = android/res/values-<lang>/strings.xml
source_file = android/res/values/strings.xml
source_lang = en
trans.en_GB = android/res/values-en-rGB/strings.xml
trans.es_419 = android/res/values-es-rUS/strings.xml
trans.he = android/res/values-iw/strings.xml
trans.id = android/res/values-in/strings.xml
trans.pt_BR = android/res/values-pt-rBR/strings.xml
trans.zh_CN = android/res/values-zh-rCN/strings.xml
trans.zh_TW = android/res/values-zh-rTW/strings.xml


+ 202
- 0
COPYING.APACHE View File

@@ -0,0 +1,202 @@

Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.

"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:

(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.

You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

+ 31
- 0
Makefile.am View File

@@ -55,6 +55,7 @@ install-exec-hook:

clean-local:
cd src && rm -f *.o *~ && cd ..
cd android && $(GRADLE) clean

distclean-local:
rm -rf espeak-ng-data/phondata-manifest
@@ -105,6 +106,8 @@ docs: docs/index.html \
src/speak-ng.1.html \
README.html

check: apk-check

##### build targets:

espeak_includedir = $(includedir)/espeak
@@ -305,6 +308,34 @@ phsource/phonemes.stamp: \
ESPEAK_DATA_PATH=$(PWD) src/espeak-ng --compile-phonemes && \
touch $@

##### android targets:

jni:
cd android && ndk-build

apk-release:
cd android && $(GRADLE) assembleRelease

apk-debug:
cd android && $(GRADLE) assembleDebug

apk-check:
cd android && $(GRADLE) connectedCheck

android/res/raw/espeakdata.zip: espeak-data/phontab dictionaries
mkdir -pv android/res/raw
rm -f $@
find espeak-data/{intonations,phondata,phonindex,phontab} | zip -@ $@
find espeak-data/*_dict | zip -@ $@
find espeak-data/voices -type f | grep -vF "/mb/" | zip -@ $@

android/res/raw/espeakdata_version: android/res/raw/espeakdata.zip
sha1sum $< | awk '{ print $$1 }' > $@

espeakdata: \
android/res/raw/espeakdata.zip \
android/res/raw/espeakdata_version

##### dictionaries:

dictionaries: \

+ 8
- 0
android/.classpath View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

+ 33
- 0
android/.project View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>eSpeakActivity</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

+ 4
- 0
android/.settings/org.eclipse.jdt.core.prefs View File

@@ -0,0 +1,4 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.source=1.6

+ 76
- 0
android/AndroidManifest.xml View File

@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.reecedunn.espeak"
android:versionCode="19"
android:versionName="1.48.11" >

<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />

<application
android:icon="@drawable/icon"
android:theme="@style/AppTheme"
android:label="@string/app_name" >
<service
android:name=".TtsService"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.TTS_SERVICE" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

<meta-data
android:name="android.speech.tts"
android:resource="@xml/tts_engine" />
</service>

<activity
android:name=".DownloadVoiceData"
android:theme="@android:style/Theme.Dialog" >
<intent-filter>
<action android:name="android.speech.tts.engine.INSTALL_TTS_DATA" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".CheckVoiceData"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
<intent-filter>
<action android:name="android.speech.tts.engine.CHECK_TTS_DATA" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".GetSampleText"
android:theme="@android:style/Theme.Translucent.NoTitleBar" >
<intent-filter>
<action android:name="android.speech.tts.engine.GET_SAMPLE_TEXT" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".TtsSettingsActivity"
android:label="@string/tts_settings_label" >
<intent-filter>
<action android:name="android.speech.tts.engine.CONFIGURE_ENGINE" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".eSpeakActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

+ 51
- 0
android/build.gradle View File

@@ -0,0 +1,51 @@
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
}

apply plugin: 'com.android.application'

repositories {
mavenCentral()
}

dependencies {
androidTestCompile 'org.hamcrest:hamcrest-all:1.3'
}

android {
buildToolsVersion '19.1'
compileSdkVersion 23

defaultConfig {
minSdkVersion 14
targetSdkVersion 23
versionCode 20
versionName "1.48.15"
}

sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
}
androidTest.setRoot('eSpeakTests')
androidTest {
java.srcDirs = ['eSpeakTests/src']
}
}

lintOptions {
abortOnError false
}
}

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

+ 9
- 0
android/eSpeakTests/.classpath View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry combineaccessrules="false" kind="src" path="/eSpeakActivity"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

+ 34
- 0
android/eSpeakTests/.project View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>eSpeakTests</name>
<comment></comment>
<projects>
<project>eSpeakActivity</project>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

+ 4
- 0
android/eSpeakTests/.settings/org.eclipse.jdt.core.prefs View File

@@ -0,0 +1,4 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.source=1.6

+ 17
- 0
android/eSpeakTests/AndroidManifest.xml View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.reecedunn.espeak.test"
android:versionCode="1"
android:versionName="1.0" >

<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.reecedunn.espeak" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="android.test.runner" />
</application>

</manifest>

+ 20
- 0
android/eSpeakTests/proguard-project.txt View File

@@ -0,0 +1,20 @@
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

+ 14
- 0
android/eSpeakTests/project.properties View File

@@ -0,0 +1,14 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

# Project target.
target=android-17

BIN
android/eSpeakTests/res/drawable-hdpi/ic_launcher.png View File


BIN
android/eSpeakTests/res/drawable-ldpi/ic_launcher.png View File


BIN
android/eSpeakTests/res/drawable-mdpi/ic_launcher.png View File


BIN
android/eSpeakTests/res/drawable-xhdpi/ic_launcher.png View File


+ 6
- 0
android/eSpeakTests/res/values/strings.xml View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="app_name">ESpeakTestsTest</string>

</resources>

+ 149
- 0
android/eSpeakTests/src/com/reecedunn/espeak/test/CheckVoiceDataTest.java View File

@@ -0,0 +1,149 @@
/*
* Copyright (C) 2014 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.reecedunn.espeak.test;

import android.app.Activity;
import android.content.Intent;
import android.speech.tts.TextToSpeech;
import android.test.ActivityUnitTestCase;

import com.reecedunn.espeak.CheckVoiceData;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

public class CheckVoiceDataTest extends ActivityUnitTestCase<CheckVoiceData>
{
Field mResultCode;
Field mResultData;

public void setUp() throws Exception
{
super.setUp();

mResultCode = Activity.class.getDeclaredField("mResultCode");
mResultCode.setAccessible(true);

mResultData = Activity.class.getDeclaredField("mResultData");
mResultData.setAccessible(true);
}

public int getResultCode() throws IllegalAccessException
{
return (Integer)mResultCode.get(getActivity());
}

public Intent getResultData() throws IllegalAccessException
{
return (Intent)mResultData.get(getActivity());
}

public CheckVoiceDataTest()
{
super(CheckVoiceData.class);
}

public Set<String> getExpectedVoices()
{
Set<String> expected = new HashSet<String>();
for (VoiceData.Voice voice : VoiceData.voices)
{
expected.add(voice.locale);
}
return expected;
}

public void testUnavailableVoices() throws IllegalAccessException
{
Intent intent = new Intent(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivity(intent, null, null);

assertThat(getActivity(), is(notNullValue()));
assertThat(isFinishCalled(), is(true));
assertThat(getResultCode(), is(TextToSpeech.Engine.CHECK_VOICE_DATA_PASS));
assertThat(getResultData(), is(notNullValue()));

Intent data = getResultData();

ArrayList<String> unavailable = data.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES);
assertThat(unavailable, is(notNullValue()));
assertThat(unavailable.toString(), is("[]"));
}

public void testAvailableVoicesAdded() throws IllegalAccessException
{
Intent intent = new Intent(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivity(intent, null, null);

assertThat(getActivity(), is(notNullValue()));
assertThat(isFinishCalled(), is(true));
assertThat(getResultCode(), is(TextToSpeech.Engine.CHECK_VOICE_DATA_PASS));
assertThat(getResultData(), is(notNullValue()));

Intent data = getResultData();

ArrayList<String> available = data.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);
assertThat(available, is(notNullValue()));

Set<String> expected = getExpectedVoices();

Set<String> added = new HashSet<String>();
for (String voice : available)
{
if (!expected.contains(voice))
{
added.add(voice);
}
}

assertThat(added.toString(), is("[]"));
}

public void testAvailableVoicesRemoved() throws IllegalAccessException
{
Intent intent = new Intent(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivity(intent, null, null);

assertThat(getActivity(), is(notNullValue()));
assertThat(isFinishCalled(), is(true));
assertThat(getResultCode(), is(TextToSpeech.Engine.CHECK_VOICE_DATA_PASS));
assertThat(getResultData(), is(notNullValue()));

Intent data = getResultData();

ArrayList<String> available = data.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);
assertThat(available, is(notNullValue()));

Set<String> expected = getExpectedVoices();

Set<String> removed = new HashSet<String>();
for (String voice : expected)
{
if (!available.contains(voice))
{
removed.add(voice);
}
}

assertThat(removed.toString(), is("[]"));
}
}

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

@@ -0,0 +1,346 @@
/*
* Copyright (C) 2012-2015 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.reecedunn.espeak.test;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import com.reecedunn.espeak.SpeechSynthesis;
import com.reecedunn.espeak.Voice;

import android.media.AudioFormat;
import android.speech.tts.TextToSpeech;
import android.util.Log;

import static com.reecedunn.espeak.test.TtsMatcher.isTtsLangCode;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.core.AnyOf.anyOf;

public class SpeechSynthesisTest extends TextToSpeechTestCase
{
public static final Locale af = new Locale("af"); // Afrikaans
public static final Locale afr = new Locale("afr"); // Afrikaans

public static final Locale de = new Locale("de"); // German
public static final Locale de_DE = new Locale("de", "DE"); // German (Germany)
public static final Locale de_1996 = new Locale("de", "", "1996"); // German (1996 Orthography)
public static final Locale de_CH_1901 = new Locale("de", "CH", "1901"); // German (Traditional Orthography,Switzerland)

public static final Locale deu = new Locale("deu"); // German
public static final Locale deu_DEU = new Locale("deu", "DEU"); // German (Germany)
public static final Locale deu_1996 = new Locale("deu", "", "1996"); // German (1996 Orthography)
public static final Locale deu_CHE_1901 = new Locale("deu", "CHE", "1901"); // German (Traditional Orthography,Switzerland)

public static final Locale fr = new Locale("fr"); // French
public static final Locale fr_FR = new Locale("fr", "FR"); // French (France)
public static final Locale fr_BE = new Locale("fr", "BE"); // French (Belgium)
public static final Locale fr_1694acad = new Locale("fr", "", "1694acad"); // French (Early Modern French)
public static final Locale fr_FR_1694acad = new Locale("fr", "FR", "1694acad"); // French (Early Modern French,France)
public static final Locale fr_BE_1694acad = new Locale("fr", "BE", "1694acad"); // French (Early Modern French,Belgium)

public static final Locale fra = new Locale("fra"); // French
public static final Locale fra_FRA = new Locale("fra", "FRA"); // French (France)
public static final Locale fra_BEL = new Locale("fra", "BEL"); // French (Belgium)
public static final Locale fra_1694acad = new Locale("fra", "", "1694acad"); // French (Early Modern French)
public static final Locale fra_FRA_1694acad = new Locale("fra", "FRA", "1694acad"); // French (Early Modern French,France)
public static final Locale fra_BEL_1694acad = new Locale("fra", "BEL", "1694acad"); // French (Early Modern French,Belgium)

public static final Locale hy = new Locale("hy"); // Armenian
public static final Locale hy_AM = new Locale("hy", "AM"); // Armenian (Armenia)
public static final Locale hy_arevela = new Locale("hy", "", "arevela"); // Armenian (Eastern)
public static final Locale hy_arevmda = new Locale("hy", "", "arevmda"); // Armenian (Western)
public static final Locale hy_AM_arevela = new Locale("hy", "AM", "arevela"); // Armenian (Eastern,Armenia)
public static final Locale hy_AM_arevmda = new Locale("hy", "AM", "arevmda"); // Armenian (Western,Armenia)

public static final Locale hye = new Locale("hye"); // Armenian
public static final Locale hye_ARM = new Locale("hye", "ARM"); // Armenian (Armenia)
public static final Locale hye_arevela = new Locale("hye", "", "arevela"); // Armenian (Eastern)
public static final Locale hye_arevmda = new Locale("hye", "", "arevmda"); // Armenian (Western)
public static final Locale hye_ARM_arevela = new Locale("hye", "ARM", "arevela"); // Armenian (Eastern,Armenia)
public static final Locale hye_ARM_arevmda = new Locale("hye", "ARM", "arevmda"); // Armenian (Western,Armenia)

public static final Locale en = new Locale("en"); // English
public static final Locale en_GB = new Locale("en", "GB"); // English (Great Britain)
public static final Locale en_US = new Locale("en", "US"); // English (USA)
public static final Locale en_scotland = new Locale("en", "", "scotland"); // English (Scottish)
public static final Locale en_GB_scotland = new Locale("en", "GB", "scotland"); // English (Scottish,Great Britain)
public static final Locale en_GB_north = new Locale("en", "GB", "north"); // English (North,Great Britain)

public static final Locale eng = new Locale("en"); // English
public static final Locale eng_GBR = new Locale("en", "GBR"); // English (Great Britain)
public static final Locale eng_USA = new Locale("en", "USA"); // English (USA)
public static final Locale eng_scotland = new Locale("en", "", "scotland"); // English (Scottish)
public static final Locale eng_GBR_scotland = new Locale("en", "GBR", "scotland"); // English (Scottish,Great Britain)
public static final Locale eng_GBR_north = new Locale("en", "GBR", "north"); // English (North,Great Britain)

private SpeechSynthesis.SynthReadyCallback mCallback = new SpeechSynthesis.SynthReadyCallback()
{
@Override
public void onSynthDataReady(byte[] audioData)
{
}
@Override
public void onSynthDataComplete()
{
}
};

private Map<String, Voice> mVoices = null;
private Set<String> mAdded = new HashSet<String>();
private Set<String> mRemoved = new HashSet<String>();

public Map<String, Voice> getVoices()
{
if (mVoices == null)
{
final SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
mVoices = new HashMap<String, Voice>();
for (Voice voice : synth.getAvailableVoices()) {
assertThat(mVoices.get(voice.name), is(nullValue()));
mVoices.put(voice.name, voice);
}
assertThat(mVoices, is(notNullValue()));

Set<String> voices = new HashSet<String>();
for (Voice data : mVoices.values())
{
voices.add(data.name);
}

Set<String> expected = new HashSet<String>();
for (VoiceData.Voice data : VoiceData.voices)
{
expected.add(data.name);
}

for (String voice : voices)
{
if (!expected.contains(voice))
{
mAdded.add(voice);
}
}

for (String voice : expected)
{
if (!voices.contains(voice))
{
mRemoved.add(voice);
}
}
}
return mVoices;
}

public Voice getVoice(String name)
{
return getVoices().get(name);
}

public void testConstruction()
{
final SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
assertThat(synth.getSampleRate(), is(22050));
assertThat(synth.getChannelCount(), is(1));
assertThat(synth.getAudioFormat(), is(AudioFormat.ENCODING_PCM_16BIT));
}

public void testJavaToIanaLanguageCode()
{
for (VoiceData.Voice data : VoiceData.voices)
{
assertThat(SpeechSynthesis.getIanaLanguageCode(data.javaLanguage), is(data.ianaLanguage));
}
}

public void testJavaToIanaCountryCode()
{
for (VoiceData.Voice data : VoiceData.voices)
{
assertThat(SpeechSynthesis.getIanaCountryCode(data.javaCountry), is(data.ianaCountry));
}
}

public void testAddedVoices()
{
getVoices(); // Ensure that the voice data has been populated.
assertThat(mAdded.toString(), is("[]"));
}

public void testRemovedVoices()
{
getVoices(); // Ensure that the voice data has been populated.
assertThat(mRemoved.toString(), is("[]"));
}

public void testVoiceData()
{
for (VoiceData.Voice data : VoiceData.voices)
{
if (mRemoved.contains(data.name))
{
Log.i("SpeechSynthesisTest", "Skipping the missing voice '" + data.name + "'");
continue;
}

String context = "[voice]";
try
{
final Voice voice = getVoice(data.name);
assertThat(voice, is(notNullValue()));

context = "[name]";
assertThat(voice.name, is(data.name));
context = "[identifier]";
assertThat(voice.identifier, is(data.identifier));
context = "[age]";
assertThat(voice.age, is(0));
context = "[gender]";
assertThat(voice.gender, is(data.gender));
context = "[locale:language]";
assertThat(voice.locale.getLanguage(), is(data.ianaLanguage));
context = "[locale:iso3language]";
assertThat(voice.locale.getISO3Language(), is(data.javaLanguage));
context = "[locale:country]";
assertThat(voice.locale.getCountry(), is(data.ianaCountry));
context = "[locale:iso3country]";
assertThat(voice.locale.getISO3Country(), is(data.javaCountry));
context = "[locale:variant]";
assertThat(voice.locale.getVariant(), is(data.variant));
context = "[toString]";
assertThat(voice.toString(), is(data.locale));
}
catch (AssertionError e)
{
throw new VoiceData.Exception(data, context, e);
}
}
}

public void testMatchVoiceWithLanguage()
{
final Voice voice = getVoice("de"); // language="de" country="" variant=""
assertThat(voice, is(notNullValue()));

assertThat(voice.match(fr), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED));
assertThat(voice.match(fr_BE), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED));
assertThat(voice.match(fr_1694acad), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED));
assertThat(voice.match(fr_FR_1694acad), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED));

assertThat(voice.match(de), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
assertThat(voice.match(de_1996), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
assertThat(voice.match(de_DE), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(de_CH_1901), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));

assertThat(voice.match(deu), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
assertThat(voice.match(deu_1996), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
assertThat(voice.match(deu_DEU), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(deu_CHE_1901), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
}

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

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

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

assertThat(voice.match(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_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));
}

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

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

assertThat(voice.match(en), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(en_GB), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
assertThat(voice.match(en_US), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(en_scotland), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); // NOTE: Android does not support LANG_VAR_AVAILABLE.
assertThat(voice.match(en_GB_scotland), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
assertThat(voice.match(en_GB_north), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));

assertThat(voice.match(eng), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(eng_GBR), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
assertThat(voice.match(eng_USA), isTtsLangCode(TextToSpeech.LANG_AVAILABLE));
assertThat(voice.match(eng_scotland), isTtsLangCode(TextToSpeech.LANG_AVAILABLE)); // NOTE: Android does not support LANG_VAR_AVAILABLE.
assertThat(voice.match(eng_GBR_scotland), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
assertThat(voice.match(eng_GBR_north), isTtsLangCode(TextToSpeech.LANG_COUNTRY_AVAILABLE));
}

public void testGetSampleText()
{
final String[] currentLocales = getContext().getResources().getAssets().getLocales();
for (VoiceData.Voice data : VoiceData.voices)
{
if (mRemoved.contains(data.name))
{
Log.i("SpeechSynthesisTest", "Skipping the missing voice '" + data.name + "'");
continue;
}

String context = null;
try
{
final Locale ianaLocale = new Locale(data.ianaLanguage, data.ianaCountry, data.variant);
context = "[iana:sample-text]";
assertThat(SpeechSynthesis.getSampleText(getContext(), ianaLocale), isIn(data.sampleText));
context = "[iana:resource-locale]";
assertThat(getContext().getResources().getAssets().getLocales(), is(currentLocales));

if (!data.javaLanguage.equals(""))
{
final Locale javaLocale = new Locale(data.javaLanguage, data.javaCountry, data.variant);
context = "[java:sample-text]";
assertThat(SpeechSynthesis.getSampleText(getContext(), javaLocale), isIn(data.sampleText));
context = "[java:resource-locale]";
assertThat(getContext().getResources().getAssets().getLocales(), is(currentLocales));
}
}
catch (AssertionError e)
{
throw new VoiceData.Exception(data, context, e);
}
}
}
}

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

@@ -0,0 +1,257 @@
/*
* Copyright (C) 2015 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.reecedunn.espeak.test;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
import android.speech.tts.TextToSpeech;
import android.test.AndroidTestCase;

import com.reecedunn.espeak.TtsService;
import com.reecedunn.espeak.Voice;

import java.util.Locale;
import java.util.Set;

import static com.reecedunn.espeak.test.TtsMatcher.isTtsLangCode;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

public class TextToSpeechServiceTest extends AndroidTestCase
{
public class TtsServiceTest extends TtsService
{
public TtsServiceTest(Context context)
{
attachBaseContext(context);
}

public String[] onGetLanguage() {
return super.onGetLanguage();
}

public int onIsLanguageAvailable(String language, String country, String variant) {
return super.onIsLanguageAvailable(language, country, variant);
}

public int onLoadLanguage(String language, String country, String variant) {
return super.onLoadLanguage(language, country, variant);
}

public Set<String> onGetFeaturesForLanguage(String language, String country, String variant) {
return super.onGetFeaturesForLanguage(language, country, variant);
}

public Voice getActiveVoice() {
return mMatchingVoice;
}

@SuppressLint("NewApi")
private android.speech.tts.Voice getVoice(String name) {
for (android.speech.tts.Voice voice : onGetVoices()) {
if (voice.getName().equals(name)) {
return voice;
}
}
return null;
}
}

private TtsServiceTest mService = null;

@Override
public void setUp() throws Exception
{
mService = new TtsServiceTest(getContext());
mService.onCreate();
}

@Override
public void tearDown()
{
if (mService != null)
{
mService.onDestroy();
mService = null;
}
}

private void checkLanguage(String[] locale, String language, String country, String variant) {
assertThat(locale.length, is(3));
assertThat(locale[0], is(language));
assertThat(locale[1], is(country));
assertThat(locale[2], is(variant));
}

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

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

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.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.getActiveVoice(), is(notNullValue()));
assertThat(mService.getActiveVoice().name, is("en"));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public void testLanguages() {
for (VoiceData.Voice data : VoiceData.voices)
{
assertThat(mService.onIsLanguageAvailable(data.javaLanguage, data.javaCountry, data.variant), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
assertThat(mService.onLoadLanguage(data.javaLanguage, data.javaCountry, data.variant), isTtsLangCode(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE));
checkLanguage(mService.onGetLanguage(), data.javaLanguage, data.javaCountry, data.variant);
} else {
assertThat(mService.onGetDefaultVoiceNameFor(data.javaLanguage, data.javaCountry, data.variant), is(data.name));
assertThat(mService.onLoadVoice(data.name), is(TextToSpeech.SUCCESS));

android.speech.tts.Voice voice = mService.getVoice(data.name);
assertThat(voice, is(notNullValue()));

Locale locale = voice.getLocale();
assertThat(locale, is(notNullValue()));
assertThat(locale.getISO3Language(), is(data.javaLanguage));
assertThat(locale.getISO3Country(), is(data.javaCountry));
assertThat(locale.getVariant(), is(data.variant));

Set<String> features = mService.onGetFeaturesForLanguage(data.javaLanguage, data.javaCountry, data.variant);
assertThat(features, is(notNullValue()));
assertThat(features.size(), is(0));
}
}
}
}

+ 242
- 0
android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechTest.java View File

@@ -0,0 +1,242 @@
/*
* Copyright (C) 2012-2015 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.reecedunn.espeak.test;

import java.util.HashSet;
import java.util.Locale;
import java.util.Set;

import android.annotation.SuppressLint;
import android.os.Build;
import android.speech.tts.TextToSpeech;

import static com.reecedunn.espeak.test.TtsMatcher.isTtsLangCode;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

public class TextToSpeechTest extends TextToSpeechTestCase
{
private Set<Object> mVoices = null;
private Set<String> mAdded = new HashSet<String>();
private Set<String> mRemoved = new HashSet<String>();

@SuppressLint("NewApi")
public Set<Object> getVoices()
{
if (mVoices == null)
{
Set<android.speech.tts.Voice> voiceData = getEngine().getVoices();
assertThat(voiceData, is(notNullValue()));

mVoices = new HashSet<Object>();
for (android.speech.tts.Voice voice : voiceData)
{
mVoices.add(voice);
}

Set<String> voices = new HashSet<String>();
for (Object data : mVoices)
{
voices.add(((android.speech.tts.Voice)data).getName());
}

Set<String> expected = new HashSet<String>();
for (VoiceData.Voice data : VoiceData.voices)
{
expected.add(data.name);
}

for (String voice : voices)
{
if (!expected.contains(voice))
{
mAdded.add(voice);
}
}

for (String voice : expected)
{
if (!voices.contains(voice))
{
mRemoved.add(voice);
}
}
}
return mVoices;
}

public VoiceData.Voice getVoiceData(String name)
{
for (VoiceData.Voice voice : VoiceData.voices)
{
if (voice.name.equals(name))
{
return voice;
}
}
return null;
}

public void testAddedVoices()
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
return;

getVoices(); // Ensure that the voice data has been populated.
assertThat(mAdded.toString(), is("[]"));
}

public void testRemovedVoices()
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
return;

getVoices(); // Ensure that the voice data has been populated.
assertThat(mRemoved.toString(), is("[]"));
}

@SuppressLint("NewApi")
public void testVoices()
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
return;

getVoices(); // Ensure that the voice data has been populated.
for (Object item : mVoices)
{
android.speech.tts.Voice voice = (android.speech.tts.Voice)item;
VoiceData.Voice data = getVoiceData(voice.getName());

assertThat(data, is(notNullValue()));
assertThat(voice.getName(), is(data.name));
assertThat(voice.getLocale().getLanguage(), is(data.ianaLanguage));
assertThat(voice.getLocale().getCountry(), is(data.ianaCountry));
assertThat(voice.getLocale().getVariant(), is(data.variant));
assertThat(voice.getFeatures(), is(notNullValue()));
assertThat(voice.getFeatures().size(), is(0));
assertThat(voice.getLatency(), is(android.speech.tts.Voice.LATENCY_VERY_LOW));
assertThat(voice.getQuality(), is(android.speech.tts.Voice.QUALITY_NORMAL));

getEngine().setVoice(voice);
assertThat(getLanguage(getEngine()).getLanguage(), is(data.javaLanguage));
assertThat(getLanguage(getEngine()).getCountry(), is(data.javaCountry));
assertThat(getLanguage(getEngine()).getVariant(), is(data.variant));

android.speech.tts.Voice voice2 = getEngine().getVoice();
assertThat(voice2, is(notNullValue()));
assertThat(voice2.getName(), is(data.name));
assertThat(voice2.getLocale().getLanguage(), is(data.ianaLanguage));
assertThat(voice2.getLocale().getCountry(), is(data.ianaCountry));
assertThat(voice2.getLocale().getVariant(), is(data.variant));
assertThat(voice2.getFeatures(), is(notNullValue()));
assertThat(voice2.getFeatures().size(), is(0));
assertThat(voice2.getLatency(), is(android.speech.tts.Voice.LATENCY_VERY_LOW));
assertThat(voice2.getQuality(), is(android.speech.tts.Voice.QUALITY_NORMAL));
}
}

public void testUnsupportedLanguage()
{
assertThat(getEngine(), is(notNullValue()));

Locale initialLocale = getLanguage(getEngine());
assertThat(getEngine().isLanguageAvailable(new Locale("cel")), isTtsLangCode(TextToSpeech.LANG_NOT_SUPPORTED));
Locale language = getLanguage(getEngine());

assertThat(getLanguage(getEngine()).getLanguage(), is(initialLocale.getLanguage()));
assertThat(getLanguage(getEngine()).getCountry(), is(initialLocale.getCountry()));
assertThat(getLanguage(getEngine()).getVariant(), is(initialLocale.getVariant()));
}

public void checkLanguage(VoiceData.Voice data, Locale locale, int status, String language, String country, String variant)
{
String langTag = locale.toString().replace('_', '-');
String context = "";
try
{
context = "isLanguageAvailable";
assertThat(getEngine().isLanguageAvailable(locale), isTtsLangCode(status));
context = "setLanguage";
assertThat(getEngine().setLanguage(locale), isTtsLangCode(status));
context = "getLanguage";
assertThat(getLanguage(getEngine()).getLanguage(), is(language));
assertThat(getLanguage(getEngine()).getCountry(), is(country));
assertThat(getLanguage(getEngine()).getVariant(), is(variant));
}
catch (AssertionError e)
{
throw new VoiceData.Exception(data, context + "|" + langTag, e);
}
}

public void testLanguages()
{
assertThat(getEngine(), is(notNullValue()));

for (VoiceData.Voice data : VoiceData.voices)
{
final Locale iana1 = new Locale(data.ianaLanguage, data.ianaCountry, data.variant);
final Locale iana2 = new Locale(data.ianaLanguage, data.ianaCountry, "test");
final Locale iana3 = new Locale(data.ianaLanguage, "VU", data.variant);

final Locale java1 = new Locale(data.javaLanguage, data.javaCountry, data.variant);
final Locale java2 = new Locale(data.javaLanguage, data.javaCountry, "test");
final Locale java3 = new Locale(data.javaLanguage, "VUT", data.variant);

checkLanguage(data, iana1, TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE, data.javaLanguage, data.javaCountry, data.variant);
checkLanguage(data, java1, TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE, data.javaLanguage, data.javaCountry, data.variant);

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
// Android Lollipop sets variant to "" when TextToSpeech.LANG_COUNTRY_AVAILABLE is returned.
checkLanguage(data, iana2, TextToSpeech.LANG_COUNTRY_AVAILABLE, data.javaLanguage, data.javaCountry, "");
checkLanguage(data, java2, TextToSpeech.LANG_COUNTRY_AVAILABLE, data.javaLanguage, data.javaCountry, "");
} else {
if (data.ianaLanguage.equals("vi") && data.ianaCountry.equals("VN")) {
checkLanguage(data, iana2, TextToSpeech.LANG_COUNTRY_AVAILABLE, data.javaLanguage, data.javaCountry, "hue");
checkLanguage(data, java2, TextToSpeech.LANG_COUNTRY_AVAILABLE, data.javaLanguage, data.javaCountry, "hue");
} else if (data.ianaLanguage.equals("hy") && data.ianaCountry.equals("AM")) {
checkLanguage(data, iana2, TextToSpeech.LANG_COUNTRY_AVAILABLE, data.javaLanguage, data.javaCountry, "arevmda");
checkLanguage(data, java2, TextToSpeech.LANG_COUNTRY_AVAILABLE, data.javaLanguage, data.javaCountry, "arevmda");
} else {
checkLanguage(data, iana2, TextToSpeech.LANG_COUNTRY_AVAILABLE, data.javaLanguage, data.javaCountry, "");
checkLanguage(data, java2, TextToSpeech.LANG_COUNTRY_AVAILABLE, data.javaLanguage, data.javaCountry, "");
}
}

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
// Android Lollipop sets country and variant to "" when TextToSpeech.LANG_AVAILABLE is returned.
checkLanguage(data, iana3, TextToSpeech.LANG_AVAILABLE, data.javaLanguage, "", "");
checkLanguage(data, java3, TextToSpeech.LANG_AVAILABLE, data.javaLanguage, "", "");
} else {
switch (data.ianaLanguage) {
case "fr":
checkLanguage(data, iana3, TextToSpeech.LANG_AVAILABLE, data.javaLanguage, "FRA", "");
checkLanguage(data, java3, TextToSpeech.LANG_AVAILABLE, data.javaLanguage, "FRA", "");
break;
case "pt":
checkLanguage(data, iana3, TextToSpeech.LANG_AVAILABLE, data.javaLanguage, "PRT", "");
checkLanguage(data, java3, TextToSpeech.LANG_AVAILABLE, data.javaLanguage, "PRT", "");
break;
default:
checkLanguage(data, iana3, TextToSpeech.LANG_AVAILABLE, data.javaLanguage, "", "");
checkLanguage(data, java3, TextToSpeech.LANG_AVAILABLE, data.javaLanguage, "", "");
break;
}
}
}
}
}

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

@@ -0,0 +1,106 @@
/*
* Copyright (C) 2012-2015 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.reecedunn.espeak.test;

import android.os.Build;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.test.AndroidTestCase;
import android.util.Log;

import java.util.Locale;

import static com.reecedunn.espeak.test.TtsMatcher.isTtsLangCode;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

public class TextToSpeechTestCase extends AndroidTestCase
{
private TextToSpeech mEngine = null;
private boolean mInitialised = false;
private int mStatus = TextToSpeech.ERROR;

private OnInitListener mInitCallback = new OnInitListener()
{
@Override
public void onInit(int status)
{
mStatus = status;
mInitialised = true;
}
};

@Override
public void setUp() throws Exception
{
try
{
// Wait until the text-to-speech engine is initialised (max: 20 seconds):

mEngine = new TextToSpeech(getContext(), mInitCallback);
for (int count = 0; !mInitialised && count < (4 * 20); ++count)
{
Thread.sleep(250);
}

assertThat(mInitialised, is(true));
assertThat(mStatus, is(TextToSpeech.SUCCESS));
assertThat(mEngine.getDefaultEngine(), is("com.reecedunn.espeak"));

// Ensure that the voice data is installed (max: 20 seconds):

Locale en = new Locale("en");
int available = mEngine.isLanguageAvailable(en);
for (int count = 0; available != TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE && count < (4 * 20); ++count)
{
Thread.sleep(250);
available = mEngine.isLanguageAvailable(en);
Log.d("TextToSpeechTestCase", "setUp: available = " + available);
}

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

@Override
public void tearDown()
{
if (mEngine != null)
{
mEngine.shutdown();
mEngine = null;
}
}

public TextToSpeech getEngine()
{
return mEngine;
}

@SuppressWarnings("deprecation")
public static Locale getLanguage(TextToSpeech engine) {
if (engine != null) {
return engine.getLanguage();
}
return null;
}
}

+ 59
- 0
android/eSpeakTests/src/com/reecedunn/espeak/test/TtsMatcher.java View File

@@ -0,0 +1,59 @@
/*
* Copyright (C) 2014 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.reecedunn.espeak.test;

import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;

import android.speech.tts.TextToSpeech;

public class TtsMatcher
{
private static String ttsLangCode(final Integer value) {
if (value == null) return "null";
switch (value.intValue()) {
case TextToSpeech.LANG_AVAILABLE: return "TextToSpeech.LANG_AVAILABLE";
case TextToSpeech.LANG_COUNTRY_AVAILABLE: return "TextToSpeech.LANG_COUNTRY_AVAILABLE";
case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE: return "TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE";
case TextToSpeech.LANG_MISSING_DATA: return "TextToSpeech.LANG_MISSING_DATA";
case TextToSpeech.LANG_NOT_SUPPORTED: return "TextToSpeech.LANG_NOT_SUPPORTED";
}
return value.toString();
}

public static Matcher<Integer> isTtsLangCode(final Integer value) {
return new TypeSafeMatcher<Integer>() {
@Override
protected boolean matchesSafely(Integer item) {
return item.equals(value);
}

@Override
public void describeTo(Description description) {
description.appendText("expected constant: ");
description.appendValue(ttsLangCode(value));
}

@Override
public void describeMismatchSafely(final Integer item, final Description description) {
description.appendText("was ");
description.appendValue(ttsLangCode(item));
}
};
}
}

+ 164
- 0
android/eSpeakTests/src/com/reecedunn/espeak/test/VoiceData.java View File

@@ -0,0 +1,164 @@
/*
* Copyright (C) 2012-2015 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.reecedunn.espeak.test;

import com.reecedunn.espeak.SpeechSynthesis;

import java.util.ArrayList;
import java.util.List;

public class VoiceData
{
public static class Voice
{
public final String name;
public final String identifier;
public final String ianaLanguage;
public final String javaLanguage;
public final String ianaCountry;
public final String javaCountry;
public final String variant;
public final int gender;
public final String displayName;
public final String locale;
public final List<String> sampleText = new ArrayList<>();

public Voice(String name,
String identifier,
String ianaLanguage,
String javaLanguage,
String ianaCountry,
String javaCountry,
String variant,
int gender,
String displayName,
String locale,
String... sampleText)
{
this.name = name;
this.identifier = identifier;
this.ianaLanguage = ianaLanguage;
this.javaLanguage = javaLanguage;
this.ianaCountry = ianaCountry;
this.javaCountry = javaCountry;
this.variant = variant;
this.gender = gender;
this.displayName = displayName;
this.locale = locale;
for (String text : sampleText)
this.sampleText.add(text);
}
}

public static class Exception extends AssertionError
{
private static final long serialVersionUID = 1L;

public Exception(Voice voice, String context, AssertionError error)
{
super("Voice \"" + voice.name + "\" " + context + " -- " + error);
}
}

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

+ 691
- 0
android/eSpeakTests/src/com/reecedunn/espeak/test/VoiceSettingsTest.java View File

@@ -0,0 +1,691 @@
/*
* Copyright (C) 2013 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.reecedunn.espeak.test;

import android.content.SharedPreferences;
import android.preference.PreferenceManager;

import com.reecedunn.espeak.SpeechSynthesis;
import com.reecedunn.espeak.VoiceSettings;

import org.json.JSONException;
import org.json.JSONObject;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

public class VoiceSettingsTest extends TextToSpeechTestCase
{
private SpeechSynthesis.SynthReadyCallback mCallback = new SpeechSynthesis.SynthReadyCallback()
{
@Override
public void onSynthDataReady(byte[] audioData)
{
}

@Override
public void onSynthDataComplete()
{
}
};

// No Settings (New Install)

public void testNoPreferences()
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.commit();

SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

// Old Settings

public void testDefaultGenderMale()
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("default_gender", Integer.toString(SpeechSynthesis.GENDER_MALE));
editor.commit();

SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void testDefaultGenderFemale()
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("default_gender", Integer.toString(SpeechSynthesis.GENDER_FEMALE));
editor.commit();

SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("female"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("female"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void defaultRateTest(int prefValue, int settingValue, SpeechSynthesis synth)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("default_rate", Integer.toString(prefValue));
editor.commit();

VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(settingValue));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(settingValue));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void testDefaultRate()
{
SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
defaultRateTest(300, 450, synth); // clamped to maximum value
defaultRateTest(200, 350, synth);
defaultRateTest(100, 175, synth); // default value
defaultRateTest( 50, 87, synth);
defaultRateTest( 25, 80, synth); // clamped to minimum value
}

public void defaultPitchTest(int prefValue, int settingValue, SpeechSynthesis synth)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("default_pitch", Integer.toString(prefValue));
editor.commit();

VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(settingValue));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(settingValue));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void testDefaultPitch()
{
SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
defaultPitchTest(250, 100, synth); // clamped to maximum value
defaultPitchTest(200, 100, synth);
defaultPitchTest(100, 50, synth); // default value
defaultPitchTest( 50, 25, synth);
defaultPitchTest( 0, 0, synth);
defaultPitchTest( -5, 0, synth); // clamped to minimum value
}

// New Settings

public void testEspeakVariant()
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("espeak_variant", "klatt2-old");
editor.commit();

SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("klatt2-old"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("klatt2-old"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void espeakRateTest(int prefValue, int settingValue, SpeechSynthesis synth)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("espeak_rate", Integer.toString(prefValue));
editor.commit();

VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(settingValue));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(settingValue));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void testEspeakRate()
{
SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
espeakRateTest(500, 450, synth); // clamped to maximum value
espeakRateTest(400, 400, synth);
espeakRateTest(200, 200, synth);
espeakRateTest(175, 175, synth); // default value
espeakRateTest(150, 150, synth);
espeakRateTest( 70, 80, synth); // clamped to minimum value
}

public void espeakPitchTest(int prefValue, int settingValue, SpeechSynthesis synth)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("espeak_pitch", Integer.toString(prefValue));
editor.commit();

VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(settingValue));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(settingValue));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void testEspeakPitch()
{
SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
espeakPitchTest(110, 100, synth); // clamped to maximum value
espeakPitchTest(100, 100, synth);
espeakPitchTest( 50, 50, synth); // default value
espeakPitchTest( 10, 10, synth);
espeakPitchTest( -5, 0, synth); // clamped to minimum value
}

public void espeakPitchRangeTest(int prefValue, int settingValue, SpeechSynthesis synth)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("espeak_pitch_range", Integer.toString(prefValue));
editor.commit();

VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(settingValue));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(settingValue));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void testEspeakPitchRange()
{
SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
espeakPitchRangeTest(110, 100, synth); // clamped to maximum value
espeakPitchRangeTest(100, 100, synth);
espeakPitchRangeTest( 50, 50, synth); // default value
espeakPitchRangeTest( 10, 10, synth);
espeakPitchRangeTest( -5, 0, synth); // clamped to minimum value
}

public void espeakVolumeTest(int prefValue, int settingValue, SpeechSynthesis synth)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("espeak_volume", Integer.toString(prefValue));
editor.commit();

VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(settingValue));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(settingValue));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void testEspeakVolume()
{
SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
espeakVolumeTest(210, 200, synth); // clamped to maximum value
espeakVolumeTest(150, 150, synth);
espeakVolumeTest(100, 100, synth); // default value
espeakVolumeTest( 50, 50, synth);
espeakVolumeTest( -5, 0, synth); // clamped to minimum value
}

public void espeakPunctuationLevelTest(int prefValue, int settingValue, String jsonValue, SpeechSynthesis synth)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("espeak_punctuation_level", Integer.toString(prefValue));
editor.commit();

VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(settingValue));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(jsonValue));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void testEspeakPunctuationLevel()
{
SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
espeakPunctuationLevelTest( 3, SpeechSynthesis.PUNCT_SOME, "some", synth); // clamped to maximum value
espeakPunctuationLevelTest( 2, SpeechSynthesis.PUNCT_SOME, "some", synth);
espeakPunctuationLevelTest( 1, SpeechSynthesis.PUNCT_ALL, "all", synth);
espeakPunctuationLevelTest( 0, SpeechSynthesis.PUNCT_NONE, "none", synth);
espeakPunctuationLevelTest(-1, SpeechSynthesis.PUNCT_NONE, "none", synth); // clamped to minimum value
}

public void testEspeakPunctuationCharacters()
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("espeak_punctuation_characters", ".?!");
editor.commit();

SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(".?!"));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(".?!"));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

// Mixed (Old and New) Settings

public void testEspeakVariantWithDefaultGenderFemale()
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("default_gender", Integer.toString(SpeechSynthesis.GENDER_FEMALE));
editor.putString("espeak_variant", "klatt4");
editor.commit();

SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("klatt4"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("klatt4"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void testEspeakRateWithDefaultRate()
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("default_rate", Integer.toString(50));
editor.putString("espeak_rate", Integer.toString(200));
editor.commit();

SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(200));
assertThat(settings.getPitch(), is(synth.Pitch.getDefaultValue()));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(200));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(synth.Pitch.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}

public void testEspeakPitchWithDefaultPitch()
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.putString("default_pitch", Integer.toString(50));
editor.putString("espeak_pitch", Integer.toString(75));
editor.commit();

SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback);
VoiceSettings settings = new VoiceSettings(prefs, synth);
assertThat(settings.getVoiceVariant().toString(), is("male"));
assertThat(settings.getRate(), is(synth.Rate.getDefaultValue()));
assertThat(settings.getPitch(), is(75));
assertThat(settings.getPitchRange(), is(synth.PitchRange.getDefaultValue()));
assertThat(settings.getVolume(), is(synth.Volume.getDefaultValue()));
assertThat(settings.getPunctuationLevel(), is(SpeechSynthesis.PUNCT_NONE));
assertThat(settings.getPunctuationCharacters(), is(nullValue()));

try {
JSONObject json = settings.toJSON();
assertThat(json.opt(VoiceSettings.PRESET_VARIANT), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_VARIANT), is("male"));
assertThat(json.opt(VoiceSettings.PRESET_RATE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_RATE), is(synth.Rate.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PITCH), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH), is(75));
assertThat(json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_PITCH_RANGE), is(synth.PitchRange.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_VOLUME), is(instanceOf(Integer.class)));
assertThat((Integer)json.opt(VoiceSettings.PRESET_VOLUME), is(synth.Volume.getDefaultValue()));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is(instanceOf(String.class)));
assertThat((String)json.opt(VoiceSettings.PRESET_PUNCTUATION_LEVEL), is("none"));
assertThat(json.opt(VoiceSettings.PRESET_PUNCTUATION_CHARACTERS), is(nullValue()));
} catch (JSONException e) {
assertThat(e.toString(), is(nullValue())); // This will be false; used to report exception.
}
}
}

+ 109
- 0
android/eSpeakTests/src/com/reecedunn/espeak/test/VoiceVariantTest.java View File

@@ -0,0 +1,109 @@
/*
* Copyright (C) 2013 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.reecedunn.espeak.test;

import android.test.AndroidTestCase;

import com.reecedunn.espeak.SpeechSynthesis;
import com.reecedunn.espeak.VoiceVariant;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

public class VoiceVariantTest extends AndroidTestCase
{
public void testMaleVoiceVariant()
{
VoiceVariant variant = VoiceVariant.parseVoiceVariant("male");
assertThat(variant.variant, is(nullValue()));
assertThat(variant.gender, is(SpeechSynthesis.GENDER_MALE));
assertThat(variant.age, is(SpeechSynthesis.AGE_ANY));
assertThat(variant.toString(), is("male"));
}

public void testFemaleVoiceVariant()
{
VoiceVariant variant = VoiceVariant.parseVoiceVariant("female");
assertThat(variant.variant, is(nullValue()));
assertThat(variant.gender, is(SpeechSynthesis.GENDER_FEMALE));
assertThat(variant.age, is(SpeechSynthesis.AGE_ANY));
assertThat(variant.toString(), is("female"));
}

public void testNamedVoiceVariant()
{
VoiceVariant variant = VoiceVariant.parseVoiceVariant("klatt1");
assertThat(variant.variant, is("klatt1"));
assertThat(variant.gender, is(SpeechSynthesis.GENDER_UNSPECIFIED));
assertThat(variant.age, is(SpeechSynthesis.AGE_ANY));
assertThat(variant.toString(), is("klatt1"));
}

public void testMaleVoiceVariantYoung()
{
VoiceVariant variant = VoiceVariant.parseVoiceVariant("male-young");
assertThat(variant.variant, is(nullValue()));
assertThat(variant.gender, is(SpeechSynthesis.GENDER_MALE));
assertThat(variant.age, is(SpeechSynthesis.AGE_YOUNG));
assertThat(variant.toString(), is("male-young"));
}

public void testFemaleVoiceVariantYoung()
{
VoiceVariant variant = VoiceVariant.parseVoiceVariant("female-young");
assertThat(variant.variant, is(nullValue()));
assertThat(variant.gender, is(SpeechSynthesis.GENDER_FEMALE));
assertThat(variant.age, is(SpeechSynthesis.AGE_YOUNG));
assertThat(variant.toString(), is("female-young"));
}

public void testNamedVoiceVariantYoung()
{
VoiceVariant variant = VoiceVariant.parseVoiceVariant("klatt2-young");
assertThat(variant.variant, is("klatt2"));
assertThat(variant.gender, is(SpeechSynthesis.GENDER_UNSPECIFIED));
assertThat(variant.age, is(SpeechSynthesis.AGE_YOUNG));
assertThat(variant.toString(), is("klatt2-young"));
}

public void testMaleVoiceVariantOld()
{
VoiceVariant variant = VoiceVariant.parseVoiceVariant("male-old");
assertThat(variant.variant, is(nullValue()));
assertThat(variant.gender, is(SpeechSynthesis.GENDER_MALE));
assertThat(variant.age, is(SpeechSynthesis.AGE_OLD));
assertThat(variant.toString(), is("male-old"));
}

public void testFemaleVoiceVariantOld()
{
VoiceVariant variant = VoiceVariant.parseVoiceVariant("female-old");
assertThat(variant.variant, is(nullValue()));
assertThat(variant.gender, is(SpeechSynthesis.GENDER_FEMALE));
assertThat(variant.age, is(SpeechSynthesis.AGE_OLD));
assertThat(variant.toString(), is("female-old"));
}

public void testNamedVoiceVariantOld()
{
VoiceVariant variant = VoiceVariant.parseVoiceVariant("klatt3-old");
assertThat(variant.variant, is("klatt3"));
assertThat(variant.gender, is(SpeechSynthesis.GENDER_UNSPECIFIED));
assertThat(variant.age, is(SpeechSynthesis.AGE_OLD));
assertThat(variant.toString(), is("klatt3-old"));
}
}

+ 95
- 0
android/icons/feature-graphic.svg View File

@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Copyright (C) Reece H. Dunn [License: CC-BY-SA 3.0] -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1024" height="500" version="1.1">

<rect x="0" y="0" width="1024" height="500" fill="#ffffff"></rect>

<g transform="translate(0,20)">
<g transform="translate(5,-880)"> <!-- width: 200 height: 175 -->
<path fill="#d40000" d="
m 78,1050
c -6, -3 -16,-12 -32,-33
C 23, 987 14,980 3,977 1,977 0,977 0,976
c 0, 0 5, -5 11,-11 6, -6 18,-19 27,-29 18,-21 35,-40 36,-40 0,0 2,3 4,6 5,9 10,15 15,15 7,0 16,-10 24,-26
l 3,-7 4,6
c 13,19 33,43 52,62
l 15,15 -5, 1
c -7, 2 -13,5 -21,12 -6,5 -13,12 -38,40 -17,20 -32,31 -40,31 -2,0 -5,-1 -7,-2
z
m 24,-49
c 7,-3 17,-13 25,-25 6,-9 12,-20 12,-21 0,0 -1,-1 -2,-1 -1,0 -7,-2 -13,-5 -12,-6 -20,-8 -26,-8
C 94,942 83,948 69,957 64,961 58,965 57,965
c -2,0 -3,1 -3,1 0,1 7,12 10,17 13,18 25,24 38,17
z
" />
</g>
</g>

<g transform="translate(170,0)" font-family="Droid Sans" font-size="64px" font-weight="bold" fill="#000000">
<text x="15" y= "64">eSpeak</text>
<text x="80" y="134">for</text>
<text x= "5" y="192">Android</text>
</g>

<image id="Afrikaans" x= "5" y="225" width="75" height="50" xlink:href="Flag_of_South_Africa.png"/>
<image id="Akan" x= "5" y="280" width="75" height="50" xlink:href="Flag_of_Ghana.png"/>
<image id="Albanian" x= "5" y="335" width="75" height="50" xlink:href="Flag_of_Albania.png"/>
<image id="Amharic" x= "5" y="390" width="75" height="50" xlink:href="Flag_of_Ethiopia.png"/>
<image id="Armenian" x= "5" y="445" width="75" height="50" xlink:href="Flag_of_Armenia.png"/>
<image id="Azerbaijani" x= "85" y="225" width="75" height="50" xlink:href="Flag_of_Azerbaijan.png"/>
<image id="Bosnian" x= "85" y="280" width="75" height="50" xlink:href="Flag_of_Bosnia_and_Herzegovina.png"/>
<image id="Bulgarian" x= "85" y="335" width="75" height="50" xlink:href="Flag_of_Bulgaria.png"/>
<image id="Catalan" x= "85" y="390" width="75" height="50" xlink:href="Flag_of_Andorra.png"/>
<image id="Chinese" x= "85" y="445" width="75" height="50" xlink:href="Flag_of_the_People's_Republic_of_China.png"/>
<image id="Croatian" x="165" y="225" width="75" height="50" xlink:href="Flag_of_Croatia.png"/>
<image id="Czech" x="165" y="280" width="75" height="50" xlink:href="Flag_of_the_Czech_Republic.png"/>
<image id="Danish" x="165" y="335" width="75" height="50" xlink:href="Flag_of_Denmark.png"/>
<image id="Divehi" x="165" y="390" width="75" height="50" xlink:href="Flag_of_Maldives.png"/>
<image id="Dutch" x="165" y="445" width="75" height="50" xlink:href="Flag_of_the_Netherlands.png"/>
<image id="English_GB" x="245" y="225" width="75" height="50" xlink:href="Flag_of_the_United_Kingdom.png"/>
<image id="English_US" x="245" y="280" width="75" height="50" xlink:href="Flag_of_the_United_States.png"/>
<image id="Esperanto" x="245" y="335" width="75" height="50" xlink:href="Flag_of_Esperanto.png"/>
<image id="Estonian" x="245" y="390" width="75" height="50" xlink:href="Flag_of_Estonia.png"/>
<image id="Finnish" x="245" y="445" width="75" height="50" xlink:href="Flag_of_Finland.png"/>
<image id="French" x="325" y="225" width="75" height="50" xlink:href="Flag_of_France.png"/>
<image id="Georgian" x="325" y="280" width="75" height="50" xlink:href="Flag_of_Georgia.png"/>
<image id="German" x="325" y="335" width="75" height="50" xlink:href="Flag_of_Germany.png"/>
<image id="Greek" x="325" y="390" width="75" height="50" xlink:href="Flag_of_Greece.png"/>
<image id="Haitian" x="325" y="445" width="75" height="50" xlink:href="Flag_of_Haiti.png"/>
<image id="Indian_Misc" x="405" y="225" width="75" height="50" xlink:href="Flag_of_India.png"/>
<image id="Hungarian" x="405" y="280" width="75" height="50" xlink:href="Flag_of_Hungary.png"/>
<image id="Icelandic" x="405" y="335" width="75" height="50" xlink:href="Flag_of_Iceland.png"/>
<image id="Indonesian" x="405" y="390" width="75" height="50" xlink:href="Flag_of_Indonesia.png"/>
<image id="Irish" x="405" y="445" width="75" height="50" xlink:href="Flag_of_Ireland.png"/>
<image id="Italian" x="485" y="225" width="75" height="50" xlink:href="Flag_of_Italy.png"/>
<image id="Kalaallisut" x="485" y="280" width="75" height="50" xlink:href="Flag_of_Greenland.png"/>
<image id="Kazakh" x="485" y="335" width="75" height="50" xlink:href="Flag_of_Kazakhstan.png"/>
<image id="Kinyarwanda" x="485" y="390" width="75" height="50" xlink:href="Flag_of_Rwanda.png"/>
<image id="Korean" x="485" y="445" width="75" height="50" xlink:href="Flag_of_South_Korea.png"/>
<image id="Latvian" x="565" y="225" width="75" height="50" xlink:href="Flag_of_Latvia.png"/>
<image id="Lithuania" x="565" y="280" width="75" height="50" xlink:href="Flag_of_Lithuania.png"/>
<image id="Lojban" x="565" y="335" width="75" height="50" xlink:href="Flag_of_Lojban.png"/>
<image id="Macedonian" x="565" y="390" width="75" height="50" xlink:href="Flag_of_Macedonia.png"/>
<image id="Maltese" x="565" y="445" width="75" height="50" xlink:href="Flag_of_Malta.png"/>
<image id="Norwegian" x="645" y="225" width="75" height="50" xlink:href="Flag_of_Norway.png"/>
<image id="Papiamento" x="645" y="280" width="75" height="50" xlink:href="Flag_of_Aruba.png"/>
<image id="Polish" x="645" y="335" width="75" height="50" xlink:href="Flag_of_Poland.png"/>
<image id="Portuguese" x="645" y="390" width="75" height="50" xlink:href="Flag_of_Portugal.png"/>
<image id="Romanian" x="645" y="445" width="75" height="50" xlink:href="Flag_of_Romania.png"/>
<image id="Russian" x="725" y="225" width="75" height="50" xlink:href="Flag_of_Russia.png"/>
<image id="Serbian" x="725" y="280" width="75" height="50" xlink:href="Flag_of_Serbia.png"/>
<image id="Sinhala" x="725" y="335" width="75" height="50" xlink:href="Flag_of_Sri_Lanka.png"/>
<image id="Slovak" x="725" y="390" width="75" height="50" xlink:href="Flag_of_Slovakia.png"/>
<image id="Slovenian" x="725" y="445" width="75" height="50" xlink:href="Flag_of_Slovenia.png"/>
<image id="Spanish" x="805" y="225" width="75" height="50" xlink:href="Flag_of_Spain.png"/>
<image id="Swahili" x="805" y="280" width="75" height="50" xlink:href="Flag_of_Tanzania.png"/>
<image id="Swedish" x="805" y="335" width="75" height="50" xlink:href="Flag_of_Sweden.png"/>
<image id="Tatar" x="805" y="390" width="75" height="50" xlink:href="Flag_of_Tatarstan.png"/>
<image id="Tswana" x="805" y="445" width="75" height="50" xlink:href="Flag_of_Botswana.png"/>
<image id="Turkish" x="885" y="225" width="75" height="50" xlink:href="Flag_of_Turkey.png"/>
<image id="Urdu" x="885" y="280" width="75" height="50" xlink:href="Flag_of_Pakistan.png"/>
<image id="Vietnamese" x="885" y="335" width="75" height="50" xlink:href="Flag_of_Vietnam.png"/>
<image id="Welsh" x="885" y="390" width="75" height="50" xlink:href="Flag_of_Wales_2.png"/>
<image id="Wolof" x="885" y="445" width="75" height="50" xlink:href="Flag_of_Senegal.png"/>

</svg>

+ 27
- 0
android/icons/launcher.svg View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" version="1.1">

<g transform="translate(28,0)">
<g transform="translate(5,-880)"> <!-- width: 200 height: 175 -->
<path fill="#d40000" d="
m 78,1050
c -6, -3 -16,-12 -32,-33
C 23, 987 14,980 3,977 1,977 0,977 0,976
c 0, 0 5, -5 11,-11 6, -6 18,-19 27,-29 18,-21 35,-40 36,-40 0,0 2,3 4,6 5,9 10,15 15,15 7,0 16,-10 24,-26
l 3,-7 4,6
c 13,19 33,43 52,62
l 15,15 -5, 1
c -7, 2 -13,5 -21,12 -6,5 -13,12 -38,40 -17,20 -32,31 -40,31 -2,0 -5,-1 -7,-2
z
m 24,-49
c 7,-3 17,-13 25,-25 6,-9 12,-20 12,-21 0,0 -1,-1 -2,-1 -1,0 -7,-2 -13,-5 -12,-6 -20,-8 -26,-8
C 94,942 83,948 69,957 64,961 58,965 57,965
c -2,0 -3,1 -3,1 0,1 7,12 10,17 13,18 25,24 38,17
z
" />
</g>
</g>

<text x="15" y="230" font-size="64px" font-family="Droid Sans" font-weight="bold" fill="#ffffff">eSpeak</text>

</svg>

+ 36
- 0
android/icons/promo-graphic.svg View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Copyright (C) Reece H. Dunn [License: CC-BY-SA 3.0] -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="180" height="120" version="1.1">

<rect x="0" y="0" width="180" height="120" fill="#ffffff"></rect>

<g transform="scale(0.4,0.4)">
<g transform="translate(0,20)">
<g transform="translate(5,-880)"> <!-- width: 200 height: 175 -->
<path fill="#d40000" d="
m 78,1050
c -6, -3 -16,-12 -32,-33
C 23, 987 14,980 3,977 1,977 0,977 0,976
c 0, 0 5, -5 11,-11 6, -6 18,-19 27,-29 18,-21 35,-40 36,-40 0,0 2,3 4,6 5,9 10,15 15,15 7,0 16,-10 24,-26
l 3,-7 4,6
c 13,19 33,43 52,62
l 15,15 -5, 1
c -7, 2 -13,5 -21,12 -6,5 -13,12 -38,40 -17,20 -32,31 -40,31 -2,0 -5,-1 -7,-2
z
m 24,-49
c 7,-3 17,-13 25,-25 6,-9 12,-20 12,-21 0,0 -1,-1 -2,-1 -1,0 -7,-2 -13,-5 -12,-6 -20,-8 -26,-8
C 94,942 83,948 69,957 64,961 58,965 57,965
c -2,0 -3,1 -3,1 0,1 7,12 10,17 13,18 25,24 38,17
z
" />
</g>
</g>

<g transform="translate(170,0)" font-family="Droid Sans" font-size="64px" font-weight="bold" fill="#000000">
<text x="15" y= "64">eSpeak</text>
<text x="80" y="134">for</text>
<text x= "5" y="192">Android</text>
</g>
</g>

</svg>

+ 64
- 0
android/jni/Android.mk View File

@@ -0,0 +1,64 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_CFLAGS = -std=c++11

# ucd-tools wide-character compatibility support:

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

LOCAL_SRC_FILES += $(UCDTOOLS_SRC_FILES)

# eSpeak (minus command line apps and espeakedit)

ESPEAK_SOURCES := \
src/compiledict.cpp \
src/debug.cpp \
src/dictionary.cpp \
src/intonation.cpp \
src/klatt.cpp \
src/numbers.cpp \
src/readclause.cpp \
src/phonemelist.cpp \
src/setlengths.cpp \
src/sonic.cpp \
src/speak_lib.cpp \
src/synthdata.cpp \
src/synthesize.cpp \
src/synth_mbrola.cpp \
src/translate.cpp \
src/tr_languages.cpp \
src/voices.cpp \
src/wavegen.cpp \
src/wave.cpp

ESPEAK_SRC_PATH := ../../src
ESPEAK_SRC_FILES := \
$(subst src/,$(ESPEAK_SRC_PATH)/,$(ESPEAK_SOURCES))

LOCAL_CFLAGS += -DINCLUDE_KLATT -DINCLUDE_SONIC
LOCAL_SRC_FILES += \
$(filter-out $(BLACKLIST_SRC_FILES),$(ESPEAK_SRC_FILES))

# JNI

LOCAL_SRC_FILES += \
$(subst $(LOCAL_PATH)/jni,jni,$(wildcard $(LOCAL_PATH)/jni/*.c*))

# Common

LOCAL_C_INCLUDES += \
$(LOCAL_PATH)/include \
$(LOCAL_PATH)/$(UCDTOOLS_SRC_PATH)/include \
$(LOCAL_PATH)/$(ESPEAK_SRC_PATH)

LOCAL_LDLIBS := \
-llog

LOCAL_MODULE := libttsespeak
LOCAL_MODULE_TAGS := optional
LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)

+ 4
- 0
android/jni/Application.mk View File

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

+ 26
- 0
android/jni/include/Log.h View File

@@ -0,0 +1,26 @@
/*
* Copyright (C) 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#ifndef LOG_H_
#define LOG_H_

#include <android/log.h>

#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

#endif /* LOG_H_ */

+ 354
- 0
android/jni/jni/eSpeakService.cpp View File

@@ -0,0 +1,354 @@
/*
* Copyright (C) 2012-2015 Reece H. Dunn
* Copyright (C) 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/*
* This file contains the JNI bindings to eSpeak used by SpeechSynthesis.java.
*
* Android Version: 4.0 (Ice Cream Sandwich)
* API Version: 14
*/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <jni.h>

#include <speak_lib.h>
#include <Log.h>

#define BUFFER_SIZE_IN_MILLISECONDS 1000

/** @name Java to Wide String Helpers
* @brief These are helpers for converting a jstring to wchar_t*.
*
* This assumes that wchar_t is a 32-bit (UTF-32) value.
*/
//@{

const char *utf8_read(const char *in, wchar_t &c)
{
if (uint8_t(*in) < 0x80)
c = *in++;
else switch (uint8_t(*in) & 0xF0)
{
default:
c = uint8_t(*in++) & 0x1F;
c = (c << 6) + (uint8_t(*in++) & 0x3F);
break;
case 0xE0:
c = uint8_t(*in++) & 0x0F;
c = (c << 6) + (uint8_t(*in++) & 0x3F);
c = (c << 6) + (uint8_t(*in++) & 0x3F);
break;
case 0xF0:
c = uint8_t(*in++) & 0x07;
c = (c << 6) + (uint8_t(*in++) & 0x3F);
c = (c << 6) + (uint8_t(*in++) & 0x3F);
c = (c << 6) + (uint8_t(*in++) & 0x3F);
break;
}
return in;
}

class unicode_string
{
static_assert(sizeof(wchar_t) == 4, "wchar_t is not UTF-32");
public:
unicode_string(JNIEnv *env, jstring str);
~unicode_string();

const wchar_t *c_str() const { return mString; }
private:
wchar_t *mString;
};

unicode_string::unicode_string(JNIEnv *env, jstring str)
: mString(NULL)
{
if (str == NULL) return;

const char *utf8 = env->GetStringUTFChars(str, NULL);
mString = (wchar_t *)malloc((strlen(utf8) + 1) * sizeof(wchar_t));

const char *utf8_current = utf8;
wchar_t *utf32_current = mString;
while (*utf8_current)
{
utf8_current = utf8_read(utf8_current, *utf32_current);
++utf32_current;
}
*utf32_current = 0;

env->ReleaseStringUTFChars(str, utf8);
}

unicode_string::~unicode_string()
{
if (mString) free(mString);
}

//@}

#define LOG_TAG "eSpeakService"
#define DEBUG true

enum synthesis_result {
SYNTH_CONTINUE = 0,
SYNTH_ABORT = 1
};

static JavaVM *jvm = NULL;
jmethodID METHOD_nativeSynthCallback;

static JNIEnv *getJniEnv() {
JNIEnv *env = NULL;
jvm->AttachCurrentThread(&env, NULL);
return env;
}

/* Callback from espeak. Should call back to the TTS API */
static int SynthCallback(short *audioData, int numSamples,
espeak_EVENT *events) {
JNIEnv *env = getJniEnv();
jobject object = (jobject)events->user_data;

if (numSamples < 1) {
env->CallVoidMethod(object, METHOD_nativeSynthCallback, NULL);
return SYNTH_ABORT;
} else {
jbyteArray arrayAudioData = env->NewByteArray(numSamples * 2);
env->SetByteArrayRegion(arrayAudioData, 0, (numSamples * 2), (jbyte *) audioData);
env->CallVoidMethod(object, METHOD_nativeSynthCallback, arrayAudioData);
return SYNTH_CONTINUE;
}
}

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

JNIEXPORT jint
JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
jvm = vm;
JNIEnv *env;

if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {
LOGE("Failed to get the environment using GetEnv()");
return -1;
}

return JNI_VERSION_1_6;
}

JNIEXPORT jboolean
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeClassInit(
JNIEnv* env, jclass clazz) {
if (DEBUG) LOGV("%s", __FUNCTION__);
METHOD_nativeSynthCallback = env->GetMethodID(clazz, "nativeSynthCallback", "([B)V");

return JNI_TRUE;
}

JNIEXPORT jint
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeCreate(
JNIEnv *env, jobject object, jstring path) {
if (DEBUG) LOGV("%s [env=%p, object=%p]", __FUNCTION__, env, object);

const char *c_path = path ? env->GetStringUTFChars(path, NULL) : NULL;

if (DEBUG) LOGV("Initializing with path %s", c_path);
int sampleRate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, BUFFER_SIZE_IN_MILLISECONDS, c_path, 0);

if (c_path) env->ReleaseStringUTFChars(path, c_path);

return sampleRate;
}

JNIEXPORT jobject
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeGetVersion(
JNIEnv *env, jclass clazz) {
if (DEBUG) LOGV("%s", __FUNCTION__);
return env->NewStringUTF(espeak_Info(NULL));
}

JNIEXPORT jobjectArray
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeGetAvailableVoices(
JNIEnv *env, jobject object) {
if (DEBUG) LOGV("%s", __FUNCTION__);

const espeak_VOICE **voices = espeak_ListVoices(NULL);

int count;

// First, count the number of voices returned.
for (count = 0; voices[count] != NULL; count++);

// Next, create a Java String array.
jobjectArray voicesArray = (jobjectArray) env->NewObjectArray(
count * 4, env->FindClass("java/lang/String"), NULL);

const espeak_VOICE *v;
char gender_buf[12];
char age_buf[12];

// Finally, populate the array.
for (int i = 0, voicesIndex = 0; (v = voices[i]) != NULL; i++) {
const char *lang_name = v->languages + 1;
const char *identifier = v->identifier;
sprintf(gender_buf, "%d", v->gender);
sprintf(age_buf, "%d", v->age);

env->SetObjectArrayElement(
voicesArray, voicesIndex++, env->NewStringUTF(lang_name));
env->SetObjectArrayElement(
voicesArray, voicesIndex++, env->NewStringUTF(identifier));
env->SetObjectArrayElement(
voicesArray, voicesIndex++, env->NewStringUTF(gender_buf));
env->SetObjectArrayElement(
voicesArray, voicesIndex++, env->NewStringUTF(age_buf));
}

return voicesArray;
}

JNIEXPORT jboolean
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeSetVoiceByName(
JNIEnv *env, jobject object, jstring name) {
const char *c_name = name ? env->GetStringUTFChars(name, NULL) : NULL;

if (DEBUG) LOGV("%s(name=%s)", __FUNCTION__, c_name);

const espeak_ERROR result = espeak_SetVoiceByName(c_name);

if (c_name) env->ReleaseStringUTFChars(name, c_name);

switch (result) {
case EE_OK: return JNI_TRUE;
case EE_INTERNAL_ERROR: LOGE("espeak_SetVoiceByName: internal error."); break;
case EE_BUFFER_FULL: LOGE("espeak_SetVoiceByName: buffer full."); break;
case EE_NOT_FOUND: LOGE("espeak_SetVoiceByName: not found."); break;
}

return JNI_FALSE;
}

JNIEXPORT jboolean
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeSetVoiceByProperties(
JNIEnv *env, jobject object, jstring language, jint gender, jint age) {
const char *c_language = language ? env->GetStringUTFChars(language, NULL) : NULL;

if (DEBUG) LOGV("%s(language=%s, gender=%d, age=%d)", __FUNCTION__, c_language, gender, age);

espeak_VOICE voice_select;
memset(&voice_select, 0, sizeof(espeak_VOICE));
voice_select.languages = c_language;
voice_select.gender = (int) gender;
voice_select.age = (int) age;

const espeak_ERROR result = espeak_SetVoiceByProperties(&voice_select);

if (c_language) env->ReleaseStringUTFChars(language, c_language);

switch (result) {
case EE_OK: return JNI_TRUE;
case EE_INTERNAL_ERROR: LOGE("espeak_SetVoiceByProperties: internal error."); break;
case EE_BUFFER_FULL: LOGE("espeak_SetVoiceByProperties: buffer full."); break;
case EE_NOT_FOUND: LOGE("espeak_SetVoiceByProperties: not found."); break;
}

return JNI_FALSE;
}

JNIEXPORT jboolean
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeSetParameter(
JNIEnv *env, jobject object, jint parameter, jint value) {
if (DEBUG) LOGV("%s(parameter=%d, value=%d)", __FUNCTION__, parameter, value);
const espeak_ERROR result = espeak_SetParameter((espeak_PARAMETER)parameter, (int)value, 0);

switch (result) {
case EE_OK: return JNI_TRUE;
case EE_INTERNAL_ERROR: LOGE("espeak_SetParameter: internal error."); break;
case EE_BUFFER_FULL: LOGE("espeak_SetParameter: buffer full."); break;
case EE_NOT_FOUND: LOGE("espeak_SetParameter: not found."); break;
}

return JNI_FALSE;
}

JNIEXPORT jint
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeGetParameter(
JNIEnv *env, jobject object, jint parameter, jint current) {
if (DEBUG) LOGV("%s(parameter=%d, pitch=%d)", __FUNCTION__, parameter, current);
return espeak_GetParameter((espeak_PARAMETER)parameter, (int)current);
}

JNIEXPORT jboolean
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeSetPunctuationCharacters(
JNIEnv *env, jobject object, jstring characters) {
if (DEBUG) LOGV("%s)", __FUNCTION__);

unicode_string list(env, characters);
const espeak_ERROR result = espeak_SetPunctuationList(list.c_str());
switch (result) {
case EE_OK: return JNI_TRUE;
case EE_INTERNAL_ERROR: LOGE("espeak_SetPunctuationList: internal error."); break;
case EE_BUFFER_FULL: LOGE("espeak_SetPunctuationList: buffer full."); break;
case EE_NOT_FOUND: LOGE("espeak_SetPunctuationList: not found."); break;
}

return JNI_FALSE;
}

JNIEXPORT jboolean
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeSynthesize(
JNIEnv *env, jobject object, jstring text, jboolean isSsml) {
if (DEBUG) LOGV("%s", __FUNCTION__);
const char *c_text = text ? env->GetStringUTFChars(text, NULL) : NULL;
unsigned int unique_identifier;

espeak_SetSynthCallback(SynthCallback);
const espeak_ERROR result = espeak_Synth(c_text, strlen(c_text), 0, // position
POS_CHARACTER, 0, // end position (0 means no end position)
isSsml ? espeakCHARS_UTF8 | espeakSSML // UTF-8 encoded SSML
: espeakCHARS_UTF8, // UTF-8 encoded text
&unique_identifier, object);
espeak_Synchronize();

if (c_text) env->ReleaseStringUTFChars(text, c_text);

switch (result) {
case EE_OK: return JNI_TRUE;
case EE_INTERNAL_ERROR: LOGE("espeak_Synth: internal error."); break;
case EE_BUFFER_FULL: LOGE("espeak_Synth: buffer full."); break;
case EE_NOT_FOUND: LOGE("espeak_Synth: not found."); break;
}

return JNI_TRUE;
}

JNIEXPORT jboolean
JNICALL Java_com_reecedunn_espeak_SpeechSynthesis_nativeStop(
JNIEnv *env, jobject object) {
if (DEBUG) LOGV("%s", __FUNCTION__);
espeak_Cancel();

return JNI_TRUE;
}

#ifdef __cplusplus
}
#endif /* __cplusplus */

+ 13
- 0
android/mkicons.sh View File

@@ -0,0 +1,13 @@
#!/bin/bash

rsvg -w 24 -h 24 icons/launcher.svg res/drawable-ldpi/icon.png
rsvg -w 32 -h 32 icons/launcher.svg res/drawable-mdpi/icon.png
rsvg -w 48 -h 48 icons/launcher.svg res/drawable-hdpi/icon.png
rsvg -w 64 -h 64 icons/launcher.svg res/drawable-xhdpi/icon.png

ls icons/Flag_*.svg | while read flag ; do
rsvg -w 75 -h 50 $flag `echo $flag | sed -e 's,.svg,.png,g'`
done

rsvg -w 1024 -h 500 icons/feature-graphic.svg icons/feature-graphic.png
rsvg -w 180 -h 120 icons/promo-graphic.svg icons/promo-graphic.png

+ 11
- 0
android/project.properties View File

@@ -0,0 +1,11 @@
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "ant.properties", and override values to adapt the script to your
# project structure.

# Project target.
target=android-18

+ 13
- 0
android/remove_string.sh View File

@@ -0,0 +1,13 @@
#!/bin/bash
#
# Copyright (C) 2013 Reece H. Dunn
# License: GPLv3+
#
# Helper utility for removing a string/string-list item in all string resources.
#
# Usage: ./remove_string.sh <string_id>

ls res/values*/strings.xml | while read STRINGS ; do
xmlstarlet ed -P -d "/resources/*[@name='${1}']" ${STRINGS} > /tmp/strings.xml
mv /tmp/strings.xml ${STRINGS}
done

BIN
android/res/drawable-hdpi/icon.png View File


BIN
android/res/drawable-ldpi/icon.png View File


BIN
android/res/drawable-mdpi/icon.png View File


BIN
android/res/drawable-xhdpi/icon.png View File


+ 24
- 0
android/res/layout/download_voice_data.xml View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="16dp" >

<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:id="@+id/progress"
android:indeterminate="false"
android:longClickable="false" />

<TextView
android:id="@+id/installing_voice_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/installing_voice_data" />

</LinearLayout>

+ 14
- 0
android/res/layout/import_voice_preference.xml View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/dictionaries"
android:gravity="bottom"
android:layout_gravity="center_vertical" />

</LinearLayout>

+ 27
- 0
android/res/layout/information_view.xml View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:padding="6dp" >

<TextView
android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
android:id="@android:id/summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="4"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary" />

</LinearLayout>

+ 80
- 0
android/res/layout/main.xml View File

@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp" >

<LinearLayout
android:id="@+id/loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone" >

<ProgressBar
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/loading" />
</LinearLayout>

<LinearLayout
android:id="@+id/success"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="visible" >

<ListView
android:id="@+id/properties"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >

</ListView>

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/synthesis_demo"
android:textAppearance="?android:attr/textAppearanceLarge" />

<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:ems="10"
android:inputType="textMultiLine" >

</EditText>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<Button
android:id="@+id/speak"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/speak" />

<Button
android:id="@+id/ssml"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ssml" />

</LinearLayout>

</LinearLayout>

</LinearLayout>

+ 37
- 0
android/res/layout/seekbar_preference.xml View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
android:id="@+id/valueText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:gravity="center_horizontal"
android:textIsSelectable="false"
android:textAppearance="?android:attr/textAppearanceMedium" />

<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<Button
android:id="@+id/resetToDefault"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:text="@string/resetToDefault" />

</LinearLayout>

</LinearLayout>

+ 45
- 0
android/res/layout/speak_punctuation_preference.xml View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<RadioGroup
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:focusable="false"
android:id="@+id/options">

<RadioButton
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="@string/punctuation_all"
android:id="@+id/all"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="true"
android:checked="false" />

<RadioButton
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="@string/punctuation_custom"
android:id="@+id/custom"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="true" />

<RadioButton
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="@string/punctuation_none"
android:id="@+id/none" />
</RadioGroup>

<EditText
android:layout_width="fill_parent"
android:layout_height="48dp"
android:id="@+id/punctuation_characters"
android:hint="@string/punctuation_characters" />

</LinearLayout>

+ 52
- 0
android/res/layout/voice_variant_preference.xml View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_gravity="center">

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/category"
android:layout_weight="0.5"
android:gravity="center_vertical"
android:layout_gravity="center_vertical" />

<Spinner
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/category"
android:layout_weight="0.5"
android:gravity="bottom"
android:layout_gravity="center_vertical" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp">

<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/variant"
android:layout_weight="0.5"
android:gravity="center_vertical"
android:layout_gravity="center_vertical" />

<Spinner
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/variant"
android:layout_weight="0.5"
android:gravity="bottom"
android:layout_gravity="center_vertical" />
</LinearLayout>

</LinearLayout>

+ 7
- 0
android/res/menu/options.xml View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/espeakSettings" android:title="@string/engine_settings"></item>
<item android:id="@+id/ttsSettings" android:title="@string/tts_settings"></item>

</menu>

+ 42
- 0
android/res/values-af/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak TTS-instellings</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Verstek toonhoogte</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Spraaktempo-vermenigvuldiger</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Installeer tans stemdata...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak is nie as jou verstek teks-na-spraak-enjin opgestel nie.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak kon nie stemdata installeer nie. Kontroleer asseblief jou SD-kaart.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Jammer, eSpeak kon nie begin nie.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Verstek stem</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Stemme geïnstalleer</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Algemene TTS-instellings</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak TTS-instellings</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Laai tans, wag asseblief...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Hierdie is \'n voorbeeld van gesproke teks in %s</string>
</resources>

+ 42
- 0
android/res/values-am/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak TTS ቅንብሮች</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">ነባሪ የድምጽ መውጣት/መውረድ</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">የንግግር መጠን ማባዣ</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">የድምጽ ውሂብ በመጫን ላይ…</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak እንደነባሪ የጽሑፍ-ወደ-ንግግር ፕሮግራም ሆኖ አልተቀመጠም። አሁን ማስቀመጥ ትፈልጋለህ?</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak የድምጽ ውሂብ መጫን አልተሳካለትም። እባክህ የማከማቻ መሳሪያ ካርድህን ፈትሽ።</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">ይቅርታ፣ eSpeak መጀመር አልቻለም። የስህተት ሪፖርት መላክ ትፈልጋለህ?</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">ነባሪ ድምጽ</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">የተጫኑ ድምጾች</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">አጠቃላይ የ TTS ቅንብሮች</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak TTS ቅንብሮች</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">በመጫን ላይ፣ እባክህ ጠብቅ…</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">ይሄ በ%s ላይ የተነገረ ጽሑፍ ናሙና ነው።</string>
</resources>

+ 42
- 0
android/res/values-ar/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">إعدادات eSpeak TTS</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">المستوى الافتراضي</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">مضاعف معدل الكلام</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">جارٍ تثبيت البيانات الصوتية…</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">لم يتم تعيين eSpeak كمحرك افتراضي لتحويل النص إلى كلام. هل تريد تعيينه الآن؟</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">أخفق eSpeak في تثبيت البيانات الصوتية. الرجاء التحقق من بطاقة SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">عذرًا، أخفق بدء eSpeak. هل تريد إرسال تقرير بالخطأ؟</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">الصوت الافتراضي</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">الأصوات المثبتة</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">إعدادات TTS العامة</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">إعدادات eSpeak TTS</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">جارٍ التحميل، يُرجى الانتظار...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">هذه عينة من النص الذي تم نطقه في %s</string>
</resources>

+ 71
- 0
android/res/values-bg/strings.xml View File

@@ -0,0 +1,71 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Настройки на eSpeak TTS</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Височина на гласа</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Скорост на речта</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Инсталиране на гласовите данни…</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak не е зададен като ваша речева машина по подразбиране.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak не успя да инсталира гласовите данни. Моля, проверете машата SD карта.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Съжаляваме, но eSpeak не можа да бъде стартиран.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Глас по подразбиране</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Инсталирани гласове</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Основни речеви настройки</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Настройки на eSpeak TTS</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Зареждане. Моля, изчакайте…</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Това е откъс от изговорен текст на %s</string>
<string name="status">Състояние</string>
<string name="tts_version">Версия на eSpeak</string>
<string name="speak">Прочети</string>
<string name="ssml">Зареди SSML шаблон</string>
<string name="synthesis_demo">Въведете текст за прочитане:</string>
<string name="espeak_volume">Сила на звука</string>
<string name="formatter_wpm">%s думи в секунда</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Нулирай стойностите</string>
<string name="espeak_pitch_range">Вариация на височината</string>
<string name="espeak_variant">Вариант на гласа</string>
<string name="espeak_speak_punctuation">Изговаряна пунктуация</string>
<string name="punctuation_all">Всичко</string>
<string name="punctuation_custom">По избор</string>
<string name="punctuation_custom_fmt">По избор: %s</string>
<string name="punctuation_none">Нищо</string>
<string name="punctuation_characters">Пунктуационни знаци</string>
<string name="category">Категория</string>
<string name="variant">Вариант</string>
<string name="variant_male">Мъжки</string>
<string name="variant_female">Женски</string>
<string name="variant_default">По подразбиране</string>
<string name="variant_n">Вариант %d</string>
<string name="variant_young">Младежки</string>
<string name="variant_old">Старчески</string>
<string name="variant_croak">Грачещ</string>
<string name="variant_whisper">Шептящ</string>
<string name="import_voice_title">Внасяне на речник на eSpeak</string>
<string name="import_voice_description">Внасяне на файл с гласов речник за eSpeak от SD картата.</string>
</resources>

+ 70
- 0
android/res/values-ca/strings.xml View File

@@ -0,0 +1,70 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Configuració de l\'eSpeak TTS</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">To predeterminat</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Multiplicador de velocitat de la veu</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">S\'estan instal·lant les dades de veu...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">No teniu definit l\'eSpeak com a motor de text a veu predeterminat.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">L\'eSpeak no ha pogut instal·lar dades de veu. Comproveu la targeta SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">No s\'ha pogut iniciar l\'eSpeak.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Veu predeterminada</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Veus instal·lades</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Configuració general de TTS</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Configuració de l\'eSpeak TTS</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">S\'està carregant; espereu...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Aquesta és una mostra de text llegit en veu alta en %s</string>
<string name="status">Estat</string>
<string name="tts_version">Versió de l\'eSpeak</string>
<string name="speak">Parla</string>
<string name="ssml">Carrega la plantilla SSML</string>
<string name="synthesis_demo">Introduïu el text a reproduir:</string>
<string name="espeak_volume">Volum</string>
<string name="formatter_wpm">%s WPM</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Estableix com a predeterminat</string>
<string name="espeak_pitch_range">Escolliu una variació</string>
<string name="espeak_variant">Variant de veu</string>
<string name="espeak_speak_punctuation">Lletreja la puntuació</string>
<string name="punctuation_all">Totes</string>
<string name="punctuation_custom">Personalitzada</string>
<string name="punctuation_custom_fmt">Personalitzada: %s</string>
<string name="punctuation_none">Cap</string>
<string name="punctuation_characters">Signes de puntuació</string>
<string name="category">Categoria</string>
<string name="variant">Variant</string>
<string name="variant_male">Masculina</string>
<string name="variant_female">Femenina</string>
<string name="variant_default">Predeterminada</string>
<string name="variant_n">Variant %d</string>
<string name="variant_young">Jove</string>
<string name="variant_old">Vell</string>
<string name="variant_whisper">Xiuxiuejant</string>
<string name="import_voice_title">Importa el diccionari eSpeak</string>
<string name="import_voice_description">Importa un fitxer de diccioanri de veu de l\'eSpeak de la targeta SD.</string>
</resources>

+ 42
- 0
android/res/values-cs/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Nastavení modulu eSpeak TTS</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Výchozí výška hlasu</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Multiplikátor rychlosti řeči</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Instalace hlasových dat...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">Aplikace eSpeak není nastavena jako váš výchozí modul pro převod textu na řeč.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Aplikaci eSpeak se nepodařilo nainstalovat hlasová data. Zkontrolujte prosím kartu SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Je nám líto, aplikaci eSpeak se nepodařilo spustit.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Výchozí hlas</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Počet nainstalovaných hlasů</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Obecná nastavení modulu TTS</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Nastavení modulu eSpeak TTS</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Načítání, čekejte prosím...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Toto je ukázkový text namluvený v jazyce %s</string>
</resources>

+ 42
- 0
android/res/values-da/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak-indstillinger for TTT</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Standard tonehøjde</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Talehastighedsmultiplikator</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Installerer stemmedata...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak er ikke angivet som din standard tekst-til-tale-maskine.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak kunne ikke installere stemmedataene. Kontrollér dit SD-kort.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Vi beklager, men eSpeak kunne ikke startes.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Standardstemme</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Installerede stemmer</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Generelle indstillinger for TTT</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak-indstillinger for TTT</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Indlæser. Vent et øjeblik...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Dette er et eksempel på talt tekst på %s</string>
</resources>

+ 71
- 0
android/res/values-de/strings.xml View File

@@ -0,0 +1,71 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak TTS Einstellungen</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Stimmhöhe</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Geschwindigkeit</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Dateien für Sprachen werden installiert…</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak ist nicht als Standardsprachausgabe eingestellt.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak konnte keine Sprachdateien installieren. Bitte SD-Karte überprüfen.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Leider konnte eSpeak nicht gestartet werden.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Standardsprache</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Installierte Stimmen</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Allgemeine TTS-Einstellungen</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak TTS-Einstellungen</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Es wird geladen… Bitte warten…</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Dies ist ein Beispieltext auf %s</string>
<string name="status">Status</string>
<string name="tts_version">eSpeak Version</string>
<string name="speak">Sprechen</string>
<string name="ssml">SSML-Vorlage laden</string>
<string name="synthesis_demo">Text, der gesprochen werden soll, eingeben:</string>
<string name="espeak_volume">Lautstärke</string>
<string name="formatter_wpm">%s WPM</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Auf Standardwerte zurücksetzen</string>
<string name="espeak_pitch_range">Betonung</string>
<string name="espeak_variant">Variante</string>
<string name="espeak_speak_punctuation">Satzzeichen sprechen</string>
<string name="punctuation_all">Alle</string>
<string name="punctuation_custom">Benutzerdefiniert</string>
<string name="punctuation_custom_fmt">Benutzerdefiniert: %s</string>
<string name="punctuation_none">Keine</string>
<string name="punctuation_characters">Satzzeichen</string>
<string name="category">Kategorie</string>
<string name="variant">Variante</string>
<string name="variant_male">Männlich</string>
<string name="variant_female">Weiblich</string>
<string name="variant_default">Standard</string>
<string name="variant_n">Variante %d</string>
<string name="variant_young">Jung</string>
<string name="variant_old">Alt</string>
<string name="variant_croak">Krächzen</string>
<string name="variant_whisper">Flüstern</string>
<string name="import_voice_title">eSpeak-Wörterbuch importieren</string>
<string name="import_voice_description">Ein eSpeak-Sprachwörterbuch von der SD-Karte importieren.</string>
</resources>

+ 42
- 0
android/res/values-el/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Ρυθμίσεις eSpeak TTS</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Προεπιλεγμένος τόνος</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Πολλαπλασιαστής ρυθμού ομιλίας</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Εγκατάσταση δεδομένων φωνής...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">Το eSpeak δεν έχει οριστεί ως η προεπιλεγμένη μηχανή μετατροπής κειμένου σε λόγο.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Το eSpeak απέτυχε να εγκαταστήσει τα δεδομένα φωνής. Ελέγξτε την κάρτα SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Λυπούμαστε, η εκκίνηση του eSpeak απέτυχε.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Προεπιλεγμένη φωνή</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Φωνές που έχουν εγκατασταθεί</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Γενικές ρυθμίσεις TTS</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Ρυθμίσεις eSpeak TTS</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Γίνεται φόρτωση. Περιμένετε...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Αυτό είναι ένα δείγμα κειμένου που εκφέρεται στα %s</string>
</resources>

+ 53
- 0
android/res/values-en-rGB/strings.xml View File

@@ -0,0 +1,53 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak TTS Settings</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Pitch</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Speech rate</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Installing voice data…</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak is not set as your default text-to-speech engine.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak failed to install voice data. Please check your SD card.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Sorry, eSpeak failed to start.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Default voice</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Voices installed</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">General TTS settings</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak TTS settings</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Loading, please wait…</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">This is a sample of text spoken in %s</string>
<string name="status">Status</string>
<string name="tts_version">eSpeak version</string>
<string name="speak">Speak</string>
<string name="ssml">Load SSML Template</string>
<string name="synthesis_demo">Enter text to speak:</string>
<string name="espeak_volume">Volume</string>
<string name="formatter_wpm">%s WPM</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Set to default</string>
<string name="espeak_pitch_range">Pitch variation</string>
<string name="espeak_variant">Voice variant</string>
</resources>

+ 53
- 0
android/res/values-es-rUS/strings.xml View File

@@ -0,0 +1,53 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Config del sintetizador eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Tono</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Velocidad de Voz</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Instalando Datos de Voz …</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak no se ha establecido como el sintetizador por defecto.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak no instaló los datos de voz. Compruebe la tarjeta SD por favor.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Lo sentimos. eSpeak no se inició.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Voz por Defecto</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Voces instaladas</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Config general del sintetizador</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Config del sintetizador eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Cargando. Espere por favor …</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Este es un ejemplo de texto hablado en %s.</string>
<string name="status">Estado</string>
<string name="tts_version">Versión de eSpeak</string>
<string name="speak">Hablar</string>
<string name="ssml">Cargar Plantilla de SSML</string>
<string name="synthesis_demo">Ingresar texto a verbalizar:</string>
<string name="espeak_volume">Volumen</string>
<string name="formatter_wpm">%s PPM</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Volver a config original</string>
<string name="espeak_pitch_range">Variación de Tono</string>
<string name="espeak_variant">Variante de Voz</string>
</resources>

+ 53
- 0
android/res/values-es/strings.xml View File

@@ -0,0 +1,53 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Config del sintetizador eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Tono</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Velocidad de Voz</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Instalando Datos de Voz …</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak no se ha establecido como el sintetizador por defecto.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak no instaló los datos de voz. Compruebe la tarjeta SD por favor.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Lo sentimos. eSpeak no se inició.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Voz por Defecto</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Voces instaladas</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Config general del sintetizador</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Config del sintetizador eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Cargando. Espere por favor …</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Esto es un ejemplo de texto hablado en %s.</string>
<string name="status">Estado</string>
<string name="tts_version">Versión de eSpeak</string>
<string name="speak">Hablar</string>
<string name="ssml">Cargar Plantilla de SSML</string>
<string name="synthesis_demo">Introducir texto a verbalizar:</string>
<string name="espeak_volume">Volumen</string>
<string name="formatter_wpm">%s PPM</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Volver a config original</string>
<string name="espeak_pitch_range">Variación de Tono</string>
<string name="espeak_variant">Variante de Voz</string>
</resources>

+ 42
- 0
android/res/values-fa/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">تنظیمات eSpeak TTS</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">زیر و بمی پیش‌فرض</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">تقویت‌کننده سرعت گفتگو</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">در حال نصب داده‌های صوتی...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak اکنون بعنوان موتور پیش‌فرض نوشتار به گفتار شما تنظیم شده است. می‌خواهید اکنون آن را تنظیم کنید؟</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak نتوانست داده‌های صوتی را نصب کند. لطفاً کارت SD خود را بررسی کنید.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">متأسفیم، eSpeak شروع به کار نکرد. می‌خواهید یک گزارش خطا ارسال کنید؟</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">صدای پیش‌فرض</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">صداهای نصب شده</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">تنظیمات کلی TTS</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">تنظیمات eSpeak TTS</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">در حال بارگیری، لطفاً صبر کنید...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">این یک نمونه از نوشتار گفته شده در %s است</string>
</resources>

+ 71
- 0
android/res/values-fi/strings.xml View File

@@ -0,0 +1,71 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak TTS -asetukset</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Äänenkorkeus</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Puhenopeus</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Asennetaan äänitietoja...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeakia ei ole asetettu tekstistä puheeksi -oletusmoottoriksi.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeakin äänitietojen asentaminen epäonnistui. Tarkista SD-kortti.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">eSpeakin käynnistäminen epäonnistui.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Oletusääni</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Asennettuja ääniä</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Yleiset tekstistä puheeksi -asetukset</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak TTS -asetukset</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Ladataan, odota...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Tämä on näyte puhutusta tekstistä kielellä %s</string>
<string name="status">Tila</string>
<string name="tts_version">eSpeak-versio</string>
<string name="speak">Puhu</string>
<string name="ssml">Lataa SSML-malli</string>
<string name="synthesis_demo">Kirjoita puhuttava teksti:</string>
<string name="espeak_volume">Voimakkuus</string>
<string name="formatter_wpm">%s sanaa minuutissa</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Palauta oletus</string>
<string name="espeak_pitch_range">Äänenkorkeuden vaihtelu</string>
<string name="espeak_variant">Äänen muunnelma</string>
<string name="espeak_speak_punctuation">Puhu välimerkit</string>
<string name="punctuation_all">Kaikki</string>
<string name="punctuation_custom">Oma</string>
<string name="punctuation_custom_fmt">Oma: %s</string>
<string name="punctuation_none">Ei mitään</string>
<string name="punctuation_characters">Välimerkit</string>
<string name="category">Kategoria</string>
<string name="variant">Muunnelma</string>
<string name="variant_male">Mies</string>
<string name="variant_female">Nainen</string>
<string name="variant_default">Oletus</string>
<string name="variant_n">Muunnelma %d</string>
<string name="variant_young">Nuori</string>
<string name="variant_old">Vanha</string>
<string name="variant_croak">Raakkuva</string>
<string name="variant_whisper">Kuiskaava</string>
<string name="import_voice_title">Tuo eSpeak-sanasto</string>
<string name="import_voice_description">Tuo eSpeak-äänisanastotiedosto SD-kortilta.</string>
</resources>

+ 42
- 0
android/res/values-fr/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Paramètres de synthèse vocale eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Tonalité par défaut</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Multiplicateur de la cadence</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Installation des données vocales en cours…</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak n\'est pas votre moteur de synthèse vocale par défaut.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Échec de l\'installation des données vocales par eSpeak. Veuillez vérifier votre carte SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Désolé, impossible de lancer eSpeak.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Voix par défaut</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Voix installées</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Paramètres généraux de synthèse vocale</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Paramètres de synthèse vocale eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Chargement en cours, veuillez patienter…</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Voici un exemple de texte énoncé en %s.</string>
</resources>

+ 42
- 0
android/res/values-hi/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak TTS सेटिंग</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">डिफ़ॉल्‍ट पिच</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">वाक् दर गुणक</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">ध्‍वनि डेटा इंस्टॉल किया जा रहा है…</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak आपके डिफ़ॉल्‍ट पाठ-से-वाक् इंजन के रूप में सेट नहीं है. क्‍या आप इसे अभी सेट करना चाहते हैं?</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak ध्‍वनि डेटा इंस्‍टॉल करने में विफल हुआ. कृपया अपना SD कार्ड जांचें.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">क्षमा करें, eSpeak प्रारंभ होने में विफल हुआ. क्‍या आप त्रुटि रिपोर्ट भेजना चाहते हैं?</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">डिफ़ॉल्‍ट ध्‍वनि</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">इंस्‍टॉल की गई ध्‍वनियां</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">सामान्‍य TTS सेटिंग</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak TTS सेटिंग</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">लोड हो रहा है, कृपया प्रतीक्षा करें…</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">यह %s में बोले गए पाठ का नमूना है</string>
</resources>

+ 42
- 0
android/res/values-hr/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">TTS postavke programa eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Zadana postavka visine tona</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Multiplikator brzine govora</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Instaliranje glasovnih podataka...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">Program eSpeak nije postavljen kao vaš zadani alat za pretvaranje teksta u govor.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Program eSpeak nije uspio instalirati glasovne podatke. Provjerite svoju SD karticu.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Žao nam je, ali pokretanje programa eSpeak nije uspjelo.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Zadani glas</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Broj instaliranih glasova</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Opće postavke TTS-a</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">TTS postavke programa eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Učitavanje. Pričekajte...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Ovo je primjer teksta izgovorenog na %s</string>
</resources>

+ 42
- 0
android/res/values-hu/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak -- A szövegfelismerő beállításai</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Alapértelmezett hangszín</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Beszédsebesség gyorsítása</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Hangadatok telepítése...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">Nem az eSpeak az alapértelmezett szövegfelolvasó motor.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Az eSpeak nem tudta telepíteni a hangadatokat. Ellenőrizze az SD-kártyát.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Sajnos az eSpeak nem indul.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Alapértelmezett hang</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Telepített hangok</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Általános szövegfelolvasási beállítások</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak -- A szövegfelismerő beállításai</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Betöltés folyamatban -- kérjük, várjon...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Ez egy %s nyelven felolvasott szöveg mintája.</string>
</resources>

+ 71
- 0
android/res/values-in/strings.xml View File

@@ -0,0 +1,71 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Setelan eSpeak TTS</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Nada</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Pengucapan</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Memasang data suara...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak tidak disetel sebagai mesin default text-to-speech anda.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak gagal memasang data suara. Silahkan periksa kartu SD anda.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Maaf, eSpeak gagal untuk berjalan.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Suara default</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Suara yang dipasang</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Setelan umum TTS</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Setelan eSpeak TTS</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Memuat, harap tunggu...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Ini adalah sebuah contoh teks yang diucapkan di %s</string>
<string name="status">Status</string>
<string name="tts_version">eSpeak versi</string>
<string name="speak">Ucapan</string>
<string name="ssml">Memuat SSML Template</string>
<string name="synthesis_demo">Masukan teks untuk di ucapkan:</string>
<string name="espeak_volume">Volume</string>
<string name="formatter_wpm">%s WPM</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Setel sebagai mesin utama</string>
<string name="espeak_pitch_range">Variasi Nada</string>
<string name="espeak_variant">Variasi Pengucapan</string>
<string name="espeak_speak_punctuation">Pengucapan tanda baca</string>
<string name="punctuation_all">Semua</string>
<string name="punctuation_custom">Sesuaikan</string>
<string name="punctuation_custom_fmt">Sesuaikan: %s</string>
<string name="punctuation_none">Tidak ada</string>
<string name="punctuation_characters">Karakter tanda baca</string>
<string name="category">Kategori</string>
<string name="variant">Variasi</string>
<string name="variant_male">Pria</string>
<string name="variant_female">Wanita</string>
<string name="variant_default">Default</string>
<string name="variant_n">Variasi %d</string>
<string name="variant_young">Muda</string>
<string name="variant_old">Tua</string>
<string name="variant_croak">Serak</string>
<string name="variant_whisper">Bisikan</string>
<string name="import_voice_title">Memuat kamus eSpeak</string>
<string name="import_voice_description">Memuat kamus ucapan eSpeak dari kartu SD.</string>
</resources>

+ 53
- 0
android/res/values-it/strings.xml View File

@@ -0,0 +1,53 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Impostazioni di sintesi vocale eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Tono</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Velocità sintesi vocale</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Installazione dati sintesi vocale...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak non è impostato come motore di sintesi vocale predefinito.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Installazione dei dati di sintesi vocale eSpeak non riuscita. Controlla la tua scheda SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Spiacente, avvio di eSpeak non riuscito.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Voce predefinita</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Voci installate</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Impostazioni generali di sintesi vocale</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Impostazioni di sintesi vocale eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Caricamento, attendere...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Questo è un esempio di testo parlato in %s</string>
<string name="status">stato</string>
<string name="tts_version">Versione Espeak</string>
<string name="speak">Parla</string>
<string name="ssml">Carica modello SSML</string>
<string name="synthesis_demo">Inserisci il testo da pronunciare</string>
<string name="espeak_volume">Volume</string>
<string name="formatter_wpm">%s WPM</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Imposta a predefinito</string>
<string name="espeak_pitch_range">Variazione tono</string>
<string name="espeak_variant">Variante voce</string>
</resources>

+ 42
- 0
android/res/values-iw/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">הגדרות eSpeak TTS</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">ברירת מחדל לגובה צליל</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">מכפיל קצב דיבור</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">מתקין נתוני קול...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak אינו מוגדר כמנוע ברירת המחדל שלך לתכונת טקסט לדיבור. האם אתה רוצה להגדיר אותו כעת?</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">התקנת נתוני הקול של eSpeak נכשלה. בדוק את כרטיס ה-SD שלך.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">מצטערים. הפעלת eSpeak נכשלה. האם אתה רוצה לשלוח דוח שגיאה?</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">ברירת מחדל לקול</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">קולות שהותקנו</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">הגדרות TTS כלליות</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">הגדרות eSpeak TTS</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">טוען. המתן...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">זוהי דוגמה לקריאת טקסט ב-%s</string>
</resources>

+ 42
- 0
android/res/values-ja/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeakテキスト読み上げ設定</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">デフォルトの声の高さ</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">音声速度</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">音声データをインストールしています...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeakはデフォルトのテキスト読み上げエンジンに設定されていません。</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeakで音声データをインストールできませんでした。SDカードを確認してください。</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">eSpeakを起動できませんでした。</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">デフォルトの音声</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">インストールされている音声</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">テキスト読み上げの全般設定</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeakテキスト読み上げ設定</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">読み込んでいます。お待ちください...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">%sで話すテキストサンプルです。</string>
</resources>

+ 42
- 0
android/res/values-ko/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak TTS 설정</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">기본 피치</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">음성 배속 비율</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">음성 데이터 설치 중...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak가 기본 TTS 엔진으로 설정되지 않았습니다.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak에서 음성 데이터를 설치하지 못했습니다. SD 카드를 확인하세요.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">죄송합니다, eSpeak를 시작할 수 없습니다.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">기본 음성</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">음성 설치됨</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">일반 TTS 설정</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak TTS 설정</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">로드 중... 잠시 기다려 주세요.</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">%s로 읽은 텍스트 샘플입니다.</string>
</resources>

+ 42
- 0
android/res/values-lt/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">„eSpeak“ TĮK nustatymai</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Numatytasis garso aukštis</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Kalbos rodiklio koeficientas</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Diegiami balso duomenys...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">„eSpeak“ nenustatytas kaip numatytasis teksto į kalbą variklis.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">„eSpeak“ nepavyko įdiegti balso duomenų. Patikrinkite SD kortelę.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Apgailestaujame, bet nepavyko paleisti „eSpeak“.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Numatytasis balsas</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Įdiegta balsų</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Bendrieji TĮK nustatymai</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">„eSpeak“ TĮK nustatymai</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Įkeliama, palaukite...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Tai teksto, sakomo %s, pavyzdys</string>
</resources>

+ 42
- 0
android/res/values-lv/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak teksta pārveidošanas runā iestatījumi</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Balss noklusējuma augstums</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Runas ātruma reizinātājs</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Notiek balss datu instalēšana...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">Programma eSpeak nav iestatīta kā noklusējuma programma teksta pārveidošanai runā.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Programmā eSpeak neizdevās instalēt balss datus. Lūdzu, pārbaudiet SD karti.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Diemžēl programmu eSpeak neizdevās palaist.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Noklusējuma balss</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Instalētie balss dati</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Vispārīgie teksta pārveidošanas runā iestatījumi</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak teksta pārveidošanas runā iestatījumi</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Notiek ielāde. Lūdzu, uzgaidiet...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Šis ir izrunāta teksta paraugs šādā valodā: %s.</string>
</resources>

+ 42
- 0
android/res/values-ms/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Tetapan TTS eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Nada lalai</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Pengganda kadar ucapan</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Memasang data suara...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak tidak ditetapkan sebagai enjin teks-ke-pertuturan lalai anda.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak gagal memasang data suara. Sila periksa kad SD anda.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Maaf, eSpeak gagal untuk bermula.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Suara lalai</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Suara dipasang</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Tetapan TTS umum</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Tetapan TTS eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Memuatkan, sila tunggu...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Ini adalah sampel teks yang dilafazkan dalam %s</string>
</resources>

+ 42
- 0
android/res/values-nb/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Innstillinger for eSpeak tekst-til-tale</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Standard tonehøyde</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Multiplikator for talehastighet</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Installerer taledata …</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak er ikke angitt som standardmotor for tekst-til-tale.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak mislyktes i å installere taledata. Kontroller SD-kortet ditt.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">eSpeak startet ikke.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Standardstemme</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Installerte stemmer</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Generelle tekst-til-tale-innstillinger</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Innstillinger for eSpeak tekst-til-tale</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Laster inn – vent litt …</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Dette er et teksteksempel lest opp på %s</string>
</resources>

+ 42
- 0
android/res/values-nl/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak-instellingen voor tekst-naar-spraak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Standaard toonhoogte</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Multiplier voor spreeksnelheid</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Spraakgegevens installeren...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak is niet ingesteld als uw standaardengine voor tekst-naar-spraak.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak heeft geen stemgegevens geïnstalleerd. Controleer uw SD-kaart.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">eSpeak kan niet worden gestart.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Standaardstem</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Geïnstalleerde stemmen</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Algemene instellingen voor tekst-naar-spraak</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak-instellingen voor tekst-naar-spraak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Laden, even geduld...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Dit is een voorbeeld van tekst die is uitgesproken in het %s</string>
</resources>

+ 42
- 0
android/res/values-pl/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Ustawienia zamiany tekstu na mowę eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Domyślny ton</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Mnożnik szybkości mowy</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Instalowanie danych głosowych...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak nie jest ustawiony jako domyślny mechanizm odczytywania tekstu.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Zainstalowanie danych głosowych przez eSpeak nie powiodło się. Sprawdź kartę SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Przepraszamy, uruchomienie eSpeak nie powiodło się.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Domyślny głos</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Zainstalowane głosy</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Ogólne ustawienia odczytywania tekstu</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Ustawienia eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Wczytywanie. Czekaj...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">To jest przykład tekstu mówionego przy ustawieniu %s</string>
</resources>

+ 53
- 0
android/res/values-pt-rBR/strings.xml View File

@@ -0,0 +1,53 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Ajustes de TTS do eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Tom</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Velocidade</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Instalando dados de voz…</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">O eSpeak não está configurado como o mecanismo padrão de texto para fala.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">O eSpeak fracassou ao instalar os dados de voz. Por favor verifique o cartão SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Desculpe, o eSpeak fracassou em iniciar.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Voz padrão</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Vozes instaladas</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Ajustes gerais de TTS</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Ajustes de TTS do eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Carregando, por favor aguarde…</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Esta é uma amostra de texto falado em %s</string>
<string name="status">Status</string>
<string name="tts_version">Versão de eSpeak</string>
<string name="speak">Speak</string>
<string name="ssml">Carregar modelo SSML</string>
<string name="synthesis_demo">Insira texto a falar:</string>
<string name="espeak_volume">Volume</string>
<string name="formatter_wpm">%s WPM</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Restaurar padrão</string>
<string name="espeak_pitch_range">Variação de tom</string>
<string name="espeak_variant">Variante de voz</string>
</resources>

+ 42
- 0
android/res/values-pt/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Definições do eSpeak TTS</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Tom predefinido</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Multiplicador da taxa de voz</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">A instalar dados de voz...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">O eSpeak não está definido como o motor de síntese de voz predefinido.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Ocorreu uma falha ao instalar os dados de voz do eSpeak. Verifique o cartão SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Ocorreu uma falha ao iniciar o eSpeak.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Voz predefinida</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Vozes instaladas</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Definições gerais do TTS</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Definições do eSpeak TTS</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">A carregar; aguarde...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Este é um exemplo de texto falado em %s</string>
</resources>

+ 42
- 0
android/res/values-ro/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Setări TTS eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Înălţime prestabilită</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Multiplicator al ritmului vorbirii</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Se instalează datele vocale...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak nu este setat ca motor prestabilit de transformare a textului în vorbire.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak nu a putut instala datele vocale. Verificaţi cardul SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Ne pare rău, dar pornirea eSpeak a eşuat.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Voce prestabilită</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Voci instalate</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Setări TTS generale</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Setări TTS eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Se încarcă, aşteptaţi...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Aceasta este o mostră de text vorbit în %s</string>
</resources>

+ 71
- 0
android/res/values-ru/strings.xml View File

@@ -0,0 +1,71 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Настройки TTS eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Тон голоса</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Скорость речи</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Установка голосовых данных...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak не является основным синтезатором речи.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Не удалось загрузить голосовые данные. Проверьте SD-карту.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Не удалось запустить eSpeak.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Язык по умолчанию</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Разновидностей голоса</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Общие настройки</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Настройки eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Загрузка, пожалуйста ожидайте...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Так синтезатор речи озвучивает %s текст</string>
<string name="status">Статус</string>
<string name="tts_version">Версия eSpeak</string>
<string name="speak">Озвучить</string>
<string name="ssml">Загрузить SSML-шаблон </string>
<string name="synthesis_demo">Введите текст для чтения:</string>
<string name="espeak_volume">Громкость</string>
<string name="formatter_wpm">%s СВМ</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Сброс</string>
<string name="espeak_pitch_range">Подстройка тона</string>
<string name="espeak_variant">Вариант голоса</string>
<string name="espeak_speak_punctuation">Читать пунктуацию</string>
<string name="punctuation_all">Всю</string>
<string name="punctuation_custom">Пользовательскую</string>
<string name="punctuation_custom_fmt">Пользовательскую: %s</string>
<string name="punctuation_none">Никакую</string>
<string name="punctuation_characters">Символы пунктуации</string>
<string name="category">Категория</string>
<string name="variant">Вариант</string>
<string name="variant_male">Мужской</string>
<string name="variant_female">Женский</string>
<string name="variant_default">По умолчанию</string>
<string name="variant_n">Вариант %d</string>
<string name="variant_young">Юный</string>
<string name="variant_old">Пожилой</string>
<string name="variant_croak">Хриплый</string>
<string name="variant_whisper">Шёпот</string>
<string name="import_voice_title">Импорт словаря eSpeak </string>
<string name="import_voice_description">Импорт файла словаря eSpeak с sd-карты </string>
</resources>

+ 71
- 0
android/res/values-sk/strings.xml View File

@@ -0,0 +1,71 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Nastavenia eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Výška</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Tempo reči</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Prebieha inštalácia hlasových údajov...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">Aplikácia eSpeak nie je nastavená ako predvolený nástroj prevodu textu na reč.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Aplikácii eSpeak sa nepodarilo nainštalovať hlasové údaje. Skontrolujte kartu SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Je nám ľúto, aplikáciu eSpeak sa nepodarilo spustiť.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Predvolený hlas</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Počet nainštalovaných hlasov</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Všeobecné nastavenia prevodu textu na reč</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Nastavenia eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Prebieha načítavanie, čakajte prosím...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Toto je ukážkový text nahovorený v jazyku %s</string>
<string name="status">Stav</string>
<string name="tts_version">Verzia eSpeak</string>
<string name="speak">Hovoriť</string>
<string name="ssml">Načítať šablónu SSML</string>
<string name="synthesis_demo">Text na prečítanie:</string>
<string name="espeak_volume">Hlasitosť</string>
<string name="formatter_wpm">%s WPM</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Nastaviť predvolené</string>
<string name="espeak_pitch_range">Intonácia</string>
<string name="espeak_variant">Variant hlasu</string>
<string name="espeak_speak_punctuation">Čítať interpunkčné znaky</string>
<string name="punctuation_all">Všetky</string>
<string name="punctuation_custom">Vlastné</string>
<string name="punctuation_custom_fmt">Vlastné: %s</string>
<string name="punctuation_none">Žiadne</string>
<string name="punctuation_characters">Interpunkčné znaky</string>
<string name="category">Kategória</string>
<string name="variant">Variant</string>
<string name="variant_male">Muž</string>
<string name="variant_female">Žena</string>
<string name="variant_default">Predvolený</string>
<string name="variant_n">Variant %d</string>
<string name="variant_young">Mladistvý</string>
<string name="variant_old">Starší</string>
<string name="variant_croak">Hundranie</string>
<string name="variant_whisper">Šepot</string>
<string name="import_voice_title">Import slovníka eSpeak</string>
<string name="import_voice_description">Import súbor slovníka eSpeak z pamäťovej karty.</string>
</resources>

+ 71
- 0
android/res/values-sl/strings.xml View File

@@ -0,0 +1,71 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Nastavitve eSpeak pretvorbe besedila v govor</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Privzeta višina tona</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Množitelj hitrosti govora</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Namestitev podatkov glasu …</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">Mehanizem eSpeak ni nastavljen kot privzeti za pretvorbo besedila v govor.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak ni uspel namestiti podatkov glasu. Preverite SD kartico.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Mehanizma eSpeak ni bilo mogoče zagnati.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Privzeti glas</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Št. nameščenih glasov</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Splošne nastavitve pretvorbe besedila v govor</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Nastavitve eSpeak pretvorbe besedila v govor</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Nalaganje, počakajte trenutek …</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">To je vzorec besedila, izgovorjen v %s</string>
<string name="status">Status</string>
<string name="tts_version">Različica eSpeak</string>
<string name="speak">Izgovori</string>
<string name="ssml">Naloži SSML predlogo</string>
<string name="synthesis_demo">Vnesite tekst za izgovorjavo</string>
<string name="espeak_volume">Glasnost</string>
<string name="formatter_wpm">%s BNM (WPM)</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Nastavi na privzeto</string>
<string name="espeak_pitch_range">Varianta višine glasu</string>
<string name="espeak_variant">Varianta glasu</string>
<string name="espeak_speak_punctuation">Izgovori ločila</string>
<string name="punctuation_all">Vse</string>
<string name="punctuation_custom">Po meri</string>
<string name="punctuation_custom_fmt">Po meri: %s</string>
<string name="punctuation_none">Noben</string>
<string name="punctuation_characters">Ločila</string>
<string name="category">Kategorija</string>
<string name="variant">Varianta</string>
<string name="variant_male">Moški</string>
<string name="variant_female">Ženski</string>
<string name="variant_default">Privzeto</string>
<string name="variant_n">Varianta %d</string>
<string name="variant_young">Mladenič</string>
<string name="variant_old">Starejši</string>
<string name="variant_croak">Hreščeče</string>
<string name="variant_whisper">Šepetaje</string>
<string name="import_voice_title">Uvozi eSpeak slovar</string>
<string name="import_voice_description">Uvozi eSpeak slovar glasov iz datoteke na SD kartici </string>
</resources>

+ 42
- 0
android/res/values-sr/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak TTS подешавања</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Подразумевани ниво</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Множилац брзине говора</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Инсталирање гласовних података...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak није подешен као подразумевани механизам за пребацивање текста у говор.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak није успео да инсталира податке о гласу. Проверите SD картицу.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Жао нам је, eSpeak није покренут.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Подразумевани глас</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Инсталирани су гласови</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Општа подешавања TTS-а</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak TTS подешавања</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Учитавање, сачекајте...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Ово је пример текста који је изговорен на језику %s</string>
</resources>

+ 42
- 0
android/res/values-sv/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">TTS-inställningar för eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Standardinställning för tonhöjd</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Multiplikator för talhastighet</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Installerar röstdata ...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">Du har inte angett eSpeak som din standardmotor för text-till-tal.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Det gick inte att installera röstsdata i eSpeak. Kontrollera SD-kortet.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Det gick tyvärr inte att starta eSpeak.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Standardröst</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Installerade röster</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Allmänna TTS-inställningar</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">TTS-inställningar för eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Läser in, vänta …</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Detta är ett textexempel som läses på %s</string>
</resources>

+ 42
- 0
android/res/values-sw/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Mipangilio ya eSpeak TTS</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Sauti chaguo-msingi</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Kizidisha kiwango cha usemi</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Inasakinisha data ya sauti...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak haijawekwa kama injini yako msingi ya maandishi-hadi-usemi.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak imeshindwa kusakinisha data ya sauti. Tafadhali kagua kadi yako ya SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Samahani, eSpeak imeshindwa kuanza.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Sauti chaguo-msingi</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Sauti zimesakinishwa</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Mipangilio ya kawaida ya TTS</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Mipangilio ya eSpeak TTS</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Inapakia, tafadhali subiri...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Hii ni sampuli ya maandishi yaliyonenwa katika %s</string>
</resources>

+ 42
- 0
android/res/values-th/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">การตั้งค่า TTS ของ eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">ระดับเสียงเริ่มต้น</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">ตัวคูณความเร็วการพูด</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">กำลังติดตั้งข้อมูลเสียง...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak ไม่ได้ถูกกำหนดให้เป็นเครื่องมืออ่านออกเสียงข้อความเริ่มต้นของคุณ คุณต้องการกำหนดเดี๋ยวนี้หรือไม่</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak ไม่สามารถติดตั้งข้อมูลเสียง โปรดตรวจสอบการ์ด SD ของคุณ</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">ขออภัย eSpeak ไม่สามารถเริ่มต้นทำงาน คุณต้องการส่งรายงานข้อผิดพลาดหรือไม่</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">เสียงเริ่มต้น</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">เสียงที่ติดตั้ง</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">การตั้งค่า TTS ทั่วไป</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">การตั้งค่า TTS ของ eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">กำลังโหลด โปรดรอสักครู่...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">นี่เป็นตัวอย่างของข้อความที่พูดใน %s</string>
</resources>

+ 42
- 0
android/res/values-tl/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Mga Setting sa TTS ng eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Default na pitch</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Multiplier ng rate ng pananalita</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Ini-install ang data ng boses…</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">Hindi nakatakda ang eSpeak bilang iyong default na text-to-speech engine.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">Nabigong mag-install ng data ng boses ang eSpeak. Pakisuri ang iyong SD card.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Paumanhin, nabigong magsimula ang eSpeak.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Default na boses</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Mga boses na na-install</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Pangkalahatang mga setting ng TTS</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Mga setting ng TTS ng eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Naglo-load, mangyaring maghintay...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Isa itong sample ng tekstong binibigkas sa %s</string>
</resources>

+ 71
- 0
android/res/values-tr/strings.xml View File

@@ -0,0 +1,71 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak TTS Ayarları</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Varsayılan ses kalınlığı</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Konuşma hızı çarpanı</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Ses verileri yükleniyor...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak varsayılan metin konuşma motorunuz olarak ayarlanmadı.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak ses verisini yükleyemedi. Lütfen SD kartınızı kontrol edin.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Maalesef, eSpeak başlatılamadı.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Varsayılan ses</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Yüklenen ses sayısı</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Genel TTS ayarları</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak TTS ayarları</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Yükleniyor, lütfen bekleyin...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Bu, %s dilinde seslendirilen örnek bir metindir</string>
<string name="status">Durum</string>
<string name="tts_version">eSpeak sürümü</string>
<string name="speak">Konuş</string>
<string name="ssml">SSML Şablonu yükle</string>
<string name="synthesis_demo">Konuşulacak metni girin:</string>
<string name="espeak_volume">Ses</string>
<string name="formatter_wpm">%s Kelime/dk</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Varsayılana ayarla</string>
<string name="espeak_pitch_range">Perde çeşitliliği</string>
<string name="espeak_variant">Ses biçimi</string>
<string name="espeak_speak_punctuation">Konuşma duraksaması</string>
<string name="punctuation_all">Hepsi</string>
<string name="punctuation_custom">Özel</string>
<string name="punctuation_custom_fmt">Özel: %s</string>
<string name="punctuation_none">Hiçbiri</string>
<string name="punctuation_characters">Noktalama işaretleri</string>
<string name="category">Kategori</string>
<string name="variant">Biçim</string>
<string name="variant_male">Erkek</string>
<string name="variant_female">Kadın</string>
<string name="variant_default">Varsayılan</string>
<string name="variant_n">Biçim %d</string>
<string name="variant_young">Genç</string>
<string name="variant_old">Yaşlı</string>
<string name="variant_croak">Boğuk</string>
<string name="variant_whisper">Fısıltı</string>
<string name="import_voice_title">eSpeak sözlüğü içe aktar</string>
<string name="import_voice_description">SD karttan bir eSpeak ses sözlüğü dosyası içe aktar</string>
</resources>

+ 42
- 0
android/res/values-uk/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Налаштування TTS eSpeak</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Висота звуку за умовчанням</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Коефіцієнт темпу мовлення</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Встановлення голосових даних...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak не встановлено як систему синтезу мовлення за умовчанням.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak не вдалося встановити голосові дані. Перевірте карту SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Не вдалося запустити eSpeak.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Мова за умовчанням</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Установлено голосів</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Загальні налаштування TTS</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Налаштування TTS eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Триває завантаження. Зачекайте...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Це зразок тексту такою мовою: %s</string>
</resources>

+ 5
- 0
android/res/values-v21/styles.xml View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">
</style>
</resources>

+ 53
- 0
android/res/values-vi/strings.xml View File

@@ -0,0 +1,53 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Thiết lập chương trình</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Độ cao thấp mặc định</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Bội số tốc độ đọc</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Đang cài đặt dữ liệu giọng nói…</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak chưa được thiết lập làm công cụ chuyển văn bản thành giọng nói mặc định của bạn.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak không thể cài đặt dữ liệu thoại. Vui lòng kiểm tra thẻ nhớ của bạn.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Rất tiếc, không thể khởi động eSpeak.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Giọng nói mặc định</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Số lượng thoại đã được cài đặt</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Thiết lập chung</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Thiết lập eSpeak</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Đang tải, vui lòng đợi…</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Đây là mẫu văn bản được đọc bằng %s</string>
<string name="status">Trạng thái</string>
<string name="tts_version">phiên bản eSpeak</string>
<string name="speak">Nói</string>
<string name="ssml">Tải mẫu SSML</string>
<string name="synthesis_demo">Điền vào văn bản để nói:</string>
<string name="espeak_volume">Âm lượng</string>
<string name="formatter_wpm">%s từ mỗi phút</string>
<string name="formatter_percentage">%s%%</string>
<string name="resetToDefault">Thiết lập về mặc định</string>
<string name="espeak_pitch_range">Độ biến động cao thấp</string>
<string name="espeak_variant">Độ biến động giọng cao thấp</string>
</resources>

+ 42
- 0
android/res/values-zh-rCN/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak 文字转语音 (TTS) 设置</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">默认声调</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">语速倍数</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">正在安装语音数据...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">未将 eSpeak 设置为文字转语音的默认引擎。</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak 无法安装语音数据。请检查您的 SD 卡。</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">很抱歉,eSpeak 启动失败。</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">默认语音</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">已安装的语音库数量</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">文字转语音 (TTS) 常规设置</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak 文字转语音 (TTS) 设置</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">正在加载,请稍候...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">正在朗读的是%s的语音示例</string>
</resources>

+ 42
- 0
android/res/values-zh-rTW/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">eSpeak 文字轉語音設定</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">預設音調</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">語音速率調節係數</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">正在安裝語音資料...</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">eSpeak 尚未設為您的預設文字轉語音引擎。</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">eSpeak 無法安裝語音資料。請檢查您的 SD 卡。</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">很抱歉,無法啟動 eSpeak。</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">預設語音</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">已安裝的語音</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">文字轉語音一般設定</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">eSpeak 文字轉語音設定</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">載入中,請稍候...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">這是「%s」的語音測試範例</string>
</resources>

+ 42
- 0
android/res/values-zu/strings.xml View File

@@ -0,0 +1,42 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<!--Source: Activity title.
Description: Title for the Settings activity.-->
<string name="tts_settings_label">Izilungiselelo ze-eSpeak TTS</string>
<!--Source: Preference title.
Description: Title for the preference that controls default voice pitch.-->
<string name="setting_default_pitch">Izinga lezwi olithola likhona</string>
<!--Source: Preference title.
Description: Title for the preference that controls default speech rate.-->
<string name="setting_default_rate">Okuphindaphinda ukushesha kwenkulumo</string>
<!--Source: Dialog text.
Description: Status message shown when installing voice data.-->
<string name="installing_voice_data">Ifaka idatha yezwi</string>
<!--Source: Dialog message.
Description: Alert dialog prompting the user to set eSpeak as their default TTS engine.-->
<string name="set_default_message">I-eSpeak ayisethwanga njengenjini yombhalo-uya-enkulumweni oyithola ikhona.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that voice data installation failed.-->
<string name="voice_data_failed_message">I-eSpeak yehlulekile ukulayisha idatha yezwi. Uyacelwa ukuthi ubheke ikhadi lakho le-SD.</string>
<!--Source: Dialog message.
Description: Alert dialog telling the user that an unknown error has occurred.-->
<string name="error_message">Uxolo, i-eSpeak yehlulekile ukuqala.</string>
<!--Source: Label text.
Description: Label informing the user of the current text-to-speech language.-->
<string name="current_tts_locale">Izwi olithola likhona</string>
<!--Source: Label text.
Description: Label informing the user of how many voices are installed.-->
<string name="available_voices">Amazwi afakiwe</string>
<!--Source: Button label.
Description: Button for launching general text-to-speech settings.-->
<string name="tts_settings">Izilungiselelo ze-TTS ezejwayelekile</string>
<!--Source: Button label.
Description: Button for launching eSpeak-specific settings.-->
<string name="engine_settings">Izilungiselelo ze-eSpeak TTS</string>
<!--Source: Label text.
Description: Label informing the user that eSpeak is loading resources.-->
<string name="loading">Iyalayisha, ucelwa ukuthi ulinde...</string>
<!--Source: Spoken aloud.
Description: Sample text spoken aloud when the user is trying out a language.-->
<string name="sample_text">Lena yisampula yombhalo okhulunywa kwi %s</string>
</resources>

+ 0
- 0
android/res/values/donottranslate.xml View File


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

Loading…
Cancel
Save