*~ | *~ | ||||
.*.swp | .*.swp | ||||
#Eclipse project files | |||||
# Eclipse project files: | |||||
.cproject | .cproject | ||||
.project | .project | ||||
*.o | *.o | ||||
*.lo | *.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 | # autotools | ||||
AUTHORS | AUTHORS |
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 |
[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 | |||||
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. |
clean-local: | clean-local: | ||||
cd src && rm -f *.o *~ && cd .. | cd src && rm -f *.o *~ && cd .. | ||||
cd android && $(GRADLE) clean | |||||
distclean-local: | distclean-local: | ||||
rm -rf espeak-ng-data/phondata-manifest | rm -rf espeak-ng-data/phondata-manifest | ||||
src/speak-ng.1.html \ | src/speak-ng.1.html \ | ||||
README.html | README.html | ||||
check: apk-check | |||||
##### build targets: | ##### build targets: | ||||
espeak_includedir = $(includedir)/espeak | espeak_includedir = $(includedir)/espeak | ||||
ESPEAK_DATA_PATH=$(PWD) src/espeak-ng --compile-phonemes && \ | ESPEAK_DATA_PATH=$(PWD) src/espeak-ng --compile-phonemes && \ | ||||
touch $@ | 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: | ||||
dictionaries: \ | dictionaries: \ |
<?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> |
<?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> |
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 |
<?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> |
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')) | |||||
} |
<?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> |
<?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> |
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 |
<?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> |
# 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 *; | |||||
#} |
# 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 |
<?xml version="1.0" encoding="utf-8"?> | |||||
<resources> | |||||
<string name="app_name">ESpeakTestsTest</string> | |||||
</resources> |
/* | |||||
* 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("[]")); | |||||
} | |||||
} |
/* | |||||
* 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); | |||||
} | |||||
} | |||||
} | |||||
} |
/* | |||||
* 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)); | |||||
} | |||||
} | |||||
} | |||||
} |
/* | |||||
* 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; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
/* | |||||
* 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; | |||||
} | |||||
} |
/* | |||||
* 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)); | |||||
} | |||||
}; | |||||
} | |||||
} |
/* | |||||
* 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 中文 (香港)"), | |||||
}; | |||||
} |
/* | |||||
* 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. | |||||
} | |||||
} | |||||
} |
/* | |||||
* 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")); | |||||
} | |||||
} |
<?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> |
<?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> |
<?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> |
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) |
APP_OPTIM := release | |||||
APP_PLATFORM := android-8 | |||||
APP_TOOLCHAIN_VERSION := 4.6.3 | |||||
APP_ABI := mips armeabi armeabi-v7a x86 |
/* | |||||
* 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_ */ |
/* | |||||
* 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 */ |
#!/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 |
# 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 |
#!/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 |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?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> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<resources> | |||||
<style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar"> | |||||
</style> | |||||
</resources> |
<?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> |
<?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> |
<?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> |
<?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> |