local.properties | local.properties | ||||
# android gradle output: | # android gradle output: | ||||
gradle/ | |||||
gradlew | |||||
.cxx | |||||
.gradle/ | .gradle/ | ||||
.idea/ | .idea/ | ||||
build/ | build/ | ||||
*.iml | *.iml | ||||
!gradlew.bat | |||||
# emscripten output: | # emscripten output: | ||||
a.out | a.out |
##### android targets: | ##### android targets: | ||||
jni: | |||||
cd android && ndk-build | |||||
apk-release: jni espeakdata | |||||
apk-release: espeakdata | |||||
cd android && $(GRADLE) assembleRelease | cd android && $(GRADLE) assembleRelease | ||||
apk-debug: jni espeakdata | |||||
apk-debug: espeakdata | |||||
cd android && $(GRADLE) assembleDebug | cd android && $(GRADLE) assembleDebug | ||||
apk-check: jni espeakdata | |||||
apk-check: espeakdata | |||||
cd android && $(GRADLE) connectedCheck | cd android && $(GRADLE) connectedCheck | ||||
android/res/raw/espeakdata.zip: espeak-ng-data/phontab dictionaries | |||||
mkdir -pv android/res/raw | |||||
rm -f $@ | |||||
find espeak-ng-data/{intonations,phondata,phonindex,phontab} | zip -@ $@ | |||||
find espeak-ng-data/*_dict | zip -@ $@ | |||||
find espeak-ng-data/lang -type f | zip -@ $@ | |||||
find espeak-ng-data/voices -type f | grep -vF "/mb/" | zip -@ $@ | |||||
android/res/raw/espeakdata_version: android/res/raw/espeakdata.zip | |||||
sha1sum $< | awk '{ print $$1 }' > $@ | |||||
espeakdata: \ | |||||
android/res/raw/espeakdata.zip \ | |||||
android/res/raw/espeakdata_version | |||||
espeakdata: espeak-ng-data/phontab 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 |
buildscript { | buildscript { | ||||
repositories { | repositories { | ||||
mavenCentral() | |||||
jcenter() | |||||
google() | google() | ||||
mavenCentral() | |||||
} | } | ||||
dependencies { | dependencies { | ||||
classpath 'com.android.tools.build:gradle:3.6.0' | |||||
classpath 'com.android.tools.build:gradle:7.1.2' | |||||
} | } | ||||
} | } | ||||
plugins { | |||||
id 'org.gradle.crypto.checksum' version '1.4.0' | |||||
} | |||||
import org.gradle.crypto.checksum.Checksum | |||||
apply plugin: 'com.android.application' | apply plugin: 'com.android.application' | ||||
repositories { | repositories { | ||||
mavenCentral() | |||||
jcenter() | |||||
google() | google() | ||||
mavenCentral() | |||||
} | } | ||||
dependencies { | dependencies { | ||||
testImplementation 'junit:junit:4.12' | testImplementation 'junit:junit:4.12' | ||||
androidTestImplementation 'org.hamcrest:hamcrest-all:1.3' | androidTestImplementation 'org.hamcrest:hamcrest-all:1.3' | ||||
} | } | ||||
tasks.register('checkData') { | |||||
doFirst { | |||||
assert file("../espeak-ng-data/en_dict").exists() | |||||
assert file("../espeak-ng-data/intonations").exists() | |||||
assert file("../espeak-ng-data/phondata").exists() | |||||
assert file("../espeak-ng-data/phondata-manifest").exists() | |||||
assert file("../espeak-ng-data/phonindex").exists() | |||||
assert file("../espeak-ng-data/phontab").exists() | |||||
} | |||||
} | |||||
tasks.register('createDataArchive', Zip) { | |||||
dependsOn tasks.checkData | |||||
preserveFileTimestamps = false | |||||
reproducibleFileOrder = true | |||||
archiveFileName = "espeakdata.zip" | |||||
destinationDirectory = file("res/raw") | |||||
from("../espeak-ng-data/") { | |||||
into "espeak-ng-data" | |||||
} | |||||
} | |||||
tasks.register('createDataHash', Checksum) { | |||||
dependsOn tasks.createDataArchive | |||||
checksumAlgorithm.set(Checksum.Algorithm.SHA256) | |||||
inputFiles.setFrom(file("./res/raw/espeakdata.zip")) | |||||
outputDirectory.set(layout.buildDirectory.dir('intermediates/datahash')) | |||||
} | |||||
tasks.register('createDataVersion', Copy) { | |||||
dependsOn tasks.createDataHash | |||||
from layout.buildDirectory.file('intermediates/datahash/espeakdata.zip.sha256') | |||||
rename { return 'espeakdata_version' } | |||||
into file("./res/raw") | |||||
} | |||||
preBuild.dependsOn createDataVersion | |||||
android { | android { | ||||
buildToolsVersion '28.0.3' | |||||
compileSdkVersion 26 | compileSdkVersion 26 | ||||
defaultConfig { | defaultConfig { | ||||
versionName "1.52-dev" | versionName "1.52-dev" | ||||
} | } | ||||
externalNativeBuild { | |||||
ndkBuild { | |||||
path "jni/Android.mk" | |||||
} | |||||
} | |||||
sourceSets { | sourceSets { | ||||
main { | main { | ||||
manifest.srcFile 'AndroidManifest.xml' | manifest.srcFile 'AndroidManifest.xml' | ||||
java.srcDirs = ['src'] | java.srcDirs = ['src'] | ||||
res.srcDirs = ['res'] | res.srcDirs = ['res'] | ||||
jniLibs.srcDir 'libs' | |||||
} | } | ||||
androidTest.setRoot('eSpeakTests') | androidTest.setRoot('eSpeakTests') | ||||
androidTest { | androidTest { |
distributionBase=GRADLE_USER_HOME | |||||
distributionPath=wrapper/dists | |||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip | |||||
zipStoreBase=GRADLE_USER_HOME | |||||
zipStorePath=wrapper/dists |
#!/bin/sh | |||||
# | |||||
# Copyright © 2015-2021 the original authors. | |||||
# | |||||
# 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 | |||||
# | |||||
# https://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. | |||||
# | |||||
############################################################################## | |||||
# | |||||
# Gradle start up script for POSIX generated by Gradle. | |||||
# | |||||
# Important for running: | |||||
# | |||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is | |||||
# noncompliant, but you have some other compliant shell such as ksh or | |||||
# bash, then to run this script, type that shell name before the whole | |||||
# command line, like: | |||||
# | |||||
# ksh Gradle | |||||
# | |||||
# Busybox and similar reduced shells will NOT work, because this script | |||||
# requires all of these POSIX shell features: | |||||
# * functions; | |||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», | |||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»; | |||||
# * compound commands having a testable exit status, especially «case»; | |||||
# * various built-in commands including «command», «set», and «ulimit». | |||||
# | |||||
# Important for patching: | |||||
# | |||||
# (2) This script targets any POSIX shell, so it avoids extensions provided | |||||
# by Bash, Ksh, etc; in particular arrays are avoided. | |||||
# | |||||
# The "traditional" practice of packing multiple parameters into a | |||||
# space-separated string is a well documented source of bugs and security | |||||
# problems, so this is (mostly) avoided, by progressively accumulating | |||||
# options in "$@", and eventually passing that to Java. | |||||
# | |||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, | |||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; | |||||
# see the in-line comments for details. | |||||
# | |||||
# There are tweaks for specific operating systems such as AIX, CygWin, | |||||
# Darwin, MinGW, and NonStop. | |||||
# | |||||
# (3) This script is generated from the Groovy template | |||||
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | |||||
# within the Gradle project. | |||||
# | |||||
# You can find Gradle at https://github.com/gradle/gradle/. | |||||
# | |||||
############################################################################## | |||||
# Attempt to set APP_HOME | |||||
# Resolve links: $0 may be a link | |||||
app_path=$0 | |||||
# Need this for daisy-chained symlinks. | |||||
while | |||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path | |||||
[ -h "$app_path" ] | |||||
do | |||||
ls=$( ls -ld "$app_path" ) | |||||
link=${ls#*' -> '} | |||||
case $link in #( | |||||
/*) app_path=$link ;; #( | |||||
*) app_path=$APP_HOME$link ;; | |||||
esac | |||||
done | |||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit | |||||
APP_NAME="Gradle" | |||||
APP_BASE_NAME=${0##*/} | |||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | |||||
# Use the maximum available, or set MAX_FD != -1 to use that value. | |||||
MAX_FD=maximum | |||||
warn () { | |||||
echo "$*" | |||||
} >&2 | |||||
die () { | |||||
echo | |||||
echo "$*" | |||||
echo | |||||
exit 1 | |||||
} >&2 | |||||
# OS specific support (must be 'true' or 'false'). | |||||
cygwin=false | |||||
msys=false | |||||
darwin=false | |||||
nonstop=false | |||||
case "$( uname )" in #( | |||||
CYGWIN* ) cygwin=true ;; #( | |||||
Darwin* ) darwin=true ;; #( | |||||
MSYS* | MINGW* ) msys=true ;; #( | |||||
NONSTOP* ) nonstop=true ;; | |||||
esac | |||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | |||||
# Determine the Java command to use to start the JVM. | |||||
if [ -n "$JAVA_HOME" ] ; then | |||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | |||||
# IBM's JDK on AIX uses strange locations for the executables | |||||
JAVACMD=$JAVA_HOME/jre/sh/java | |||||
else | |||||
JAVACMD=$JAVA_HOME/bin/java | |||||
fi | |||||
if [ ! -x "$JAVACMD" ] ; then | |||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | |||||
Please set the JAVA_HOME variable in your environment to match the | |||||
location of your Java installation." | |||||
fi | |||||
else | |||||
JAVACMD=java | |||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | |||||
Please set the JAVA_HOME variable in your environment to match the | |||||
location of your Java installation." | |||||
fi | |||||
# Increase the maximum file descriptors if we can. | |||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then | |||||
case $MAX_FD in #( | |||||
max*) | |||||
MAX_FD=$( ulimit -H -n ) || | |||||
warn "Could not query maximum file descriptor limit" | |||||
esac | |||||
case $MAX_FD in #( | |||||
'' | soft) :;; #( | |||||
*) | |||||
ulimit -n "$MAX_FD" || | |||||
warn "Could not set maximum file descriptor limit to $MAX_FD" | |||||
esac | |||||
fi | |||||
# Collect all arguments for the java command, stacking in reverse order: | |||||
# * args from the command line | |||||
# * the main class name | |||||
# * -classpath | |||||
# * -D...appname settings | |||||
# * --module-path (only if needed) | |||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. | |||||
# For Cygwin or MSYS, switch paths to Windows format before running java | |||||
if "$cygwin" || "$msys" ; then | |||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) | |||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) | |||||
JAVACMD=$( cygpath --unix "$JAVACMD" ) | |||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh | |||||
for arg do | |||||
if | |||||
case $arg in #( | |||||
-*) false ;; # don't mess with options #( | |||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath | |||||
[ -e "$t" ] ;; #( | |||||
*) false ;; | |||||
esac | |||||
then | |||||
arg=$( cygpath --path --ignore --mixed "$arg" ) | |||||
fi | |||||
# Roll the args list around exactly as many times as the number of | |||||
# args, so each arg winds up back in the position where it started, but | |||||
# possibly modified. | |||||
# | |||||
# NB: a `for` loop captures its iteration list before it begins, so | |||||
# changing the positional parameters here affects neither the number of | |||||
# iterations, nor the values presented in `arg`. | |||||
shift # remove old arg | |||||
set -- "$@" "$arg" # push replacement arg | |||||
done | |||||
fi | |||||
# Collect all arguments for the java command; | |||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of | |||||
# shell script including quotes and variable substitutions, so put them in | |||||
# double quotes to make sure that they get re-expanded; and | |||||
# * put everything else in single quotes, so that it's not re-expanded. | |||||
set -- \ | |||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \ | |||||
-classpath "$CLASSPATH" \ | |||||
org.gradle.wrapper.GradleWrapperMain \ | |||||
"$@" | |||||
# Use "xargs" to parse quoted args. | |||||
# | |||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed. | |||||
# | |||||
# In Bash we could simply go: | |||||
# | |||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) && | |||||
# set -- "${ARGS[@]}" "$@" | |||||
# | |||||
# but POSIX shell has neither arrays nor command substitution, so instead we | |||||
# post-process each arg (as a line of input to sed) to backslash-escape any | |||||
# character that might be a shell metacharacter, then use eval to reverse | |||||
# that process (while maintaining the separation between arguments), and wrap | |||||
# the whole thing up as a single "set" statement. | |||||
# | |||||
# This will of course break if any of these variables contains a newline or | |||||
# an unmatched quote. | |||||
# | |||||
eval "set -- $( | |||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | | |||||
xargs -n1 | | |||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | | |||||
tr '\n' ' ' | |||||
)" '"$@"' | |||||
exec "$JAVACMD" "$@" |
@rem | |||||
@rem Copyright 2015 the original author or authors. | |||||
@rem | |||||
@rem Licensed under the Apache License, Version 2.0 (the "License"); | |||||
@rem you may not use this file except in compliance with the License. | |||||
@rem You may obtain a copy of the License at | |||||
@rem | |||||
@rem https://www.apache.org/licenses/LICENSE-2.0 | |||||
@rem | |||||
@rem Unless required by applicable law or agreed to in writing, software | |||||
@rem distributed under the License is distributed on an "AS IS" BASIS, | |||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
@rem See the License for the specific language governing permissions and | |||||
@rem limitations under the License. | |||||
@rem | |||||
@if "%DEBUG%" == "" @echo off | |||||
@rem ########################################################################## | |||||
@rem | |||||
@rem Gradle startup script for Windows | |||||
@rem | |||||
@rem ########################################################################## | |||||
@rem Set local scope for the variables with windows NT shell | |||||
if "%OS%"=="Windows_NT" setlocal | |||||
set DIRNAME=%~dp0 | |||||
if "%DIRNAME%" == "" set DIRNAME=. | |||||
set APP_BASE_NAME=%~n0 | |||||
set APP_HOME=%DIRNAME% | |||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter. | |||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi | |||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | |||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | |||||
@rem Find java.exe | |||||
if defined JAVA_HOME goto findJavaFromJavaHome | |||||
set JAVA_EXE=java.exe | |||||
%JAVA_EXE% -version >NUL 2>&1 | |||||
if "%ERRORLEVEL%" == "0" goto execute | |||||
echo. | |||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | |||||
echo. | |||||
echo Please set the JAVA_HOME variable in your environment to match the | |||||
echo location of your Java installation. | |||||
goto fail | |||||
:findJavaFromJavaHome | |||||
set JAVA_HOME=%JAVA_HOME:"=% | |||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe | |||||
if exist "%JAVA_EXE%" goto execute | |||||
echo. | |||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | |||||
echo. | |||||
echo Please set the JAVA_HOME variable in your environment to match the | |||||
echo location of your Java installation. | |||||
goto fail | |||||
:execute | |||||
@rem Setup the command line | |||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | |||||
@rem Execute Gradle | |||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* | |||||
:end | |||||
@rem End local scope for the variables with windows NT shell | |||||
if "%ERRORLEVEL%"=="0" goto mainEnd | |||||
:fail | |||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | |||||
rem the _cmd.exe /c_ return code! | |||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | |||||
exit /b 1 | |||||
:mainEnd | |||||
if "%OS%"=="Windows_NT" endlocal | |||||
:omega |
APP_OPTIM := release | APP_OPTIM := release | ||||
APP_PLATFORM := android-26 | |||||
APP_TOOLCHAIN_VERSION := 4.6.3 | |||||
APP_ABI := armeabi-v7a x86 |
# 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 |
AC_PROG_LIBTOOL | AC_PROG_LIBTOOL | ||||
AC_PROG_LN_S | AC_PROG_LN_S | ||||
AC_CHECK_PROG(NDKBUILD_CHECK,[ndk-build],yes) | |||||
dnl ================================================================ | dnl ================================================================ | ||||
dnl gradle checks. | dnl gradle checks. | ||||
dnl ================================================================ | dnl ================================================================ | ||||
PCAudioLib: ${have_pcaudiolib} | PCAudioLib: ${have_pcaudiolib} | ||||
gradle (Android): ${GRADLE} | gradle (Android): ${GRADLE} | ||||
ndk-build (Android): ${NDKBUILD_CHECK} | |||||
Klatt: ${have_klatt} | Klatt: ${have_klatt} | ||||
speechPlayer: ${have_speechplayer} | speechPlayer: ${have_speechplayer} |
1. the [Android Studio](https://developer.android.com/studio/) with API 26 support; | 1. the [Android Studio](https://developer.android.com/studio/) with API 26 support; | ||||
2. the [Android NDK](http://developer.android.com/tools/sdk/ndk/index.html); | 2. the [Android NDK](http://developer.android.com/tools/sdk/ndk/index.html); | ||||
3. Gradle 5.6.4 | |||||
3. Gradle 7.4+ | |||||
4. JDK 11 | |||||
### Building with Gradle | ### Building with Gradle | ||||
$ export ANDROID_HOME=<path-to-the-android-sdk> | $ export ANDROID_HOME=<path-to-the-android-sdk> | ||||
(where `<path-to-the-android-sdk>` is your actual path of SDK folder e.g. `/home/user/Android/Sdk`) | (where `<path-to-the-android-sdk>` is your actual path of SDK folder e.g. `/home/user/Android/Sdk`) | ||||
2. Add location of NDK to the PATH variable: | |||||
$ export PATH=$PATH:<path-to-the-android-ndk> | |||||
(where `<path-to-the-android-ndk>` is your actual path of NDK folder, e.g. `/home/user/Android/Ndk`) | |||||
3. Configure the project: | |||||
2. Configure the project: | |||||
$ ./autogen.sh | $ ./autogen.sh | ||||
$ ./configure --with-gradle=<path-to-gradle> | $ ./configure --with-gradle=<path-to-gradle> | ||||
... | ... | ||||
gradle (Android): gradle | gradle (Android): gradle | ||||
ndk-build (Android): yes | |||||
... | ... | ||||
`<path-to-gradle>` may be just `gradle` if it is found in your path by simple name. | `<path-to-gradle>` may be just `gradle` if it is found in your path by simple name. | ||||
4. Build the project: | |||||
3. Build the project: | |||||
$ make apk-release | $ make apk-release | ||||
To enable eSpeak, you need to: | To enable eSpeak, you need to: | ||||
1. go into the Android `Text-to-Speech settings` UI; | 1. go into the Android `Text-to-Speech settings` UI; | ||||
2. enable `eSpeak TTS` in the `Engines` section; | |||||
3. select `eSpeak TTS` as the default engine; | |||||
4. use the `Listen to an example` option to check if everything is working. | |||||
2. select `eSpeak TTS` as the default engine; | |||||
3. use the `Listen to an example` option to check if everything is working. | |||||