| 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 |