This port of eSpeak-ng to Javascript via emscripten allows client-side text-to-speech synthesis in any browser supporting Web workers and the Web Audio API.
- Version: 1.49.1
- Date: 2017-05-01
- License: the GNU General Public License, Version 3 (GPLv3)
- Size: 3.2 MB (including all the voices)
For an online demo, visit this page.
If you prefer a local demo, open the file demo.html
in your browser.
(Depending on your browser, you might need to serve it via a Web server.
A simple way consists in calling $ python -m SimpleHTTPServer 8000
and pointing your browser to http://localhost:8000/demo.html
)
-
Include
js/espeakng.js
in your HTML file:<script type="text/javascript" src="js/espeakng.js"></script>
-
Create a new
eSpeakNG
instance with the path of the worker (e.g.,js/espeakng.worker.js
) as the first argument. You can supply a callback function that will be called once the worker is ready:<script> var tts = new eSpeakNG('js/espeakng.worker.js', function(){ // now tts is initialized and // you can call tts.function(...) ... }); </script>
-
Functions exposed by the
eSpeakNG
object:list_voices(cb(voices))
: obtain the list of available voices, passing it (voices
) to the callback functioncb
set_rate(value)
: set the rate of the synthesized speech,value
must be an integer in[80..450]
, default175
set_pitch(value)
: set the pitch of the synthesized speech,value
must be an integer in[0..99]
, default50
set_voice.apply(espeakng, voice)
: set the voice for synthesizing speech,voice
must be the code string for the desired voice (e.g.,en
,en-us
,it
, etc.)synthesize(text, cb(samples, events))
: synthesize the given stringtext
and call the callback functioncb
when done, passing the generated audio samples (samples
) and events (events
)
See the file
demo.html
for details.
You can download pre-built JS/data files from the jsdelivr CDN. You need to get the following files:
# Latest version
https://cdn.jsdelivr.net/espeakng.js/latest/espeakng.min.js
https://cdn.jsdelivr.net/espeakng.js/latest/espeakng.worker.js
https://cdn.jsdelivr.net/espeakng.js/latest/espeakng.worker.data
# Specific version
https://cdn.jsdelivr.net/espeakng.js/1.49.0/espeakng.min.js
https://cdn.jsdelivr.net/espeakng.js/1.49.0/espeakng.worker.js
https://cdn.jsdelivr.net/espeakng.js/1.49.0/espeakng.worker.data
For details, see the espeakng.js-cdn repository.
-
Make sure you have
emscripten
installed and activated, and configured in your shell. -
Clone the repository, enter the
espeak-ng
directory, and initialize it:$ git clone https://github.com/espeak-ng/espeak-ng $ cd espeak-ng $ ./autogen.sh
-
Compile
espeak-ng
:$ ./configure --prefix=/usr --without-async --without-mbrola --without-sonic $ make
Instead, if you just want a subset of languages of your choice, run
make XX
for each of them, whereXX
is the language code. For example:$ # build English only $ make en $ $ # build English, Italian, and German $ make en && make it && make de
-
Enter the
src/ucd-tools
directory,make clean
it, and compile withemconfigure
andemmake
:$ cd src/ucd-tools $ ./autogen.sh $ make clean $ emconfigure ./configure $ emmake make $ cd ../..
-
Recompile the
espeak-ng
library withemconfigure
andemmake
:$ emconfigure ./configure --prefix=/usr --without-async --without-mbrola --without-sonic $ emmake make src/libespeak-ng.la
-
Enter the
emscripten
directory and compile the JS worker withemmake
:$ cd emscripten $ emmake make
-
The
js/
directory should contain the output JS files:espeakng.js
,espeakng.worker.js
, andespeakng.worker.data
.
- Even if you build only a subset of languages,
the
list_voices()
function will still list all the available voices. However, if you try using language that has not been built, you will get a runtime error. (TODO: fix this issue.) - The
-O3
optimization flag is passed toemscripten
by default, achieving a considerable reduction of the size of the generated JS worker. If you want to omit it, for example for debug purposes, just export theEM_DEBUG
environment variable with value1
(i.e.,$ export EM_DEBUG=1
) before step 3. - To remove intermediate files compiled by emscripten,
run
$ emmake clean-intermediate
. This command will keep the output JS files, if any. - To remove all the files compiled by emscripten,
including the output JS files,
run
$ emmake clean
.
Eitan Isaacson wrote the original glue code for compiling eSpeak to Javascript via emscripten.
Alberto Pettarin adapted Eitan's files to work with eSpeak-ng and wrote this README
file.