build/ | build/ | ||||
espeak.iml | espeak.iml | ||||
# emscripten output: | |||||
a.out | |||||
a.out.js | |||||
# autotools | # autotools | ||||
AUTHORS | AUTHORS |
# | # | ||||
# Copyright (C) 2014-2016 Eitan Isaacson | |||||
# Copyright (C) 2016 Alberto Pettarin | |||||
# Copyright (C) 2014-2017 Eitan Isaacson | |||||
# Copyright (C) 2016-2017 Alberto Pettarin | |||||
# | # | ||||
# This program is free software; you can redistribute it and/or modify | # This program is free software; you can redistribute it and/or modify | ||||
# it under the terms of the GNU General Public License as published by | # it under the terms of the GNU General Public License as published by | ||||
EM_WORKER_JS=js/espeakng.worker.js | EM_WORKER_JS=js/espeakng.worker.js | ||||
EM_PTHREAD_MAIN_JS=js/pthread-main.js | EM_PTHREAD_MAIN_JS=js/pthread-main.js | ||||
# NOTE: intermediate objects | |||||
# NOTE: intermediate objects | |||||
EM_OBJS=$(EM_GLUE_OBJ) $(EM_LIBESPEAKNG_SO) | EM_OBJS=$(EM_GLUE_OBJ) $(EM_LIBESPEAKNG_SO) | ||||
EM_ALL_PRE_JS=$(EM_PRE_JS) $(EM_ESPEAKNG_DATA_PACKAGE_JS) | EM_ALL_PRE_JS=$(EM_PRE_JS) $(EM_ESPEAKNG_DATA_PACKAGE_JS) | ||||
EM_ALL_POST_JS=$(EM_GLUE_AUTOGEN_JS) $(EM_POST_JS) | EM_ALL_POST_JS=$(EM_GLUE_AUTOGEN_JS) $(EM_POST_JS) | ||||
# | # | ||||
# ./emconfigure ./configure --prefix=/usr --without-async | # ./emconfigure ./configure --prefix=/usr --without-async | ||||
# ./emmake make | # ./emmake make | ||||
CXXFLAGS+=-DESPEAK_DATA_PATH=\"$(EM_VIRTUAL_PATH_ESPEAKNG_DATA)\" | |||||
CXXFLAGS+=-I ./ -I ../ -I ../src/include/espeak-ng | |||||
CXXFLAGS+=-DESPEAK_DATA_PATH=\"$(EM_VIRTUAL_PATH_ESPEAKNG_DATA)\" | |||||
CXXFLAGS+=-I ./ -I ../ -I ../src/include/espeak-ng | |||||
# NOTE: so far, pthread is not supported in any browser | # NOTE: so far, pthread is not supported in any browser | ||||
# except Firefox Nightly. | # except Firefox Nightly. | ||||
$(EM_ESPEAKNG_DATA_PACKAGE_JS): $(EM_WORKER_DATA) | $(EM_ESPEAKNG_DATA_PACKAGE_JS): $(EM_WORKER_DATA) | ||||
$(EM_GLUE_AUTOGEN_CPP): $(EM_GLUE_IDL) | $(EM_GLUE_AUTOGEN_CPP): $(EM_GLUE_IDL) | ||||
$(EM_WEBIDL_BINDER) $(EM_GLUE_IDL) $(EM_GLUE_PREFIX) | |||||
$(EM_WEBIDL_BINDER) $(EM_GLUE_IDL) $(EM_GLUE_PREFIX) | |||||
$(EM_GLUE_AUTOGEN_JS): $(EM_GLUE_AUTOGEN_CPP) | $(EM_GLUE_AUTOGEN_JS): $(EM_GLUE_AUTOGEN_CPP) | ||||
allows client-side text-to-speech synthesis in any browser | allows client-side text-to-speech synthesis in any browser | ||||
supporting Web workers and the Web Audio API. | supporting Web workers and the Web Audio API. | ||||
* Version: 1.49.0 | |||||
* Date: 2016-11-01 | |||||
* Version: 1.49.1 | |||||
* Date: 2017-02-01 | |||||
* License: the GNU General Public License, Version 3 (GPLv3) | * License: the GNU General Public License, Version 3 (GPLv3) | ||||
* Size: 3.0 MB (including all the voices) | |||||
* Size: 3.2 MB (including all the voices) | |||||
## Demo | ## Demo |
<head> | <head> | ||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | ||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"> | <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"> | ||||
<title>espeakng.js Demo</title> | |||||
<title>espeakng.js 1.49.1 Demo</title> | |||||
<style> | <style> | ||||
h1 { | h1 { | ||||
max-width: 480px; | max-width: 480px; | ||||
width: calc(80% - 3rem); | width: calc(80% - 3rem); | ||||
margin: 0; | margin: 0; | ||||
} | } | ||||
.speecharg input { | |||||
margin: 0; | |||||
padding: 0; | |||||
border: 0; | |||||
} | |||||
.speecharg button { | .speecharg button { | ||||
width: 1.5rem; | width: 1.5rem; | ||||
height: 1.5rem; | height: 1.5rem; | ||||
<div>Loading eSpeak-ng worker and data...</div> | <div>Loading eSpeak-ng worker and data...</div> | ||||
<progress></progress> | <progress></progress> | ||||
</div> | </div> | ||||
<h1>espeakng.js Demo</h1> | |||||
<h1>espeakng.js 1.49.1 Demo</h1> | |||||
<form> | <form> | ||||
<textarea id="texttospeak">Call me Ishmael. Some years ago --- never mind how long precisely --- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving off the spleen and regulating the circulation.</textarea> | <textarea id="texttospeak">Call me Ishmael. Some years ago --- never mind how long precisely --- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving off the spleen and regulating the circulation.</textarea> | ||||
<div class="speecharg"> | <div class="speecharg"> | ||||
<label for="pitch">Pitch</label><input id="pitch" type="range" value="50" min="0" max="100"><button type="button" aria-label="Reset pitch" title="Reset pitch" onclick="resetPitch();">↶</button> | |||||
<label for="pitch">Pitch</label><input id="pitch" type="range" value="50" min="0" max="100" /><button type="button" aria-label="Reset pitch" title="Reset pitch" onclick="resetPitch();">↶</button> | |||||
</div> | </div> | ||||
<div class="speecharg"> | <div class="speecharg"> | ||||
<label for="rate">Rate</label><input id="rate" type="range" value="175" min="80" max="450"><button type="button" aria-label="Reset rate" title="Reset rate" onclick="resetRate();">↶</button> | |||||
<label for="rate">Rate</label><input id="rate" type="range" value="175" min="80" max="450" /><button type="button" aria-label="Reset rate" title="Reset rate" onclick="resetRate();">↶</button> | |||||
</div> | </div> | ||||
<div class="speecharg"> | <div class="speecharg"> | ||||
<label for="voice">Voice</label><select id="voice"></select><button type="button" aria-label="Reset voice" title="Reset voice" onclick="resetVoice();">↶</button> | <label for="voice">Voice</label><select id="voice"></select><button type="button" aria-label="Reset voice" title="Reset voice" onclick="resetVoice();">↶</button> |
/* | /* | ||||
* Copyright (C) 2014-2016 Eitan Isaacson | |||||
* Copyright (C) 2014-2017 Eitan Isaacson | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or modify | * This program is free software; you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by |
/* | /* | ||||
* Copyright (C) 2014-2016 Eitan Isaacson | |||||
* Copyright (C) 2014-2017 Eitan Isaacson | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or modify | * This program is free software; you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by |
/* | /* | ||||
* Copyright (C) 2014-2016 Eitan Isaacson | |||||
* Copyright (C) 2014-2017 Eitan Isaacson | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or modify | * This program is free software; you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by | ||||
var now = Date.now(); | var now = Date.now(); | ||||
chunkID = 0; | chunkID = 0; | ||||
console.log(' Creating pusher...'); | console.log(' Creating pusher...'); | ||||
pusher = new PushAudioNode( | pusher = new PushAudioNode( | ||||
ctx, | ctx, | ||||
} // end of function cb | } // end of function cb | ||||
); // end of tts.synthesize() | ); // end of tts.synthesize() | ||||
console.log(' Calling synthesize... done'); | console.log(' Calling synthesize... done'); | ||||
console.log('Leaving speak()'); | console.log('Leaving speak()'); | ||||
} // end of speak() | } // end of speak() | ||||
opt.value = voice.identifier; | opt.value = voice.identifier; | ||||
console.log('Adding voice: ' + opt.text); | console.log('Adding voice: ' + opt.text); | ||||
sel.add(opt); | sel.add(opt); | ||||
if (voice.name === 'en') { | |||||
if (voice.name === 'english') { | |||||
opt.id = 'default-voice'; | opt.id = 'default-voice'; | ||||
opt.selected = true; | opt.selected = true; | ||||
} | } |
/* | /* | ||||
* Copyright (C) 2014-2016 Eitan Isaacson | |||||
* Copyright (C) 2014-2017 Eitan Isaacson | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or modify | * This program is free software; you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by |
/* | /* | ||||
* Copyright (C) 2014-2016 Eitan Isaacson | |||||
* Copyright (C) 2014-2017 Eitan Isaacson | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or modify | * This program is free software; you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by |