├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── dist ├── espeak-all-worker.js ├── espeak-all-workerthread.js ├── espeak-en-worker.js ├── espeak-es-worker.js ├── espeak-fr-worker.js ├── sam-worker.js └── sam-workerthread.js ├── docs ├── basic-example │ ├── asset-manifest.json │ ├── favicon.ico │ ├── index.html │ ├── manifest.json │ ├── precache-manifest.4f4c8f68c05626d5d90a0f1a0ed5c0b6.js │ ├── service-worker.js │ ├── static │ │ ├── css │ │ │ ├── main.90485467.chunk.css │ │ │ └── main.90485467.chunk.css.map │ │ └── js │ │ │ ├── 2.a168fabe.chunk.js │ │ │ ├── 2.a168fabe.chunk.js.map │ │ │ ├── main.14a999b8.chunk.js │ │ │ ├── main.14a999b8.chunk.js.map │ │ │ ├── runtime-main.d1c27915.js │ │ │ └── runtime-main.d1c27915.js.map │ └── webworkers │ │ ├── espeak-all-worker.js │ │ ├── espeak-all-workerthread.js │ │ ├── espeak-en-worker.js │ │ ├── espeak-es-worker.js │ │ ├── espeak-fr-worker.js │ │ ├── sam-worker.js │ │ └── sam-workerthread.js ├── borg-example │ ├── asset-manifest.json │ ├── favicon.ico │ ├── index.html │ ├── manifest.json │ ├── precache-manifest.8347efcf6e704f3bb8ca44be2bf96715.js │ ├── service-worker.js │ ├── static │ │ ├── css │ │ │ ├── main.90485467.chunk.css │ │ │ └── main.90485467.chunk.css.map │ │ └── js │ │ │ ├── 2.0b5599c5.chunk.js │ │ │ ├── 2.0b5599c5.chunk.js.map │ │ │ ├── main.7e57d34f.chunk.js │ │ │ ├── main.7e57d34f.chunk.js.map │ │ │ ├── runtime-main.bb52d24f.js │ │ │ └── runtime-main.bb52d24f.js.map │ └── webworkers │ │ ├── espeak-all-worker.js │ │ ├── espeak-all-workerthread.js │ │ ├── espeak-en-worker.js │ │ ├── espeak-es-worker.js │ │ ├── espeak-fr-worker.js │ │ ├── sam-worker.js │ │ └── sam-workerthread.js ├── full-example │ ├── asset-manifest.json │ ├── favicon.ico │ ├── index.html │ ├── manifest.json │ ├── precache-manifest.f506c149a7bfa9c675319b677ffd8842.js │ ├── service-worker.js │ ├── static │ │ ├── css │ │ │ ├── main.b28886e8.chunk.css │ │ │ └── main.b28886e8.chunk.css.map │ │ └── js │ │ │ ├── 2.af0ff3a9.chunk.js │ │ │ ├── 2.af0ff3a9.chunk.js.map │ │ │ ├── main.769c33b0.chunk.js │ │ │ ├── main.769c33b0.chunk.js.map │ │ │ ├── runtime-main.a3e02a5a.js │ │ │ └── runtime-main.a3e02a5a.js.map │ └── webworkers │ │ ├── espeak-all-worker.js │ │ ├── espeak-all-workerthread.js │ │ ├── espeak-en-worker.js │ │ ├── espeak-es-worker.js │ │ ├── espeak-fr-worker.js │ │ ├── sam-worker.js │ │ └── sam-workerthread.js ├── index.html └── multiplevoices-example │ ├── asset-manifest.json │ ├── favicon.ico │ ├── index.html │ ├── manifest.json │ ├── precache-manifest.659faaf26edf86fc39804a8fb2e06ec5.js │ ├── service-worker.js │ ├── static │ ├── css │ │ ├── main.c7e122f0.chunk.css │ │ └── main.c7e122f0.chunk.css.map │ └── js │ │ ├── 2.8af5121b.chunk.js │ │ ├── 2.8af5121b.chunk.js.map │ │ ├── main.ada18e40.chunk.js │ │ ├── main.ada18e40.chunk.js.map │ │ ├── runtime-main.4d9ca5ce.js │ │ └── runtime-main.4d9ca5ce.js.map │ └── webworkers │ ├── espeak-all-worker.js │ ├── espeak-all-workerthread.js │ ├── espeak-en-worker.js │ ├── espeak-es-worker.js │ ├── espeak-fr-worker.js │ ├── sam-worker.js │ └── sam-workerthread.js ├── examples ├── basic-example │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── manifest.json │ │ └── webworkers │ │ │ ├── espeak-all-worker.js │ │ │ ├── espeak-all-workerthread.js │ │ │ ├── espeak-en-worker.js │ │ │ ├── espeak-es-worker.js │ │ │ ├── espeak-fr-worker.js │ │ │ ├── sam-worker.js │ │ │ └── sam-workerthread.js │ └── src │ │ ├── SayApp.js │ │ ├── index.css │ │ ├── index.js │ │ └── serviceWorker.js ├── borg-example │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── manifest.json │ │ └── webworkers │ │ │ ├── espeak-all-worker.js │ │ │ ├── espeak-all-workerthread.js │ │ │ ├── espeak-en-worker.js │ │ │ ├── espeak-es-worker.js │ │ │ ├── espeak-fr-worker.js │ │ │ ├── sam-worker.js │ │ │ └── sam-workerthread.js │ └── src │ │ ├── SayApp.js │ │ ├── index.css │ │ ├── index.js │ │ └── serviceWorker.js ├── full-example │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── manifest.json │ │ └── webworkers │ │ │ ├── espeak-all-worker.js │ │ │ ├── espeak-all-workerthread.js │ │ │ ├── espeak-en-worker.js │ │ │ ├── espeak-es-worker.js │ │ │ ├── espeak-fr-worker.js │ │ │ ├── sam-worker.js │ │ │ └── sam-workerthread.js │ └── src │ │ ├── SayApp.js │ │ ├── index.css │ │ ├── index.js │ │ └── serviceWorker.js └── multiplevoices-example │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── public │ ├── favicon.ico │ ├── index.html │ ├── manifest.json │ └── webworkers │ │ ├── espeak-all-worker.js │ │ ├── espeak-all-workerthread.js │ │ ├── espeak-en-worker.js │ │ ├── espeak-es-worker.js │ │ ├── espeak-fr-worker.js │ │ ├── sam-worker.js │ │ └── sam-workerthread.js │ └── src │ ├── MultipleSpeakersApp.js │ ├── MultipleSpeakersApp.test.js │ ├── index.css │ ├── index.js │ └── serviceWorker.js ├── index.js ├── lib ├── mespeak │ ├── ESpeak.js │ ├── index.js │ └── mespeak_config.json ├── monauralscope.js ├── profiles.js ├── queue.js └── say.js ├── package-lock.json ├── package.json ├── screenshot.png ├── tools ├── webworkers │ ├── espeak-all-worker.js │ ├── espeak-en-worker.js │ ├── espeak-es-worker.js │ ├── espeak-fr-worker.js │ ├── espeak-interface.js │ ├── sam-interface.js │ └── sam-worker.js └── workerthreads │ ├── espeak-all-workerthread.js │ ├── espeak-en-workerthread.js │ ├── espeak-interface-workerthread.js │ ├── sam-interface-workerthread.js │ └── sam-workerthread.js ├── voices ├── ca.json ├── cs.json ├── de.json ├── el.json ├── en │ ├── en-n.json │ ├── en-rp.json │ ├── en-sc.json │ ├── en-us.json │ ├── en-wm.json │ └── en.json ├── eo.json ├── es-la.json ├── es.json ├── fi.json ├── fr.json ├── hu.json ├── it.json ├── kn.json ├── la.json ├── lv.json ├── nl.json ├── pl.json ├── pt-pt.json ├── pt.json ├── ro.json ├── sk.json ├── sv.json ├── tr.json ├── zh-yue.json └── zh.json └── webpack.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | 7 | /.pnp 8 | .pnp.js 9 | 10 | # testing 11 | /coverage 12 | 13 | # production 14 | /build 15 | 16 | # misc 17 | .DS_Store 18 | .env.local 19 | .env.development.local 20 | .env.test.local 21 | .env.production.local 22 | 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | examples/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Jaxcore Say 2 | ======= 3 | 4 | A JavaScript speech synthesis and visualization system for the web, based upon [meSpeak](http://www.masswerk.at/mespeak/) and [sam-js](https://github.com/discordier/sam). 5 | 6 | Jaxcore Say combines both speech synthesis systems through a common API with an HTML5 canvas-based audio volume display which was partially based on [volume-meter](https://github.com/cwilso/volume-meter). 7 | 8 | Beware that web browsers are now disabling Web Audio API by default, so the first usage of Jaxcore Say must be called from a user action such as mouse click or keyboard action. 9 | 10 | For a version of this library which works inside NodeJS, refer to: 11 | 12 | - [https://github.com/jaxcore/jaxcore-say-node](https://github.com/jaxcore/jaxcore-say-node) 13 | 14 | 15 | ### Examples 16 | 17 | - [Basic example](https://jaxcore.github.io/jaxcore-say/basic-example) 18 | - [Borg Voice example](https://jaxcore.github.io/jaxcore-say/borg-example) 19 | - [Full example](https://jaxcore.github.io/jaxcore-say/full-example) 20 | - [Multiple voices & scopes](https://jaxcore.github.io/jaxcore-say/multiplevoices-example) 21 | 22 | #### CyberTyper React Component 23 | 24 | [CyberTyper](https://github.com/jaxcore/cybertyper) is a ReactJS component for automatically typing tech synchronized with jaxcore-say's speech synthesis 25 | 26 | - Example: [Blade Runner interrogation](https://jaxcore.github.io/cybertyper/palefire/) 27 | 28 | ### Installation (NPM module) 29 | 30 | ``` 31 | npm install jaxcore-say 32 | ``` 33 | 34 | ### Usage 35 | 36 | English `en` is the default, but see below for how other languages can be used. 37 | 38 | ``` 39 | import Say from "jaxcore-say"; 40 | 41 | Say.setWorkers({ 42 | 'espeak': 'webworkers/espeak-en-worker.js', 43 | 'sam': 'webworkers/sam-worker.js' 44 | }); 45 | 46 | let voice = new Say({ 47 | profile: "Cylon", 48 | language: "en" 49 | }); 50 | 51 | voice.say("hello my name is Cylon").then(function() { 52 | console.log("done"); 53 | }); 54 | ``` 55 | 56 | ### Webworker Usage 57 | 58 | Both speech synthesizers are loaded with webworkers which drastically improve memory usage. The webworker files can be downloaded [here](https://github.com/jaxcore/jaxcore-say/blob/master/dist/workers.tar.gz). Or to build the worker files clone this repo and run `npm run build-workers` and see the `dist` directory. 59 | 60 | The worker js files must be served separately from the NPM module, and the path to the files must be set using the `Say.setWorkers()` method. 61 | 62 | SAM is English only so there is only 1 webworker file for it. 63 | 64 | But ESpeak has many language options. For English (US) only use this: 65 | 66 | ``` 67 | Say.setWorkers({ 68 | 'espeak': 'webworkers/espeak-en-worker.js', 69 | 'sam': 'webworkers/sam-worker.js' 70 | }); 71 | ``` 72 | 73 | For other languages it likely will be better to use the `all` file: 74 | 75 | ``` 76 | Say.setWorkers({ 77 | 'espeak': 'webworkers/espeak-all-worker.js', 78 | 'sam': 'webworkers/sam-worker.js' 79 | }); 80 | ``` 81 | 82 | Keep in mind, the file sizes of each worker is large. English (US) is 1.7MB, and all the languages is 2.7MB. Your webserver requires proper caching of the worker files. 83 | 84 | ### Voice Profiles 85 | 86 | Jaxcore Say includes the following predefined ESpeak-based voices: 87 | 88 | * Jack 89 | * Pris 90 | * Roy 91 | * Scotty 92 | * Xenu 93 | * Cylon 94 | * Leon 95 | * Rachel 96 | * Zhora 97 | * Borg (a combination of other espeak voices) 98 | 99 | And the following SAM-based voices: 100 | 101 | * Sam 102 | * Elf 103 | * Robo 104 | * Granny 105 | 106 | Custom voices can be generated at run time. See the source code of [SayApp.js](examples/full-example/src/SayApp.js) example for details. 107 | 108 | ### Intonation 109 | 110 | The voice profiles include an easy way to modify the speed (faster/slower) and pitch (deeper/higher): 111 | 112 | ``` 113 | voice.say('hello world', { 114 | fast: true 115 | }); 116 | ``` 117 | 118 | ``` 119 | voice.say('hello world', { 120 | slow: true 121 | }); 122 | ``` 123 | 124 | ``` 125 | voice.say('hello world', { 126 | high: true 127 | }); 128 | ``` 129 | 130 | ``` 131 | voice.say('hello world', { 132 | low: true 133 | }); 134 | ``` 135 | 136 | #### ESpeak Languages 137 | 138 | The language should be defined while instantiating `new Say()`, the possible languages are: 139 | 140 | * ca = Catalan 141 | * cs = Czech 142 | * de = German 143 | * el = Greek 144 | * en = English 145 | * en-n = English (N) 146 | * en-rp = English (RP) 147 | * en-sc = English (Scottish) 148 | * en-us = English (US) 149 | * en-wm = English (WM) 150 | * eo = Esperanto 151 | * es = Spanish 152 | * es-la = Spanish (Latin America) 153 | * fi = Finnish 154 | * fr = French 155 | * hu = Hungarian 156 | * it = Italian 157 | * kn = Kannada 158 | * la = Latin 159 | * lv = Latvian 160 | * nl = Dutch 161 | * pl = Polish 162 | * pt = Portuguese (Brazil) 163 | * pt-pt = Portuguese, European 164 | * ro = Romanian 165 | * sk = Slovak 166 | * sv = Swedish 167 | * tr = Turkish 168 | * zh = Chinese (Mandarin) 169 | * zh-yue = Chinese (Cantonese) 170 | 171 | Set the desired language while instantiating the Say object: 172 | 173 | ``` 174 | let voice = new Say({ 175 | profile: "Cylon", 176 | language: "es" 177 | }); 178 | voice.say("hola mi nombre es Cylon"); 179 | ``` 180 | 181 | Or switch languages at any time: 182 | 183 | ``` 184 | voice.setLanguage("es"); 185 | ``` 186 | 187 | Or set the language as a `say()` option: 188 | 189 | ``` 190 | voice.say("bonjour je m'appelle Cylon", { 191 | language: "fr" 192 | }); 193 | ``` 194 | 195 | ### Scope Visualization 196 | 197 | ``` 198 | import {MonauralScope} from 'jaxcore-say'; 199 | ``` 200 | 201 | Include a canvas element somewhere in your page: 202 | ``` 203 | 204 | ``` 205 | 206 | And use the `setVisualizer()` method: 207 | 208 | ``` 209 | var canvasElement = document.getElementById('scope'); 210 | var monoScope = new MonauralScope(canvasElement); 211 | 212 | voice.setVisualizer(monoScope); 213 | ``` 214 | 215 | ### Run examples locally: 216 | 217 | Clone this repo, then: 218 | 219 | ``` 220 | cd examples/basic-example 221 | npm install 222 | npm start 223 | ``` 224 | 225 | ### Build all examples 226 | 227 | Clone this repo, then: 228 | 229 | ``` 230 | npm install 231 | npm run build-all 232 | cd docs 233 | python -m SimpleHTTPServer 234 | // load http://localhost:8000 235 | ``` 236 | 237 | ## Say Queue 238 | 239 | The Say Queue allows multiple Say instances (voices) to be queued up and played one by one and receive start/stop events for UI updates while that voice is speaking. 240 | 241 | See the [multiplevoices](https://jaxcore.github.io/jaxcore-say/multiplevoices-example) for an example of this in action. 242 | 243 | ## License 244 | 245 | Jaxcore Say is free software released under the GPL License. 246 | 247 | However, IANAL (I am not a lawyer) and due to the bizarre combination of dependencies and the typical use case of compilation/minification into a JavaScript file delivered over the web, the license restrictions are ambiguous. 248 | 249 | ### Original Works 250 | 251 | meSpeak (NPM module by Mikola Lysenko): 252 | [https://github.com/mikolalysenko/mespeak](https://github.com/mikolalysenko/mespeak) 253 | 254 | meSpeak (emscripten port by Norbert Landsteiner): 255 | [https://www.masswerk.at/mespeak/](https://www.masswerk.at/mespeak/) 256 | 257 | eSpeak [http://espeak.sourceforge.net/](http://espeak.sourceforge.net/) 258 | 259 | SAM (reverse-engineered version of SAM by Sebastian Macke) 260 | [https://github.com/s-macke/SAM](https://github.com/s-macke/SAM) 261 | 262 | SAM fork by Vidar Hokstad 263 | [https://github.com/vidarh/SAM](https://github.com/vidarh/SAM) 264 | 265 | SAM-js port by Christian Schiffler 266 | [https://github.com/discordier/sam](https://github.com/discordier/sam) 267 | 268 | 269 | ##### meSpeak License 270 | 271 | Jaxcore Say includes modified source code from meSpeak which is GPL and also includes emscripten-compiled eSpeak code which is also GPL. Therefore this derivative work is available under the GPL. 272 | 273 | ##### sam-js License 274 | 275 | sam-js is used as an external dependency (via NPM) for the SAM based voice profiles. sam-js was reverse engineered and could be classified as abadonware (quoted from [https://github.com/s-macke/SAM](https://github.com/s-macke/SAM)) : 276 | 277 | ``` 278 | The software is a reverse-engineered version of a software published more than 34 years ago by "Don't ask Software". 279 | 280 | The company no longer exists. Any attempt to contact the original authors failed. Hence S.A.M. can be best described as Abandonware (http://en.wikipedia.org/wiki/Abandonware) 281 | 282 | As long this is the case I cannot put my code under any specific open source software license. However the software might be used under the "Fair Use" act (https://en.wikipedia.org/wiki/FAIR_USE_Act) in the USA. 283 | ``` 284 | 285 | Jaxcore Say will be updated according to any new information that comes to light and it is recommended that any further derivative works/improvement also be independently released under the GPL. -------------------------------------------------------------------------------- /docs/basic-example/asset-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": { 3 | "main.css": "./static/css/main.90485467.chunk.css", 4 | "main.js": "./static/js/main.14a999b8.chunk.js", 5 | "main.js.map": "./static/js/main.14a999b8.chunk.js.map", 6 | "runtime-main.js": "./static/js/runtime-main.d1c27915.js", 7 | "runtime-main.js.map": "./static/js/runtime-main.d1c27915.js.map", 8 | "static/js/2.a168fabe.chunk.js": "./static/js/2.a168fabe.chunk.js", 9 | "static/js/2.a168fabe.chunk.js.map": "./static/js/2.a168fabe.chunk.js.map", 10 | "index.html": "./index.html", 11 | "precache-manifest.4f4c8f68c05626d5d90a0f1a0ed5c0b6.js": "./precache-manifest.4f4c8f68c05626d5d90a0f1a0ed5c0b6.js", 12 | "service-worker.js": "./service-worker.js", 13 | "static/css/main.90485467.chunk.css.map": "./static/css/main.90485467.chunk.css.map" 14 | }, 15 | "entrypoints": [ 16 | "static/js/runtime-main.d1c27915.js", 17 | "static/js/2.a168fabe.chunk.js", 18 | "static/css/main.90485467.chunk.css", 19 | "static/js/main.14a999b8.chunk.js" 20 | ] 21 | } -------------------------------------------------------------------------------- /docs/basic-example/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaxcore/jaxcore-say/202c72a933455e97a38bd60d76a73711f0e6ff12/docs/basic-example/favicon.ico -------------------------------------------------------------------------------- /docs/basic-example/index.html: -------------------------------------------------------------------------------- 1 | Jaxcore SayFork me on GitHub
-------------------------------------------------------------------------------- /docs/basic-example/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /docs/basic-example/precache-manifest.4f4c8f68c05626d5d90a0f1a0ed5c0b6.js: -------------------------------------------------------------------------------- 1 | self.__precacheManifest = (self.__precacheManifest || []).concat([ 2 | { 3 | "revision": "da3bc9245e722f6b3a354434f84f9741", 4 | "url": "./index.html" 5 | }, 6 | { 7 | "revision": "8cbf5d9364357985730f", 8 | "url": "./static/css/main.90485467.chunk.css" 9 | }, 10 | { 11 | "revision": "e326a8ecf71cad61bf67", 12 | "url": "./static/js/2.a168fabe.chunk.js" 13 | }, 14 | { 15 | "revision": "8cbf5d9364357985730f", 16 | "url": "./static/js/main.14a999b8.chunk.js" 17 | }, 18 | { 19 | "revision": "9bfa1de4a591b39a3f47", 20 | "url": "./static/js/runtime-main.d1c27915.js" 21 | } 22 | ]); -------------------------------------------------------------------------------- /docs/basic-example/service-worker.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Welcome to your Workbox-powered service worker! 3 | * 4 | * You'll need to register this file in your web app and you should 5 | * disable HTTP caching for this file too. 6 | * See https://goo.gl/nhQhGp 7 | * 8 | * The rest of the code is auto-generated. Please don't update this file 9 | * directly; instead, make changes to your Workbox build configuration 10 | * and re-run your build process. 11 | * See https://goo.gl/2aRDsh 12 | */ 13 | 14 | importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); 15 | 16 | importScripts( 17 | "./precache-manifest.4f4c8f68c05626d5d90a0f1a0ed5c0b6.js" 18 | ); 19 | 20 | self.addEventListener('message', (event) => { 21 | if (event.data && event.data.type === 'SKIP_WAITING') { 22 | self.skipWaiting(); 23 | } 24 | }); 25 | 26 | workbox.core.clientsClaim(); 27 | 28 | /** 29 | * The workboxSW.precacheAndRoute() method efficiently caches and responds to 30 | * requests for URLs in the manifest. 31 | * See https://goo.gl/S9QRab 32 | */ 33 | self.__precacheManifest = [].concat(self.__precacheManifest || []); 34 | workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); 35 | 36 | workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("./index.html"), { 37 | 38 | blacklist: [/^\/_/,/\/[^/?]+\.[^/]+$/], 39 | }); 40 | -------------------------------------------------------------------------------- /docs/basic-example/static/css/main.90485467.chunk.css: -------------------------------------------------------------------------------- 1 | body{font-family:sans-serif;line-height:1.5em}H2{margin-left:130px}body,button,input,select{font-size:18px}pre{font-size:15px;color:#055;line-height:1em} 2 | /*# sourceMappingURL=main.90485467.chunk.css.map */ -------------------------------------------------------------------------------- /docs/basic-example/static/css/main.90485467.chunk.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["index.css"],"names":[],"mappings":"AAAA,KACE,sBAAuB,CACvB,iBACF,CACA,GACE,iBACF,CACA,yBACE,cACF,CAEA,IACE,cAAe,CACf,UAAc,CACd,eACF","file":"main.90485467.chunk.css","sourcesContent":["body {\n font-family: sans-serif;\n line-height:1.5em;\n}\nH2 {\n margin-left:130px;\n}\nbody, button, input, select{\n font-size: 18px;\n}\n\npre {\n font-size: 15px;\n color: #005555;\n line-height: 1em;\n}\n\n"]} -------------------------------------------------------------------------------- /docs/basic-example/static/js/runtime-main.d1c27915.js: -------------------------------------------------------------------------------- 1 | !function(e){function r(r){for(var n,a,l=r[0],i=r[1],c=r[2],f=0,s=[];fBorg Voice GeneratorFork me on GitHub
-------------------------------------------------------------------------------- /docs/borg-example/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /docs/borg-example/precache-manifest.8347efcf6e704f3bb8ca44be2bf96715.js: -------------------------------------------------------------------------------- 1 | self.__precacheManifest = (self.__precacheManifest || []).concat([ 2 | { 3 | "revision": "1a3a7b46aefa82266e79da520dae7535", 4 | "url": "./index.html" 5 | }, 6 | { 7 | "revision": "45c1a4785a8ed9730a5e", 8 | "url": "./static/css/main.90485467.chunk.css" 9 | }, 10 | { 11 | "revision": "c9a638fcd08aa42a5ec6", 12 | "url": "./static/js/2.0b5599c5.chunk.js" 13 | }, 14 | { 15 | "revision": "45c1a4785a8ed9730a5e", 16 | "url": "./static/js/main.7e57d34f.chunk.js" 17 | }, 18 | { 19 | "revision": "2f90463eb403bf374b90", 20 | "url": "./static/js/runtime-main.bb52d24f.js" 21 | } 22 | ]); -------------------------------------------------------------------------------- /docs/borg-example/service-worker.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Welcome to your Workbox-powered service worker! 3 | * 4 | * You'll need to register this file in your web app and you should 5 | * disable HTTP caching for this file too. 6 | * See https://goo.gl/nhQhGp 7 | * 8 | * The rest of the code is auto-generated. Please don't update this file 9 | * directly; instead, make changes to your Workbox build configuration 10 | * and re-run your build process. 11 | * See https://goo.gl/2aRDsh 12 | */ 13 | 14 | importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); 15 | 16 | importScripts( 17 | "./precache-manifest.8347efcf6e704f3bb8ca44be2bf96715.js" 18 | ); 19 | 20 | self.addEventListener('message', (event) => { 21 | if (event.data && event.data.type === 'SKIP_WAITING') { 22 | self.skipWaiting(); 23 | } 24 | }); 25 | 26 | workbox.core.clientsClaim(); 27 | 28 | /** 29 | * The workboxSW.precacheAndRoute() method efficiently caches and responds to 30 | * requests for URLs in the manifest. 31 | * See https://goo.gl/S9QRab 32 | */ 33 | self.__precacheManifest = [].concat(self.__precacheManifest || []); 34 | workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); 35 | 36 | workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("./index.html"), { 37 | 38 | blacklist: [/^\/_/,/\/[^/?]+\.[^/]+$/], 39 | }); 40 | -------------------------------------------------------------------------------- /docs/borg-example/static/css/main.90485467.chunk.css: -------------------------------------------------------------------------------- 1 | body{font-family:sans-serif;line-height:1.5em}H2{margin-left:130px}body,button,input,select{font-size:18px}pre{font-size:15px;color:#055;line-height:1em} 2 | /*# sourceMappingURL=main.90485467.chunk.css.map */ -------------------------------------------------------------------------------- /docs/borg-example/static/css/main.90485467.chunk.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["index.css"],"names":[],"mappings":"AAAA,KACE,sBAAuB,CACvB,iBACF,CACA,GACE,iBACF,CACA,yBACE,cACF,CAEA,IACE,cAAe,CACf,UAAc,CACd,eACF","file":"main.90485467.chunk.css","sourcesContent":["body {\n font-family: sans-serif;\n line-height:1.5em;\n}\nH2 {\n margin-left:130px;\n}\nbody, button, input, select{\n font-size: 18px;\n}\n\npre {\n font-size: 15px;\n color: #005555;\n line-height: 1em;\n}\n\n"]} -------------------------------------------------------------------------------- /docs/borg-example/static/js/runtime-main.bb52d24f.js: -------------------------------------------------------------------------------- 1 | !function(e){function r(r){for(var n,a,l=r[0],p=r[1],f=r[2],c=0,s=[];cJaxcore Say Full ExampleFork me on GitHub
-------------------------------------------------------------------------------- /docs/full-example/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /docs/full-example/precache-manifest.f506c149a7bfa9c675319b677ffd8842.js: -------------------------------------------------------------------------------- 1 | self.__precacheManifest = (self.__precacheManifest || []).concat([ 2 | { 3 | "revision": "0e1157df505de2045c478b75099389b1", 4 | "url": "./index.html" 5 | }, 6 | { 7 | "revision": "46a067905f0788fba02e", 8 | "url": "./static/css/main.b28886e8.chunk.css" 9 | }, 10 | { 11 | "revision": "e884a408e1999c337a87", 12 | "url": "./static/js/2.af0ff3a9.chunk.js" 13 | }, 14 | { 15 | "revision": "46a067905f0788fba02e", 16 | "url": "./static/js/main.769c33b0.chunk.js" 17 | }, 18 | { 19 | "revision": "ed6d5d75560db1565fe8", 20 | "url": "./static/js/runtime-main.a3e02a5a.js" 21 | } 22 | ]); -------------------------------------------------------------------------------- /docs/full-example/service-worker.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Welcome to your Workbox-powered service worker! 3 | * 4 | * You'll need to register this file in your web app and you should 5 | * disable HTTP caching for this file too. 6 | * See https://goo.gl/nhQhGp 7 | * 8 | * The rest of the code is auto-generated. Please don't update this file 9 | * directly; instead, make changes to your Workbox build configuration 10 | * and re-run your build process. 11 | * See https://goo.gl/2aRDsh 12 | */ 13 | 14 | importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); 15 | 16 | importScripts( 17 | "./precache-manifest.f506c149a7bfa9c675319b677ffd8842.js" 18 | ); 19 | 20 | self.addEventListener('message', (event) => { 21 | if (event.data && event.data.type === 'SKIP_WAITING') { 22 | self.skipWaiting(); 23 | } 24 | }); 25 | 26 | workbox.core.clientsClaim(); 27 | 28 | /** 29 | * The workboxSW.precacheAndRoute() method efficiently caches and responds to 30 | * requests for URLs in the manifest. 31 | * See https://goo.gl/S9QRab 32 | */ 33 | self.__precacheManifest = [].concat(self.__precacheManifest || []); 34 | workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); 35 | 36 | workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("./index.html"), { 37 | 38 | blacklist: [/^\/_/,/\/[^/?]+\.[^/]+$/], 39 | }); 40 | -------------------------------------------------------------------------------- /docs/full-example/static/css/main.b28886e8.chunk.css: -------------------------------------------------------------------------------- 1 | body{font-family:sans-serif;line-height:1.5em}H2{margin-left:0}body,button,input,select{font-size:18px}pre{font-size:15px;color:#055;line-height:1em} 2 | /*# sourceMappingURL=main.b28886e8.chunk.css.map */ -------------------------------------------------------------------------------- /docs/full-example/static/css/main.b28886e8.chunk.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["index.css"],"names":[],"mappings":"AAAA,KACE,sBAAuB,CACvB,iBACF,CACA,GACE,aACF,CACA,yBACE,cACF,CAEA,IACE,cAAe,CACf,UAAc,CACd,eACF","file":"main.b28886e8.chunk.css","sourcesContent":["body {\n font-family: sans-serif;\n line-height:1.5em;\n}\nH2 {\n margin-left:0px;\n}\nbody, button, input, select{\n font-size: 18px;\n}\n\npre {\n font-size: 15px;\n color: #005555;\n line-height: 1em;\n}\n\n"]} -------------------------------------------------------------------------------- /docs/full-example/static/js/runtime-main.a3e02a5a.js: -------------------------------------------------------------------------------- 1 | !function(e){function r(r){for(var n,l,a=r[0],f=r[1],p=r[2],c=0,s=[];c 2 |
  • 3 | Basic Example 4 |
  • 5 |
  • 6 | Borg Example 7 |
  • 8 |
  • 9 | Full Example 10 |
  • 11 |
  • 12 | Multiple Voices Example 13 |
  • 14 | 15 | -------------------------------------------------------------------------------- /docs/multiplevoices-example/asset-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": { 3 | "main.css": "./static/css/main.c7e122f0.chunk.css", 4 | "main.js": "./static/js/main.ada18e40.chunk.js", 5 | "main.js.map": "./static/js/main.ada18e40.chunk.js.map", 6 | "runtime-main.js": "./static/js/runtime-main.4d9ca5ce.js", 7 | "runtime-main.js.map": "./static/js/runtime-main.4d9ca5ce.js.map", 8 | "static/js/2.8af5121b.chunk.js": "./static/js/2.8af5121b.chunk.js", 9 | "static/js/2.8af5121b.chunk.js.map": "./static/js/2.8af5121b.chunk.js.map", 10 | "index.html": "./index.html", 11 | "precache-manifest.659faaf26edf86fc39804a8fb2e06ec5.js": "./precache-manifest.659faaf26edf86fc39804a8fb2e06ec5.js", 12 | "service-worker.js": "./service-worker.js", 13 | "static/css/main.c7e122f0.chunk.css.map": "./static/css/main.c7e122f0.chunk.css.map" 14 | }, 15 | "entrypoints": [ 16 | "static/js/runtime-main.4d9ca5ce.js", 17 | "static/js/2.8af5121b.chunk.js", 18 | "static/css/main.c7e122f0.chunk.css", 19 | "static/js/main.ada18e40.chunk.js" 20 | ] 21 | } -------------------------------------------------------------------------------- /docs/multiplevoices-example/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaxcore/jaxcore-say/202c72a933455e97a38bd60d76a73711f0e6ff12/docs/multiplevoices-example/favicon.ico -------------------------------------------------------------------------------- /docs/multiplevoices-example/index.html: -------------------------------------------------------------------------------- 1 | Jaxcore Say - Multiple SpeakersFork me on GitHub
    -------------------------------------------------------------------------------- /docs/multiplevoices-example/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /docs/multiplevoices-example/precache-manifest.659faaf26edf86fc39804a8fb2e06ec5.js: -------------------------------------------------------------------------------- 1 | self.__precacheManifest = (self.__precacheManifest || []).concat([ 2 | { 3 | "revision": "877e2ed541bb19e52615e7ce700d2793", 4 | "url": "./index.html" 5 | }, 6 | { 7 | "revision": "183b6ed1d9cb41cda049", 8 | "url": "./static/css/main.c7e122f0.chunk.css" 9 | }, 10 | { 11 | "revision": "db2414c8c932b37d46c7", 12 | "url": "./static/js/2.8af5121b.chunk.js" 13 | }, 14 | { 15 | "revision": "183b6ed1d9cb41cda049", 16 | "url": "./static/js/main.ada18e40.chunk.js" 17 | }, 18 | { 19 | "revision": "64584dc12d40d104755c", 20 | "url": "./static/js/runtime-main.4d9ca5ce.js" 21 | } 22 | ]); -------------------------------------------------------------------------------- /docs/multiplevoices-example/service-worker.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Welcome to your Workbox-powered service worker! 3 | * 4 | * You'll need to register this file in your web app and you should 5 | * disable HTTP caching for this file too. 6 | * See https://goo.gl/nhQhGp 7 | * 8 | * The rest of the code is auto-generated. Please don't update this file 9 | * directly; instead, make changes to your Workbox build configuration 10 | * and re-run your build process. 11 | * See https://goo.gl/2aRDsh 12 | */ 13 | 14 | importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); 15 | 16 | importScripts( 17 | "./precache-manifest.659faaf26edf86fc39804a8fb2e06ec5.js" 18 | ); 19 | 20 | self.addEventListener('message', (event) => { 21 | if (event.data && event.data.type === 'SKIP_WAITING') { 22 | self.skipWaiting(); 23 | } 24 | }); 25 | 26 | workbox.core.clientsClaim(); 27 | 28 | /** 29 | * The workboxSW.precacheAndRoute() method efficiently caches and responds to 30 | * requests for URLs in the manifest. 31 | * See https://goo.gl/S9QRab 32 | */ 33 | self.__precacheManifest = [].concat(self.__precacheManifest || []); 34 | workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); 35 | 36 | workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("./index.html"), { 37 | 38 | blacklist: [/^\/_/,/\/[^/?]+\.[^/]+$/], 39 | }); 40 | -------------------------------------------------------------------------------- /docs/multiplevoices-example/static/css/main.c7e122f0.chunk.css: -------------------------------------------------------------------------------- 1 | body{font-family:sans-serif;line-height:1.5em}H2{margin-left:2em}body,button,input,select{font-size:18px}pre{font-size:15px;color:#055;line-height:1em}#scopes{clear:both;position:relative}#scopes canvas{display:inline-block;float:left;width:100px;height:100px}#red .speakername{left:0}#orange .speakername{left:100px}#yellow .speakername{left:200px}#green .speakername{left:300px}#cyan .speakername{left:400px}#blue .speakername{left:500px}#purple .speakername{left:600px}#brown .speakername{left:700px}.speakername{color:#ccc}.speakername.active{color:#000}.speakername{width:100px;text-align:center;position:absolute}#controls{clear:both} 2 | /*# sourceMappingURL=main.c7e122f0.chunk.css.map */ -------------------------------------------------------------------------------- /docs/multiplevoices-example/static/css/main.c7e122f0.chunk.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["index.css"],"names":[],"mappings":"AAAA,KACI,sBAAuB,CACvB,iBACJ,CAEA,GACI,eACJ,CAEA,yBACI,cACJ,CAEA,IACI,cAAe,CACf,UAAc,CACd,eACJ,CAEA,QACI,UAAW,CACX,iBACJ,CAEA,eACI,oBAAqB,CACrB,UAAW,CACX,WAAY,CACZ,YACJ,CAEA,kBACI,MACJ,CAEA,qBACI,UACJ,CAEA,qBACI,UACJ,CAEA,oBACI,UACJ,CAEA,mBACI,UACJ,CAEA,mBACI,UACJ,CAEA,qBACI,UACJ,CAEA,oBACI,UACJ,CAEA,aACI,UACJ,CAEA,oBACI,UACJ,CAEA,aACI,WAAY,CACZ,iBAAkB,CAClB,iBACJ,CAEA,UACI,UACJ","file":"main.c7e122f0.chunk.css","sourcesContent":["body {\n font-family: sans-serif;\n line-height: 1.5em;\n}\n\nH2 {\n margin-left: 2em;\n}\n\nbody, button, input, select {\n font-size: 18px;\n}\n\npre {\n font-size: 15px;\n color: #005555;\n line-height: 1em;\n}\n\n#scopes {\n clear: both;\n position: relative;\n}\n\n#scopes canvas {\n display: inline-block;\n float: left;\n width: 100px;\n height: 100px;\n}\n\n#red .speakername {\n left: 0px;\n}\n\n#orange .speakername {\n left: 100px;\n}\n\n#yellow .speakername {\n left: 200px;\n}\n\n#green .speakername {\n left: 300px;\n}\n\n#cyan .speakername {\n left: 400px;\n}\n\n#blue .speakername {\n left: 500px;\n}\n\n#purple .speakername {\n left: 600px;\n}\n\n#brown .speakername {\n left: 700px;\n}\n\n.speakername {\n color: #ccc;\n}\n\n.speakername.active {\n color: #000;\n}\n\n.speakername {\n width: 100px;\n text-align: center;\n position: absolute;\n}\n\n#controls {\n clear: both;\n}"]} -------------------------------------------------------------------------------- /docs/multiplevoices-example/static/js/runtime-main.4d9ca5ce.js: -------------------------------------------------------------------------------- 1 | !function(e){function t(t){for(var n,l,i=t[0],p=t[1],a=t[2],c=0,s=[];c0.2%", 21 | "not dead", 22 | "not ie <= 11", 23 | "not op_mini all" 24 | ], 25 | "homepage": ".", 26 | "license": "MIT" 27 | } 28 | -------------------------------------------------------------------------------- /examples/basic-example/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaxcore/jaxcore-say/202c72a933455e97a38bd60d76a73711f0e6ff12/examples/basic-example/public/favicon.ico -------------------------------------------------------------------------------- /examples/basic-example/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | 15 | 16 | 25 | Jaxcore Say 26 | 27 | 28 | 29 | 30 | 31 | Fork me on GitHub 32 | 33 | 34 |
    35 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /examples/basic-example/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /examples/basic-example/src/SayApp.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import Say from 'jaxcore-say'; 3 | 4 | Say.setWorkers({ 5 | 'espeak': 'webworkers/espeak-all-worker.js', 6 | 'sam': 'webworkers/sam-worker.js' 7 | }); 8 | 9 | var jack = new Say({ 10 | language: 'en', 11 | profile: 'Jack' 12 | }); 13 | 14 | class SayApp extends Component { 15 | constructor() { 16 | super(); 17 | 18 | this.state = { 19 | isSpeaking: false 20 | }; 21 | 22 | this.inputRef = React.createRef(); 23 | } 24 | 25 | render() { 26 | return ( 27 |
    28 |

    Basic Text-to-Speech Example

    29 | 30 |
    31 | 32 | 33 |
    34 | 35 |
    36 | 37 |
    Is Speaking : {this.state.isSpeaking? 'YES':'NO'}
    38 |
    39 | ); 40 | } 41 | 42 | sayText() { 43 | const text = this.inputRef.current.value; 44 | this.setState({ 45 | isSpeaking: true 46 | }, () => { 47 | console.log('Jack: started'); 48 | jack.say(text).then(() => { 49 | console.log('Jack: stopped'); 50 | this.setState({ 51 | isSpeaking: false 52 | }); 53 | }); 54 | 55 | }); 56 | } 57 | } 58 | 59 | export default SayApp; 60 | -------------------------------------------------------------------------------- /examples/basic-example/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: sans-serif; 3 | line-height:1.5em; 4 | } 5 | H2 { 6 | margin-left:130px; 7 | } 8 | body, button, input, select{ 9 | font-size: 18px; 10 | } 11 | 12 | pre { 13 | font-size: 15px; 14 | color: #005555; 15 | line-height: 1em; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /examples/basic-example/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import SayApp from './SayApp'; 5 | import * as serviceWorker from './serviceWorker'; 6 | 7 | ReactDOM.render(, document.getElementById('root')); 8 | 9 | // If you want your app to work offline and load faster, you can change 10 | // unregister() to register() below. Note this comes with some pitfalls. 11 | // Learn more about service workers: http://bit.ly/CRA-PWA 12 | serviceWorker.unregister(); 13 | -------------------------------------------------------------------------------- /examples/basic-example/src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read http://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.1/8 is considered localhost for IPv4. 18 | window.location.hostname.match( 19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 20 | ) 21 | ); 22 | 23 | export function register(config) { 24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 25 | // The URL constructor is available in all browsers that support SW. 26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); 27 | if (publicUrl.origin !== window.location.origin) { 28 | // Our service worker won't work if PUBLIC_URL is on a different origin 29 | // from what our page is served on. This might happen if a CDN is used to 30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 31 | return; 32 | } 33 | 34 | window.addEventListener('load', () => { 35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 36 | 37 | if (isLocalhost) { 38 | // This is running on localhost. Let's check if a service worker still exists or not. 39 | checkValidServiceWorker(swUrl, config); 40 | 41 | // Add some additional logging to localhost, pointing developers to the 42 | // service worker/PWA documentation. 43 | navigator.serviceWorker.ready.then(() => { 44 | console.log( 45 | 'This web app is being served cache-first by a service ' + 46 | 'worker. To learn more, visit http://bit.ly/CRA-PWA' 47 | ); 48 | }); 49 | } else { 50 | // Is not localhost. Just register service worker 51 | registerValidSW(swUrl, config); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | function registerValidSW(swUrl, config) { 58 | navigator.serviceWorker 59 | .register(swUrl) 60 | .then(registration => { 61 | registration.onupdatefound = () => { 62 | const installingWorker = registration.installing; 63 | if (installingWorker == null) { 64 | return; 65 | } 66 | installingWorker.onstatechange = () => { 67 | if (installingWorker.state === 'installed') { 68 | if (navigator.serviceWorker.controller) { 69 | // At this point, the updated precached content has been fetched, 70 | // but the previous service worker will still serve the older 71 | // content until all client tabs are closed. 72 | console.log( 73 | 'New content is available and will be used when all ' + 74 | 'tabs for this page are closed. See http://bit.ly/CRA-PWA.' 75 | ); 76 | 77 | // Execute callback 78 | if (config && config.onUpdate) { 79 | config.onUpdate(registration); 80 | } 81 | } else { 82 | // At this point, everything has been precached. 83 | // It's the perfect time to display a 84 | // "Content is cached for offline use." message. 85 | console.log('Content is cached for offline use.'); 86 | 87 | // Execute callback 88 | if (config && config.onSuccess) { 89 | config.onSuccess(registration); 90 | } 91 | } 92 | } 93 | }; 94 | }; 95 | }) 96 | .catch(error => { 97 | console.error('Error during service worker registration:', error); 98 | }); 99 | } 100 | 101 | function checkValidServiceWorker(swUrl, config) { 102 | // Check if the service worker can be found. If it can't reload the page. 103 | fetch(swUrl) 104 | .then(response => { 105 | // Ensure service worker exists, and that we really are getting a JS file. 106 | const contentType = response.headers.get('content-type'); 107 | if ( 108 | response.status === 404 || 109 | (contentType != null && contentType.indexOf('javascript') === -1) 110 | ) { 111 | // No service worker found. Probably a different app. Reload the page. 112 | navigator.serviceWorker.ready.then(registration => { 113 | registration.unregister().then(() => { 114 | window.location.reload(); 115 | }); 116 | }); 117 | } else { 118 | // Service worker found. Proceed as normal. 119 | registerValidSW(swUrl, config); 120 | } 121 | }) 122 | .catch(() => { 123 | console.log( 124 | 'No internet connection found. App is running in offline mode.' 125 | ); 126 | }); 127 | } 128 | 129 | export function unregister() { 130 | if ('serviceWorker' in navigator) { 131 | navigator.serviceWorker.ready.then(registration => { 132 | registration.unregister(); 133 | }); 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /examples/borg-example/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /*/node_modules 6 | /.pnp 7 | .pnp.js 8 | 9 | # testing 10 | /coverage 11 | 12 | # production 13 | /build 14 | 15 | # misc 16 | .DS_Store 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | -------------------------------------------------------------------------------- /examples/borg-example/README.md: -------------------------------------------------------------------------------- 1 | ``` 2 | npm install 3 | npm start 4 | ``` -------------------------------------------------------------------------------- /examples/borg-example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jaxcore-say-borg-example", 3 | "version": "0.0.1", 4 | "dependencies": { 5 | "jaxcore-say": "0.0.6", 6 | "react": "^16.8.3", 7 | "react-dom": "^16.8.3", 8 | "react-scripts": "^3.2.0" 9 | }, 10 | "scripts": { 11 | "start": "react-scripts start", 12 | "build": "react-scripts build", 13 | "test": "react-scripts test", 14 | "eject": "react-scripts eject" 15 | }, 16 | "eslintConfig": { 17 | "extends": "react-app" 18 | }, 19 | "browserslist": [ 20 | ">0.2%", 21 | "not dead", 22 | "not ie <= 11", 23 | "not op_mini all" 24 | ], 25 | "homepage": ".", 26 | "license": "MIT" 27 | } 28 | -------------------------------------------------------------------------------- /examples/borg-example/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaxcore/jaxcore-say/202c72a933455e97a38bd60d76a73711f0e6ff12/examples/borg-example/public/favicon.ico -------------------------------------------------------------------------------- /examples/borg-example/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | 15 | 16 | 25 | Borg Voice Generator 26 | 27 | 28 | 29 | 30 | 31 | Fork me on GitHub 32 | 33 | 34 |
    35 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /examples/borg-example/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /examples/borg-example/src/SayApp.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import Say from 'jaxcore-say'; 3 | 4 | Say.setWorkers({ 5 | 'espeak': 'webworkers/espeak-all-worker.js', 6 | 'sam': 'webworkers/sam-worker.js' 7 | }); 8 | 9 | var say = new Say({ 10 | language: 'en-us' 11 | // language: 'fr' // borg voice also supports other languages 12 | }); 13 | 14 | class SayApp extends Component { 15 | constructor() { 16 | super(); 17 | let sayText; 18 | let autoplay = false; 19 | // the autoplay feature hides the url in base64 encoding (send friends the url) 20 | if (document.location.search.startsWith('?say=')) { 21 | sayText = atob(decodeURIComponent(document.location.search.substring('?say='.length))); 22 | autoplay = true; 23 | } 24 | else sayText = "we are the borg... resistance is futile.... your technological and biological distinctiveness will be added to our own" 25 | 26 | this.state = { 27 | isSpeaking: false, 28 | sayText, 29 | autoplay 30 | }; 31 | 32 | this.inputRef = React.createRef(); 33 | } 34 | 35 | render() { 36 | return ( 37 |
    38 |

    Borg Text-to-Speech Example:

    39 | 40 |
    41 |
    { 42 | e.preventDefault(); return false; 43 | }}> 44 | 45 | { 46 | this.state.autoplay? '' : ( this.setState({sayText: e.target.value})}/>) 48 | } 49 | 50 | 51 |
    52 |
    53 | 54 |
    55 | 56 |
    Are the Borg Speaking? {this.state.isSpeaking ? 'YES' : 'NO'}
    57 |
    58 | ); 59 | } 60 | 61 | sayText() { 62 | const text = this.state.autoplay? this.state.sayText : this.inputRef.current.value; 63 | this.setState({ 64 | isSpeaking: true 65 | }, () => { 66 | 67 | let btext = window.btoa(text); 68 | window.history.pushState(null, null, '?say='+encodeURIComponent(btext)); 69 | 70 | console.log('Borg: started'); 71 | 72 | say.say(text, {profile: 'Borg'}).then(() => { 73 | this.setState({ 74 | isSpeaking: false, 75 | autoplay: false 76 | }); 77 | 78 | }) 79 | 80 | }); 81 | } 82 | } 83 | 84 | export default SayApp; 85 | -------------------------------------------------------------------------------- /examples/borg-example/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: sans-serif; 3 | line-height:1.5em; 4 | } 5 | H2 { 6 | margin-left:130px; 7 | } 8 | body, button, input, select{ 9 | font-size: 18px; 10 | } 11 | 12 | pre { 13 | font-size: 15px; 14 | color: #005555; 15 | line-height: 1em; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /examples/borg-example/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import SayApp from './SayApp'; 5 | import * as serviceWorker from './serviceWorker'; 6 | 7 | ReactDOM.render(, document.getElementById('root')); 8 | 9 | // If you want your app to work offline and load faster, you can change 10 | // unregister() to register() below. Note this comes with some pitfalls. 11 | // Learn more about service workers: http://bit.ly/CRA-PWA 12 | serviceWorker.unregister(); 13 | -------------------------------------------------------------------------------- /examples/borg-example/src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read http://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.1/8 is considered localhost for IPv4. 18 | window.location.hostname.match( 19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 20 | ) 21 | ); 22 | 23 | export function register(config) { 24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 25 | // The URL constructor is available in all browsers that support SW. 26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); 27 | if (publicUrl.origin !== window.location.origin) { 28 | // Our service worker won't work if PUBLIC_URL is on a different origin 29 | // from what our page is served on. This might happen if a CDN is used to 30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 31 | return; 32 | } 33 | 34 | window.addEventListener('load', () => { 35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 36 | 37 | if (isLocalhost) { 38 | // This is running on localhost. Let's check if a service worker still exists or not. 39 | checkValidServiceWorker(swUrl, config); 40 | 41 | // Add some additional logging to localhost, pointing developers to the 42 | // service worker/PWA documentation. 43 | navigator.serviceWorker.ready.then(() => { 44 | console.log( 45 | 'This web app is being served cache-first by a service ' + 46 | 'worker. To learn more, visit http://bit.ly/CRA-PWA' 47 | ); 48 | }); 49 | } else { 50 | // Is not localhost. Just register service worker 51 | registerValidSW(swUrl, config); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | function registerValidSW(swUrl, config) { 58 | navigator.serviceWorker 59 | .register(swUrl) 60 | .then(registration => { 61 | registration.onupdatefound = () => { 62 | const installingWorker = registration.installing; 63 | if (installingWorker == null) { 64 | return; 65 | } 66 | installingWorker.onstatechange = () => { 67 | if (installingWorker.state === 'installed') { 68 | if (navigator.serviceWorker.controller) { 69 | // At this point, the updated precached content has been fetched, 70 | // but the previous service worker will still serve the older 71 | // content until all client tabs are closed. 72 | console.log( 73 | 'New content is available and will be used when all ' + 74 | 'tabs for this page are closed. See http://bit.ly/CRA-PWA.' 75 | ); 76 | 77 | // Execute callback 78 | if (config && config.onUpdate) { 79 | config.onUpdate(registration); 80 | } 81 | } else { 82 | // At this point, everything has been precached. 83 | // It's the perfect time to display a 84 | // "Content is cached for offline use." message. 85 | console.log('Content is cached for offline use.'); 86 | 87 | // Execute callback 88 | if (config && config.onSuccess) { 89 | config.onSuccess(registration); 90 | } 91 | } 92 | } 93 | }; 94 | }; 95 | }) 96 | .catch(error => { 97 | console.error('Error during service worker registration:', error); 98 | }); 99 | } 100 | 101 | function checkValidServiceWorker(swUrl, config) { 102 | // Check if the service worker can be found. If it can't reload the page. 103 | fetch(swUrl) 104 | .then(response => { 105 | // Ensure service worker exists, and that we really are getting a JS file. 106 | const contentType = response.headers.get('content-type'); 107 | if ( 108 | response.status === 404 || 109 | (contentType != null && contentType.indexOf('javascript') === -1) 110 | ) { 111 | // No service worker found. Probably a different app. Reload the page. 112 | navigator.serviceWorker.ready.then(registration => { 113 | registration.unregister().then(() => { 114 | window.location.reload(); 115 | }); 116 | }); 117 | } else { 118 | // Service worker found. Proceed as normal. 119 | registerValidSW(swUrl, config); 120 | } 121 | }) 122 | .catch(() => { 123 | console.log( 124 | 'No internet connection found. App is running in offline mode.' 125 | ); 126 | }); 127 | } 128 | 129 | export function unregister() { 130 | if ('serviceWorker' in navigator) { 131 | navigator.serviceWorker.ready.then(registration => { 132 | registration.unregister(); 133 | }); 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /examples/full-example/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /*/node_modules 6 | /.pnp 7 | .pnp.js 8 | 9 | # testing 10 | /coverage 11 | 12 | # production 13 | /build 14 | 15 | # misc 16 | .DS_Store 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | -------------------------------------------------------------------------------- /examples/full-example/README.md: -------------------------------------------------------------------------------- 1 | ``` 2 | npm install 3 | npm start 4 | ``` -------------------------------------------------------------------------------- /examples/full-example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jaxcore-say-full-example", 3 | "version": "0.0.0", 4 | "dependencies": { 5 | "jaxcore-say": "0.0.4", 6 | "react": "^16.8.3", 7 | "react-dom": "^16.8.3", 8 | "react-scripts": "^3.2.0" 9 | }, 10 | "scripts": { 11 | "start": "react-scripts start", 12 | "build": "react-scripts build", 13 | "test": "react-scripts test", 14 | "eject": "react-scripts eject" 15 | }, 16 | "eslintConfig": { 17 | "extends": "react-app" 18 | }, 19 | "browserslist": [ 20 | ">0.2%", 21 | "not dead", 22 | "not ie <= 11", 23 | "not op_mini all" 24 | ], 25 | "homepage": ".", 26 | "license": "MIT" 27 | } 28 | -------------------------------------------------------------------------------- /examples/full-example/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaxcore/jaxcore-say/202c72a933455e97a38bd60d76a73711f0e6ff12/examples/full-example/public/favicon.ico -------------------------------------------------------------------------------- /examples/full-example/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | 15 | 16 | 25 | Jaxcore Say Full Example 26 | 27 | 28 | 29 | 30 | 31 | Fork me on GitHub 32 | 33 | 34 |
    35 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /examples/full-example/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /examples/full-example/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: sans-serif; 3 | line-height:1.5em; 4 | } 5 | H2 { 6 | margin-left:0px; 7 | } 8 | body, button, input, select{ 9 | font-size: 18px; 10 | } 11 | 12 | pre { 13 | font-size: 15px; 14 | color: #005555; 15 | line-height: 1em; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /examples/full-example/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import SayApp from './SayApp'; 5 | import * as serviceWorker from './serviceWorker'; 6 | 7 | ReactDOM.render(, document.getElementById('root')); 8 | 9 | // If you want your app to work offline and load faster, you can change 10 | // unregister() to register() below. Note this comes with some pitfalls. 11 | // Learn more about service workers: http://bit.ly/CRA-PWA 12 | serviceWorker.unregister(); 13 | -------------------------------------------------------------------------------- /examples/full-example/src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read http://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.1/8 is considered localhost for IPv4. 18 | window.location.hostname.match( 19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 20 | ) 21 | ); 22 | 23 | export function register(config) { 24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 25 | // The URL constructor is available in all browsers that support SW. 26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); 27 | if (publicUrl.origin !== window.location.origin) { 28 | // Our service worker won't work if PUBLIC_URL is on a different origin 29 | // from what our page is served on. This might happen if a CDN is used to 30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 31 | return; 32 | } 33 | 34 | window.addEventListener('load', () => { 35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 36 | 37 | if (isLocalhost) { 38 | // This is running on localhost. Let's check if a service worker still exists or not. 39 | checkValidServiceWorker(swUrl, config); 40 | 41 | // Add some additional logging to localhost, pointing developers to the 42 | // service worker/PWA documentation. 43 | navigator.serviceWorker.ready.then(() => { 44 | console.log( 45 | 'This web app is being served cache-first by a service ' + 46 | 'worker. To learn more, visit http://bit.ly/CRA-PWA' 47 | ); 48 | }); 49 | } else { 50 | // Is not localhost. Just register service worker 51 | registerValidSW(swUrl, config); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | function registerValidSW(swUrl, config) { 58 | navigator.serviceWorker 59 | .register(swUrl) 60 | .then(registration => { 61 | registration.onupdatefound = () => { 62 | const installingWorker = registration.installing; 63 | if (installingWorker == null) { 64 | return; 65 | } 66 | installingWorker.onstatechange = () => { 67 | if (installingWorker.state === 'installed') { 68 | if (navigator.serviceWorker.controller) { 69 | // At this point, the updated precached content has been fetched, 70 | // but the previous service worker will still serve the older 71 | // content until all client tabs are closed. 72 | console.log( 73 | 'New content is available and will be used when all ' + 74 | 'tabs for this page are closed. See http://bit.ly/CRA-PWA.' 75 | ); 76 | 77 | // Execute callback 78 | if (config && config.onUpdate) { 79 | config.onUpdate(registration); 80 | } 81 | } else { 82 | // At this point, everything has been precached. 83 | // It's the perfect time to display a 84 | // "Content is cached for offline use." message. 85 | console.log('Content is cached for offline use.'); 86 | 87 | // Execute callback 88 | if (config && config.onSuccess) { 89 | config.onSuccess(registration); 90 | } 91 | } 92 | } 93 | }; 94 | }; 95 | }) 96 | .catch(error => { 97 | console.error('Error during service worker registration:', error); 98 | }); 99 | } 100 | 101 | function checkValidServiceWorker(swUrl, config) { 102 | // Check if the service worker can be found. If it can't reload the page. 103 | fetch(swUrl) 104 | .then(response => { 105 | // Ensure service worker exists, and that we really are getting a JS file. 106 | const contentType = response.headers.get('content-type'); 107 | if ( 108 | response.status === 404 || 109 | (contentType != null && contentType.indexOf('javascript') === -1) 110 | ) { 111 | // No service worker found. Probably a different app. Reload the page. 112 | navigator.serviceWorker.ready.then(registration => { 113 | registration.unregister().then(() => { 114 | window.location.reload(); 115 | }); 116 | }); 117 | } else { 118 | // Service worker found. Proceed as normal. 119 | registerValidSW(swUrl, config); 120 | } 121 | }) 122 | .catch(() => { 123 | console.log( 124 | 'No internet connection found. App is running in offline mode.' 125 | ); 126 | }); 127 | } 128 | 129 | export function unregister() { 130 | if ('serviceWorker' in navigator) { 131 | navigator.serviceWorker.ready.then(registration => { 132 | registration.unregister(); 133 | }); 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /examples/multiplevoices-example/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /*/node_modules 6 | /.pnp 7 | .pnp.js 8 | 9 | # testing 10 | /coverage 11 | 12 | # production 13 | /build 14 | 15 | # misc 16 | .DS_Store 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | -------------------------------------------------------------------------------- /examples/multiplevoices-example/README.md: -------------------------------------------------------------------------------- 1 | ``` 2 | npm install 3 | npm start 4 | ``` -------------------------------------------------------------------------------- /examples/multiplevoices-example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "multiple-voices-example", 3 | "version": "0.0.5", 4 | "dependencies": { 5 | "jaxcore-say": "0.0.6", 6 | "react": "^16.8.3", 7 | "react-dom": "^16.8.3", 8 | "react-scripts": "^3.2.0" 9 | }, 10 | "scripts": { 11 | "start": "react-scripts start", 12 | "build": "react-scripts build", 13 | "test": "react-scripts test", 14 | "eject": "react-scripts eject" 15 | }, 16 | "eslintConfig": { 17 | "extends": "react-app" 18 | }, 19 | "browserslist": [ 20 | ">0.2%", 21 | "not dead", 22 | "not ie <= 11", 23 | "not op_mini all" 24 | ], 25 | "homepage": ".", 26 | "license": "MIT" 27 | } 28 | -------------------------------------------------------------------------------- /examples/multiplevoices-example/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaxcore/jaxcore-say/202c72a933455e97a38bd60d76a73711f0e6ff12/examples/multiplevoices-example/public/favicon.ico -------------------------------------------------------------------------------- /examples/multiplevoices-example/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 11 | 15 | 16 | 25 | Jaxcore Say - Multiple Speakers 26 | 27 | 28 | 29 | 30 | 31 | Fork me on GitHub 32 | 33 | 34 |
    35 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /examples/multiplevoices-example/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /examples/multiplevoices-example/src/MultipleSpeakersApp.js: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react'; 2 | import Say from 'jaxcore-say'; 3 | import {MonauralScope} from 'jaxcore-say'; 4 | 5 | global.Say = Say; 6 | 7 | Say.setWorkers({ 8 | 'espeak': 'webworkers/espeak-all-worker.js', 9 | 10 | // if you only need one language (english, french, spanish) then only load that worker 11 | // 'espeak': 'webworkers/espeak-en-worker.js', 12 | 13 | // // the following format is mainly just for this demo for testing the individual language builds 14 | // 'espeak': [ 15 | // { 16 | // language: 'en', 17 | // path: 'webworkers/espeak-en-worker.js' 18 | // }, 19 | // { 20 | // language: 'es', 21 | // path: 'webworkers/espeak-es-worker.js' 22 | // }, 23 | // { 24 | // language: 'fr', 25 | // path: 'webworkers/espeak-fr-worker.js' 26 | // }, 27 | // ], 28 | 29 | 'sam': 'webworkers/sam-worker.js' 30 | }); 31 | 32 | class MultipleSpeakersApp extends Component { 33 | constructor() { 34 | super(); 35 | 36 | this.redRef = React.createRef(); 37 | this.orangeRef = React.createRef(); 38 | this.yellowRef = React.createRef(); 39 | this.greenRef = React.createRef(); 40 | this.cyanRef = React.createRef(); 41 | this.blueRef = React.createRef(); 42 | this.purpleRef = React.createRef(); 43 | this.brownRef = React.createRef(); 44 | 45 | this.state = { 46 | text: '', 47 | activeSpeakers: { 48 | red: false, 49 | orange: false, 50 | yellow: false, 51 | green: false, 52 | cyan: false, 53 | blue: false, 54 | purple: false, 55 | brown: false 56 | } 57 | }; 58 | 59 | global.app = this; 60 | } 61 | 62 | componentDidMount() { 63 | const colors = { 64 | red: '255,0,0', 65 | orange: '255,128,0', 66 | yellow: '255,255,0', 67 | green: '0,255,0', 68 | cyan: '0,255,255', 69 | blue: '0,0,255', 70 | purple: '255,0,255', 71 | brown: '150,75,0' 72 | }; 73 | 74 | const getTheme = function (color) { 75 | return { 76 | strokeColor: 'rgb(' + colors[color] + ')', 77 | clipColor: 'black', 78 | fillColor: 'rgba(' + colors[color] + ',0.2)', 79 | dotColor: 'rgb(' + colors[color] + ')', 80 | bgOffColor: '#fafafa', 81 | bgOnColor: '#eee' 82 | } 83 | }; 84 | 85 | this.scopes = { 86 | red: new MonauralScope(this.redRef.current, getTheme('red')), 87 | orange: new MonauralScope(this.orangeRef.current, getTheme('orange')), 88 | yellow: new MonauralScope(this.yellowRef.current, getTheme('yellow')), 89 | green: new MonauralScope(this.greenRef.current, getTheme('green')), 90 | cyan: new MonauralScope(this.cyanRef.current, getTheme('cyan')), 91 | blue: new MonauralScope(this.blueRef.current, getTheme('blue')), 92 | purple: new MonauralScope(this.purpleRef.current, getTheme('purple')), 93 | brown: new MonauralScope(this.brownRef.current, getTheme('brown')) 94 | }; 95 | 96 | } 97 | 98 | render() { 99 | return ( 100 |
    101 | 102 |

    Multiple Voices Example

    103 | 104 |
    105 |
    106 |
    Jack
    107 | 108 |
    109 |
    110 |
    Scotty
    111 | 112 |
    113 |
    114 |
    Roy
    115 | 116 |
    117 |
    118 |
    Leon
    119 | 120 |
    121 |
    122 |
    Robo
    123 | 124 |
    125 |
    126 |
    Zhora
    127 | 128 |
    129 |
    130 |
    Cylon
    131 | 132 |
    133 |
    134 |
    Borg
    135 | 136 |
    137 | 138 |
    139 | 140 |
    141 | 142 | 143 |
    144 |
    145 | ); 146 | } 147 | 148 | clearQueue() { 149 | Say.clearQueue(); 150 | } 151 | 152 | setActiveSpeaker(color, active) { 153 | const {activeSpeakers} = this.state; 154 | activeSpeakers[color] = active; 155 | this.setState(activeSpeakers); 156 | } 157 | 158 | introduceYourselves() { 159 | 160 | Say.once('finish', () => { 161 | console.log('queue finished'); 162 | }); 163 | 164 | Say.queue({ 165 | text: "hello, i am jack", 166 | scope: this.scopes.red, 167 | options: { 168 | profile: 'Jack', 169 | language: 'en' 170 | }, 171 | onStart: () => { 172 | console.log('Jack saying: ', this.text); 173 | this.setActiveSpeaker('red', true); 174 | }, 175 | onStop: () => { 176 | console.log('Jack finished saying: ', this.text); 177 | this.setActiveSpeaker('red', false); 178 | } 179 | }); 180 | 181 | Say.queue({ 182 | text: "aye this is scotty, gled to meet you", 183 | scope: this.scopes.orange, 184 | options: { 185 | profile: 'Scotty', 186 | language: 'en-sc' 187 | }, 188 | onStart: () => { 189 | console.log('Scotty saying: ', this.text); 190 | this.setActiveSpeaker('orange', true); 191 | }, 192 | onStop: () => { 193 | console.log('Scotty finished saying: ', this.text); 194 | this.setActiveSpeaker('orange', false); 195 | } 196 | }); 197 | 198 | 199 | Say.queue({ 200 | text: "this is roy, at your service", 201 | scope: this.scopes.yellow, 202 | options: { 203 | profile: 'Roy', 204 | language: 'en-wm' 205 | }, 206 | onStart: () => { 207 | console.log('Roy saying: ', this.text); 208 | this.setActiveSpeaker('yellow', true); 209 | }, 210 | onStop: () => { 211 | console.log('Roy finished saying: ', this.text); 212 | this.setActiveSpeaker('yellow', false); 213 | } 214 | }); 215 | 216 | Say.queue({ 217 | text: "hola, mi nombre es leon", 218 | scope: this.scopes.green, 219 | options: { 220 | profile: 'Leon', 221 | language: 'es' 222 | }, 223 | onStart: () => { 224 | console.log('Leon saying: ', this.text); 225 | this.setActiveSpeaker('green', true); 226 | }, 227 | onStop: () => { 228 | console.log('Leon finished saying: ', this.text); 229 | this.setActiveSpeaker('green', false); 230 | } 231 | }); 232 | 233 | Say.queue({ 234 | text: "greetings, i am robo", 235 | scope: this.scopes.cyan, 236 | options: { 237 | profile: 'Robo' 238 | }, 239 | onStart: () => { 240 | console.log('Robo saying: ', this.text); 241 | this.setActiveSpeaker('cyan', true); 242 | }, 243 | onStop: () => { 244 | console.log('Robo finished saying: ', this.text); 245 | this.setActiveSpeaker('cyan', false); 246 | } 247 | }); 248 | 249 | Say.queue({ 250 | text: "bonjour. je m'appelle zhora", 251 | scope: this.scopes.blue, 252 | options: { 253 | profile: 'Zhora', 254 | language: 'fr' 255 | }, 256 | onStart: () => { 257 | console.log('Zhora saying: ', this.text); 258 | this.setActiveSpeaker('blue', true); 259 | }, 260 | onStop: () => { 261 | console.log('Zhora finished saying: ', this.text); 262 | this.setActiveSpeaker('blue', false); 263 | } 264 | }); 265 | 266 | Say.queue({ 267 | text: "we are the cylon", 268 | scope: this.scopes.purple, 269 | options: { 270 | profile: 'Cylon', 271 | language: 'en' 272 | }, 273 | onStart: () => { 274 | console.log('Cylon aying: ', this.text); 275 | this.setActiveSpeaker('purple', true); 276 | }, 277 | onStop: () => { 278 | console.log('Cylon finished saying: ', this.text); 279 | this.setActiveSpeaker('purple', false); 280 | } 281 | }); 282 | 283 | Say.queue({ 284 | text: "we are the borg", 285 | scope: this.scopes.brown, 286 | options: { 287 | profile: 'Borg', 288 | language: 'en' 289 | }, 290 | onStart: () => { 291 | console.log('Borg aying: ', this.text); 292 | this.setActiveSpeaker('brown', true); 293 | }, 294 | onStop: () => { 295 | console.log('Borg finished saying: ', this.text); 296 | this.setActiveSpeaker('brown', false); 297 | } 298 | }); 299 | 300 | } 301 | 302 | } 303 | 304 | export default MultipleSpeakersApp; 305 | -------------------------------------------------------------------------------- /examples/multiplevoices-example/src/MultipleSpeakersApp.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => { 6 | const div = document.createElement('div'); 7 | ReactDOM.render(, div); 8 | ReactDOM.unmountComponentAtNode(div); 9 | }); 10 | -------------------------------------------------------------------------------- /examples/multiplevoices-example/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: sans-serif; 3 | line-height: 1.5em; 4 | } 5 | 6 | H2 { 7 | margin-left: 2em; 8 | } 9 | 10 | body, button, input, select { 11 | font-size: 18px; 12 | } 13 | 14 | pre { 15 | font-size: 15px; 16 | color: #005555; 17 | line-height: 1em; 18 | } 19 | 20 | #scopes { 21 | clear: both; 22 | position: relative; 23 | } 24 | 25 | #scopes canvas { 26 | display: inline-block; 27 | float: left; 28 | width: 100px; 29 | height: 100px; 30 | } 31 | 32 | #red .speakername { 33 | left: 0px; 34 | } 35 | 36 | #orange .speakername { 37 | left: 100px; 38 | } 39 | 40 | #yellow .speakername { 41 | left: 200px; 42 | } 43 | 44 | #green .speakername { 45 | left: 300px; 46 | } 47 | 48 | #cyan .speakername { 49 | left: 400px; 50 | } 51 | 52 | #blue .speakername { 53 | left: 500px; 54 | } 55 | 56 | #purple .speakername { 57 | left: 600px; 58 | } 59 | 60 | #brown .speakername { 61 | left: 700px; 62 | } 63 | 64 | .speakername { 65 | color: #ccc; 66 | } 67 | 68 | .speakername.active { 69 | color: #000; 70 | } 71 | 72 | .speakername { 73 | width: 100px; 74 | text-align: center; 75 | position: absolute; 76 | } 77 | 78 | #controls { 79 | clear: both; 80 | } -------------------------------------------------------------------------------- /examples/multiplevoices-example/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import MultipleSpeakersApp from './MultipleSpeakersApp'; 5 | import * as serviceWorker from './serviceWorker'; 6 | 7 | ReactDOM.render(, document.getElementById('root')); 8 | 9 | // If you want your app to work offline and load faster, you can change 10 | // unregister() to register() below. Note this comes with some pitfalls. 11 | // Learn more about service workers: http://bit.ly/CRA-PWA 12 | serviceWorker.unregister(); 13 | -------------------------------------------------------------------------------- /examples/multiplevoices-example/src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read http://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.1/8 is considered localhost for IPv4. 18 | window.location.hostname.match( 19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 20 | ) 21 | ); 22 | 23 | export function register(config) { 24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 25 | // The URL constructor is available in all browsers that support SW. 26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); 27 | if (publicUrl.origin !== window.location.origin) { 28 | // Our service worker won't work if PUBLIC_URL is on a different origin 29 | // from what our page is served on. This might happen if a CDN is used to 30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 31 | return; 32 | } 33 | 34 | window.addEventListener('load', () => { 35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 36 | 37 | if (isLocalhost) { 38 | // This is running on localhost. Let's check if a service worker still exists or not. 39 | checkValidServiceWorker(swUrl, config); 40 | 41 | // Add some additional logging to localhost, pointing developers to the 42 | // service worker/PWA documentation. 43 | navigator.serviceWorker.ready.then(() => { 44 | console.log( 45 | 'This web app is being served cache-first by a service ' + 46 | 'worker. To learn more, visit http://bit.ly/CRA-PWA' 47 | ); 48 | }); 49 | } else { 50 | // Is not localhost. Just register service worker 51 | registerValidSW(swUrl, config); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | function registerValidSW(swUrl, config) { 58 | navigator.serviceWorker 59 | .register(swUrl) 60 | .then(registration => { 61 | registration.onupdatefound = () => { 62 | const installingWorker = registration.installing; 63 | if (installingWorker == null) { 64 | return; 65 | } 66 | installingWorker.onstatechange = () => { 67 | if (installingWorker.state === 'installed') { 68 | if (navigator.serviceWorker.controller) { 69 | // At this point, the updated precached content has been fetched, 70 | // but the previous service worker will still serve the older 71 | // content until all client tabs are closed. 72 | console.log( 73 | 'New content is available and will be used when all ' + 74 | 'tabs for this page are closed. See http://bit.ly/CRA-PWA.' 75 | ); 76 | 77 | // Execute callback 78 | if (config && config.onUpdate) { 79 | config.onUpdate(registration); 80 | } 81 | } else { 82 | // At this point, everything has been precached. 83 | // It's the perfect time to display a 84 | // "Content is cached for offline use." message. 85 | console.log('Content is cached for offline use.'); 86 | 87 | // Execute callback 88 | if (config && config.onSuccess) { 89 | config.onSuccess(registration); 90 | } 91 | } 92 | } 93 | }; 94 | }; 95 | }) 96 | .catch(error => { 97 | console.error('Error during service worker registration:', error); 98 | }); 99 | } 100 | 101 | function checkValidServiceWorker(swUrl, config) { 102 | // Check if the service worker can be found. If it can't reload the page. 103 | fetch(swUrl) 104 | .then(response => { 105 | // Ensure service worker exists, and that we really are getting a JS file. 106 | const contentType = response.headers.get('content-type'); 107 | if ( 108 | response.status === 404 || 109 | (contentType != null && contentType.indexOf('javascript') === -1) 110 | ) { 111 | // No service worker found. Probably a different app. Reload the page. 112 | navigator.serviceWorker.ready.then(registration => { 113 | registration.unregister().then(() => { 114 | window.location.reload(); 115 | }); 116 | }); 117 | } else { 118 | // Service worker found. Proceed as normal. 119 | registerValidSW(swUrl, config); 120 | } 121 | }) 122 | .catch(() => { 123 | console.log( 124 | 'No internet connection found. App is running in offline mode.' 125 | ); 126 | }); 127 | } 128 | 129 | export function unregister() { 130 | if ('serviceWorker' in navigator) { 131 | navigator.serviceWorker.ready.then(registration => { 132 | registration.unregister(); 133 | }); 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./lib/say'); -------------------------------------------------------------------------------- /lib/mespeak/ESpeak.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaxcore/jaxcore-say/202c72a933455e97a38bd60d76a73711f0e6ff12/lib/mespeak/ESpeak.js -------------------------------------------------------------------------------- /lib/profiles.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "Jack": { 3 | "name": "Jack", 4 | "engine": "espeak", 5 | "default": { 6 | amplitude: 100, 7 | wordgap: 0, 8 | pitch: 10, 9 | speed: 180, 10 | variant: 'm2' 11 | }, 12 | "high": { 13 | pitch: 50 14 | }, 15 | "low": { 16 | pitch: 0 17 | }, 18 | "slow": { 19 | speed: 120 20 | }, 21 | "fast": { 22 | speed: 250 23 | } 24 | }, 25 | "Pris": { 26 | "name": "Pris", 27 | "phoneticName": "Priss", 28 | "engine": "espeak", 29 | "default": { 30 | amplitude: 100, 31 | wordgap: 0, 32 | pitch: 47, 33 | speed: 130, 34 | variant: 'f5' 35 | }, 36 | "high": { 37 | pitch: 80 38 | }, 39 | "low": { 40 | pitch: 20 41 | }, 42 | "slow": { 43 | speed: 100 44 | }, 45 | "fast": { 46 | speed: 200 47 | } 48 | }, 49 | "Roy": { 50 | "name": "Roy", 51 | "engine": "espeak", 52 | "default": { 53 | amplitude: 100, 54 | wordgap: 0, 55 | pitch: 35, 56 | speed: 180, 57 | variant: 'm1' 58 | }, 59 | "high": { 60 | pitch: 3 61 | }, 62 | "low": { 63 | pitch: 5 64 | }, 65 | "slow": { 66 | speed: 100 67 | }, 68 | "fast": { 69 | speed: 200 70 | } 71 | }, 72 | "Scotty": { 73 | "name": "Scotty", 74 | "engine": "espeak", 75 | "default": { 76 | amplitude: 100, 77 | wordgap: 0, 78 | pitch: 35, 79 | speed: 200, 80 | variant: 'm3' 81 | }, 82 | "high": { 83 | pitch: 3 84 | }, 85 | "low": { 86 | pitch: 5 87 | }, 88 | "slow": { 89 | speed: 100 90 | }, 91 | "fast": { 92 | speed: 230 93 | } 94 | }, 95 | "Xenu": { 96 | "name": "Xenu", 97 | "phoneticName": "zee-new", 98 | "engine": "espeak", 99 | "default": { 100 | amplitude: 100, 101 | wordgap: 1, 102 | pitch: 35, 103 | speed: 170, 104 | variant: 'klatt3' 105 | }, 106 | "high": { 107 | pitch: 65 108 | }, 109 | "low": { 110 | pitch: 0 111 | }, 112 | "slow": { 113 | speed: 100 114 | }, 115 | "fast": { 116 | speed: 200 117 | } 118 | }, 119 | "Cylon": { 120 | "name": "Cylon", 121 | "engine": "espeak", 122 | "default": { 123 | amplitude: 100, 124 | wordgap: 1, 125 | pitch: 35, 126 | speed: 170, 127 | variant: 'whisperf' 128 | }, 129 | "high": { 130 | pitch: 65, 131 | speed: 150 132 | }, 133 | "low": { 134 | pitch: 0, 135 | speed: 140 136 | }, 137 | "slow": { 138 | pitch: 20, 139 | speed: 100, 140 | wordgap: 1, 141 | }, 142 | "fast": { 143 | speed: 200, 144 | wordgap: 0 145 | } 146 | }, 147 | "Leon": { 148 | "name": "Leon", 149 | "phoneticName": "Leeon", 150 | "engine": "espeak", 151 | "default": { 152 | amplitude: 100, 153 | wordgap: 0, 154 | pitch: 40, 155 | speed: 150, 156 | variant: 'm7' 157 | }, 158 | "high": { 159 | pitch: 55 160 | }, 161 | "low": { 162 | pitch: 5 163 | }, 164 | "slow": { 165 | speed: 100 166 | }, 167 | "fast": { 168 | speed: 200 169 | } 170 | }, 171 | "Rachel": { 172 | "name": "Rachel", 173 | "engine": "espeak", 174 | "default": { 175 | amplitude: 100, 176 | wordgap: 0, 177 | pitch: 60, 178 | speed: 150, 179 | variant: 'f2' 180 | }, 181 | "high": { 182 | pitch: 75 183 | }, 184 | "low": { 185 | pitch: 40 186 | }, 187 | "slow": { 188 | speed: 100 189 | }, 190 | "fast": { 191 | speed: 200 192 | } 193 | }, 194 | "Zhora": { 195 | "name": "Zhora", 196 | "engine": "espeak", 197 | "default": { 198 | amplitude: 100, 199 | wordgap: 0, 200 | pitch: 60, 201 | speed: 150, 202 | variant: 'f4' 203 | }, 204 | "high": { 205 | pitch: 75 206 | }, 207 | "low": { 208 | pitch: 40 209 | }, 210 | "slow": { 211 | speed: 100 212 | }, 213 | "fast": { 214 | speed: 200 215 | } 216 | }, 217 | "Borg": { 218 | "name": "Borg", 219 | "engine": "espeak", 220 | "default": {} 221 | }, 222 | "Sam": { 223 | "name": "Sam", 224 | "engine": "sam", 225 | "default": { 226 | speed: 64, 227 | pitch: 64, 228 | throat: 128, 229 | mouth: 128 230 | }, 231 | "high": { 232 | pitch: 50 233 | }, 234 | "low": { 235 | pitch: 110 236 | }, 237 | "slow": { 238 | speed: 100 239 | }, 240 | "fast": { 241 | speed: 40 242 | } 243 | }, 244 | "Elf": { 245 | "name": "Elf", 246 | "engine": "sam", 247 | "default": { 248 | speed: 72, 249 | pitch: 64, 250 | throat: 110, 251 | mouth: 160 252 | }, 253 | "high": { 254 | pitch: 50 255 | }, 256 | "low": { 257 | pitch: 110 258 | }, 259 | "slow": { 260 | speed: 100 261 | }, 262 | "fast": { 263 | speed: 40 264 | } 265 | }, 266 | "Robo": { 267 | "name": "Robo", 268 | "engine": "sam", 269 | "default": { 270 | speed: 82, 271 | pitch: 60, 272 | throat: 190, 273 | mouth: 190 274 | }, 275 | "high": { 276 | pitch: 40 277 | }, 278 | "low": { 279 | pitch: 100 280 | }, 281 | "slow": { 282 | speed: 120 283 | }, 284 | "fast": { 285 | speed: 50 286 | } 287 | }, 288 | "Granny": { 289 | "name": "Granny", 290 | "engine": "sam", 291 | "default": { 292 | speed: 82, 293 | pitch: 35, 294 | throat: 145, 295 | mouth: 145 296 | }, 297 | "high": { 298 | pitch: 25 299 | }, 300 | "low": { 301 | pitch: 120 302 | }, 303 | "slow": { 304 | speed: 130 305 | }, 306 | "fast": { 307 | speed: 40 308 | } 309 | } 310 | 311 | }; -------------------------------------------------------------------------------- /lib/queue.js: -------------------------------------------------------------------------------- 1 | const EventEmitter = require("events"); 2 | 3 | class SpeakerQueue extends EventEmitter { 4 | constructor(speak) { 5 | super(); 6 | this._queue = []; 7 | this.speaker = speak; 8 | } 9 | 10 | clearQueue() { 11 | this._queue = []; 12 | } 13 | queue(speech) { 14 | this._queue.push(speech); 15 | this._speakNext(); 16 | } 17 | 18 | _speakNext() { 19 | if (this.isSpeaking) { 20 | return; 21 | } 22 | let next = this._queue.shift(); 23 | if (next) { 24 | this.isSpeaking = true; 25 | 26 | this.speaker.getWorkerAudioData(next.text, next.options, (audioContext, source) => { 27 | if (next.onStart) { 28 | next.onStart(next); 29 | } 30 | next.scope.loadAudioData(audioContext, source, () => { 31 | if (next.onStop) { 32 | setTimeout(() => { 33 | next.onStop(next); 34 | }, 1); 35 | } 36 | this._onEnded(); 37 | }); 38 | }); 39 | } else { 40 | this.emit('finish'); 41 | } 42 | } 43 | 44 | _onEnded() { 45 | this.isSpeaking = false; 46 | this._speakNext(); 47 | } 48 | } 49 | 50 | module.exports = SpeakerQueue; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jaxcore-say", 3 | "version": "0.0.5", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "async": { 8 | "version": "3.2.0", 9 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", 10 | "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" 11 | }, 12 | "sam-js": { 13 | "version": "git+https://github.com/jaxcore/sam.git#3fb5450033072ba494958179eb5af05325e2f07a", 14 | "from": "git+https://github.com/jaxcore/sam.git#jsonly", 15 | "dev": true 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jaxcore-say", 3 | "version": "0.0.6", 4 | "description": "Jaxcore speech synthesis library", 5 | "main": "index.js", 6 | "directories": { 7 | "lib": "lib" 8 | }, 9 | "scripts": { 10 | "test": "echo \"Error: no test specified\" && exit 1", 11 | "build-examples": "npm run build-multiple && npm run build-full && npm run build-basic && npm run build-borg && npm run copy-docs", 12 | "build-multiple": "cd examples/multiplevoices-example && npm run build", 13 | "build-full": "cd examples/full-example && npm run build", 14 | "build-basic": "cd examples/basic-example && npm run build", 15 | "build-borg": "cd examples/borg-example && npm run build", 16 | "copy-docs": "rm -rf docs/multiplevoices-example && rm -rf docs/full-example && rm -rf docs/basic-example && rm -rf docs/borg-example && mv examples/multiplevoices-example/build docs/multiplevoices-example && mv examples/full-example/build docs/full-example && mv examples/basic-example/build docs/basic-example && mv examples/borg-example/build docs/borg-example", 17 | "copy-workers-borg": "rm -f examples/borg-example/public/webworkers/* && cp -f dist/*.js examples/borg-example/public/webworkers", 18 | "copy-workers-basic": "rm -f examples/basic-example/public/webworkers/* && cp -f dist/*.js examples/basic-example/public/webworkers", 19 | "copy-workers-full": "rm -f examples/full-example/public/webworkers/* && cp -f dist/*.js examples/full-example/public/webworkers", 20 | "copy-workers-multiple": "rm -f examples/multiple-example/public/webworkers/* && cp -f dist/*.js examples/multiplevoices-example/public/webworkers", 21 | "copy-workers": "npm run copy-workers-borg && npm run copy-workers-basic && npm run copy-workers-full && npm run copy-workers-multiple", 22 | "build-workers": "rm -rf dist && npm run build-espeak-workerthread && npm run build-sam-workerthread && npm run build-sam-worker && npm run build-all-worker && npm run build-en-worker && npm run build-es-worker && npm run build-fr-worker && npm run copy-workers", 23 | "build-sam-worker": "webpack --env=sam && cat tools/webworkers/sam-interface.js >> dist/sam-worker.js", 24 | "build-all-worker": "webpack --env=all && cat tools/webworkers/espeak-interface.js >> dist/espeak-all-worker.js", 25 | "build-en-worker": "webpack --env=en && cat tools/webworkers/espeak-interface.js >> dist/espeak-en-worker.js", 26 | "build-es-worker": "webpack --env=es && cat tools/webworkers/espeak-interface.js >> dist/espeak-es-worker.js", 27 | "build-fr-worker": "webpack --env=fr && cat tools/webworkers/espeak-interface.js >> dist/espeak-fr-worker.js", 28 | "build-espeak-workerthread": "webpack --env=workerthreadall && cat tools/workerthreads/espeak-interface-workerthread.js >> dist/espeak-all-workerthread.js", 29 | "build-sam-workerthread": "webpack --env=workerthreadsam && cat tools/workerthreads/sam-interface-workerthread.js >> dist/sam-workerthread.js", 30 | "build-all": "npm run build-workers && npm run build-examples" 31 | }, 32 | "repository": { 33 | "type": "git", 34 | "url": "https://github.com/jaxcore/jaxcore-say" 35 | }, 36 | "homepage": "https://jaxcore.com", 37 | "author": "Jaxcore", 38 | "license": "GPL-3.0", 39 | "devDependencies": { 40 | "sam-js": "https://github.com/jaxcore/sam#jsonly" 41 | }, 42 | "dependencies": { 43 | "async": "^3.1.0" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaxcore/jaxcore-say/202c72a933455e97a38bd60d76a73711f0e6ff12/screenshot.png -------------------------------------------------------------------------------- /tools/webworkers/espeak-all-worker.js: -------------------------------------------------------------------------------- 1 | import meSpeak from '../../lib/mespeak'; 2 | import mespeakConfig from '../../lib/mespeak/mespeak_config.json'; 3 | meSpeak.loadConfig(mespeakConfig); 4 | 5 | import ca from "../../voices/ca.json"; 6 | import cs from "../../voices/cs.json"; 7 | import de from "../../voices/de.json"; 8 | import en from "../../voices/en/en.json"; 9 | import en_n from "../../voices/en/en-n.json"; 10 | import en_rp from "../../voices/en/en-rp.json"; 11 | import en_sc from "../../voices/en/en-sc.json"; 12 | import en_us from "../../voices/en/en-us.json"; 13 | import en_wm from "../../voices/en/en-wm.json"; 14 | import el from "../../voices/el.json"; 15 | import eo from "../../voices/eo.json"; 16 | import es from "../../voices/es.json"; 17 | import es_la from "../../voices/es-la.json"; 18 | import fi from "../../voices/fi.json"; 19 | import fr from "../../voices/fr.json"; 20 | import hu from "../../voices/hu.json"; 21 | import it from "../../voices/it.json"; 22 | import kn from "../../voices/kn.json"; 23 | import la from "../../voices/la.json"; 24 | import lv from "../../voices/lv.json"; 25 | import nl from "../../voices/nl.json"; 26 | import pt from "../../voices/pt.json"; 27 | import pt_pt from "../../voices/pt-pt.json"; 28 | import ro from "../../voices/ro.json"; 29 | import sk from "../../voices/sk.json"; 30 | import sv from "../../voices/sv.json"; 31 | import tr from "../../voices/tr.json"; 32 | import zh from "../../voices/zh.json"; 33 | import zh_yue from "../../voices/zh-yue.json"; 34 | 35 | [ca, cs, de, en, en_n, en_rp, en_sc, en_us, en_wm, el, eo, es, es_la, fi, fr, hu, it, kn, la, lv, nl, pt, pt_pt, ro, sk, sv, tr, zh, zh_yue].forEach(function(lang) { 36 | meSpeak.loadVoice(lang); 37 | }); 38 | 39 | self.meSpeak = meSpeak; -------------------------------------------------------------------------------- /tools/webworkers/espeak-en-worker.js: -------------------------------------------------------------------------------- 1 | import meSpeak from '../../lib/mespeak'; 2 | import mespeakConfig from '../../lib/mespeak/mespeak_config.json'; 3 | meSpeak.loadConfig(mespeakConfig); 4 | import lang from "../../voices/en/en-us.json"; 5 | meSpeak.loadVoice(lang); 6 | self.meSpeak = meSpeak; -------------------------------------------------------------------------------- /tools/webworkers/espeak-es-worker.js: -------------------------------------------------------------------------------- 1 | import meSpeak from '../../lib/mespeak'; 2 | import mespeakConfig from '../../lib/mespeak/mespeak_config.json'; 3 | meSpeak.loadConfig(mespeakConfig); 4 | import lang from "../../voices/es.json"; 5 | meSpeak.loadVoice(lang); 6 | self.meSpeak = meSpeak; -------------------------------------------------------------------------------- /tools/webworkers/espeak-fr-worker.js: -------------------------------------------------------------------------------- 1 | import meSpeak from '../../lib/mespeak'; 2 | import mespeakConfig from '../../lib/mespeak/mespeak_config.json'; 3 | meSpeak.loadConfig(mespeakConfig); 4 | import lang from "../../voices/fr.json"; 5 | meSpeak.loadVoice(lang); 6 | self.meSpeak = meSpeak; -------------------------------------------------------------------------------- /tools/webworkers/espeak-interface.js: -------------------------------------------------------------------------------- 1 | 2 | self.addEventListener('message', function(e) { 3 | var data = e.data; 4 | switch (data.cmd) { 5 | case 'speak': 6 | const text = data.options.replacementText? data.options.replacementText : data.text; 7 | data.options.rawdata = 'raw'; 8 | let rawdata = meSpeak.speak(text, data.options); 9 | self.postMessage({ 10 | rawdata: rawdata 11 | }); 12 | self.close(); 13 | break; 14 | } 15 | }, false); -------------------------------------------------------------------------------- /tools/webworkers/sam-interface.js: -------------------------------------------------------------------------------- 1 | 2 | self.addEventListener('message', function(e) { 3 | var data = e.data; 4 | switch (data.cmd) { 5 | case 'speak': 6 | const text = data.options.replacementText? data.options.replacementText : data.text; 7 | let buffer = SamData(text, data.options); 8 | self.postMessage({ 9 | rawdata: buffer 10 | }); 11 | self.close(); 12 | break; 13 | } 14 | }, false); -------------------------------------------------------------------------------- /tools/webworkers/sam-worker.js: -------------------------------------------------------------------------------- 1 | import {SamProcess, TextToPhonemes} from '../../node_modules/sam-js'; 2 | function SamData(text, options) { 3 | const input = TextToPhonemes(text); 4 | options = options || {}; 5 | 6 | const data = SamProcess(input, options); 7 | const audiodata = new Float32Array(data.length); 8 | for(let i=0; i < data.length; i++) { 9 | audiodata[i] = (data[i] - 128) / 256; 10 | } 11 | 12 | return audiodata; 13 | } 14 | self.SamData = SamData; -------------------------------------------------------------------------------- /tools/workerthreads/espeak-all-workerthread.js: -------------------------------------------------------------------------------- 1 | import meSpeak from '../../lib/mespeak'; 2 | import mespeakConfig from '../../lib/mespeak/mespeak_config.json'; 3 | meSpeak.loadConfig(mespeakConfig); 4 | 5 | import ca from "../../voices/ca.json"; 6 | import cs from "../../voices/cs.json"; 7 | import de from "../../voices/de.json"; 8 | import en from "../../voices/en/en.json"; 9 | import en_n from "../../voices/en/en-n.json"; 10 | import en_rp from "../../voices/en/en-rp.json"; 11 | import en_sc from "../../voices/en/en-sc.json"; 12 | import en_us from "../../voices/en/en-us.json"; 13 | import en_wm from "../../voices/en/en-wm.json"; 14 | import el from "../../voices/el.json"; 15 | import eo from "../../voices/eo.json"; 16 | import es from "../../voices/es.json"; 17 | import es_la from "../../voices/es-la.json"; 18 | import fi from "../../voices/fi.json"; 19 | import fr from "../../voices/fr.json"; 20 | import hu from "../../voices/hu.json"; 21 | import it from "../../voices/it.json"; 22 | import kn from "../../voices/kn.json"; 23 | import la from "../../voices/la.json"; 24 | import lv from "../../voices/lv.json"; 25 | import nl from "../../voices/nl.json"; 26 | import pt from "../../voices/pt.json"; 27 | import pt_pt from "../../voices/pt-pt.json"; 28 | import ro from "../../voices/ro.json"; 29 | import sk from "../../voices/sk.json"; 30 | import sv from "../../voices/sv.json"; 31 | import tr from "../../voices/tr.json"; 32 | import zh from "../../voices/zh.json"; 33 | import zh_yue from "../../voices/zh-yue.json"; 34 | 35 | [ca, cs, de, en, en_n, en_rp, en_sc, en_us, en_wm, el, eo, es, es_la, fi, fr, hu, it, kn, la, lv, nl, pt, pt_pt, ro, sk, sv, tr, zh, zh_yue].forEach(function(lang) { 36 | meSpeak.loadVoice(lang); 37 | }); 38 | 39 | global.meSpeak = meSpeak; -------------------------------------------------------------------------------- /tools/workerthreads/espeak-en-workerthread.js: -------------------------------------------------------------------------------- 1 | import meSpeak from '../../lib/mespeak'; 2 | import mespeakConfig from '../../lib/mespeak/mespeak_config.json'; 3 | meSpeak.loadConfig(mespeakConfig); 4 | import lang from "../../voices/en/en-us.json"; 5 | meSpeak.loadVoice(lang); 6 | global.meSpeak = meSpeak; -------------------------------------------------------------------------------- /tools/workerthreads/espeak-interface-workerthread.js: -------------------------------------------------------------------------------- 1 | const {parentPort} = require('worker_threads'); 2 | parentPort.once('message', (message) => { 3 | switch (message.cmd) { 4 | case 'speak': 5 | const text = message.options.replacementText? message.options.replacementText : message.text; 6 | message.options.rawdata = 'raw'; 7 | let rawdata = meSpeak.speak(text, message.options); 8 | parentPort.postMessage({ 9 | rawdata: rawdata 10 | }); 11 | parentPort.close(); 12 | break; 13 | } 14 | }); -------------------------------------------------------------------------------- /tools/workerthreads/sam-interface-workerthread.js: -------------------------------------------------------------------------------- 1 | const {parentPort} = require('worker_threads'); 2 | parentPort.once('message', (message) => { 3 | switch (message.cmd) { 4 | case 'speak': 5 | const text = message.options.replacementText? message.options.replacementText : message.text; 6 | let buffer = SamData(text, message.options); 7 | parentPort.postMessage({ 8 | rawdata: buffer 9 | }); 10 | parentPort.close(); 11 | break; 12 | } 13 | }); -------------------------------------------------------------------------------- /tools/workerthreads/sam-workerthread.js: -------------------------------------------------------------------------------- 1 | // import {SamProcess, TextToPhonemes} from '../../node_modules/sam-js'; 2 | import {SamProcess, TextToPhonemes} from 'sam-js'; 3 | console.log = function() {}; 4 | function SamData(text, options) { 5 | const input = TextToPhonemes(text); 6 | options = options || {}; 7 | 8 | const data = SamProcess(input, options); 9 | const audiodata = new Float32Array(data.length); 10 | for(let i=0; i < data.length; i++) { 11 | audiodata[i] = (data[i] - 128) / 256; 12 | } 13 | 14 | return audiodata; 15 | } 16 | global.SamData = SamData; 17 | -------------------------------------------------------------------------------- /voices/ca.json: -------------------------------------------------------------------------------- 1 | { 2 | "voice_id":"ca", 3 | "dict_id":"ca_dict", 4 | "dict":"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", 5 | "voice":"bmFtZSBjYXRhbGFuCmxhbmd1YWdlIGNhCmdlbmRlciBtYWxlCgo=" 6 | } -------------------------------------------------------------------------------- /voices/el.json: -------------------------------------------------------------------------------- 1 | { 2 | "voice_id":"el", 3 | "dict_id":"el_dict", 4 | "dict":"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", 5 | "voice":"bmFtZSBncmVlawpsYW5ndWFnZSBlbApnZW5kZXIgbWFsZQoKCg==" 6 | } -------------------------------------------------------------------------------- /voices/eo.json: -------------------------------------------------------------------------------- 1 | { 2 | "voice_id":"eo", 3 | "dict_id":"eo_dict", 4 | "dict":"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", 5 | "voice":"bmFtZSBlc3BlcmFudG8KbGFuZ3VhZ2UgZW8KZ2VuZGVyIG1hbGUK" 6 | } -------------------------------------------------------------------------------- /voices/es-la.json: -------------------------------------------------------------------------------- 1 | { 2 | "voice_id":"es-la", 3 | "dict_id":"es_dict", 4 | "dict":"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", 5 | "voice":"bmFtZSBzcGFuaXNoLWxhdGluLWFtZXJpY2FuCmxhbmd1YWdlIGVzLWxhCmxhbmd1YWdlIGVzLW14IDYKZ2VuZGVyIG1hbGUKCnBob25lbWVzIGVzLWxhCmRpY3RydWxlcyAyCmludG9uYXRpb24gMgpzdHJlc3NMZW5ndGggMTcwIDIwMCAgMTgwIDE4MCAgMCAwICAyNTAgMjgwCgpyZXBsYWNlIDAwIFQgcwo=" 6 | } -------------------------------------------------------------------------------- /voices/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "voice_id":"es", 3 | "dict_id":"es_dict", 4 | "dict":"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", 5 | "voice":"bmFtZSBzcGFuaXNoCmxhbmd1YWdlIGVzCmdlbmRlciBtYWxlCgpkaWN0cnVsZXMgMQppbnRvbmF0aW9uIDMKCg==" 6 | } -------------------------------------------------------------------------------- /voices/fi.json: -------------------------------------------------------------------------------- 1 | { 2 | "voice_id":"fi", 3 | "dict_id":"fi_dict", 4 | "dict":"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", 5 | "voice":"bmFtZSBmaW5uaXNoCmxhbmd1YWdlIGZpCmdlbmRlciBtYWxlCgo=" 6 | } -------------------------------------------------------------------------------- /voices/kn.json: -------------------------------------------------------------------------------- 1 | { 2 | "voice_id":"kn", 3 | "dict_id":"kn_dict", 4 | "dict":"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7QwAADcAAADuDAAAOAAAAO8MAAA5AAAAAAAAAAYBBgADIwAHBgEHAAN2AAcGAQgAAyUABwYBCQADcAAHBgEKAAMoAAcGAQsAA3sABwYBDAADIigABwYBDwADJAAHBgEQAANyAAcGAREAA4YABwYBEwADJwAHBgEUAAN3AAcGARUAA4cABwYBFgACEUIDMQADMSMABwYBFwACEUIDkgADkiMABwYBGAACEUIDTwADTyMABwYBGQACEUIDkwADkyMABwYBGgACEUIDQgADQiMABwYBGwACEUIDTgADTiMABwYBHAACEUIDkAADkCMABwYBHQACEUIDTQADTSMABwYBHgACEUIDkQADkSMABwYBHwACEUIDQQADQSMABwYBIAACEUIDjAADjCMABwYBIQACEUIDjgADjiMABwYBIgACEUIDjQADjSMABwYBIwACEUIDjwADjyMABwYBJAACEUIDQAADQCMABwYBJQACEUIDLwADLyMABwYBJgACEUIDigADiiMABwYBJwACEUIDRgADRiMABwYBKAACEUIDiwADiyMABwYBKQACEUIDMgADMiMABwYBKwACEUIDMAADMCMABwYBLAACEUIDiAADiCMABwYBLQACEUIDRQADRSMABwYBLgACEUIDiQADiSMABwYBLwACEUIDPwADPyMABwYBMAACEUIDOQADOSMABwYBMQACEUIDIgADIiMABwYBMgACEUIDIgADIiMABwYBMwACEUIDNwADNyMABwYBNAACEUIDPgADPiMABwYBNgACEUIDUgADUiMABwYBNwACEUIDXwADXyMABwYBOAACEUIDWwADWyMABwYBOQACEUIDVwADVyMABwYBOgACEUIDaQADaSMABwYBXwACEUIDUQADUSMABwYBYQADLAAHBuCkAAMVaGkABwbgpQADFWhpAAcG4LIAvwMlAIIDPwCDA2kAvgN2AAcG4LMAjQMABJUDDACWAIMDIigAhgMkAIoDJwCBAygAhAMsDACAA3AAhwNyAIsDdwCCA3sAiAOGAIwDhwAHBgAkA0Z3PiMiAAcA", 5 | "voice":"bmFtZSBrYW5uYWRhCmxhbmd1YWdlIGtuCgppbnRvbmF0aW9uIDIKLy9jb25zb25hbnRzIDgwCg==" 6 | } -------------------------------------------------------------------------------- /voices/la.json: -------------------------------------------------------------------------------- 1 | { 2 | "voice_id":"la", 3 | "dict_id":"la_dict", 4 | "dict":"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", 5 | "voice":"bmFtZSBsYXRpbgpsYW5ndWFnZSBsYQpnZW5kZXIgbWFsZQpzdHJlc3NydWxlIDIgMzMgMCAyCi8vIHJ1bGU9cGVudWx0aW1hdGUKLy8gZmxhZ3M9MDEwMDAwMSAobm8gYXV0b21hdGljIHNlY29uZGFyeSBzdHJlc3MgKyBkb24ndCBzdHJlcyBtb25vc3lsbGFibGVzKQovLyB1bnN0cmVzc2VkX3dkMT0wCi8vIHVuc3RyZXNzZWRfd2QyPTIKCi8vIHNob3J0IGdhcCBiZXR3ZWVuIHdvcmRzCndvcmRzIDIKCi8vIE5vdGU6IFRoZSBMYXRpbiB2b2ljZSBuZWVkcyBsb25nIHZvd2VscyB0byBiZSBtYXJrZWQgd2l0aCBtYWNyb25zCg==" 6 | } -------------------------------------------------------------------------------- /voices/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "voice_id":"tr", 3 | "dict_id":"tr_dict", 4 | "dict":"AAQAADUNAAAAAAAKhwkTExYFw6dBAAAFQQQjAAAGwgUAEQkACscsFNQE085UQQAABkEIRSQAAAnGNBMBUZBAQgAAAAZBDElrAAAAEgRfCAEDLwZrM1dZIzAxBiMAAAAGQRBGawAAAAbDJNGAEQAABUEUawAAAAAHxARmTzhBAAZBGFFrAAAAAAjEZPLTBEgcAAZBHE1rAAAAAAAGQSBpawAAAAAABUEkJQAACgElOW9WRmsAGwAIASYLUgZrAAAABkEoWGsAAAAMASo5Bg03Rg1WABsACQErIzMvDQAbAAZBLDEjAAAAAAAGQTA3awAAAAAABkE0P2sAAAAAAAjFFEJSOFBCBkE4MmsAAAAHw0yWgEwJAAAFwTxMCQAJAT1rWXovABsAAAAGQUAwawAACcZMk1MlkEhBBsIEIBEJAAfDBCEAEQkAAAdBRDFSawAAAAAABkFIM2sAAAAAAAeExZ8UCREGwyTSwhEGwyTSwhEGQUxXawAAAAAABkFQL2sAAAbDUQBPEQAAAAVBVCgAAAAAAAZBWFJrAAAHhAHDtgYRAAAADEFcRihFazdSBmsAAAAAAAdBYGsxVwAAAAAABkFkOWsAAAAAAAZBaFZrAAAAAAAAAAqHAgkOB8O2DEEAAAAAAAAAAAAAAAAAAAAAAAbDPSEVQQAAAAAGwxlAQREAAAbDBGQAEQAAAAbDUJIWEQAAAAAAAAAAAAbCEBBICQAAAAAJxiASywUiQEEAAAAACcYsFlMVIkBBBsIJUEwJAAAAAAAGwwVjQBEAAAAAAAAAAAAAAAAAAAjFIJUMFSBBAAAAAAAAAAAAAAAAAAAAB8RMk49AQQAAAAAAAAAAAAAAAAAIxTRUkyTgQQAAAAAAAAAAAAbCEFBICQAAAAAGwwS0ABEAABAEXwQQFApSJTNPBG83FwAAAAAAC8gk44ckxQVIUEMAAAAAAAAAAAfELJMJTEEHxED01ARBDQRfFAwEL3o3RgZrAAAAAAAAAAAAAAAAAAAAAAAHw1hWQUgcAAjFBNBTZBBCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfDCFOATAkAB8QIE4sEQQAAAAAAAAAAAAjFTBNTVOBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMUIlQwlMEEAAAbDPTCAEQAHxEgRGTxBAAAAAAAAAAoD4oKsI1IzbAAAAAAAAAAAAAAAAAAAB8RMlYFMQQbDFQELEQAAAAAAAAAAAAAAAAAIxQUlFiTgQQAAAAAAEQRfDQMOKFYGIy8/IyU/egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgNfM1gnLyhWAAAJA18wQzluVgAAAAAAAAAAAAAAAAAHxCzzmQRBAAAAAA0DXzJDBiVOJTluVgAAAAnGUVODFMJAQQ6LC8SxEgsMARIFDAlBAAAAAAbDBJINEQwDXzExBicyRSUzAAAIA18xMCcyAAAADANfMTIGJzIlTiUAAAAAAAbDJIEAEQAADANfN1g5JC8/JVkAAAAAAAAAAAAAB8QgFQFkQQ6LC8SxEwvEsRYSAQtBAAAGwwjzFUEAAAAAAAgDXzFYJzIAAAAAAAAAAAALA18yWDklMz8lAAAAAAAADIkQw7wUw7wSBwVCAAAACIXEsQ0LAhEAAAqHCcSfBMSxEkEACcZMEsFJkEBCAAANA18/P1drP0UGbDcAAAAACgNfNFgxDTMxAAAAAAALiAvDvBQBCBkBQgAAAAAKA181WCQ3NyUAAAAIxQjxElTQQQAAAAAAAAwDXzZYIzcvPw1ZAAAAAAAAAAAACsclNNQE4JUwQgAAAAAAAAAIhRXFnwELQQAMA184WFckMVdrMgAAAAAAAAAABsIskEgcAAwDXzlYRicxVyMyAAAAAAAAAAAGwjVQSAkKA18/QWkjM1EAAAAAAAAAAAAAAAAACMU0FIQk4EEACcYEw0E5kEBCAAeDDcO8SAkOBF8PBw8nTycyBmsxAAAAAAAAB4PFnxVMCQAAAAbDUTFAEQAAAAAAB4MNxLFICQAAAAbDUTJAEQAAAAAAAAANBF8wTTI/JTc5JzIAAAfDTFOATAkNBF8wTTM/JTc5IyIAAAnGCFNCFZBaQQAKBF8wTTFFejIAABMEXwISFjENVwYjNy8/IyU/egAAAAAAAAAACMUIFQ0E4EEAAA2Kw6cBDgELCwEMBUIHhMO2ExMRAAAACcYIFkJVJQBBAAAACMVk9ocFQEEABsI0kEgJAAbDUTZEEQAAAAeEw7YUFhEAAAAAAAAAAAAAAAALiATDvA0Ew7waQQAAAAAJxjRUiAQgQEEABsM8UMQRAAAAAAAAAAAAAAAAAAAAAAmGAcSfEsSxQQAAAAAAAAuIEwEQEwESxLFBAA0EXwMJElkjMDEGIwAADYrDpwEOC8SxEsSxQQAAAAAAAAAJxlS0gWTgQEIAAAfETJJSUEEAAAAAB8QdNkkgEQAQBF8BAxVSbTNPBm0lP3oAAAAAAAAAAAAAAA0EXxIOB2kjNzEGIwAAAAAJxhBTiWjCQEIAAAAAAAAAAAAACYYBGQTEsQ5BAAAAAAAAAAmGDRXEnwwBQQiFw7bEsQIRAAAAFQRfAQMySgZ6US9SbTNPBm0lP3oAAAAAAAbCUBBICQAHhMO2GQsRAAAAAAAACMUFZJVAEEEAAAeEw7YGCxEAAAAAAAAAAAAAAAAAB8RQ008IEQAAAAuIxZ/EsRIOAQtBAAAAAAAADALCp0prMk0GazcAAAAAB4TDtgQQEQAAAAAAEQLEnzkoPyhZBiMxD00GawAHAsOnSmsAAAnGNBTNBWJAQQiFw7YTGQ0RAAAAAAAADgLCtjAjECNPMwYjUQAABwLFn1lrAAAAAAAABsNUJAARDALCsEYkECRJBmsAAAmGDgnEnwQFQQAGAsO2ewAAAAAADARfAwUEaQYjM1EAAAjFCVSEVSBBAAAABsNVIYFBAAAGwlBQSAkGAsO8bgAAAAAKhwIBEhTEsQ5BAAAGAsSxDQAAAAjFBOLBSBBBAAbDBCHTEQAGw1UxABEAAAAABsNks0ARBsMEs0ARAAAAAAAAAAAAAAAHhMO2CQIRAAAAAAAAAAAAAAAAAAAAAAAAB8RQ8sFQQQyJCxUSFBUMFcWfQQAAAAAAAAAABgJfD2wAAAAAAAAAAAAAAAAAAAAABsJYUEgcAAAAAAALAl8jRiU5BmtWAAAUAl8iLw0zMgYjMSVZIxAkLwZ6AAATAl8hbzI3Bms/JVkjECQvBHoAAAAOAl8nIzBsVy8zBmxRAAAQAl8mUgZrJVkjECQvBnoAAAAHhMO2CRYRAAANBF8DARBFbjkGbzEAABICXykxIzAjMCMQIzIvBmtWAAAQAl8oI0owIxAjMi8Ga1YAABACXy8kOQZ6MUp6Vk8GegAACwJfLjJsMS8GIwAAEAJfLTEGDVcjSnpWTwZ6AAAJxjVRATmQQEIJxgTlATGQQEIMAl8sUnozTQZvNwAAB8MIlIBMCQcCXzNvSgAACAJfMiVOJQAACYbDpw8SFQ1BCcZAVNAU0IVBCAJfMUUlMwAACgJfMFcNUQ0zAAAJAl83OSRGJQAACQJfNiM3Lw0AAAgCXzVFJFkAAAkCXzRGezMvAAAUAl87MmwxLyM3Bg1SejNNBm83AAAPAl86JTEGejJsMS8GIwAACgJfOUYnMShWAAAGw0iWhUEKAl84VyROJVYAABICXz9XJzMGbSVZIxAkLwR6AAAAAAAHwwiWgEwJAAAAEAJfQDFtOTNtMTcGbQYjAAAAAAAAAAAAAAAAABAEX+KApgZvSjJsMS8GIwAAAAAAAAbDFLHAEREEX+KAmS9rMS8NMzIGIzEAAAyJBA8TBA/EnxIVQREEX+KAmC9rMS8NMzIGIzEAEARfBA8Ub1cvMmwxLwYjAAAAAAfDJMFASAkAABIEX+KAkwYoVm0ySnpWTwZ6AAAADwJfXwQjNy9KelZPBnoAABYCX156MkkGazcvP2slWSMQJC8GegAAABYCX1wvBmszVw8kOQR6MUp6Vk8GegAAAAAAAAbDUNPAEQAAEY4LxLEQC8SxEg3EsRrEsUEAAAAAABAEXwcSFgYjMVcjMiU/egAABsM8dMARAAAAAAAAAAAAAAAADgRfBAkBbT83IwZtLwAAAAAAAA4CX345IzE3I1kGDTEAAAAAAAAAAAAAAAAAAAzJJTTLFOEFSVOAQgAAAAAAAAAAAAnGJTQBSUBAQgAAAAjFJaaNJSBBAAAAAAAAAAAAAAAAAAAGwwVDQBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8QJVJMEQQAJhgTDvBoDBUEAAAAAAAAHwwTQQBxBAAAAAAAACMU09M09IEEAAAAAAAAAAAAAAAAAAAAAAAyJFAULCRIEAcSfQgAAAAAAAAAAAA2KE8SxDRPEsQMBC0EAAAAABsMFRYARAAAAAAAAAAAAAAAAAAAAAAAABhJCw6cAxZ8AZgBoAGsAcABxAHMAdAAHBhQAYAAAACcAAAAAAAAABsOnAANKAAcGw7YAA3sABwbDvABuw7x6ARUCIA6AgIQDAm4yblYAbQEVAiAOgICCAwJuPwB6ARUCIA6AgIIDAm5WAAQDbgABFQIgDoCAgQBuARUCIA6AgIIDbjIAeW9yARUCIA6AgIQDbjkCJzMABwbEnwABEUEDDA8ABAFlAzkAAWkAA2IABQEBEUEDfAAHBsSxAG7EsXoBFQIgDoCAhAMCDTINVgBtARUCIA6AgIIDAg0/AHoBFQIgDoCAggMCDVYABAMNAAEVAiAOgICBAG4BFQIgDoCAggMNMgB5b3IBFQIgDoCAhAMNOQInMwAHBsWfAANZAAcGYQAEAyMAARUCIA6AgIEAbMSxbQEVAiAOgICEAyM3DT8AecSxbQEVAiAOgICEAyM5DT8AY2FrARUCIA6AgIQDI0kjMQBjYWttxLHFnwEVAiAOgICHAyNJIzE/Ag1ZAHZydQEVAnBhAyNSIgYoAHPEsW4BFQIgDoCAhAMjVw0yAAcGYgADRQAHBmMAA0kABwZkAMSxcgIgDoCAgwMCRg0zAGlyAiAOgICDAwJGJTMAdXICIA6AgIMDAkYoMwDDvHICIA6AgIMDAkZuMwAIAmXEn2lsAwZGAANGAMSxAiAOgICCA0YNAMSxawIgDoCAgwNGDTEAxLFuAiAOgICDA0YNMgDEsW7EsXoCIA6AgIUDRg0yDVYAxLFsYXICIA6AgIUDRg03IzMAxLFtAiAOgICDA0YNPwBhAiAOgICCA0YjAGFuAiAOgICDA0YjMgBlAiAOgICCA0YkAGVuAiAOgICDA0YkMgBpAiAOgICCA0YlAGlrAiAOgICDA0YlMQBpbgIgDoCAgwNGJTIAaW5pegIgDoCAhQNGJTIlVgBpbGVyAiAOgICFA0YlNyQzAGltAiAOgICDA0YlPwB1AiAOgICCA0YoAHVrAiAOgICDA0YoMQB1bgIgDoCAgwNGKDIAdW51egIgDoCAhQNGKDIoVgB1bGFyAiAOgICFA0YoNyMiAHVtAiAOgICDA0YoPwDDvAIgDoCAggNGbgDDvGsCIA6AgIMDRm4xAMO8bgIgDoCAgwNGbjIAw7xuw7x6AiAOgICFA0ZuMm5WAMO8bGVyAiAOgICFA0ZuNyQiAMO8bQIgDoCAgwNGbj8ABwZlAAQDJAABFQIgDoCAgQBsaW0BFQIgDoCAhAMkNyU/AHlpbQEVAiAOgICEAyQ5JT8AY2VrARUCIA6AgIQDJEkkMQBjZWttacWfARUCIA6AgIcDJEkkMT8CJVkAc2luARUCIA6AgIQDJFclMgAHBmYAA1EABwZnAAQCZQNNAAJpAALDtgACw7wAA08ABwZoAANpAAcGaQBuaXoBFQIgDoCAhAMCJTIlVgBtARUCIA6AgIIDAiU/AHoBFQIgDoCAggMCJVYABAMlAAEVAiAOgICBAG4BFQIgDoCAggMlMgB5b3IBFQIgDoCAhAMlOQInMwAHBmoAA1gABwZrAGVuAiAOgICDAwJOJDIAAzEABAJlA04AAmkAAsO2AALDvAAHBmwAYQIgDoCAggMCNyMAZQIgDoCAggMCNyQAAzcAxLECIA6AgIIDNw0AxLFrAiAOgICDAzcNMQBhcgIgDoCAgwM3IzMAZXICIA6AgIMDNyQzAGkCIA6AgIIDNyUAaWsCIA6AgIMDNyUxAHUCIA6AgIIDNygAdWsCIA6AgIMDNygxAMO8AiAOgICCAzduAMO8awIgDoCAgwM3bjEABwZtAGECIA6AgIIDAj8jAGUCIA6AgIIDAj8kAAM/AAcGbgADMgDEsW4CIA6AgIMDMg0yAGluAiAOgICDAzIlMgB1bgIgDoCAgwMyKDIAZGEIAiADMkYjAGRhbggCIAMyRiMyAGRlCAIgAzJGJABkZW4IAiADMkYkMgDDvG4CIA6AgIMDMm4yAAcGbwADJwAHBnAAAzAABwZxAAMxAAcGcgBhAiAOgICCAwIzIwBlAiAOgICCAwIzJAABEUECEUEDEAADMwBhAiAYAzMjAGUCIBgDMyQABwZzAMSxbsSxegIgDoCAhQMCVw0yDVYAYQIgDoCAggMCVyMAYWsCIA6AgIMDAlcjMQBhbgIgDoCAgwMCVyMyAGFuxLF6AiAOgICFAwJXIzINVgBhbQIgDoCAgwMCVyM/AGUCIA6AgIIDAlckAGVrAiAOgICDAwJXJDEAZW4CIA6AgIMDAlckMgBlbml6AiAOgICFAwJXJDIlVgBlbQIgDoCAgwMCVyQ/AGluaXoCIA6AgIUDAlclMiVWAHVudXoCIA6AgIUDAlcoMihWAMO8bsO8egIgDoCAhQMCV24yblYAA1cABwZ0AMSxcgESQgIgDoCAgwMCLw0zAGlyARJCAiAOgICDAwIvJTMAdXIBEkICIA6AgIMDAi8oMwDDvHIBEkICIA6AgIMDAi9uMwADLwBhAiAOgICCAy8jAGFuAiAOgICDAy8jMgBlAiAOgICCAy8kAGVuAiAOgICDAy8kMgAHBnUAbnV6ARUCIA6AgIQDAigyKFYAbQEVAiAOgICCAwIoPwB6ARUCIA6AgIIDAihWAAQDKAABFQIgDoCAgQBuARUCIA6AgIIDKDIAeW9yARUCIA6AgIQDKDkCJzMABwZ2AANSAAcGdwADOgAHBngAAzFXAAEZA1YABwZ5AMSxbsSxegIgDoCAhQMCOQ0yDVYAxLFtAiAOgICDAwI5DT8AxLF6AiAOgICDAwI5DVYAaW5pegIgDoCAhQMCOSUyJVYAaW0CIA6AgIMDAjklPwBpegIgDoCAgwMCOSVWAHVudXoCIA6AgIUDAjkoMihWAHVtAiAOgICDAwI5KD8AdXoCIA6AgIMDAjkoVgBsYQIgDoCAgwMCOTcjAGxlAiAOgICDAwI5NyQAw7xuw7x6AiAOgICFAwI5bjJuVgDDvG0CIA6AgIMDAjluPwDDvHoCIA6AgIMDAjluVgADOQDEsQIgDoCAggM5DQBhAiAOgICCAzkjAGFsxLFtAiAOgICFAzkjNw0/AGF5xLFtAiAOgICFAzkjOQ0/AGFjYWsCIA6AgIUDOSNJIzEAYWNha23EscWfAiAOgICIAzkjSSMxPwINWQBhc8SxbgIgDoCAhQM5I1cNMgBlAiAOgICCAzkkAGVsaW0CIA6AgIUDOSQ3JT8AZXlpbQIgDoCAhQM5JDklPwBlY2VrAiAOgICFAzkkSSQxAGVjZWttacWfAiAOgICIAzkkSSQxPwIlWQBlc2luAiAOgICFAzkkVyUyAGkCIA6AgIIDOSUAdQIgDoCAggM5KABrZW4CIA6AgIQDOU4CJDIAw7wCIA6AgIIDOW4ABwZ6AANWAAcGACcCDoKEgAMAJANGJzcjIgAEw6QDawDJmQAHAA==", 5 | "voice":"bmFtZSB0dXJraXNoCmxhbmd1YWdlIHRyCmdlbmRlciBtYWxlCgo=" 6 | } -------------------------------------------------------------------------------- /voices/zh-yue.json: -------------------------------------------------------------------------------- 1 | { 2 | "voice_id":"zh-yue", 3 | "dict_id":"zhy_dict", 4 | "dict":"AAQAAAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmEABQEDFQAFAgMjAGEFAgNwAGFpBQIDcQBhdQUCA3IAYW5nBQIDdABpBQIDdQB1BQIDdgAHBmIABQEDFQAFAgNFAAcGYwAFAQMVAGgFAgNKAAUCA04ABwZkAAUBAxUABQIDRgAHBmUABQEDFQAFAgMkAGkFAgN3AHUFAgN5AG8FAgOEAG9pBQIDhQAHBmYABQEDFQAFAgNRAAcGZwAFAQMVAAUCA08ABwZoAAUBAxUABQIDaQAHBmkABQEDFQAFAgMlAHUFAgN7AAcGagAFAQMVAAUCAzkABwZrAAUBAxUABQIDMQAHBmwABQEDFQAFAgM3AAcGbQAFAQMVAAUCAz8ABwZuAAUBAxUABQIDMgBnBQIDQgAHBm8ABQEDFQAFAgMnAGkFAgN+AHUFAgN/AG5nBQIDgABlBQIDgwAHBnAABQEDFQAFAgMwAAcGcQAFAQMVAAUCAzEAdQUCAzE6AAcGcgAFAQMVAAUCAyIABwZzAAUBAxUABQIDVwAHBnQABQEDFQAFAgMvAAcGdQAFAQMVAAUCAygAaQUCA4IABwZ2AAUBAxUABQIDUgAHBncABQEDFQAFAgM6AAcGeAAFAQMVAAUCAzFXAAcGeQAFAQMVAAUCAzkAdQUCA4YABwZ6AAUBAxUABQIDVgAHBgAxAxEAMgNqADMDawA0A2wANQNtADYDbgA3A28ABwA=", 5 | "voice":"bmFtZSBjYW50b25lc2UKbGFuZ3VhZ2UgemgteXVlCmxhbmd1YWdlIHl1ZQpsYW5ndWFnZSB6aHkKCnRyYW5zbGF0b3Igemh5CnBob25lbWVzIHpoeQpkaWN0aW9uYXJ5IHpoeQpnZW5kZXIgbWFsZQoKLy8gaW50ZXJwcmV0IEVuZ2xpc2ggbGV0dGVycyBhcyAxPUVuZ2xpc2ggd29yZHMsIDI9anl1dHBpbmcKZGljdHJ1bGVzIDEKCndvcmRzIDEK" 6 | } -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = function(env) { 4 | if (env.startsWith('workerthread')) { 5 | let name; 6 | if (env === 'workerthreaden') { 7 | name = 'espeak-en-workerthread'; 8 | } 9 | if (env === 'workerthreadall') { 10 | name = 'espeak-all-workerthread'; 11 | } 12 | if (env === 'workerthreadsam') { 13 | name = 'sam-workerthread'; 14 | } 15 | console.log('building workerthread', name); 16 | return { 17 | entry: './tools/workerthreads/'+name+'.js', 18 | output: { 19 | filename: name+'.js', 20 | path: path.resolve(__dirname, 'dist') 21 | } 22 | }; 23 | } 24 | else { 25 | let name = (env === 'sam') ? 'sam-worker' : 'espeak-' + env + '-worker'; 26 | console.log('building', name); 27 | return { 28 | entry: './tools/webworkers/' + name + '.js', 29 | output: { 30 | filename: name + '.js', 31 | path: path.resolve(__dirname, 'dist') 32 | } 33 | }; 34 | } 35 | }; --------------------------------------------------------------------------------