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., espeakng.worker.js
) as the first argument.
You can supply a callback function that will be called once the worker is ready:
<script>
var espeakng = new eSpeakNG('js/espeakng.worker.js', function(){
// now you can use espeakng
...
});
</script>
Functions exposed by the eSpeakNG
object:
list_voices(cb(voices))
: obtain the list of available voices, passing it (voices
) to the callback function cb
set_rate(value)
: set the rate of the synthesized speech, value
must be an integer in [80..450]
, default 175
set_pitch(value)
: set the pitch of the synthesized speech, value
must be an integer in [0..99]
, default 50
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 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 files from the Releases page.
TODO: add the compiled JS files to a public free CDN, and list the URL here.
Make sure you have emscripten
installed and activated.
Clone the repo and enter the espeak-ng
directory:
$ git clone https://github.com/espeak-ng/espeak-ng
$ cd espeak-ng
Compile espeak-ng
:
$ ./autogen.sh
$ ./configure --prefix=/usr --without-async --without-mbrola --without-sonic
$ make
Recompile espeak-ng
with emconfigure
and emmake
:
$ emconfigure ./configure --prefix=/usr --without-async --without-mbrola --without-sonic
$ emmake make
Note: the emmake make
command currently exits
with the error recipe for target 'phsource/phonemes.stamp' failed
,
but you can safely ignore it.
(TODO: fix this issue.)
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
.$ make en
instead of $ make
at step 3.
You can also build a subset of all the available voices,
by running (say) $ make en && make it && make fr && make es
.
Note that list_voices()
will still list all available voices,
but if you try using one that has not been compiled,
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 EM_DEBUG=1
before calling emmake make
in step 5.$ emmake clean-intermediate
.$ 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.