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.
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 function cbset_rate(value): set the rate of the synthesized speech, value must be an integer in [80..450], default 175set_pitch(value): set the pitch of the synthesized speech, value must be an integer in [0..99], default 50set_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 string text and call the callback function cb 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, where XX 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 with emconfigure and emmake:
$ cd src/ucd-tools
$ ./autogen.sh
$ make clean
$ emconfigure ./configure
$ emmake make
$ cd ../..
Recompile the espeak-ng library with emconfigure and emmake:
$ 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 with emmake:
$ cd emscripten
$ emmake make
The js/ directory should contain the output JS files:
espeakng.js,espeakng.worker.js, andespeakng.worker.data.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.)-O3 optimization flag is passed to emscripten 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 the EM_DEBUG environment variable with value 1
(i.e., $ export EM_DEBUG=1) before step 3.$ emmake clean-intermediate.
This command will keep the output JS files, if any.$ 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.