diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..8ce12dd
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,12 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.{js,json,yml}]
+indent_style = space
+indent_size = 2
+max_line_length = 79
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5ae7945
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+/generators
+/node_modules
+*.tgz
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..0b64e25
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Rauli Laine
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..54cfffb
--- /dev/null
+++ b/README.md
@@ -0,0 +1,15 @@
+# oddcast-tts-demo
+
+Helper functions for generating MP3 URLs from text using oddcast.com's
+text-to-speech demo.
+
+## Usage
+
+```JavaScript
+const { buildUrl, voices } = require('oddcast-tts-demo');
+
+buildUrl('Hello, World.', voices.daniel);
+
+// Produces:
+// https://cache-a.oddcast.com/c_fs/3053a357f5d3a85a17182971a84007c9.mp3?engine=4&language=1&voice=5&text=Hello%2C%20World.&useUTF8=1
+```
diff --git a/lib/build-hash.js b/lib/build-hash.js
new file mode 100644
index 0000000..0402702
--- /dev/null
+++ b/lib/build-hash.js
@@ -0,0 +1,14 @@
+const md5 = require('md5');
+
+module.exports = (text, voice) => {
+ const { id, language, engine } = voice;
+ const fragments = [
+ `${engine}`,
+ `${id}`,
+ `${language.id}`,
+ 'mp3',
+ text
+ ];
+
+ return md5(fragments.join(''));
+};
diff --git a/lib/build-url.js b/lib/build-url.js
new file mode 100644
index 0000000..40dec8f
--- /dev/null
+++ b/lib/build-url.js
@@ -0,0 +1,17 @@
+const buildUrl = require('build-url');
+
+const buildHash = require('./build-hash');
+
+module.exports = (text, voice, hash = null) => buildUrl(
+ 'https://cache-a.oddcast.com',
+ {
+ path: `c_fs/${hash || buildHash(text, voice)}.mp3`,
+ queryParams: {
+ engine: voice.engine,
+ language: voice.language.id,
+ voice: voice.id,
+ text,
+ useUTF8: 1
+ }
+ }
+);
diff --git a/lib/index.js b/lib/index.js
new file mode 100644
index 0000000..729bcfd
--- /dev/null
+++ b/lib/index.js
@@ -0,0 +1,4 @@
+module.exports.languages = require('./languages');
+module.exports.voices = require('./voices');
+module.exports.buildHash = require('./build-hash');
+module.exports.buildUrl = require('./build-url');
diff --git a/lib/languages.js b/lib/languages.js
new file mode 100644
index 0000000..76c324f
--- /dev/null
+++ b/lib/languages.js
@@ -0,0 +1,147 @@
+module.exports = {
+ ar: {
+ name: 'Arabic',
+ id: 27,
+ code: 'ar'
+ },
+ eu: {
+ name: 'Basque',
+ id: 22,
+ code: 'eu'
+ },
+ ca: {
+ name: 'Catalan',
+ id: 5,
+ code: 'ca'
+ },
+ zh: {
+ name: 'Chinese',
+ id: 10,
+ code: 'zh'
+ },
+ cs: {
+ name: 'Czech',
+ id: 18,
+ code: 'cs'
+ },
+ da: {
+ name: 'Danish',
+ id: 19,
+ code: 'da'
+ },
+ nl: {
+ name: 'Dutch',
+ id: 11,
+ code: 'nl'
+ },
+ en: {
+ name: 'English',
+ id: 1,
+ code: 'en'
+ },
+ eo: {
+ name: 'Esperanto',
+ id: 31,
+ code: 'eo'
+ },
+ fi: {
+ name: 'Finnish',
+ id: 23,
+ code: 'fi'
+ },
+ fr: {
+ name: 'French',
+ id: 4,
+ code: 'fr'
+ },
+ gl: {
+ name: 'Galician',
+ id: 15,
+ code: 'gl'
+ },
+ de: {
+ name: 'German',
+ id: 3,
+ code: 'de'
+ },
+ el: {
+ name: 'Greek',
+ id: 8,
+ code: 'el'
+ },
+ hi: {
+ name: 'Hindi',
+ id: 24,
+ code: 'hi'
+ },
+ hu: {
+ name: 'Hungarian',
+ id: 29,
+ code: 'hu'
+ },
+ id: {
+ name: 'Indonesian',
+ id: 28,
+ code: 'id'
+ },
+ it: {
+ name: 'Italian',
+ id: 7,
+ code: 'it'
+ },
+ ja: {
+ name: 'Japanese',
+ id: 12,
+ code: 'ja'
+ },
+ ko: {
+ name: 'Korean',
+ id: 13,
+ code: 'ko'
+ },
+ no: {
+ name: 'Norwegian',
+ id: 20,
+ code: 'no'
+ },
+ pl: {
+ name: 'Polish',
+ id: 14,
+ code: 'pl'
+ },
+ pt: {
+ name: 'Portuguese',
+ id: 6,
+ code: 'pt'
+ },
+ ro: {
+ name: 'Romanian',
+ id: 30,
+ code: 'ro'
+ },
+ ru: {
+ name: 'Russian',
+ id: 21,
+ code: 'ru'
+ },
+ es: {
+ name: 'Spanish',
+ id: 2,
+ code: 'es'
+ },
+ sv: {
+ name: 'Swedish',
+ id: 9,
+ code: 'sv'
+ },
+ th: {
+ name: 'Thai',
+ id: 26,
+ code: 'th'
+ },
+ tr: {
+ name: 'Turkish',
+ id: 16,
+ code: 'tr'
+ }
+};
diff --git a/lib/voices.js b/lib/voices.js
new file mode 100644
index 0000000..958e257
--- /dev/null
+++ b/lib/voices.js
@@ -0,0 +1,1418 @@
+const languages = require('./languages');
+
+module.exports.alan = {
+ name: 'Alan',
+ dialect: 'Australian',
+ id: 9,
+ engine: 2,
+ language: languages.en,
+ gender: 'M'
+};
+
+module.exports.allison = {
+ name: 'Allison',
+ dialect: 'US',
+ id: 7,
+ engine: 2,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.ashley = {
+ name: 'Ashley',
+ dialect: 'US',
+ id: 6,
+ engine: 3,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.beth = {
+ name: 'Beth',
+ dialect: 'US',
+ id: 8,
+ engine: 3,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.bridget = {
+ name: 'Bridget',
+ dialect: 'UK',
+ id: 4,
+ engine: 3,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.catherine = {
+ name: 'Catherine',
+ dialect: 'UK',
+ id: 6,
+ engine: 2,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.daniel = {
+ name: 'Daniel',
+ dialect: 'UK',
+ id: 5,
+ engine: 4,
+ language: languages.en,
+ gender: 'M'
+};
+
+module.exports.dave = {
+ name: 'Dave',
+ dialect: 'US',
+ id: 2,
+ engine: 2,
+ language: languages.en,
+ gender: 'M'
+};
+
+module.exports.elizabeth = {
+ name: 'Elizabeth',
+ dialect: 'UK',
+ id: 4,
+ engine: 2,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.fiona = {
+ name: 'Fiona',
+ dialect: 'Scottish',
+ id: 12,
+ engine: 4,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.grace = {
+ name: 'Grace',
+ dialect: 'Australian',
+ id: 10,
+ engine: 2,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.hugh = {
+ name: 'Hugh',
+ dialect: 'UK',
+ id: 5,
+ engine: 3,
+ language: languages.en,
+ gender: 'M'
+};
+
+module.exports.james = {
+ name: 'James',
+ dialect: 'US',
+ id: 7,
+ engine: 3,
+ language: languages.en,
+ gender: 'M'
+};
+
+module.exports.jill = {
+ name: 'Jill',
+ dialect: 'US',
+ id: 2,
+ engine: 4,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.julie = {
+ name: 'Julie',
+ dialect: 'US',
+ id: 3,
+ engine: 3,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.karen = {
+ name: 'Karen',
+ dialect: 'Australian',
+ id: 4,
+ engine: 4,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.kate = {
+ name: 'Kate',
+ dialect: 'US',
+ id: 1,
+ engine: 3,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.lee = {
+ name: 'Lee',
+ dialect: 'Australian',
+ id: 10,
+ engine: 4,
+ language: languages.en,
+ gender: 'M'
+};
+
+module.exports.moira = {
+ name: 'Moira',
+ dialect: 'Irish',
+ id: 8,
+ engine: 4,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.paul = {
+ name: 'Paul',
+ dialect: 'US',
+ id: 2,
+ engine: 3,
+ language: languages.en,
+ gender: 'M'
+};
+
+module.exports.samantha = {
+ name: 'Samantha',
+ dialect: 'US',
+ id: 11,
+ engine: 4,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.sangeeta = {
+ name: 'Sangeeta',
+ dialect: 'Indian',
+ id: 9,
+ engine: 4,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.serena = {
+ name: 'Serena',
+ dialect: 'UK',
+ id: 7,
+ engine: 4,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.simon = {
+ name: 'Simon',
+ dialect: 'UK',
+ id: 5,
+ engine: 2,
+ language: languages.en,
+ gender: 'M'
+};
+
+module.exports.steven = {
+ name: 'Steven',
+ dialect: 'US',
+ id: 8,
+ engine: 2,
+ language: languages.en,
+ gender: 'M'
+};
+
+module.exports.susan = {
+ name: 'Susan',
+ dialect: 'US',
+ id: 1,
+ engine: 2,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.tessa = {
+ name: 'Tessa',
+ dialect: 'South African',
+ id: 13,
+ engine: 4,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.tom = {
+ name: 'Tom',
+ dialect: 'US',
+ id: 3,
+ engine: 4,
+ language: languages.en,
+ gender: 'M'
+};
+
+module.exports.veena = {
+ name: 'Veena',
+ dialect: 'Indian',
+ id: 11,
+ engine: 2,
+ language: languages.en,
+ gender: 'F'
+};
+
+module.exports.carlos = {
+ name: 'Carlos',
+ dialect: 'American',
+ id: 7,
+ engine: 2,
+ language: languages.es,
+ gender: 'M'
+};
+
+module.exports.carmen = {
+ name: 'Carmen',
+ dialect: 'Castilian',
+ id: 1,
+ engine: 2,
+ language: languages.es,
+ gender: 'F'
+};
+
+module.exports.diego = {
+ name: 'Diego',
+ dialect: 'Argentine',
+ id: 4,
+ engine: 2,
+ language: languages.es,
+ gender: 'M'
+};
+
+module.exports.duardo = {
+ name: 'Duardo',
+ id: 1,
+ engine: 4,
+ language: languages.es,
+ gender: 'M'
+};
+
+module.exports.esperanza = {
+ name: 'Esperanza',
+ dialect: 'Mexican',
+ id: 5,
+ engine: 2,
+ language: languages.es,
+ gender: 'F'
+};
+
+module.exports.francisca = {
+ name: 'Francisca',
+ dialect: 'Chilean',
+ id: 3,
+ engine: 2,
+ language: languages.es,
+ gender: 'F'
+};
+
+module.exports.francisco = {
+ name: 'Francisco',
+ dialect: 'Mexican',
+ id: 2,
+ engine: 3,
+ language: languages.es,
+ gender: 'M'
+};
+
+module.exports.gloria = {
+ name: 'Gloria',
+ dialect: 'Mexican',
+ id: 3,
+ engine: 3,
+ language: languages.es,
+ gender: 'F'
+};
+
+module.exports.javier = {
+ name: 'Javier',
+ dialect: 'Mexican',
+ id: 5,
+ engine: 4,
+ language: languages.es,
+ gender: 'M'
+};
+
+module.exports.jorge = {
+ name: 'Jorge',
+ dialect: 'Castilian',
+ id: 6,
+ engine: 2,
+ language: languages.es,
+ gender: 'M'
+};
+
+module.exports.juan = {
+ name: 'Juan',
+ dialect: 'Castilian',
+ id: 2,
+ engine: 2,
+ language: languages.es,
+ gender: 'M'
+};
+
+module.exports.leonor = {
+ name: 'Leonor',
+ dialect: 'Castilian',
+ id: 9,
+ engine: 2,
+ language: languages.es,
+ gender: 'F'
+};
+
+module.exports.lola = {
+ name: 'Lola',
+ dialect: 'Castilian',
+ id: 4,
+ engine: 3,
+ language: languages.es,
+ gender: 'F'
+};
+
+module.exports.manuel = {
+ name: 'Manuel',
+ dialect: 'Castilian',
+ id: 5,
+ engine: 3,
+ language: languages.es,
+ gender: 'M'
+};
+
+module.exports.monica = {
+ name: 'Monica',
+ id: 3,
+ engine: 4,
+ language: languages.es,
+ gender: 'F'
+};
+
+module.exports.paulina = {
+ name: 'Paulina',
+ dialect: 'Mexican',
+ id: 4,
+ engine: 4,
+ language: languages.es,
+ gender: 'F'
+};
+
+module.exports.soledad = {
+ name: 'Soledad',
+ dialect: 'American',
+ id: 8,
+ engine: 2,
+ language: languages.es,
+ gender: 'F'
+};
+
+module.exports.violeta = {
+ name: 'Violeta',
+ id: 1,
+ engine: 3,
+ language: languages.es,
+ gender: 'F'
+};
+
+module.exports.ximena = {
+ name: 'Ximena',
+ id: 10,
+ engine: 2,
+ language: languages.es,
+ gender: 'F'
+};
+
+module.exports.anna = {
+ name: 'Anna',
+ id: 3,
+ engine: 4,
+ language: languages.de,
+ gender: 'F'
+};
+
+module.exports.katrin = {
+ name: 'Katrin',
+ id: 3,
+ engine: 2,
+ language: languages.de,
+ gender: 'F'
+};
+
+module.exports.lena = {
+ name: 'Lena',
+ id: 1,
+ engine: 3,
+ language: languages.de,
+ gender: 'F'
+};
+
+module.exports.stefan = {
+ name: 'Stefan',
+ id: 2,
+ engine: 2,
+ language: languages.de,
+ gender: 'M'
+};
+
+module.exports.steffi = {
+ name: 'Steffi',
+ id: 1,
+ engine: 4,
+ language: languages.de,
+ gender: 'F'
+};
+
+module.exports.tim = {
+ name: 'Tim',
+ id: 2,
+ engine: 3,
+ language: languages.de,
+ gender: 'M'
+};
+
+module.exports.yannick = {
+ name: 'Yannick',
+ id: 2,
+ engine: 4,
+ language: languages.de,
+ gender: 'M'
+};
+
+module.exports.bernard = {
+ name: 'Bernard',
+ id: 2,
+ engine: 2,
+ language: languages.fr,
+ gender: 'M'
+};
+
+module.exports.charlotte = {
+ name: 'Charlotte',
+ id: 5,
+ engine: 2,
+ language: languages.fr,
+ gender: 'F'
+};
+
+module.exports.chloe = {
+ name: 'Chloe',
+ dialect: 'Canadian',
+ id: 1,
+ engine: 3,
+ language: languages.fr,
+ gender: 'F'
+};
+
+module.exports.felix = {
+ name: 'Felix',
+ dialect: 'Canadian',
+ id: 1,
+ engine: 4,
+ language: languages.fr,
+ gender: 'M'
+};
+
+module.exports.florence = {
+ name: 'Florence',
+ id: 4,
+ engine: 2,
+ language: languages.fr,
+ gender: 'F'
+};
+
+module.exports.jolie = {
+ name: 'Jolie',
+ id: 3,
+ engine: 2,
+ language: languages.fr,
+ gender: 'F'
+};
+
+module.exports.julie = {
+ name: 'Julie',
+ dialect: 'Canadian',
+ id: 2,
+ engine: 4,
+ language: languages.fr,
+ gender: 'F'
+};
+
+module.exports.leo = {
+ name: 'Leo',
+ dialect: 'Canadian',
+ id: 2,
+ engine: 3,
+ language: languages.fr,
+ gender: 'M'
+};
+
+module.exports.louis = {
+ name: 'Louis',
+ dialect: 'European',
+ id: 4,
+ engine: 3,
+ language: languages.fr,
+ gender: 'M'
+};
+
+module.exports.olivier = {
+ name: 'Olivier',
+ id: 6,
+ engine: 2,
+ language: languages.fr,
+ gender: 'M'
+};
+
+module.exports.roxane = {
+ name: 'Roxane',
+ dialect: 'European',
+ id: 3,
+ engine: 3,
+ language: languages.fr,
+ gender: 'F'
+};
+
+module.exports.sebastien = {
+ name: 'Sebastien',
+ id: 3,
+ engine: 4,
+ language: languages.fr,
+ gender: 'M'
+};
+
+module.exports.thomas = {
+ name: 'Thomas',
+ id: 5,
+ engine: 4,
+ language: languages.fr,
+ gender: 'M'
+};
+
+module.exports.virginie = {
+ name: 'Virginie',
+ id: 4,
+ engine: 4,
+ language: languages.fr,
+ gender: 'F'
+};
+
+module.exports.empar = {
+ name: 'Empar',
+ dialect: 'Valencian',
+ id: 3,
+ engine: 2,
+ language: languages.ca,
+ gender: 'F'
+};
+
+module.exports.jordi = {
+ name: 'Jordi',
+ id: 2,
+ engine: 2,
+ language: languages.ca,
+ gender: 'M'
+};
+
+module.exports.montserrat = {
+ name: 'Montserrat',
+ id: 1,
+ engine: 2,
+ language: languages.ca,
+ gender: 'F'
+};
+
+module.exports.nuria = {
+ name: 'Nuria',
+ id: 1,
+ engine: 4,
+ language: languages.ca,
+ gender: 'F'
+};
+
+module.exports.amalia = {
+ name: 'Amalia',
+ dialect: 'European',
+ id: 2,
+ engine: 2,
+ language: languages.pt,
+ gender: 'F'
+};
+
+module.exports.eusebio = {
+ name: 'Eusebio',
+ dialect: 'European',
+ id: 3,
+ engine: 2,
+ language: languages.pt,
+ gender: 'M'
+};
+
+module.exports.helena = {
+ name: 'Helena',
+ dialect: 'Brazilian',
+ id: 1,
+ engine: 3,
+ language: languages.pt,
+ gender: 'F'
+};
+
+module.exports.joana = {
+ name: 'Joana',
+ dialect: 'European',
+ id: 3,
+ engine: 4,
+ language: languages.pt,
+ gender: 'F'
+};
+
+module.exports.rafael = {
+ name: 'Rafael',
+ dialect: 'Brazilian',
+ id: 2,
+ engine: 3,
+ language: languages.pt,
+ gender: 'M'
+};
+
+module.exports.raquel = {
+ name: 'Raquel',
+ dialect: 'Brazilian',
+ id: 2,
+ engine: 4,
+ language: languages.pt,
+ gender: 'F'
+};
+
+module.exports.elisa = {
+ name: 'Elisa',
+ id: 1,
+ engine: 3,
+ language: languages.it,
+ gender: 'F'
+};
+
+module.exports.federica = {
+ name: 'Federica',
+ id: 10,
+ engine: 2,
+ language: languages.it,
+ gender: 'F'
+};
+
+module.exports.giulia = {
+ name: 'Giulia',
+ id: 9,
+ engine: 2,
+ language: languages.it,
+ gender: 'F'
+};
+
+module.exports.luca = {
+ name: 'Luca',
+ id: 5,
+ engine: 2,
+ language: languages.it,
+ gender: 'M'
+};
+
+module.exports.marcello = {
+ name: 'Marcello',
+ id: 6,
+ engine: 2,
+ language: languages.it,
+ gender: 'M'
+};
+
+module.exports.matteo = {
+ name: 'Matteo',
+ id: 8,
+ engine: 2,
+ language: languages.it,
+ gender: 'M'
+};
+
+module.exports.paola = {
+ name: 'Paola',
+ id: 1,
+ engine: 2,
+ language: languages.it,
+ gender: 'F'
+};
+
+module.exports.paolo = {
+ name: 'Paolo',
+ id: 1,
+ engine: 4,
+ language: languages.it,
+ gender: 'M'
+};
+
+module.exports.roberto = {
+ name: 'Roberto',
+ id: 2,
+ engine: 3,
+ language: languages.it,
+ gender: 'M'
+};
+
+module.exports.roberto = {
+ name: 'Roberto',
+ id: 7,
+ engine: 2,
+ language: languages.it,
+ gender: 'M'
+};
+
+module.exports.silvana = {
+ name: 'Silvana',
+ id: 2,
+ engine: 2,
+ language: languages.it,
+ gender: 'F'
+};
+
+module.exports.silvia = {
+ name: 'Silvia',
+ id: 2,
+ engine: 4,
+ language: languages.it,
+ gender: 'F'
+};
+
+module.exports.valentina = {
+ name: 'Valentina',
+ id: 3,
+ engine: 2,
+ language: languages.it,
+ gender: 'F'
+};
+
+module.exports.afroditi = {
+ name: 'Afroditi',
+ id: 1,
+ engine: 2,
+ language: languages.el,
+ gender: 'F'
+};
+
+module.exports.alexandros = {
+ name: 'Alexandros',
+ id: 1,
+ engine: 4,
+ language: languages.el,
+ gender: 'M'
+};
+
+module.exports.nikos = {
+ name: 'Nikos',
+ id: 3,
+ engine: 2,
+ language: languages.el,
+ gender: 'M'
+};
+
+module.exports.alva = {
+ name: 'Alva',
+ id: 1,
+ engine: 4,
+ language: languages.sv,
+ gender: 'F'
+};
+
+module.exports.annika = {
+ name: 'Annika',
+ id: 1,
+ engine: 2,
+ language: languages.sv,
+ gender: 'F'
+};
+
+module.exports.oskar = {
+ name: 'Oskar',
+ id: 3,
+ engine: 4,
+ language: languages.sv,
+ gender: 'M'
+};
+
+module.exports.sven = {
+ name: 'Sven',
+ id: 2,
+ engine: 2,
+ language: languages.sv,
+ gender: 'M'
+};
+
+module.exports.hui = {
+ name: 'Hui',
+ dialect: 'Mandarin',
+ id: 3,
+ engine: 3,
+ language: languages.zh,
+ gender: 'F'
+};
+
+module.exports.kaho = {
+ name: 'Kaho',
+ dialect: 'Cantonese',
+ id: 6,
+ engine: 3,
+ language: languages.zh,
+ gender: 'M'
+};
+
+module.exports.kayan = {
+ name: 'Kayan',
+ dialect: 'Cantonese',
+ id: 7,
+ engine: 3,
+ language: languages.zh,
+ gender: 'F'
+};
+
+module.exports.kiang = {
+ name: 'Kiang',
+ dialect: 'Mandarin',
+ id: 5,
+ engine: 3,
+ language: languages.zh,
+ gender: 'M'
+};
+
+module.exports.liang = {
+ name: 'Liang',
+ dialect: 'Mandarin',
+ id: 4,
+ engine: 3,
+ language: languages.zh,
+ gender: 'M'
+};
+
+module.exports.linlin = {
+ name: 'Linlin',
+ dialect: 'Mandarin',
+ id: 1,
+ engine: 2,
+ language: languages.zh,
+ gender: 'F'
+};
+
+module.exports.lisheng = {
+ name: 'Lisheng',
+ dialect: 'Mandarin',
+ id: 2,
+ engine: 2,
+ language: languages.zh,
+ gender: 'F'
+};
+
+module.exports.sinji = {
+ name: 'Sin-Ji',
+ dialect: 'Cantonese',
+ id: 1,
+ engine: 4,
+ language: languages.zh,
+ gender: 'F'
+};
+
+module.exports.tingting = {
+ name: 'Ting-Ting',
+ dialect: 'Mandrine',
+ id: 4,
+ engine: 4,
+ language: languages.zh,
+ gender: 'F'
+};
+
+module.exports.yaling = {
+ name: 'Ya-Ling',
+ dialect: 'Taiwanese',
+ id: 2,
+ engine: 4,
+ language: languages.zh,
+ gender: 'F'
+};
+
+module.exports.yafang = {
+ name: 'Yafang',
+ dialect: 'Taiwanese',
+ id: 8,
+ engine: 3,
+ language: languages.zh,
+ gender: 'F'
+};
+
+module.exports.claire = {
+ name: 'Claire',
+ dialect: 'Netherland',
+ id: 2,
+ engine: 4,
+ language: languages.nl,
+ gender: 'F'
+};
+
+module.exports.ellen = {
+ name: 'Ellen',
+ dialect: 'Belgian',
+ id: 1,
+ engine: 4,
+ language: languages.nl,
+ gender: 'F'
+};
+
+module.exports.laura = {
+ name: 'Laura',
+ dialect: 'Netherland',
+ id: 3,
+ engine: 4,
+ language: languages.nl,
+ gender: 'F'
+};
+
+module.exports.saskia = {
+ name: 'Saskia',
+ id: 2,
+ engine: 2,
+ language: languages.nl,
+ gender: 'F'
+};
+
+module.exports.willem = {
+ name: 'Willem',
+ id: 1,
+ engine: 2,
+ language: languages.nl,
+ gender: 'M'
+};
+
+module.exports.xander = {
+ name: 'Xander',
+ dialect: 'Netherland',
+ id: 4,
+ engine: 4,
+ language: languages.nl,
+ gender: 'M'
+};
+
+module.exports.haruka = {
+ name: 'Haruka',
+ id: 6,
+ engine: 3,
+ language: languages.ja,
+ gender: 'F'
+};
+
+module.exports.hikari = {
+ name: 'Hikari',
+ id: 5,
+ engine: 3,
+ language: languages.ja,
+ gender: 'M'
+};
+
+module.exports.kyoko = {
+ name: 'Kyoko',
+ id: 1,
+ engine: 4,
+ language: languages.ja,
+ gender: 'F'
+};
+
+module.exports.misaki = {
+ name: 'Misaki',
+ id: 3,
+ engine: 3,
+ language: languages.ja,
+ gender: 'F'
+};
+
+module.exports.ryo = {
+ name: 'Ryo',
+ id: 7,
+ engine: 3,
+ language: languages.ja,
+ gender: 'F'
+};
+
+module.exports.sayaka = {
+ name: 'Sayaka',
+ id: 4,
+ engine: 3,
+ language: languages.ja,
+ gender: 'F'
+};
+
+module.exports.show = {
+ name: 'Show',
+ id: 2,
+ engine: 3,
+ language: languages.ja,
+ gender: 'M'
+};
+
+module.exports.takeru = {
+ name: 'Takeru',
+ id: 8,
+ engine: 3,
+ language: languages.ja,
+ gender: 'M'
+};
+
+module.exports.dayoung = {
+ name: 'Dayoung',
+ id: 7,
+ engine: 3,
+ language: languages.ko,
+ gender: 'M'
+};
+
+module.exports.hyeryun = {
+ name: 'Hyeryun',
+ id: 4,
+ engine: 3,
+ language: languages.ko,
+ gender: 'M'
+};
+
+module.exports.hyuna = {
+ name: 'Hyuna',
+ id: 8,
+ engine: 3,
+ language: languages.ko,
+ gender: 'M'
+};
+
+module.exports.jihun = {
+ name: 'Jihun',
+ id: 10,
+ engine: 3,
+ language: languages.ko,
+ gender: 'M'
+};
+
+module.exports.jimin = {
+ name: 'Jimin',
+ id: 5,
+ engine: 3,
+ language: languages.ko,
+ gender: 'M'
+};
+
+module.exports.junwoo = {
+ name: 'Junwoo',
+ id: 2,
+ engine: 3,
+ language: languages.ko,
+ gender: 'M'
+};
+
+module.exports.narae = {
+ name: 'Narae',
+ id: 1,
+ engine: 4,
+ language: languages.ko,
+ gender: 'F'
+};
+
+module.exports.sena = {
+ name: 'Sena',
+ id: 6,
+ engine: 3,
+ language: languages.ko,
+ gender: 'M'
+};
+
+module.exports.yumi = {
+ name: 'Yumi',
+ id: 1,
+ engine: 3,
+ language: languages.ko,
+ gender: 'F'
+};
+
+module.exports.yura = {
+ name: 'Yura',
+ id: 9,
+ engine: 3,
+ language: languages.ko,
+ gender: 'M'
+};
+
+module.exports.agata = {
+ name: 'Agata',
+ id: 1,
+ engine: 4,
+ language: languages.pl,
+ gender: 'F'
+};
+
+module.exports.krzysztof = {
+ name: 'Krzysztof',
+ id: 2,
+ engine: 2,
+ language: languages.pl,
+ gender: 'M'
+};
+
+module.exports.zosia = {
+ name: 'Zosia',
+ id: 1,
+ engine: 2,
+ language: languages.pl,
+ gender: 'F'
+};
+
+module.exports.carmela = {
+ name: 'Carmela',
+ id: 1,
+ engine: 2,
+ language: languages.gl,
+ gender: 'F'
+};
+
+module.exports.aylin = {
+ name: 'Aylin',
+ id: 1,
+ engine: 4,
+ language: languages.tr,
+ gender: 'F'
+};
+
+module.exports.kerem = {
+ name: 'Kerem',
+ id: 1,
+ engine: 2,
+ language: languages.tr,
+ gender: 'M'
+};
+
+module.exports.selin = {
+ name: 'Selin',
+ id: 3,
+ engine: 2,
+ language: languages.tr,
+ gender: 'F'
+};
+
+module.exports.zeynep = {
+ name: 'Zeynep',
+ id: 2,
+ engine: 2,
+ language: languages.tr,
+ gender: 'F'
+};
+
+module.exports.zuzana = {
+ name: 'Zuzana',
+ id: 1,
+ engine: 4,
+ language: languages.cs,
+ gender: 'F'
+};
+
+module.exports.frida = {
+ name: 'Frida',
+ id: 1,
+ engine: 2,
+ language: languages.da,
+ gender: 'F'
+};
+
+module.exports.ida = {
+ name: 'Ida',
+ id: 1,
+ engine: 4,
+ language: languages.da,
+ gender: 'F'
+};
+
+module.exports.magnus = {
+ name: 'Magnus',
+ id: 2,
+ engine: 2,
+ language: languages.da,
+ gender: 'M'
+};
+
+module.exports.henrik = {
+ name: 'Henrik',
+ id: 2,
+ engine: 2,
+ language: languages.no,
+ gender: 'M'
+};
+
+module.exports.stine = {
+ name: 'Stine',
+ id: 2,
+ engine: 4,
+ language: languages.no,
+ gender: 'F'
+};
+
+module.exports.vilde = {
+ name: 'Vilde',
+ id: 1,
+ engine: 2,
+ language: languages.no,
+ gender: 'F'
+};
+
+module.exports.dmitri = {
+ name: 'Dmitri',
+ id: 2,
+ engine: 2,
+ language: languages.ru,
+ gender: 'M'
+};
+
+module.exports.milena = {
+ name: 'Milena',
+ id: 2,
+ engine: 4,
+ language: languages.ru,
+ gender: 'F'
+};
+
+module.exports.olga = {
+ name: 'Olga',
+ id: 1,
+ engine: 2,
+ language: languages.ru,
+ gender: 'F'
+};
+
+module.exports.arantxa = {
+ name: 'Arantxa',
+ id: 1,
+ engine: 4,
+ language: languages.eu,
+ gender: 'F'
+};
+
+module.exports.marko = {
+ name: 'Marko',
+ id: 2,
+ engine: 2,
+ language: languages.fi,
+ gender: 'M'
+};
+
+module.exports.mikko = {
+ name: 'Mikko',
+ id: 1,
+ engine: 4,
+ language: languages.fi,
+ gender: 'M'
+};
+
+module.exports.milla = {
+ name: 'Milla',
+ id: 1,
+ engine: 2,
+ language: languages.fi,
+ gender: 'F'
+};
+
+module.exports.lekha = {
+ name: 'Lekha',
+ id: 1,
+ engine: 4,
+ language: languages.hi,
+ gender: 'F'
+};
+
+module.exports.narisa = {
+ name: 'Narisa',
+ id: 1,
+ engine: 4,
+ language: languages.th,
+ gender: 'F'
+};
+
+module.exports.sarawut = {
+ name: 'Sarawut',
+ id: 1,
+ engine: 3,
+ language: languages.th,
+ gender: 'M'
+};
+
+module.exports.somsi = {
+ name: 'Somsi',
+ id: 2,
+ engine: 3,
+ language: languages.th,
+ gender: 'F'
+};
+
+module.exports.laila = {
+ name: 'Laila',
+ id: 2,
+ engine: 2,
+ language: languages.ar,
+ gender: 'F'
+};
+
+module.exports.maged = {
+ name: 'Maged',
+ id: 1,
+ engine: 4,
+ language: languages.ar,
+ gender: 'M'
+};
+
+module.exports.tarik = {
+ name: 'Tarik',
+ id: 1,
+ engine: 2,
+ language: languages.ar,
+ gender: 'M'
+};
+
+module.exports.damayanti = {
+ name: 'Damayanti',
+ id: 1,
+ engine: 4,
+ language: languages.id,
+ gender: 'F'
+};
+
+module.exports.eszter = {
+ name: 'Eszter',
+ id: 1,
+ engine: 4,
+ language: languages.hu,
+ gender: 'F'
+};
+
+module.exports.ioana = {
+ name: 'Ioana',
+ id: 1,
+ engine: 2,
+ language: languages.ro,
+ gender: 'F'
+};
+
+module.exports.simona = {
+ name: 'Simona',
+ id: 1,
+ engine: 4,
+ language: languages.ro,
+ gender: 'F'
+};
+
+module.exports.ludoviko = {
+ name: 'Ludoviko',
+ id: 1,
+ engine: 2,
+ language: languages.eo,
+ gender: 'M'
+};
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..ad6aab6
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,38 @@
+{
+ "name": "oddcast-tts-demo",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "build-url": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/build-url/-/build-url-1.1.2.tgz",
+ "integrity": "sha512-H8G4apX+CdlgZU8db4S1MniU6POELvnoznAX4Qi9h2OW2JV1hJdlhTN5X3POfDqzUuXX+xVG7lgYS0yNVz5PGg=="
+ },
+ "charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
+ },
+ "crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "md5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
+ "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
+ "requires": {
+ "charenc": "~0.0.1",
+ "crypt": "~0.0.1",
+ "is-buffer": "~1.1.1"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..7b0b2f2
--- /dev/null
+++ b/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "oddcast-tts-demo",
+ "version": "1.0.0",
+ "description": "Text-to-speech using oddcast.com's TTS demo.",
+ "main": "./lib/index.js",
+ "author": "Rauli Laine ",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "dependencies": {
+ "build-url": "^1.1.2",
+ "md5": "^2.2.1"
+ }
+}