Initial commit

This commit is contained in:
2018-11-11 13:26:55 +08:00
commit d68e4e97a6
42 changed files with 7060 additions and 0 deletions
+242
View File
@@ -0,0 +1,242 @@
'use strict';
goog.provide('Blockly.JavaScript.Sendto');
goog.require('Blockly.JavaScript');
// --- SayIt --------------------------------------------------
Blockly.Words['sayit'] = {'en': 'say text', 'de': 'aussprechen', 'ru': 'произнести'};
Blockly.Words['sayit_message'] = {'en': 'message', 'de': 'Meldung', 'ru': 'сообщение'};
Blockly.Words['sayit_volume'] = {'en': 'volume (optional)', 'de': 'Lautstärke (optional)', 'ru': 'громкость (не обяз.)'};
Blockly.Words['sayit_tooltip'] = {'en': 'Text to speech', 'de': 'Text zu Sprache', 'ru': 'Произнести сообщение'};
Blockly.Words['sayit_help'] = {'en': 'https://git.spacen.net/yunkong2/yunkong2.sayit/blob/master/README.md', 'de': 'http://www.yunkong2.net/?page_id=178&lang=de', 'ru': 'http://www.yunkong2.net/?page_id=4262&lang=ru'};
Blockly.Words['sayit_configured'] = {'en': 'configured', 'de': 'standart', 'ru': 'настроенный'};
Blockly.Words['sayit_log'] = {'en': 'log level', 'de': 'Loglevel', 'ru': 'Протокол'};
Blockly.Words['sayit_log_none'] = {'en': 'none', 'de': 'keins', 'ru': 'нет'};
Blockly.Words['sayit_log_info'] = {'en': 'info', 'de': 'info', 'ru': 'инфо'};
Blockly.Words['sayit_log_debug'] = {'en': 'debug', 'de': 'debug', 'ru': 'debug'};
Blockly.Words['sayit_log_warn'] = {'en': 'warning', 'de': 'warning', 'ru': 'warning'};
Blockly.Words['sayit_log_error'] = {'en': 'error', 'de': 'error', 'ru': 'ошибка'};
// this is copy of engines.js
var sayitEngines = {
"en": {name: "Google - English", engine: "google", params: []},
"de": {name: "Google - Deutsch", engine: "google", params: []},
"ru": {name: "Google - Русский", engine: "google", params: []},
"it": {name: "Google - Italiano", engine: "google", params: []},
"es": {name: "Google - Espaniol", engine: "google", params: []},
"fr": {name: "Google - Français", engine: "google", params: []},
"ru_YA": {name: "Yandex - Русский", engine: "yandex", params: ['key', 'voice', 'emotion', 'ill', 'drunk', 'robot'], voice: ['jane', 'zahar'], emotion: ['none', 'good', 'neutral', 'evil', 'mixed']},
"en-US": {name: "PicoTTS - Englisch US", engine: "PicoTTS", params: []},
"en-GB": {name: "PicoTTS - Englisch GB", engine: "PicoTTS", params: []},
"de-DE": {name: "PicoTTS - Deutsch", engine: "PicoTTS", params: []},
"it-IT": {name: "PicoTTS - Italiano", engine: "PicoTTS", params: []},
"es-ES": {name: "PicoTTS - Espaniol", engine: "PicoTTS", params: []},
"fr-FR": {name: "PicoTTS - Français", engine: "PicoTTS", params: []},
"ru-RU_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "ru-RU", ename: "Tatyana", ssml: true, name: "Cloud - Русский - Татьяна"},
"ru-RU_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "ru-RU", ename: "Maxim", ssml: true, name: "Cloud - Русский - Максим"},
"de-DE_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "de-DE", ename: "Marlene", ssml: true, name: "Cloud - Deutsch - Marlene"},
"de-DE_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "de-DE", ename: "Hans", ssml: true, name: "Cloud - Deutsch - Hans"},
"en-US_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Salli", ssml: true, name: "Cloud - en-US - Female - Salli"},
"en-US_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Joey", ssml: true, name: "Cloud - en-US - Male - Joey"},
"da-DK_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "da-DK", ename: "Naja", ssml: true, name: "Cloud - da-DK - Female - Naja"},
"da-DK_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "da-DK", ename: "Mads", ssml: true, name: "Cloud - da-DK - Male - Mads"},
"en-AU_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-AU", ename: "Nicole", ssml: true, name: "Cloud - en-AU - Female - Nicole"},
"en-AU_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-AU", ename: "Russell", ssml: true, name: "Cloud - en-AU - Male - Russell"},
"en-GB_CLOUD_Female_Amy": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-GB", ename: "Amy", ssml: true, name: "Cloud - en-GB - Female - Amy"},
"en-GB_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-GB", ename: "Brian", ssml: true, name: "Cloud - en-GB - Male - Brian"},
"en-GB_CLOUD_Female_Emma": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-GB", ename: "Emma", ssml: true, name: "Cloud - en-GB - Female - Emma"},
"en-GB-WLS_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-GB-WLS", ename: "Gwyneth", ssml: true, name: "Cloud - en-GB-WLS - Female - Gwyneth"},
"en-GB-WLS_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-GB-WLS", ename: "Geraint", ssml: true, name: "Cloud - en-GB-WLS - Male - Geraint"},
"cy-GB_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "cy-GB", ename: "Gwyneth", ssml: true, name: "Cloud - cy-GB - Female - Gwyneth"},
"cy-GB_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "cy-GB", ename: "Geraint", ssml: true, name: "Cloud - cy-GB - Male - Geraint"},
"en-IN_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-IN", ename: "Raveena", ssml: true, name: "Cloud - en-IN - Female - Raveena"},
"en-US_CLOUD_Male_Chipmunk":{gender: "Male", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Chipmunk", ssml: true, name: "Cloud - en-US - Male - Chipmunk"},
"en-US_CLOUD_Male_Eric": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Eric", ssml: true, name: "Cloud - en-US - Male - Eric"},
"en-US_CLOUD_Female_Ivy": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Ivy", ssml: true, name: "Cloud - en-US - Female - Ivy"},
"en-US_CLOUD_Female_Jennifer": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Jennifer", ssml: true, name: "Cloud - en-US - Female - Jennifer"},
"en-US_CLOUD_Male_Justin": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Justin", ssml: true, name: "Cloud - en-US - Male - Justin"},
"en-US_CLOUD_Female_Kendra": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Kendra", ssml: true, name: "Cloud - en-US - Female - Kendra"},
"en-US_CLOUD_Female_Kimberly": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Kimberly", ssml: true, name: "Cloud - en-US - Female - Kimberly"},
"es-ES_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "es-ES", ename: "Conchita", ssml: true, name: "Cloud - es-ES - Female - Conchita"},
"es-ES_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "es-ES", ename: "Enrique", ssml: true, name: "Cloud - es-ES - Male - Enrique"},
"es-US_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "es-US", ename: "Penelope", ssml: true, name: "Cloud - es-US - Female - Penelope"},
"es-US_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "es-US", ename: "Miguel", ssml: true, name: "Cloud - es-US - Male - Miguel"},
"fr-CA_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "fr-CA", ename: "Chantal", ssml: true, name: "Cloud - fr-CA - Female - Chantal"},
"fr-FR_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "fr-FR", ename: "Celine", ssml: true, name: "Cloud - fr-FR - Female - Celine"},
"fr-FR_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "fr-FR", ename: "Mathieu", ssml: true, name: "Cloud - fr-FR - Male - Mathieu"},
"is-IS_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "is-IS", ename: "Dora", ssml: true, name: "Cloud - is-IS - Female - Dora"},
"is-IS_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "is-IS", ename: "Karl", ssml: true, name: "Cloud - is-IS - Male - Karl"},
"it-IT_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "it-IT", ename: "Carla", ssml: true, name: "Cloud - it-IT - Female - Carla"},
"it-IT_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "it-IT", ename: "Giorgio", ssml: true, name: "Cloud - it-IT - Male - Giorgio"},
"nb-NO_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "nb-NO", ename: "Liv", ssml: true, name: "Cloud - nb-NO - Female - Liv"},
"nl-NL_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "nl-NL", ename: "Lotte", ssml: true, name: "Cloud - nl-NL - Female - Lotte"},
"nl-NL_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "nl-NL", ename: "Ruben", ssml: true, name: "Cloud - nl-NL - Male - Ruben"},
"pl-PL_CLOUD_Female_Agnieszka":{gender: "Female", engine: "cloud",params: ['cloud'], language: "pl-PL", ename: "Agnieszka", ssml: true, name: "Cloud - pl-PL - Female - Agnieszka"},
"pl-PL_CLOUD_Male_Jacek": {gender: "Male", engine: "cloud", params: ['cloud'], language: "pl-PL", ename: "Jacek", ssml: true, name: "Cloud - pl-PL - Male - Jacek"},
"pl-PL_CLOUD_Female_Ewa": {gender: "Female", engine: "cloud", params: ['cloud'], language: "pl-PL", ename: "Ewa", ssml: true, name: "Cloud - pl-PL - Female - Ewa"},
"pl-PL_CLOUD_Male_Jan": {gender: "Male", engine: "cloud", params: ['cloud'], language: "pl-PL", ename: "Jan", ssml: true, name: "Cloud - pl-PL - Male - Jan"},
"pl-PL_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "pl-PL", ename: "Maja", ssml: true, name: "Cloud - pl-PL - Female - Maja"},
"pt-BR_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "pt-BR", ename: "Vitoria", ssml: true, name: "Cloud - pt-BR - Female - Vitoria"},
"pt-BR_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "pt-BR", ename: "Ricardo", ssml: true, name: "Cloud - pt-BR - Male - Ricardo"},
"pt-PT_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "pt-PT", ename: "Cristiano", ssml: true, name: "Cloud - pt-PT - Male - Cristiano"},
"pt-PT_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "pt-PT", ename: "Ines", ssml: true, name: "Cloud - pt-PT - Female - Ines"},
"ro-RO_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "ro-RO", ename: "Carmen", ssml: true, name: "Cloud - ro-RO - Female - Carmen"},
"sv-SE_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "sv-SE", ename: "Astrid", ssml: true, name: "Cloud - sv-SE - Female - Astrid"},
"tr-TR_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "tr-TR", ename: "Filiz", ssml: true, name: "Cloud - tr-TR - Female - Filiz"},
"ru-RU_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "ru-RU", ename: "Tatyana", ssml: true, name: "AWS Polly - Русский - Татьяна"},
"ru-RU_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "ru-RU", ename: "Maxim", ssml: true, name: "AWS Polly - Русский - Максим"},
"de-DE_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "de-DE", ename: "Marlene", ssml: true, name: "AWS Polly - Deutsch - Marlene"},
"de-DE_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "de-DE", ename: "Hans", ssml: true, name: "AWS Polly - Deutsch - Hans"},
"en-US_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Salli", ssml: true, name: "AWS Polly - en-US - Female - Salli"},
"en-US_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Joey", ssml: true, name: "AWS Polly - en-US - Male - Joey"},
"da-DK_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "da-DK", ename: "Naja", ssml: true, name: "AWS Polly - da-DK - Female - Naja"},
"da-DK_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "da-DK", ename: "Mads", ssml: true, name: "AWS Polly - da-DK - Male - Mads"},
"en-AU_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-AU", ename: "Nicole", ssml: true, name: "AWS Polly - en-AU - Female - Nicole"},
"en-AU_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-AU", ename: "Russell", ssml: true, name: "AWS Polly - en-AU - Male - Russell"},
"en-GB_AP_Female_Amy": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-GB", ename: "Amy", ssml: true, name: "AWS Polly - en-GB - Female - Amy"},
"en-GB_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-GB", ename: "Brian", ssml: true, name: "AWS Polly - en-GB - Male - Brian"},
"en-GB_AP_Female_Emma": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-GB", ename: "Emma", ssml: true, name: "AWS Polly - en-GB - Female - Emma"},
"en-GB-WLS_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-GB-WLS", ename: "Gwyneth", ssml: true, name: "AWS Polly - en-GB-WLS - Female - Gwyneth"},
"en-GB-WLS_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-GB-WLS", ename: "Geraint", ssml: true, name: "AWS Polly - en-GB-WLS - Male - Geraint"},
"cy-GB_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "cy-GB", ename: "Gwyneth", ssml: true, name: "AWS Polly - cy-GB - Female - Gwyneth"},
"cy-GB_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "cy-GB", ename: "Geraint", ssml: true, name: "AWS Polly - cy-GB - Male - Geraint"},
"en-IN_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-IN", ename: "Raveena", ssml: true, name: "AWS Polly - en-IN - Female - Raveena"},
"en-US_AP_Male_Chipmunk": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Chipmunk", ssml: true, name: "AWS Polly - en-US - Male - Chipmunk"},
"en-US_AP_Male_Eric": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Eric", ssml: true, name: "AWS Polly - en-US - Male - Eric"},
"en-US_AP_Female_Ivy": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Ivy", ssml: true, name: "AWS Polly - en-US - Female - Ivy"},
"en-US_AP_Female_Jennifer": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Jennifer", ssml: true, name: "AWS Polly - en-US - Female - Jennifer"},
"en-US_AP_Male_Justin": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Justin", ssml: true, name: "AWS Polly - en-US - Male - Justin"},
"en-US_AP_Female_Kendra": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Kendra", ssml: true, name: "AWS Polly - en-US - Female - Kendra"},
"en-US_AP_Female_Kimberly": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Kimberly", ssml: true, name: "AWS Polly - en-US - Female - Kimberly"},
"es-ES_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "es-ES", ename: "Conchita", ssml: true, name: "AWS Polly - es-ES - Female - Conchita"},
"es-ES_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "es-ES", ename: "Enrique", ssml: true, name: "AWS Polly - es-ES - Male - Enrique"},
"es-US_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "es-US", ename: "Penelope", ssml: true, name: "AWS Polly - es-US - Female - Penelope"},
"es-US_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "es-US", ename: "Miguel", ssml: true, name: "AWS Polly - es-US - Male - Miguel"},
"fr-CA_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "fr-CA", ename: "Chantal", ssml: true, name: "AWS Polly - fr-CA - Female - Chantal"},
"fr-FR_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "fr-FR", ename: "Celine", ssml: true, name: "AWS Polly - fr-FR - Female - Celine"},
"fr-FR_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "fr-FR", ename: "Mathieu", ssml: true, name: "AWS Polly - fr-FR - Male - Mathieu"},
"is-IS_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "is-IS", ename: "Dora", ssml: true, name: "AWS Polly - is-IS - Female - Dora"},
"is-IS_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "is-IS", ename: "Karl", ssml: true, name: "AWS Polly - is-IS - Male - Karl"},
"it-IT_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "it-IT", ename: "Carla", ssml: true, name: "AWS Polly - it-IT - Female - Carla"},
"it-IT_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "it-IT", ename: "Giorgio", ssml: true, name: "AWS Polly - it-IT - Male - Giorgio"},
"nb-NO_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "nb-NO", ename: "Liv", ssml: true, name: "AWS Polly - nb-NO - Female - Liv"},
"nl-NL_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "nl-NL", ename: "Lotte", ssml: true, name: "AWS Polly - nl-NL - Female - Lotte"},
"nl-NL_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "nl-NL", ename: "Ruben", ssml: true, name: "AWS Polly - nl-NL - Male - Ruben"},
"pl-PL_AP_Female_Agnieszka":{gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pl-PL", ename: "Agnieszka", ssml: true, name: "AWS Polly - pl-PL - Female - Agnieszka"},
"pl-PL_AP_Male_Jacek": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pl-PL", ename: "Jacek", ssml: true, name: "AWS Polly - pl-PL - Male - Jacek"},
"pl-PL_AP_Female_Ewa": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pl-PL", ename: "Ewa", ssml: true, name: "AWS Polly - pl-PL - Female - Ewa"},
"pl-PL_AP_Male_Jan": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pl-PL", ename: "Jan", ssml: true, name: "AWS Polly - pl-PL - Male - Jan"},
"pl-PL_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pl-PL", ename: "Maja", ssml: true, name: "AWS Polly - pl-PL - Female - Maja"},
"pt-BR_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pt-BR", ename: "Vitoria", ssml: true, name: "AWS Polly - pt-BR - Female - Vitoria"},
"pt-BR_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pt-BR", ename: "Ricardo", ssml: true, name: "AWS Polly - pt-BR - Male - Ricardo"},
"pt-PT_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pt-PT", ename: "Cristiano", ssml: true, name: "AWS Polly - pt-PT - Male - Cristiano"},
"pt-PT_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pt-PT", ename: "Ines", ssml: true, name: "AWS Polly - pt-PT - Female - Ines"},
"ro-RO_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "ro-RO", ename: "Carmen", ssml: true, name: "AWS Polly - ro-RO - Female - Carmen"},
"sv-SE_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "sv-SE", ename: "Astrid", ssml: true, name: "AWS Polly - sv-SE - Female - Astrid"},
"tr-TR_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "tr-TR", ename: "Filiz", ssml: true, name: "AWS Polly - tr-TR - Female - Filiz"}
};
// Blockly.Sendto is global variable and defined in javascript/admin/google-blockly/own/blocks_sendto.js
Blockly.Sendto.blocks['sayit'] =
'<block type="sayit">'
+ ' <value name="INSTANCE">'
+ ' </value>'
+ ' <value name="LANGUAGE">'
+ ' </value>'
+ ' <value name="VOLUME">'
+ ' </value>'
+ ' <value name="MESSAGE">'
+ ' <shadow type="text">'
+ ' <field name="TEXT">text</field>'
+ ' </shadow>'
+ ' </value>'
+ ' <value name="LOG">'
+ ' </value>'
+ '</block>';
Blockly.Blocks['sayit'] = {
init: function() {
var options = [];
if (typeof main !== 'undefined' && main.instances) {
for (var i = 0; i < main.instances.length; i++) {
var m = main.instances[i].match(/^system.adapter.sayit.(\d+)$/);
if (m) {
var n = parseInt(m[1], 10);
options.push(['sayit.' + n, '.' + n]);
}
}
if (options.length === 0) {
for (var u = 0; u <= 4; u++) {
options.push(['sayit.' + u, '.' + u]);
}
}
} else {
for (var u = 0; u <= 4; u++) {
options.push(['sayit.' + u, '.' + u]);
}
}
this.appendDummyInput('INSTANCE')
.appendField(Blockly.Words['sayit'][systemLang])
.appendField(new Blockly.FieldDropdown(options), 'INSTANCE');
var languages = [[Blockly.Words['sayit_configured'][systemLang], '']];
for (var l in sayitEngines) {
if (sayitEngines.hasOwnProperty(l)) languages.push([sayitEngines[l].name, l]);
}
this.appendDummyInput('LANGUAGE')
.appendField(new Blockly.FieldDropdown(languages), 'LANGUAGE');
var input = this.appendValueInput('VOLUME')
.setCheck('Number')
.appendField(Blockly.Words['sayit_volume'][systemLang]);
if (input.connection) input.connection._optional = true;
this.appendValueInput('MESSAGE')
.appendField(Blockly.Words['sayit_message'][systemLang]);
this.appendDummyInput('LOG')
.appendField(Blockly.Words['sayit_log'][systemLang])
.appendField(new Blockly.FieldDropdown([
[Blockly.Words['sayit_log_none'][systemLang], ''],
[Blockly.Words['sayit_log_info'][systemLang], 'log'],
[Blockly.Words['sayit_log_debug'][systemLang], 'debug'],
[Blockly.Words['sayit_log_warn'][systemLang], 'warn'],
[Blockly.Words['sayit_log_error'][systemLang], 'error']
]), 'LOG');
this.setInputsInline(false);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(Blockly.Sendto.HUE);
this.setTooltip(Blockly.Words['sayit_tooltip'][systemLang]);
this.setHelpUrl(Blockly.Words['sayit_help'][systemLang]);
}
};
Blockly.JavaScript['sayit'] = function(block) {
var dropdown_instance = block.getFieldValue('INSTANCE');
var dropdown_language = block.getFieldValue('LANGUAGE');
var value_message = Blockly.JavaScript.valueToCode(block, 'MESSAGE', Blockly.JavaScript.ORDER_ATOMIC);
var value_volume = Blockly.JavaScript.valueToCode(block, 'VOLUME', Blockly.JavaScript.ORDER_ATOMIC);
var logLevel = block.getFieldValue('LOG');
var logText;
if (logLevel) {
logText = 'console.' + logLevel + '("sayIt' + (dropdown_language ? '[' + dropdown_language + ']' : '') + (value_volume ? '[Volume - ' + value_volume + ']' : '') + ': " + ' + value_message + ');\n'
} else {
logText = '';
}
return 'setState("sayit' + dropdown_instance + '.tts.text", "' + (dropdown_language ? dropdown_language + ';' : '') + (value_volume !== null && value_volume !== '' ? value_volume + ';' : '') + '" + ' + value_message + ');\n' +
logText;
};
+139
View File
@@ -0,0 +1,139 @@
// DONT Forget to update sayitEngines in blockly.js (If you change this table)
var sayitEngines = {
"en": {name: "Google - English", engine: "google", params: []},
"de": {name: "Google - Deutsch", engine: "google", params: []},
"ru": {name: "Google - Русский", engine: "google", params: []},
"it": {name: "Google - Italiano", engine: "google", params: []},
"es": {name: "Google - Espaniol", engine: "google", params: []},
"fr": {name: "Google - Français", engine: "google", params: []},
"ru_YA": {name: "Yandex - Русский", engine: "yandex", params: ['key', 'voice', 'emotion', 'ill', 'drunk', 'robot'], voice: ['jane', 'zahar'], emotion: ['none', 'good', 'neutral', 'evil', 'mixed']},
"ru-RU_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "ru-RU", ename: "Tatyana", ssml: true, name: "Cloud - Русский - Татьяна"},
"ru-RU_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "ru-RU", ename: "Maxim", ssml: true, name: "Cloud - Русский - Максим"},
"de-DE_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "de-DE", ename: "Marlene", ssml: true, name: "Cloud - Deutsch - Marlene"},
"de-DE_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "de-DE", ename: "Hans", ssml: true, name: "Cloud - Deutsch - Hans"},
"en-US_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Salli", ssml: true, name: "Cloud - en-US - Female - Salli"},
"en-US_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Joey", ssml: true, name: "Cloud - en-US - Male - Joey"},
"da-DK_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "da-DK", ename: "Naja", ssml: true, name: "Cloud - da-DK - Female - Naja"},
"da-DK_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "da-DK", ename: "Mads", ssml: true, name: "Cloud - da-DK - Male - Mads"},
"en-AU_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-AU", ename: "Nicole", ssml: true, name: "Cloud - en-AU - Female - Nicole"},
"en-AU_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-AU", ename: "Russell", ssml: true, name: "Cloud - en-AU - Male - Russell"},
"en-GB_CLOUD_Female_Amy": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-GB", ename: "Amy", ssml: true, name: "Cloud - en-GB - Female - Amy"},
"en-GB_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-GB", ename: "Brian", ssml: true, name: "Cloud - en-GB - Male - Brian"},
"en-GB_CLOUD_Female_Emma": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-GB", ename: "Emma", ssml: true, name: "Cloud - en-GB - Female - Emma"},
"en-GB-WLS_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-GB-WLS", ename: "Gwyneth", ssml: true, name: "Cloud - en-GB-WLS - Female - Gwyneth"},
"en-GB-WLS_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-GB-WLS", ename: "Geraint", ssml: true, name: "Cloud - en-GB-WLS - Male - Geraint"},
"cy-GB_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "cy-GB", ename: "Gwyneth", ssml: true, name: "Cloud - cy-GB - Female - Gwyneth"},
"cy-GB_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "cy-GB", ename: "Geraint", ssml: true, name: "Cloud - cy-GB - Male - Geraint"},
"en-IN_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-IN", ename: "Raveena", ssml: true, name: "Cloud - en-IN - Female - Raveena"},
"en-US_CLOUD_Male_Chipmunk":{gender: "Male", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Chipmunk", ssml: true, name: "Cloud - en-US - Male - Chipmunk"},
"en-US_CLOUD_Male_Eric": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Eric", ssml: true, name: "Cloud - en-US - Male - Eric"},
"en-US_CLOUD_Female_Ivy": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Ivy", ssml: true, name: "Cloud - en-US - Female - Ivy"},
"en-US_CLOUD_Female_Jennifer": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Jennifer", ssml: true, name: "Cloud - en-US - Female - Jennifer"},
"en-US_CLOUD_Male_Justin": {gender: "Male", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Justin", ssml: true, name: "Cloud - en-US - Male - Justin"},
"en-US_CLOUD_Female_Kendra": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Kendra", ssml: true, name: "Cloud - en-US - Female - Kendra"},
"en-US_CLOUD_Female_Kimberly": {gender: "Female", engine: "cloud", params: ['cloud'], language: "en-US", ename: "Kimberly", ssml: true, name: "Cloud - en-US - Female - Kimberly"},
"es-ES_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "es-ES", ename: "Conchita", ssml: true, name: "Cloud - es-ES - Female - Conchita"},
"es-ES_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "es-ES", ename: "Enrique", ssml: true, name: "Cloud - es-ES - Male - Enrique"},
"es-US_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "es-US", ename: "Penelope", ssml: true, name: "Cloud - es-US - Female - Penelope"},
"es-US_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "es-US", ename: "Miguel", ssml: true, name: "Cloud - es-US - Male - Miguel"},
"fr-CA_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "fr-CA", ename: "Chantal", ssml: true, name: "Cloud - fr-CA - Female - Chantal"},
"fr-FR_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "fr-FR", ename: "Celine", ssml: true, name: "Cloud - fr-FR - Female - Celine"},
"fr-FR_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "fr-FR", ename: "Mathieu", ssml: true, name: "Cloud - fr-FR - Male - Mathieu"},
"is-IS_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "is-IS", ename: "Dora", ssml: true, name: "Cloud - is-IS - Female - Dora"},
"is-IS_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "is-IS", ename: "Karl", ssml: true, name: "Cloud - is-IS - Male - Karl"},
"it-IT_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "it-IT", ename: "Carla", ssml: true, name: "Cloud - it-IT - Female - Carla"},
"it-IT_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "it-IT", ename: "Giorgio", ssml: true, name: "Cloud - it-IT - Male - Giorgio"},
"nb-NO_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "nb-NO", ename: "Liv", ssml: true, name: "Cloud - nb-NO - Female - Liv"},
"nl-NL_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "nl-NL", ename: "Lotte", ssml: true, name: "Cloud - nl-NL - Female - Lotte"},
"nl-NL_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "nl-NL", ename: "Ruben", ssml: true, name: "Cloud - nl-NL - Male - Ruben"},
"pl-PL_CLOUD_Female_Agnieszka":{gender: "Female", engine: "cloud",params: ['cloud'], language: "pl-PL", ename: "Agnieszka", ssml: true, name: "Cloud - pl-PL - Female - Agnieszka"},
"pl-PL_CLOUD_Male_Jacek": {gender: "Male", engine: "cloud", params: ['cloud'], language: "pl-PL", ename: "Jacek", ssml: true, name: "Cloud - pl-PL - Male - Jacek"},
"pl-PL_CLOUD_Female_Ewa": {gender: "Female", engine: "cloud", params: ['cloud'], language: "pl-PL", ename: "Ewa", ssml: true, name: "Cloud - pl-PL - Female - Ewa"},
"pl-PL_CLOUD_Male_Jan": {gender: "Male", engine: "cloud", params: ['cloud'], language: "pl-PL", ename: "Jan", ssml: true, name: "Cloud - pl-PL - Male - Jan"},
"pl-PL_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "pl-PL", ename: "Maja", ssml: true, name: "Cloud - pl-PL - Female - Maja"},
"pt-BR_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "pt-BR", ename: "Vitoria", ssml: true, name: "Cloud - pt-BR - Female - Vitoria"},
"pt-BR_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "pt-BR", ename: "Ricardo", ssml: true, name: "Cloud - pt-BR - Male - Ricardo"},
"pt-PT_CLOUD_Male": {gender: "Male", engine: "cloud", params: ['cloud'], language: "pt-PT", ename: "Cristiano", ssml: true, name: "Cloud - pt-PT - Male - Cristiano"},
"pt-PT_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "pt-PT", ename: "Ines", ssml: true, name: "Cloud - pt-PT - Female - Ines"},
"ro-RO_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "ro-RO", ename: "Carmen", ssml: true, name: "Cloud - ro-RO - Female - Carmen"},
"sv-SE_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "sv-SE", ename: "Astrid", ssml: true, name: "Cloud - sv-SE - Female - Astrid"},
"tr-TR_CLOUD_Female": {gender: "Female", engine: "cloud", params: ['cloud'], language: "tr-TR", ename: "Filiz", ssml: true, name: "Cloud - tr-TR - Female - Filiz"},
"en-US": {name: "PicoTTS - Englisch US", engine: "PicoTTS", params: []},
"en-GB": {name: "PicoTTS - Englisch GB", engine: "PicoTTS", params: []},
"de-DE": {name: "PicoTTS - Deutsch", engine: "PicoTTS", params: []},
"it-IT": {name: "PicoTTS - Italiano", engine: "PicoTTS", params: []},
"es-ES": {name: "PicoTTS - Espaniol", engine: "PicoTTS", params: []},
"fr-FR": {name: "PicoTTS - Français", engine: "PicoTTS", params: []},
"ru-RU_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "ru-RU", ename: "Tatyana", ssml: true, name: "AWS Polly - Русский - Татьяна"},
"ru-RU_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "ru-RU", ename: "Maxim", ssml: true, name: "AWS Polly - Русский - Максим"},
"de-DE_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "de-DE", ename: "Marlene", ssml: true, name: "AWS Polly - Deutsch - Marlene"},
"de-DE_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "de-DE", ename: "Hans", ssml: true, name: "AWS Polly - Deutsch - Hans"},
"en-US_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Salli", ssml: true, name: "AWS Polly - en-US - Female - Salli"},
"en-US_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Joey", ssml: true, name: "AWS Polly - en-US - Male - Joey"},
"da-DK_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "da-DK", ename: "Naja", ssml: true, name: "AWS Polly - da-DK - Female - Naja"},
"da-DK_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "da-DK", ename: "Mads", ssml: true, name: "AWS Polly - da-DK - Male - Mads"},
"en-AU_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-AU", ename: "Nicole", ssml: true, name: "AWS Polly - en-AU - Female - Nicole"},
"en-AU_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-AU", ename: "Russell", ssml: true, name: "AWS Polly - en-AU - Male - Russell"},
"en-GB_AP_Female_Amy": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-GB", ename: "Amy", ssml: true, name: "AWS Polly - en-GB - Female - Amy"},
"en-GB_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-GB", ename: "Brian", ssml: true, name: "AWS Polly - en-GB - Male - Brian"},
"en-GB_AP_Female_Emma": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-GB", ename: "Emma", ssml: true, name: "AWS Polly - en-GB - Female - Emma"},
"en-GB-WLS_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-GB-WLS", ename: "Gwyneth", ssml: true, name: "AWS Polly - en-GB-WLS - Female - Gwyneth"},
"en-GB-WLS_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-GB-WLS", ename: "Geraint", ssml: true, name: "AWS Polly - en-GB-WLS - Male - Geraint"},
"cy-GB_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "cy-GB", ename: "Gwyneth", ssml: true, name: "AWS Polly - cy-GB - Female - Gwyneth"},
"cy-GB_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "cy-GB", ename: "Geraint", ssml: true, name: "AWS Polly - cy-GB - Male - Geraint"},
"en-IN_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-IN", ename: "Raveena", ssml: true, name: "AWS Polly - en-IN - Female - Raveena"},
"en-US_AP_Male_Chipmunk": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Chipmunk", ssml: true, name: "AWS Polly - en-US - Male - Chipmunk"},
"en-US_AP_Male_Eric": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Eric", ssml: true, name: "AWS Polly - en-US - Male - Eric"},
"en-US_AP_Female_Ivy": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Ivy", ssml: true, name: "AWS Polly - en-US - Female - Ivy"},
"en-US_AP_Female_Jennifer": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Jennifer", ssml: true, name: "AWS Polly - en-US - Female - Jennifer"},
"en-US_AP_Male_Justin": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Justin", ssml: true, name: "AWS Polly - en-US - Male - Justin"},
"en-US_AP_Female_Kendra": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Kendra", ssml: true, name: "AWS Polly - en-US - Female - Kendra"},
"en-US_AP_Female_Kimberly": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "en-US", ename: "Kimberly", ssml: true, name: "AWS Polly - en-US - Female - Kimberly"},
"es-ES_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "es-ES", ename: "Conchita", ssml: true, name: "AWS Polly - es-ES - Female - Conchita"},
"es-ES_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "es-ES", ename: "Enrique", ssml: true, name: "AWS Polly - es-ES - Male - Enrique"},
"es-US_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "es-US", ename: "Penelope", ssml: true, name: "AWS Polly - es-US - Female - Penelope"},
"es-US_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "es-US", ename: "Miguel", ssml: true, name: "AWS Polly - es-US - Male - Miguel"},
"fr-CA_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "fr-CA", ename: "Chantal", ssml: true, name: "AWS Polly - fr-CA - Female - Chantal"},
"fr-FR_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "fr-FR", ename: "Celine", ssml: true, name: "AWS Polly - fr-FR - Female - Celine"},
"fr-FR_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "fr-FR", ename: "Mathieu", ssml: true, name: "AWS Polly - fr-FR - Male - Mathieu"},
"is-IS_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "is-IS", ename: "Dora", ssml: true, name: "AWS Polly - is-IS - Female - Dora"},
"is-IS_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "is-IS", ename: "Karl", ssml: true, name: "AWS Polly - is-IS - Male - Karl"},
"it-IT_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "it-IT", ename: "Carla", ssml: true, name: "AWS Polly - it-IT - Female - Carla"},
"it-IT_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "it-IT", ename: "Giorgio", ssml: true, name: "AWS Polly - it-IT - Male - Giorgio"},
"nb-NO_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "nb-NO", ename: "Liv", ssml: true, name: "AWS Polly - nb-NO - Female - Liv"},
"nl-NL_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "nl-NL", ename: "Lotte", ssml: true, name: "AWS Polly - nl-NL - Female - Lotte"},
"nl-NL_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "nl-NL", ename: "Ruben", ssml: true, name: "AWS Polly - nl-NL - Male - Ruben"},
"pl-PL_AP_Female_Agnieszka":{gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pl-PL", ename: "Agnieszka", ssml: true, name: "AWS Polly - pl-PL - Female - Agnieszka"},
"pl-PL_AP_Male_Jacek": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pl-PL", ename: "Jacek", ssml: true, name: "AWS Polly - pl-PL - Male - Jacek"},
"pl-PL_AP_Female_Ewa": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pl-PL", ename: "Ewa", ssml: true, name: "AWS Polly - pl-PL - Female - Ewa"},
"pl-PL_AP_Male_Jan": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pl-PL", ename: "Jan", ssml: true, name: "AWS Polly - pl-PL - Male - Jan"},
"pl-PL_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pl-PL", ename: "Maja", ssml: true, name: "AWS Polly - pl-PL - Female - Maja"},
"pt-BR_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pt-BR", ename: "Vitoria", ssml: true, name: "AWS Polly - pt-BR - Female - Vitoria"},
"pt-BR_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pt-BR", ename: "Ricardo", ssml: true, name: "AWS Polly - pt-BR - Male - Ricardo"},
"pt-PT_AP_Male": {gender: "Male", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pt-PT", ename: "Cristiano", ssml: true, name: "AWS Polly - pt-PT - Male - Cristiano"},
"pt-PT_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "pt-PT", ename: "Ines", ssml: true, name: "AWS Polly - pt-PT - Female - Ines"},
"ro-RO_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "ro-RO", ename: "Carmen", ssml: true, name: "AWS Polly - ro-RO - Female - Carmen"},
"sv-SE_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "sv-SE", ename: "Astrid", ssml: true, name: "AWS Polly - sv-SE - Female - Astrid"},
"tr-TR_AP_Female": {gender: "Female", engine: "polly", params: ['accessKey', 'secretKey', 'region'], language: "tr-TR", ename: "Filiz", ssml: true, name: "AWS Polly - tr-TR - Female - Filiz"}
};
var sayitOptions = {
"browser": {name: "Browser", params: ['engine', 'cache', 'instance'], mp3Required: true, checkLength: true, func: (typeof sayItBrowser !== 'undefined') ? sayItBrowser : null, server: true, libs: ['fs', 'crypto', 'http']},
"mp24ftp": {name: "MediaPlayer24+FTP", params: ['engine', 'cache', 'server', 'port', 'user', 'pass'], mp3Required: true, checkLength: true, func: (typeof sayItMP24ftp !== 'undefined') ? sayItMP24ftp : null, server: false, libs: ['fs', 'crypto', 'http', 'jsftp']},
"mp24": {name: "MediaPlayer24", params: ['server'], mp3Required: false, checkLength: true, func: (typeof sayItMP24 !== 'undefined') ? sayItMP24 : null, server: false, libs: ['fs', 'crypto', 'http']},
"system": {name: "System", params: ['engine', 'cache'], mp3Required: true, checkLength: false, func: (typeof sayItSystem !== 'undefined') ? sayItSystem : null, server: false, libs: ['fs', 'crypto', 'http', 'child_process', 'os']},
"windows": {name: "Windows default", params: [], mp3Required: false, checkLength: true, func: (typeof sayItWindows !== 'undefined') ? sayItWindows : null, server: false, libs: ['fs', 'child_process']},
"sonos": {name: "Sonos", params: ['engine', 'cache', 'device', 'web', 'webServer'], mp3Required: true, checkLength: true, func: (typeof sayItSonos !== 'undefined') ? sayItSonos : null, server: true, libs: ['fs', 'crypto', 'http']},
"chromecast": {name: "Chromecast", params: ['engine', 'cache', 'cDevice', 'web', 'webServer'], mp3Required: true, checkLength: true, func: (typeof sayItChromecast !== 'undefined') ? sayItChromecast : null, server: true, libs: ['fs', 'crypto', 'http']},
"mpd": {name: "MPD", params: ['engine', 'cache', 'mpd_device', 'web', 'webServer'], mp3Required: true, checkLength: true, func: (typeof sayItMpd !== 'undefined') ? sayItMpd : null, server: true, libs: ['fs', 'crypto', 'http']},
"googleHome": {name: "Google Home", params: ['engine', 'cache', 'server', 'web', 'webServer'], mp3Required: true, checkLength: true, func: (typeof sayItGoogleHome !== 'undefined') ? sayItGoogleHome : null, server: true, libs: ['fs', 'crypto', 'http', 'castv2-client']}
};
if (typeof module !== 'undefined' && module.parent) {
module.exports.sayitEngines = sayitEngines;
module.exports.sayitOptions = sayitOptions;
}
+42
View File
@@ -0,0 +1,42 @@
{
"sayIt adapter settings": "sayIt Einstellungen",
"Language:": "Sprache",
"Type:": "Ausgabe durch",
"Cache:": "Cache benutzen",
"Server:": "Server",
"Port:": "Port",
"User:": "Anwender",
"Password:": "Kennwort",
"Browser instance:": "Browser-Instanz",
"Device:": "Gerät",
"Web server IP:": "Web server IP",
"All": "Alle",
"Web instance:": "Web instance",
"Voice:": "Stimme",
"API Key:": "API Key",
"Emotion:": "Emotion",
"Drunk:": "Betrunken",
"Ill:": "Krank",
"Robot:": "Roboter",
"Announce:": "Ankündigung",
"place here": "Dateien hier ablegen",
"Announce timeout (sec):": "Ankündigungstimeout (Sek)",
"Announce length (sec):": "Ankündigunglänge (Sek)",
"API Key is not set!": "API Key ist leer!",
"System command:": "Systemkommando",
"Announce volume (%):": "Ankündigungslautstärke(%)",
"Linux player:": "Linux-Player",
"Ignore for non linux OS": "Ignorieren für nicht linux OS",
"Access Key:": "Access Key",
"Secret Key:": "Secret Key",
"AWS Region:": "AWS Region",
"Cloud instance:": "Cloud-Intsanz",
"Cache-Expiry:": "Cache-Expiry",
"Browse": "Suchen",
"select": "auswählen",
"error": "Fehler",
"IP not accessible for server": "IP ist für dieses Gerät nicht erreichbar",
"Install first cloud adapter": "Erst muss cloud-Adapter installiert werden",
"tooltip_type": "Damit wird gesetzt, wo die Sprache ausgegeben wird",
"tooltip_command": "Dieses Kommando wird ausgeführt, um eigenen System-Player zu benutzen"
}
+42
View File
@@ -0,0 +1,42 @@
{
"sayIt adapter settings": "sayIt adapter settings",
"Language:": "Language",
"Type:": "Output in",
"Cache:": "Cache received audio files",
"Server:": "Server",
"Port:": "Port",
"User:": "User",
"Password:": "Password",
"Browser instance:": "Browser instance",
"Device:": "Device",
"Web server IP:": "Web server IP",
"All": "All",
"Web instance:": "Web instance",
"Voice:": "Voice",
"API Key:": "API Key",
"Emotion:": "Emotion",
"Drunk:": "Drunk",
"Ill:": "Ill",
"Robot:": "Robot",
"Announce:": "Announce",
"place here": "Place files here",
"Announce timeout (sec):": "Announce timeout (sec)",
"Announce length (sec):": "Announce length (sec)",
"API Key is not set!": "API Key is not set!",
"System command:": "System command",
"Announce volume (%):": "Announce volume(%)",
"Linux player:": "Linux player",
"Ignore for non linux OS": "Ignore for non linux OS",
"Access Key:": "Access Key",
"Secret Key:": "Secret Key",
"AWS Region:": "AWS Region",
"Cloud instance:": "Cloud instance",
"Cache-Expiry:": "Cache-Expiry",
"Browse": "Browse",
"select": "select",
"error": "error",
"IP not accessible for server": "IP is not accessible for the device",
"Install first cloud adapter": "Install first cloud adapter",
"tooltip_type": "Specify where the voice must be played",
"tooltip_command": "This command will be executed, to use the custom system player"
}
+42
View File
@@ -0,0 +1,42 @@
{
"sayIt adapter settings": "sayIt configuración del adaptador",
"Language:": "Idioma",
"Type:": "Salida en",
"Cache:": "Caché recibió archivos de audio",
"Server:": "Servidor",
"Port:": "Puerto",
"User:": "Usuario",
"Password:": "Contraseña",
"Browser instance:": "Instancia del navegador",
"Device:": "Dispositivo",
"Web server IP:": "Servidor web IP",
"All": "Todas",
"Web instance:": "Instancia web",
"Voice:": "Voz",
"API Key:": "Clave API",
"Emotion:": "Emoción",
"Drunk:": "Borracho",
"Ill:": "Enfermo",
"Robot:": "Robot",
"Announce:": "Anunciar",
"place here": "Coloque los archivos aquí",
"Announce timeout (sec):": "Anunciar tiempo de espera (sec)",
"Announce length (sec):": "Anunciar longitud (sec)",
"API Key is not set!": "¡La clave API no está configurada!",
"System command:": "Comando del sistema",
"Announce volume (%):": "Anunciar volumen (%)",
"Linux player:": "Reproductor de Linux",
"Ignore for non linux OS": "Ignorar para el sistema operativo no Linux",
"Access Key:": "Llave de acceso",
"Secret Key:": "Llave secreta",
"AWS Region:": "Región de AWS",
"Cloud instance:": "Instancia de la nube",
"Cache-Expiry:": "Caché-expiración",
"Browse": "Vistazo",
"select": "seleccionar",
"error": "error",
"IP not accessible for server": "IP no es accesible para el dispositivo",
"Install first cloud adapter": "Instale el primer adaptador de nube",
"tooltip_type": "Especifique dónde debe reproducirse la voz",
"tooltip_command": "Este comando se ejecutará para usar el reproductor de sistema personalizado"
}
+42
View File
@@ -0,0 +1,42 @@
{
"sayIt adapter settings": "sayIt paramètres de l'adaptateur",
"Language:": "La langue",
"Type:": "Sortie dans",
"Cache:": "Cache les fichiers audio reçus",
"Server:": "Serveur",
"Port:": "Port",
"User:": "Utilisateur",
"Password:": "Mot de passe",
"Browser instance:": "Instance du navigateur",
"Device:": "Dispositif",
"Web server IP:": "Adresse IP du serveur Web",
"All": "Tout",
"Web instance:": "Instance Web",
"Voice:": "Voix",
"API Key:": "clé API",
"Emotion:": "Émotion",
"Drunk:": "Ivre",
"Ill:": "Mauvais",
"Robot:": "Robot",
"Announce:": "Annoncer",
"place here": "Placez les fichiers ici",
"Announce timeout (sec):": "Annoncer le délai (sec)",
"Announce length (sec):": "Annoncer la longueur (sec)",
"API Key is not set!": "La clé de l'API n'est pas définie!",
"System command:": "Commande système",
"Announce volume (%):": "Annoncer le volume (%)",
"Linux player:": "Lecteur Linux",
"Ignore for non linux OS": "Ignorer pour les systèmes d'exploitation autres que Linux",
"Access Key:": "Clef d'accès",
"Secret Key:": "Clef secrète",
"AWS Region:": "Région AWS",
"Cloud instance:": "Instance de cloud",
"Cache-Expiry:": "Cache-Expiration",
"Browse": "Feuilleter",
"select": "sélectionner",
"error": "Erreur",
"IP not accessible for server": "L'adresse IP n'est pas accessible pour l'appareil",
"Install first cloud adapter": "Installez le premier adaptateur de cloud",
"tooltip_type": "Précisez où la voix doit être jouée",
"tooltip_command": "Cette commande sera exécutée pour utiliser le lecteur système personnalisé"
}
+42
View File
@@ -0,0 +1,42 @@
{
"sayIt adapter settings": "impostazioni dell'adattatore sayIt",
"Language:": "linguaggio",
"Type:": "Uscita in",
"Cache:": "La cache ha ricevuto file audio",
"Server:": "server",
"Port:": "Porta",
"User:": "Utente",
"Password:": "Parola d'ordine",
"Browser instance:": "Istanza del browser",
"Device:": "Dispositivo",
"Web server IP:": "IP del server Web",
"All": "Tutti",
"Web instance:": "Istanza Web",
"Voice:": "Voce",
"API Key:": "Chiave API",
"Emotion:": "Emozione",
"Drunk:": "Ubriaco",
"Ill:": "Malato",
"Robot:": "Robot",
"Announce:": "Annunciare",
"place here": "Inserisci i file qui",
"Announce timeout (sec):": "Annuncia timeout (sec)",
"Announce length (sec):": "Annunciare la lunghezza (sec)",
"API Key is not set!": "Chiave API non impostata!",
"System command:": "Comando di sistema",
"Announce volume (%):": "Annuncia volume (%)",
"Linux player:": "Lettore Linux",
"Ignore for non linux OS": "Ignora per sistema operativo non Linux",
"Access Key:": "Chiave di accesso",
"Secret Key:": "Chiave segreta",
"AWS Region:": "Regione AWS",
"Cloud instance:": "Istanza Cloud",
"Cache-Expiry:": "Cache-scadenza",
"Browse": "Navigare",
"select": "selezionare",
"error": "errore",
"IP not accessible for server": "L'IP non è accessibile per il dispositivo",
"Install first cloud adapter": "Installa il primo adattatore cloud",
"tooltip_type": "Specificare dove deve essere suonata la voce",
"tooltip_command": "Questo comando verrà eseguito, per utilizzare il player di sistema personalizzato"
}
+42
View File
@@ -0,0 +1,42 @@
{
"sayIt adapter settings": "sayIt adapter-instellingen",
"Language:": "Taal",
"Type:": "Uitgang in",
"Cache:": "Cache ontvangen audiobestanden",
"Server:": "Server",
"Port:": "Haven",
"User:": "Gebruiker",
"Password:": "Wachtwoord",
"Browser instance:": "Browserinstantie",
"Device:": "Apparaat",
"Web server IP:": "Webserver IP",
"All": "Alle",
"Web instance:": "Web-instantie",
"Voice:": "Stem",
"API Key:": "API sleutel",
"Emotion:": "Emotie",
"Drunk:": "Dronken",
"Ill:": "Ziek",
"Robot:": "Robot",
"Announce:": "aankondigen",
"place here": "Plaats hier bestanden",
"Announce timeout (sec):": "Announce time-out (sec)",
"Announce length (sec):": "Kondig lengte (sec)",
"API Key is not set!": "API-sleutel is niet ingesteld!",
"System command:": "Systeemopdracht",
"Announce volume (%):": "Volume aankondigen (%)",
"Linux player:": "Linux-speler",
"Ignore for non linux OS": "Negeren voor niet-Linux OS",
"Access Key:": "Toegangssleutel",
"Secret Key:": "Geheime sleutel",
"AWS Region:": "AWS-regio",
"Cloud instance:": "Cloud instantie",
"Cache-Expiry:": "Cache-Vervaldatum",
"Browse": "Blader",
"select": "kiezen",
"error": "fout",
"IP not accessible for server": "IP is niet toegankelijk voor het apparaat",
"Install first cloud adapter": "Installeer de eerste cloudadapter",
"tooltip_type": "Geef op waar de stem moet worden afgespeeld",
"tooltip_command": "Deze opdracht wordt uitgevoerd om de aangepaste systeemspeler te gebruiken"
}
+42
View File
@@ -0,0 +1,42 @@
{
"sayIt adapter settings": "sayTo ustawienia adaptera",
"Language:": "Język",
"Type:": "Wyjście w",
"Cache:": "Pamięć podręczna otrzymała pliki audio",
"Server:": "serwer",
"Port:": "Port",
"User:": "Użytkownik",
"Password:": "Hasło",
"Browser instance:": "Browser instance",
"Device:": "Urządzenie",
"Web server IP:": "Adres IP serwera WWW",
"All": "Wszystko",
"Web instance:": "Instancja internetowa",
"Voice:": "Głos",
"API Key:": "Klucz API",
"Emotion:": "Emocja",
"Drunk:": "Pijany",
"Ill:": "Chory",
"Robot:": "Robot",
"Announce:": "Ogłosić",
"place here": "Umieść pliki tutaj",
"Announce timeout (sec):": "Ogłaszaj limit czasu (sek)",
"Announce length (sec):": "Ogłaszaj długość (s)",
"API Key is not set!": "Klucz API nie jest ustawiony!",
"System command:": "Polecenie systemowe",
"Announce volume (%):": "Ogłaszaj objętość (%)",
"Linux player:": "Odtwarzacz Linux",
"Ignore for non linux OS": "Zignoruj dla systemu operacyjnego non linux",
"Access Key:": "Klucz dostępu",
"Secret Key:": "Sekretny klucz",
"AWS Region:": "Region AWS",
"Cloud instance:": "Instancja chmury",
"Cache-Expiry:": "Cache-Expiry",
"Browse": "Paść się",
"select": "Wybierz",
"error": "błąd",
"IP not accessible for server": "Adres IP jest niedostępny dla urządzenia",
"Install first cloud adapter": "Zainstaluj pierwszy adapter chmury",
"tooltip_type": "Określ, gdzie musi być odtwarzany głos",
"tooltip_command": "To polecenie zostanie wykonane, aby użyć niestandardowego odtwarzacza systemu"
}
+42
View File
@@ -0,0 +1,42 @@
{
"sayIt adapter settings": "configurações do adaptador sayIt",
"Language:": "Língua",
"Type:": "Saída em",
"Cache:": "Cache recebido arquivos de áudio",
"Server:": "Servidor",
"Port:": "Porta",
"User:": "Do utilizador",
"Password:": "Senha",
"Browser instance:": "Instância do navegador",
"Device:": "Dispositivo",
"Web server IP:": "IP do servidor da Web",
"All": "Todos",
"Web instance:": "Instância da Web",
"Voice:": "Voz",
"API Key:": "Chave API",
"Emotion:": "Emoção",
"Drunk:": "Bêbado",
"Ill:": "Eu vou",
"Robot:": "Robô",
"Announce:": "Anunciar",
"place here": "Coloque arquivos aqui",
"Announce timeout (sec):": "Anular o tempo limite (seg)",
"Announce length (sec):": "Anunciar o comprimento (seg)",
"API Key is not set!": "A chave da API não está definida!",
"System command:": "Comando do sistema",
"Announce volume (%):": "Anunciar volume (%)",
"Linux player:": "Jogador Linux",
"Ignore for non linux OS": "Ignorar para SO não linux",
"Access Key:": "Chave de acesso",
"Secret Key:": "Chave secreta",
"AWS Region:": "Região da AWS",
"Cloud instance:": "Instância de nuvem",
"Cache-Expiry:": "Cache-Expiração",
"Browse": "Squeaky toy",
"select": "selecione",
"error": "erro",
"IP not accessible for server": "IP não está acessível para o dispositivo",
"Install first cloud adapter": "Instalar o primeiro adaptador de nuvem",
"tooltip_type": "Especifique onde a voz deve ser tocada",
"tooltip_command": "Este comando será executado para usar o player do sistema personalizado"
}
+42
View File
@@ -0,0 +1,42 @@
{
"sayIt adapter settings": "sayIt Настройки",
"Language:": "Язык",
"Type:": "Вывод звука",
"Cache:": "Кэшировать полученные аудио-файлы",
"Server:": "Сервер",
"Port:": "Порт",
"User:": "Пользователь",
"Password:": "Пароль",
"Browser instance:": "ID броузера",
"Device:": "Устройство",
"Web server IP:": "IP Веб сервера",
"All": "Все",
"Web instance:": "Web instance",
"Voice:": "Голос",
"API Key:": "API Key",
"Emotion:": "Емоциональный окрас",
"Drunk:": "Пьяный голос",
"Ill:": "Больной голос",
"Robot:": "Голос робота",
"Announce:": "Извещение",
"place here": "Перетащите файлы сюда",
"Announce timeout (sec):": "Таймаут извещения (сек)",
"Announce length (sec):": "Длительность извещения (сек)",
"API Key is not set!": "API Key отсутствует!",
"System command:": "Системный вызов",
"Announce volume (%):": "Громкость извещения(%)",
"Linux player:": "Linux плейер",
"Ignore for non linux OS": "Игнорировать для не linux OS",
"Access Key:": "Access Key",
"Secret Key:": "Secret Key",
"AWS Region:": "AWS регион",
"Cloud instance:": "Cloud драйвер",
"Cache-Expiry:": "Срок хранения кэш",
"Browse": "Искать",
"select": "выбрать",
"error": "ошибка",
"IP not accessible for server": "Этот IP недоступен для устройства",
"Install first cloud adapter": "Сначала установите cloud драйвер",
"tooltip_type": "Укажите как и где будет выводится голос",
"tooltip_command": "Эта команда выполнится для проигрывания с собственным плеером"
}
+650
View File
@@ -0,0 +1,650 @@
<html>
<head>
<link rel="stylesheet" type="text/css" href="../../lib/css/themes/jquery-ui/redmond/jquery-ui.min.css"/>
<script type="text/javascript" src="../../lib/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
<script type="text/javascript" src="../../lib/js/jquery-ui-1.10.3.full.min.js"></script>
<link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
<script type="text/javascript" src="engines.js"></script>
<script type="text/javascript" src="../../js/translate.js"></script>
<script type="text/javascript" src="../../js/adapter-settings.js"></script>
<script type="text/javascript" src="words.js"></script>
<style>
#drop_zone {
border: 2px dashed #bbb;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
padding: 25px;
text-align: center;
font-size: 20pt;
font-weight: bold;
font-family: 'Arial';
color: #bbb;
width: 90%;
height: 60px;
}
.error {
border: 2px solid red;
}
</style>
<script type="text/javascript">
var webServers = null;
var gOnChange;
function showHideSettings() {
$('.variable').hide();
var type = $('#type').val();
for (var j = 0; j < sayitOptions[type].params.length; j++) {
$('#tr_' + sayitOptions[type].params[j]).show();
}
if (type === 'googleHome') {
$('.announceValue').hide();
$('.announce').hide();
$('.system').hide();
$('.googleHome').show();
getIsAdapterAlive(function (isAlive) {
if (isAlive || common.enabled) {
$('#search').button('enable');
fillGoogleHome();
}
});
} else {
$('.googleHome').hide();
$('.announceValue').show();
$('.announce').show();
}
$('.engine').hide();
var engine = $('#engine').val();
if (!sayitEngines[engine] || sayitOptions[type].params.indexOf('engine') === -1) return;
for (var i = 0; i < sayitEngines[engine].params.length; i++) {
$('#tr_' + sayitEngines[engine].params[i]).show();
if (sayitEngines[engine][sayitEngines[engine].params[i]]) {
var arr = sayitEngines[engine][sayitEngines[engine].params[i]];
var param = sayitEngines[engine].params[i];
var $val = $('#' + param);
if (arr.length) {
var val = $val.val();
var text = '';
for (var p = 0; p < arr.length; p++) {
text += '<option value="' + arr[p] + '">' + arr[p] + '</option>';
}
$val.html(text);
if (val) {
$val.val(val);
} else {
$val.val(arr[0]);
}
} else {
$val.html('');
}
}
}
if (type !== 'system') {
$('.system').hide();
} else {
$('.system').show();
}
if (!$('#announce').val()) {
$('.announce').hide();
$('#play').button('disable');
} else {
$('.announce').show();
$('#play').button('enable');
}
}
function fillSonosDevices(elem, current) {
socket.emit('getObjectView', 'system', 'channel', {startkey: 'sonos.', endkey: 'sonos.\u9999'}, function (err, res) {
if (!err && res) {
for (var i = 0; i < res.rows.length; i++) {
$(elem).append('<option value="' + res.rows[i].id + '">' + res.rows[i].id + '</option>');
}
}
$(elem).val(current);
});
}
function fillMpdDevice(elem, current) {
socket.emit('getObjectView', 'system', 'instance', {startkey: 'system.adapter.mpd.', endkey: 'system.adapter.mpd.\u9999'}, function (err, res) {
if (!err && res) {
for (var i = 0; i < res.rows.length; i++) {
var n = res.rows[i].id.replace('system.adapter.', '');
$(elem).append('<option value="' + n + '">' + n + '</option>');
}
}
$(elem).val(current);
});
}
function fillChromecastDevices(elem, current) {
socket.emit('getObjectView', 'system', 'device', {startkey: 'chromecast.', endkey: 'chromecast.\u9999'}, function (err, res) {
if (!err && res) {
for (var i = 0; i < res.rows.length; i++) {
$(elem).append('<option value="' + res.rows[i].id + '">' + res.rows[i].id + '</option>');
}
}
$(elem).val(current);
});
}
function fillGoogleHome() {
$('#search').button('disable');
sendTo(null, 'browseChromecast', null, function (list) {
var text = '<option value="">' + _('select') + '</option>';
if (list) {
for (var i = 0; i < list.length; i++) {
text += '<option value="' + list[i].ip + '">' + list[i].name + '[' + list[i].ip + ']</option>';
}
$('#googleHome').html(text).prop('disabled', false).off('change').on('change', function () {
$('#server').val($(this).val()).trigger('change');
});
} else {
$('#googleHome').html('<option value="">' + _('error') + '</option>').prop('disabled', true);
}
$('#search').button('enable');
});
}
function ip2hex(ip) {
var octets = ip.split('.');
if (octets.length !== 4) {
return 0;
}
var result = 0;
for (var i = 0; i < octets.length; ++i) {
var octet = parseInt(octets[i], 10);
if (Number.isNaN(octet) || octet < 0 || octet > 255) {
throw new Error("Each octet must be between 0 and 255");
}
result |= octet << ((octets.length - i) * 8);
}
return result;
}
function checkWeb(elem, current) {
var web = $('#web').val();
for (var i = 0; i < webServers.length; i++) {
if (webServers[i].id === 'system.adapter.' + web) {
if (webServers[i].value.native.auth) {
showMessage(_('Cannot use web server with authentication'), null, 'info');
}
if (webServers[i].value.native.bind === 'localhost' || webServers[i].value.native.bind === '127.0.0.1' || webServers[i].value.native.bind === '::1') {
showMessage(_('Cannot use web server only on localhost'), null, 'info');
}
if (webServers[i].value.native.bind === '0.0.0.0') {
$('#tr_webServer').show();
var $webServer = $('#webServer');
$webServer.html('');
// read all ipv4 addresses of host
socket.emit('getObject', 'system.host.' + webServers[i].value.common.host, function (err, obj) {
var text = '';
if (!err && obj && obj.native) {
for (var iface in obj.native.hardware.networkInterfaces) {
if (obj.native.hardware.networkInterfaces.hasOwnProperty(iface)) {
for (var i = 0; i < obj.native.hardware.networkInterfaces[iface].length; i++) {
if (obj.native.hardware.networkInterfaces[iface][i].family === 'IPv4' && !obj.native.hardware.networkInterfaces[iface][i].internal) {
text += '<option value="' + obj.native.hardware.networkInterfaces[iface][i].address + '" data-mask="' + obj.native.hardware.networkInterfaces[iface][i].netmask + '">[IPv4] ' + obj.native.hardware.networkInterfaces[iface][i].address + ' - ' + iface + '</option>';
}
}
}
}
}
$webServer.html(text);
if (current) {
$webServer.val(current);
}
$webServer.off('change').on('change', function () {
gOnChange();
var ip = $(this).val();
var netmask = $(this).find('option[value="' + ip + '"]').data('mask');
var server;
var type = $('#type').val();
if (type === 'googleHome') {
server = $('#server').val();
} else if (type === 'sonos') {
server = $('#device').val();
} else if (type === 'chromecast') {
server = $('#cDevice').val();
} else if (type === 'mpd') {
server = $('#mpd_device').val();
}
if (server && ip && netmask && server.indexOf(':') === -1 && ip.indexOf(':') === -1) {
ip = ip2hex(ip);
netmask = ip2hex(netmask);
server = ip2hex(server);
if ((ip & netmask) !== (server & netmask)) {
$webServer.addClass('error').attr('title', _('IP not accessible for server'));
} else {
$webServer.removeClass('error').attr('title', '');
}
} else {
$webServer.removeClass('error');
}
});
});
} else if (webServers[i].value.native.bind === '::') {
// read all ipv6 addresses of host
socket.emit('getObject', 'system.host.' + webServers[i].value.common.host, function (err, obj) {
if (!err && obj && obj.native) {
for (var iface in obj.native.hardware.networkInterfaces) {
if (obj.native.hardware.networkInterfaces.hasOwnProperty(iface)) {
for (var i = 0; i < obj.native.hardware.networkInterfaces[iface].length; i++) {
if (obj.native.hardware.networkInterfaces[iface][i].family === 'IPv6' && !obj.native.hardware.networkInterfaces[iface][i].internal) {
$('#webServer').append('<option value="' + obj.native.hardware.networkInterfaces[iface][i].address + '">[IPv6] ' + obj.native.hardware.networkInterfaces[iface][i].address + ' - ' + iface + '</option>');
}
}
}
}
}
if (current) {
$('#webServer').val(current);
}
});
} else {
$('#tr_webServer').hide();
}
}
}
}
function fillWebServices(elem, current, type, webServer) {
socket.emit('getObjectView', 'system', 'instance', {startkey: 'system.adapter.web.', endkey: 'system.adapter.web.\u9999'}, function (err, res) {
if (!err && res) {
webServers = res.rows;
for (var i = 0; i < res.rows.length; i++) {
var n = res.rows[i].id.replace('system.adapter.', '');
var auth = res.rows[i].value.native.auth ? 'data-auth="true"' : '';
$(elem).append('<option value="' + n + '" ' + auth + '>' + n + '</option>');
}
}
$(elem).val(current);
if ((type === 'sonos') ||
(type === 'chromecast') ||
(type === 'googleHome')) {
checkWeb('#web', webServer);
}
});
}
function uploadFile(file, callback) {
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = function(e) {
socket.emit('writeFile', 'sayit.' + instance, 'tts.userfiles/' + file.name, e.target.result, function () {
if (callback) callback(file.name);
});
};
// Read in the image file as a data URL.
reader.readAsArrayBuffer(file);
}
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
$('#drop_indcator').hide();
// files is a FileList of File objects. List some properties.
var count = 0;
for (var i = 0, f; f = files[i]; i++) {
if (f.size > 1024 * 1024) {
showMessage(_('File %s is too big. Maximum 1MB', escape(f.name)));
$('#files').val('');
return;
}
if (f.name === 'say.mp3') {
showMessage(_('Name say.mp3 is reserved'));
$('#files').val('');
return;
}
count++;
uploadFile(f, function (name) {
count--;
if (!count) {
// Read names of files for gong
socket.emit('readDir', 'sayit.' + instance, 'tts.userfiles', function (err, dir) {
var text = '<option value="">' + _('none') + '</option>';
if (dir) {
for (var i = 0; i < dir.length; i++) {
if (dir[i].isDir) continue;
text += '<option value="' + dir[i].file + '">' + dir[i].file + '</option>';
}
}
$('#announce').html(text).val(name).trigger('change');
$('#files').val('');
});
}
});
}
}
function handleFileSelectDrop(evt) {
$('#drop_indcator').hide();
evt.stopPropagation();
evt.preventDefault();
var files = evt.dataTransfer.files; // FileList object.
// files is a FileList of File objects. List some properties.
var output = [];
for (var i = 0, f; f = files[i]; i++) {
if (f.size > 1024 * 1024) {
showMessage(_('File %s is too big. Maximum 1MB', escape(f.name)));
return;
}
console.log(escape(f.name));
}
}
function handleDragOver(evt) {
evt.stopPropagation();
evt.preventDefault();
evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
$('#drop_indcator').show();
}
// the function loadSettings has to exist ...
function load(settings, onChange) {
if (!settings) return;
if (!settings.player) {
settings.player = 'mpg321';
}
gOnChange = onChange;
var $play = $('#play');
var $announce = $('#announce');
$play.button({icons: {primary: 'ui-icon-play'}, text: false}).css({width: 22, height: 22}).click(function () {
socket.emit('readFile', 'sayit.' + instance, 'tts.userfiles/' + $('#announce').val(), function (err, data) {
if (typeof AudioContext !== 'undefined') {
context = new AudioContext();
context.decodeAudioData(data, function(buffer) {
//console.log(buffer);
var source = context.createBufferSource(); // creates a sound source
source.buffer = buffer; // tell the source which sound to play
source.connect(context.destination); // connect the source to the context's destination (the speakers)
source.start(0);
}, function(err) {
console.log(err);
});
}
});
});
var $type = $('#type');
for (name in sayitOptions) {
if (sayitOptions.hasOwnProperty(name)) {
$type.append('<option value="' + name + '">' + sayitOptions[name].name + '</option>');
}
}
$('#search').button({
label: _('Browse')
}).click(function () {
fillGoogleHome();
});
getIsAdapterAlive(function (isAlive) {
if (isAlive || common.enabled) {
$('#search').button('enable');
if (settings.type === 'googleHome') {
fillGoogleHome();
}
} else {
$('#search').button('disable').title(_('Adapter must be enabled'));
}
});
var $engine = $('#engine');
for (var name in sayitEngines) {
if (sayitEngines.hasOwnProperty(name)) {
$engine.append('<option value="' + name + '">' + sayitEngines[name].name + '</option>');
}
}
for (var key in settings) {
if (settings.hasOwnProperty(key)) {
var $val = $('#' + key + '.value');
if ($val.attr('type') === 'checkbox') {
$val.prop('checked', settings[key]);
} else {
$val.val(settings[key]);
}
}
}
$('.value').on('change', function () {
var key = $(this).attr('id');
if (key === 'auth') {
if ($('#auth').prop('checked')) {
$('#secure').prop('checked', true);
}
} else
if (key === 'type' || key === 'engine') {
showHideSettings();
var type = $('#type').val();
if ((type === 'sonos') ||
(type === 'chromecast') ||
(type === 'mpd') ||
(type === 'googleHome')) {
checkWeb('#web');
$('#announce').val('').trigger('change');
showHideSettings();
} else {
showHideSettings();
}
} else
if (key === 'announce') {
showHideSettings();
if ($(this).val()) {
socket.emit('readFile', 'sayit.' + instance, 'tts.userfiles/' + $('#announce').val(), function (err, data) {
if (typeof AudioContext !== 'undefined') {
context = new AudioContext();
context.decodeAudioData(data, function (buffer) {
$('#annoDuration').val(Math.ceil(buffer.duration));
}, function (err) {
console.log(err);
});
}
});
}
}
if (key === 'web') {
checkWeb('#web');
}
onChange();
}).keyup(function() {
$(this).trigger('change');
});
if (!settings.engine) {
settings.engine = systemLang;
$engine.val(systemLang).trigger('change');
}
if (!settings.instance) {
settings.instance = 'FFFFFFFF';
$('#instance').val(settings.instance).trigger('change');
}
fillSonosDevices('#device', settings.device);
fillChromecastDevices('#cDevice', settings.cDevice);
fillWebServices('#web', settings.web, settings.type, settings.webServer);
fillMpdDevice('#mpd_device', settings.mpd_device);
if ((settings.type === 'sonos') ||
(settings.type === 'chromecast') ||
(settings.type === 'mpd') ||
(settings.type === 'googleHome')){
$('.announce').hide();
if (settings.announce) {
$announce.val('').trigger('change');
}
}
// Read names of files for gong
socket.emit('readDir', 'sayit.' + instance, 'tts.userfiles', function (err, dir) {
var text = '<option value="">' + _('none') + '</option>';
if (dir) {
for (var i = 0; i < dir.length; i++) {
if (dir[i].isDir) continue;
text += '<option value="' + dir[i].file + '">' + dir[i].file + '</option>';
}
}
$('#announce').html(text).val(settings.announce);
showHideSettings();
});
getAdapterInstances('cloud', function (list) {
if (list) {
var text = '';
for (var i = 0; i < list.length; i++) {
var id = list[i]._id.substring('system.adapter.'.length);
text += '<option value="' + id + '" ' + (id === settings.cloud ? 'selected' : '') + '>' + id + '</option>';
}
if (text) $('#cloud').html(text);
}
});
$('#voice').val(settings.voice);
var w = $engine.width();
$announce.css({width: w});
$type.css({width: w});
document.getElementById('files').addEventListener('change', handleFileSelect, false);
showHideSettings();
if (!$announce.val()) {
$play.button('disable');
}
if (typeof AudioContext === 'undefined') {
$play.hide();
}
var dropZone = document.getElementById('drop_zone');
if (dropZone) {
dropZone.addEventListener('dragover', handleDragOver, false);
dropZone.addEventListener('drop', handleFileSelect, false);
/*dropZone.addEventListener('dragend', function () {
$(this).css({background: 'white'});
console.log('dragend');
return false;
}, false);
dropZone.addEventListener('dragstart', function () {
console.log('dragstart');
}, false);
dropZone.addEventListener('dragleave', function () {
$(this).css({background: 'white'});
}, false);
dropZone.addEventListener('dragenter', function () {
$(this).css({background: 'gray'});
}, false);*/
}
onChange(false);
}
function save(callback) {
var obj = {};
$('.value').each(function () {
var $this = $(this);
if ($this.attr('type') === 'checkbox') {
obj[$this.attr('id')] = $this.prop('checked');
} else {
obj[$this.attr('id')] = $this.val();
}
});
if (obj.engine && sayitEngines[obj.engine].engine === 'yandex') {
if (!obj.key) {
showMessage(_('API Key is not set!'));
return;
}
} else
if (obj.engine && sayitEngines[obj.engine].engine === 'polly') {
if (!obj.accessKey || !obj.secretKey) {
showMessage(_('API Key is not set!'));
return;
}
if (!obj.region) {
showMessage(_('AWS Region is not set!'));
return;
}
}
if (obj.type === 'googleHome') {
obj.cache = false;
}
callback(obj);
}
</script>
</head>
<body>
<!-- you have to put your config page in a div with id adapter-container -->
<div id="adapter-container" ondragover="return false" ondrop="return false">
<table><tr><td><img src="sayit.png"></td><td><h3 class="translate">sayIt adapter settings</h3></td></tr></table>
<div>
<table>
<tr><td><label class="translate" for="type">Type:</label></td><td class="admin-icon" data-link="configuration"></td><td><select class="value" id="type"></select></td></tr>
<tr id="tr_engine" class="variable"><td style="width: 150px"><label class="translate" for="engine">Language:</label></td><td class="admin-icon" data-link="tts-engines"></td><td><select class="value" id="engine"></select></td></tr>
<tr class="system"><td><label for="player" class="translate">Linux player:</label></td><td class="admin-icon"></td><td>
<select class="value" id="player" >
<option value="mpg321">mpg321</option>
<option value="omxplayer">omxplayer</option>
</select><span class="translate" style="padding-left: 10px; font-size: 10px">Ignore for non linux OS</span>
</td>
</tr>
<tr class="system"><td><label class="translate" for="command">System command:</label></td><td class="admin-icon" data-link="system-command"></td><td><input class="value" id="command"/></td></tr>
<tr class="announceValue"><td><label class="translate" for="announce">Announce:</label></td><td class="admin-icon"></td><td><select class="value" id="announce"></select>&nbsp;<button id="play"></button></td></tr>
<tr class="announceValue"><td></td><td></td><td><input type="file" accept=".mp3,audio/*" id="files" name="files[]" multiple /></td></tr>
<tr class="announce"><td><label class="translate" for="annoTimeout">Announce timeout (sec):</label></td><td class="admin-icon"></td><td><input class="value" id="annoTimeout" size="8" /></td></tr>
<tr class="announce"><td><label class="translate" for="annoDuration">Announce length (sec):</label></td><td class="admin-icon"></td><td><input class="value" id="annoDuration" size="2" /></td></tr>
<tr class="announce"><td><label class="translate" for="annoVolume">Announce volume (%):</label></td><td class="admin-icon"></td><td><input class="value" id="annoVolume" size="3" /></td></tr>
<tr><td>&nbsp;</td><td></td><td>&nbsp;</td></tr>
<tr id="tr_cache" class="variable"><td><label class="translate" for="cache">Cache:</label></td><td class="admin-icon"></td> <td><input class="value" id="cache" type="checkbox" /></td></tr>
<tr id="tr_cacheExpiryDays" class="variable"><td><label class="translate" for="tr_cacheExpiryDays">Cache-Expiry:</label></td><td class="admin-icon"></td> <td><input class="value" id="cacheExpiryDays" size="5" /></td></tr>
<tr id="tr_server" class="variable"><td><label class="translate" for="server">Server:</label></td><td class="admin-icon"></td> <td><input class="value" id="server"/><select class="value googleHome" id="googleHome"><option value="" class="translate">none</option></select><button style="font-size: 10px; margin-left: 10px;" id="search" class="translate googleHome"></button></td></tr>
<tr id="tr_port" class="variable"><td><label class="translate" for="port">Port:</label></td><td class="admin-icon"></td> <td><input class="value" id="port" size="5" maxlength="5"/></td></tr>
<tr id="tr_user" class="variable"><td><label class="translate" for="user">User:</label></td><td class="admin-icon"></td> <td><input class="value" id="user" /></td></tr>
<tr id="tr_pass" class="variable"><td><label class="translate" for="pass">Password:</label></td><td class="admin-icon"></td><td><input class="value" id="pass" /></td></tr>
<tr id="tr_instance" class="variable"><td><label class="translate" for="instance">Browser instance:</label></td><td class="admin-icon"></td><td><input class="value" id="instance" /></td></tr>
<tr id="tr_device" class="variable"><td><label class="translate" for="device">Device:</label></td><td class="admin-icon"></td><td><select class="value" id="device"><option value="" class="translate">All</option></select></td></tr>
<tr id="tr_cDevice" class="variable"><td><label class="translate" for="cDevice">Device:</label></td><td class="admin-icon"></td><td><select class="value" id="cDevice"><option value="" class="translate">All</option></select></td></tr>
<tr id="tr_mpd_device" class="variable"><td><label class="translate" for="mpd_device">Device:</label></td><td class="admin-icon"></td><td><select class="value" id="mpd_device"><option value="" class="translate">All</option></select></td></tr>
<tr id="tr_web" class="variable"><td><label class="translate" for="web">Web instance:</label></td><td class="admin-icon"></td><td><select class="value" id="web"></select></td></tr>
<tr id="tr_webServer" class="variable"><td><label class="translate" for="webServer">Web server IP:</label></td><td class="admin-icon"></td><td><select class="value" id="webServer"></select></td></tr>
<tr id="tr_voice" class="engine" ><td><label class="translate" for="voice">Voice:</label></td><td class="admin-icon"></td><td><select class="value" id="voice"></select></td></tr>
<tr id="tr_key" class="engine" ><td><label class="translate" for="key">API Key:</label></td><td class="admin-icon"></td><td><input class="value" id="key" type="text"/></td></tr>
<tr id="tr_emotion" class="engine" ><td><label class="translate" for="emotion">Emotion:</label></td><td class="admin-icon"></td><td><select class="value" id="emotion"></select></td></tr>
<tr id="tr_drunk" class="engine" ><td><label class="translate" for="drunk">Drunk:</label></td><td class="admin-icon"></td><td><input type="checkbox" class="value" id="drunk"/></td></tr>
<tr id="tr_ill" class="engine" ><td><label class="translate" for="ill">Ill:</label></td><td class="admin-icon"></td><td><input type="checkbox" class="value" id="ill"/></td></tr>
<tr id="tr_robot" class="engine" ><td><label class="translate" for="robot">Robot:</label></td><td class="admin-icon"></td><td><input type="checkbox" class="value" id="robot"/></td></tr>
<tr id="tr_accessKey" class="engine" ><td><label class="translate" for="accessKey">Access Key:</label></td><td class="admin-icon"></td><td><input class="value" id="accessKey" type="text"/></td></tr>
<tr id="tr_secretKey" class="engine" ><td><label class="translate" for="secretKey">Secret Key:</label></td><td class="admin-icon"></td><td><input class="value" id="secretKey" type="password"/></td></tr>
<tr id="tr_region" class="engine" ><td><label class="translate" for="region">AWS Region:</label></td><td class="admin-icon"></td><td><input class="value" id="region" type="text"/></td></tr>
<tr id="tr_cloud" class="engine" ><td><label class="translate" for="cloud">Cloud instance:</label></td><td class="admin-icon"></td><td><select class="value" id="cloud"><option value="" class="translate">Install first cloud adapter</option></select></td></tr>
</table>
</div>
<div id="drop_zone" style="display: none" class="translate">place here</div>
</div>
</body>
</html>
+811
View File
@@ -0,0 +1,811 @@
<html>
<head>
<!-- Materialze style -->
<link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
<link rel="stylesheet" type="text/css" href="../../lib/css/materialize.css">
<script type="text/javascript" src="../../lib/js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
<script type="text/javascript" src="engines.js"></script>
<script type="text/javascript" src="../../js/translate.js"></script>
<script type="text/javascript" src="../../lib/js/materialize.js"></script>
<script type="text/javascript" src="../../js/adapter-settings.js"></script>
<script type="text/javascript" src="words.js"></script>
<style>
#drop_zone {
border: 2px dashed #bbb;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
padding: 25px;
text-align: center;
font-size: 20pt;
font-weight: bold;
font-family: 'Arial';
color: #bbb;
width: 90%;
height: 60px;
}
.error {
border: 2px solid red;
}
</style>
<script type="text/javascript">
var webServers = null;
var gOnChange;
function showHideSettings() {
$('.variable').hide();
var type = $('#type').val();
for (var j = 0; j < sayitOptions[type].params.length; j++) {
$('#tr_' + sayitOptions[type].params[j]).show();
}
if (type === 'googleHome') {
$('.announceValue').hide();
$('.announce').hide();
$('.system').hide();
$('.googleHome').show();
getIsAdapterAlive(function (isAlive) {
if (isAlive || common.enabled) {
$('#search').removeClass('disabled');
fillGoogleHome();
}
});
} else {
$('.googleHome').hide();
$('.announceValue').show();
$('.announce').show();
}
$('.engine').hide();
var engine = $('#engine').val();
if (!sayitEngines[engine] || sayitOptions[type].params.indexOf('engine') === -1) return;
for (var i = 0; i < sayitEngines[engine].params.length; i++) {
$('#tr_' + sayitEngines[engine].params[i]).show();
if (sayitEngines[engine][sayitEngines[engine].params[i]]) {
var arr = sayitEngines[engine][sayitEngines[engine].params[i]];
var param = sayitEngines[engine].params[i];
var $val = $('#' + param);
if (arr.length) {
var val = $val.val();
var text = '';
for (var p = 0; p < arr.length; p++) {
text += '<option value="' + arr[p] + '">' + arr[p] + '</option>';
}
$val.html(text);
if (val) {
$val.val(val);
} else {
$val.val(arr[0]);
}
} else {
$val.html('');
}
}
}
if (type !== 'system') {
$('.system').hide();
} else {
$('.system').show();
}
if (!$('#announce').val()) {
$('.announce').hide();
$('#play').addClass('disabled');
} else {
$('.announce').show();
$('#play').removeClass('disabled');
}
}
function fillSonosDevices(elem, current) {
socket.emit('getObjectView', 'system', 'channel', {startkey: 'sonos.', endkey: 'sonos.\u9999'}, function (err, res) {
if (!err && res) {
for (var i = 0; i < res.rows.length; i++) {
$(elem).append('<option value="' + res.rows[i].id + '">' + res.rows[i].id + '</option>');
}
$(elem).select();
}
$(elem).val(current);
});
}
function fillMpdDevice(elem, current) {
socket.emit('getObjectView', 'system', 'instance', {startkey: 'system.adapter.mpd.', endkey: 'system.adapter.mpd.\u9999'}, function (err, res) {
if (!err && res) {
for (var i = 0; i < res.rows.length; i++) {
var n = res.rows[i].id.replace('system.adapter.', '');
$(elem).append('<option value="' + n + '">' + n + '</option>');
}
$(elem).select();
}
$(elem).val(current);
});
}
function fillChromecastDevices(elem, current) {
socket.emit('getObjectView', 'system', 'device', {startkey: 'chromecast.', endkey: 'chromecast.\u9999'}, function (err, res) {
if (!err && res) {
for (var i = 0; i < res.rows.length; i++) {
$(elem).append('<option value="' + res.rows[i].id + '">' + res.rows[i].id + '</option>');
}
}
$(elem).select();
$(elem).val(current);
});
}
function fillGoogleHome() {
$('#search').addClass('disabled');
sendTo(null, 'browseChromecast', null, function (list) {
var text = '<option value="">' + _('select') + '</option>';
if (list) {
for (var i = 0; i < list.length; i++) {
text += '<option value="' + list[i].ip + '">' + list[i].name + '[' + list[i].ip + ']</option>';
}
$('#googleHome').html(text).prop('disabled', false).off('change').on('change', function () {
$('#server').val($(this).val()).trigger('change');
});
} else {
$('#googleHome').html('<option value="">' + _('error') + '</option>').prop('disabled', true);
}
$('#search').removeClass('disabled');
$('#googleHome').select();
});
}
function ip2hex(ip) {
var octets = ip.split('.');
if (octets.length !== 4) {
return 0;
}
var result = 0;
for (var i = 0; i < octets.length; ++i) {
var octet = parseInt(octets[i], 10);
if (Number.isNaN(octet) || octet < 0 || octet > 255) {
throw new Error("Each octet must be between 0 and 255");
}
result |= octet << ((octets.length - i) * 8);
}
return result;
}
function checkWeb(elem, current) {
var web = $('#web').val();
for (var i = 0; i < webServers.length; i++) {
if (webServers[i].id === 'system.adapter.' + web) {
if (webServers[i].value.native.auth) {
showMessage(_('Cannot use web server with authentication'), null, 'info');
}
if (webServers[i].value.native.bind === 'localhost' || webServers[i].value.native.bind === '127.0.0.1' || webServers[i].value.native.bind === '::1') {
showMessage(_('Cannot use web server only on localhost'), null, 'info');
}
if (webServers[i].value.native.bind === '0.0.0.0') {
$('#tr_webServer').show();
var $webServer = $('#webServer');
$webServer.html('');
// read all ipv4 addresses of host
socket.emit('getObject', 'system.host.' + webServers[i].value.common.host, function (err, obj) {
var text = '';
if (!err && obj && obj.native) {
for (var iface in obj.native.hardware.networkInterfaces) {
if (obj.native.hardware.networkInterfaces.hasOwnProperty(iface)) {
for (var i = 0; i < obj.native.hardware.networkInterfaces[iface].length; i++) {
if (obj.native.hardware.networkInterfaces[iface][i].family === 'IPv4' && !obj.native.hardware.networkInterfaces[iface][i].internal) {
text += '<option value="' + obj.native.hardware.networkInterfaces[iface][i].address + '" data-mask="' + obj.native.hardware.networkInterfaces[iface][i].netmask + '">[IPv4] ' + obj.native.hardware.networkInterfaces[iface][i].address + ' - ' + iface + '</option>';
}
}
}
}
}
$webServer.html(text);
if (current) {
$webServer.val(current);
}
$webServer.select();
$webServer.off('change').on('change', function () {
gOnChange();
var ip = $(this).val();
var netmask = $(this).find('option[value="' + ip + '"]').data('mask');
var server;
var type = $('#type').val();
if (type === 'googleHome') {
server = $('#server').val();
} else if (type === 'sonos') {
server = $('#device').val().split('.')[3].replace('_', '.').replace('_', '.').replace('_', '.');
} else if (type === 'chromecast') {
server = $('#cDevice').val();
} else if (type === 'mpd') {
server = $('#mpd_device').val();
}
if (server && ip && netmask && server.indexOf(':') === -1 && ip.indexOf(':') === -1) {
ip = ip2hex(ip);
netmask = ip2hex(netmask);
server = ip2hex(server);
if ((ip & netmask) !== (server & netmask)) {
$webServer.addClass('error').attr('title', _('IP not accessible for server'));
} else {
$webServer.removeClass('error').attr('title', '');
}
} else {
$webServer.removeClass('error');
}
});
});
} else if (webServers[i].value.native.bind === '::') {
// read all ipv6 addresses of host
socket.emit('getObject', 'system.host.' + webServers[i].value.common.host, function (err, obj) {
if (!err && obj && obj.native) {
for (var iface in obj.native.hardware.networkInterfaces) {
if (obj.native.hardware.networkInterfaces.hasOwnProperty(iface)) {
for (var i = 0; i < obj.native.hardware.networkInterfaces[iface].length; i++) {
if (obj.native.hardware.networkInterfaces[iface][i].family === 'IPv6' && !obj.native.hardware.networkInterfaces[iface][i].internal) {
$('#webServer').append('<option value="' + obj.native.hardware.networkInterfaces[iface][i].address + '">[IPv6] ' + obj.native.hardware.networkInterfaces[iface][i].address + ' - ' + iface + '</option>');
}
}
}
}
}
if (current) {
$('#webServer').val(current);
}
});
$('#webServer').select();
} else {
$('#tr_webServer').hide();
}
}
}
}
function fillWebServices(elem, current, type, webServer) {
socket.emit('getObjectView', 'system', 'instance', {startkey: 'system.adapter.web.', endkey: 'system.adapter.web.\u9999'}, function (err, res) {
if (!err && res) {
webServers = res.rows;
for (var i = 0; i < res.rows.length; i++) {
var n = res.rows[i].id.replace('system.adapter.', '');
var auth = res.rows[i].value.native.auth ? 'data-auth="true"' : '';
$(elem).append('<option value="' + n + '" ' + auth + '>' + n + '</option>');
}
}
$(elem).val(current);
if ((type === 'sonos') ||
(type === 'chromecast') ||
(type === 'googleHome')) {
checkWeb('#web', webServer);
}
$(elem).select();
});
}
function uploadFile(file, callback) {
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = function(e) {
socket.emit('writeFile', 'sayit.' + instance, 'tts.userfiles/' + file.name, e.target.result, function () {
if (callback) callback(file.name);
});
};
// Read in the image file as a data URL.
reader.readAsArrayBuffer(file);
}
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
$('#drop_indcator').hide();
// files is a FileList of File objects. List some properties.
var count = 0;
for (var i = 0, f; f = files[i]; i++) {
if (f.size > 1024 * 1024) {
showMessage(_('File %s is too big. Maximum 1MB', escape(f.name)));
$('#files').val('');
return;
}
if (f.name === 'say.mp3') {
showMessage(_('Name say.mp3 is reserved'));
$('#files').val('');
return;
}
count++;
uploadFile(f, function (name) {
count--;
if (!count) {
// Read names of files for gong
socket.emit('readDir', 'sayit.' + instance, 'tts.userfiles', function (err, dir) {
var text = '<option value="">' + _('none') + '</option>';
if (dir) {
for (var i = 0; i < dir.length; i++) {
if (dir[i].isDir) continue;
text += '<option value="' + dir[i].file + '">' + dir[i].file + '</option>';
}
}
$('#announce').html(text).val(name).trigger('change');
$('#announce').select();
$('#files').val('');
});
}
});
}
}
function handleFileSelectDrop(evt) {
$('#drop_indcator').hide();
evt.stopPropagation();
evt.preventDefault();
var files = evt.dataTransfer.files; // FileList object.
// files is a FileList of File objects. List some properties.
var output = [];
for (var i = 0, f; f = files[i]; i++) {
if (f.size > 1024 * 1024) {
showMessage(_('File %s is too big. Maximum 1MB', escape(f.name)));
return;
}
console.log(escape(f.name));
}
}
function handleDragOver(evt) {
evt.stopPropagation();
evt.preventDefault();
evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
$('#drop_indcator').show();
}
// the function loadSettings has to exist ...
function load(settings, onChange) {
if (!settings) return;
if (!settings.player) {
settings.player = 'mpg321';
}
gOnChange = onChange;
$('#play').on('click', function () {
socket.emit('readFile', 'sayit.' + instance, 'tts.userfiles/' + $('#announce').val(), function (err, data) {
if (typeof AudioContext !== 'undefined') {
context = new AudioContext();
context.decodeAudioData(data, function(buffer) {
//console.log(buffer);
var source = context.createBufferSource(); // creates a sound source
source.buffer = buffer; // tell the source which sound to play
source.connect(context.destination); // connect the source to the context's destination (the speakers)
source.start(0);
}, function(err) {
console.log(err);
});
}
});
});
var $t = $('#type');
for (name in sayitOptions) {
if (sayitOptions.hasOwnProperty(name)) {
$t.append('<option value="' + name + '">' + sayitOptions[name].name + '</option>');
}
}
$('#search').on('click', function () {
fillGoogleHome();
});
getIsAdapterAlive(function (isAlive) {
if (isAlive || common.enabled) {
$('#search').removeClass('disabled');
if (settings.type === 'googleHome') {
fillGoogleHome();
}
} else {
$('#search').addClass('disabled').attr('title', _('Adapter must be enabled'));
}
});
var $e = $('#engine');
for (var name in sayitEngines) {
if (sayitEngines.hasOwnProperty(name)) {
$e.append('<option value="' + name + '">' + sayitEngines[name].name + '</option>');
}
}
for (var key in settings) {
if (settings.hasOwnProperty(key)) {
var $val = $('#' + key + '.value');
if ($val.attr('type') === 'checkbox') {
$val.prop('checked', settings[key]);
} else {
$val.val(settings[key]);
}
}
}
$('.value').on('change', function () {
var key = $(this).attr('id');
if (key === 'auth') {
if ($('#auth').prop('checked')) {
$('#secure').prop('checked', true);
}
} else
if (key === 'type' || key === 'engine') {
showHideSettings();
var type = $('#type').val();
if ((type === 'sonos') ||
(type === 'chromecast') ||
(type === 'mpd') ||
(type === 'googleHome')) {
checkWeb('#web');
$('#announce').val('').trigger('change');
showHideSettings();
} else {
showHideSettings();
}
} else
if (key === 'announce') {
showHideSettings();
if ($(this).val()) {
socket.emit('readFile', 'sayit.' + instance, 'tts.userfiles/' + $('#announce').val(), function (err, data) {
if (typeof AudioContext !== 'undefined') {
context = new AudioContext();
context.decodeAudioData(data, function (buffer) {
$('#annoDuration').val(Math.ceil(buffer.duration));
}, function (err) {
console.log(err);
});
}
});
}
}
if (key === 'web') {
checkWeb('#web');
}
onChange();
}).keyup(function() {
$(this).trigger('change');
});
if (!settings.engine) {
settings.engine = systemLang;
$('#engine').val(systemLang).trigger('change');
}
if (!settings.instance) {
settings.instance = 'FFFFFFFF';
$('#instance').val(settings.instance).trigger('change');
}
fillSonosDevices('#device', settings.device);
fillChromecastDevices('#cDevice', settings.cDevice);
fillWebServices('#web', settings.web, settings.type, settings.webServer);
fillMpdDevice('#mpd_device', settings.mpd_device);
if ((settings.type === 'sonos') ||
(settings.type === 'chromecast') ||
(settings.type === 'mpd') ||
(settings.type === 'googleHome')){
$('.announce').hide();
if (settings.announce) {
$('#announce').val('').trigger('change');
}
}
// Read names of files for gong
socket.emit('readDir', 'sayit.' + instance, 'tts.userfiles', function (err, dir) {
var text = '<option value="">' + _('none') + '</option>';
if (dir) {
for (var i = 0; i < dir.length; i++) {
if (dir[i].isDir) continue;
text += '<option value="' + dir[i].file + '">' + dir[i].file + '</option>';
}
}
$('#announce').html(text).val(settings.announce);
showHideSettings();
});
getAdapterInstances('cloud', function (list) {
if (list) {
var text = '';
for (var i = 0; i < list.length; i++) {
var id = list[i]._id.substring('system.adapter.'.length);
text += '<option value="' + id + '" ' + (id === settings.cloud ? 'selected' : '') + '>' + id + '</option>';
}
if (text) $('#cloud').html(text);
}
});
$('#voice').val(settings.voice);
var w = $('#engine').width();
$('#announce').css({width: w});
$('#type').css({width: w});
document.getElementById('files').addEventListener('change', handleFileSelect, false);
showHideSettings();
if (!$('#announce').val()) $('#play').addClass('disabled');
if (typeof AudioContext === 'undefined') $('#play').hide();
var dropZone = document.getElementById('drop_zone');
if (dropZone) {
dropZone.addEventListener('dragover', handleDragOver, false);
dropZone.addEventListener('drop', handleFileSelect, false);
/*dropZone.addEventListener('dragend', function () {
$(this).css({background: 'white'});
console.log('dragend');
return false;
}, false);
dropZone.addEventListener('dragstart', function () {
console.log('dragstart');
}, false);
dropZone.addEventListener('dragleave', function () {
$(this).css({background: 'white'});
}, false);
dropZone.addEventListener('dragenter', function () {
$(this).css({background: 'gray'});
}, false);*/
}
onChange(false);
}
function save(callback) {
var obj = {};
$('.value').each(function () {
var $this = $(this);
if ($this.attr('type') === 'checkbox') {
obj[$this.attr('id')] = $this.prop('checked');
} else {
obj[$this.attr('id')] = $this.val();
}
});
if (obj.engine && sayitEngines[obj.engine].engine === 'yandex') {
if (!obj.key) {
showMessage(_('API Key is not set!'));
return;
}
} else
if (obj.engine && sayitEngines[obj.engine].engine === 'polly') {
if (!obj.accessKey || !obj.secretKey) {
showMessage(_('API Key is not set!'));
return;
}
if (!obj.region) {
showMessage(_('AWS Region is not set!'));
return;
}
}
if (obj.type === 'googleHome') {
obj.cache = false;
}
callback(obj);
}
</script>
</head>
<body>
<div class="m adapter-container" ondragover="return false" ondrop="return false">
<div class="row">
<div class="col s12">
<div class="row">
<div class="col s6">
<img src="sayit.png" class="logo">
</div>
</div>
<div class="row">
<div class="input-field col s6 m4">
<select class="value" id="type"></select>
<label class="translate" for="type">Type:</label>
</div>
<div class="input-field col s6 m4" id="tr_engine" >
<select class="value" id="engine"></select>
<label class="translate" for="engine">Language:</label>
</div>
</div>
<div class="row system">
<div class="input-field col s6 m4">
<select class="value" id="player" >
<option value="mpg321">mpg321</option>
<option value="omxplayer">omxplayer</option>
</select>
<label for="player"><span class="translate">Linux player:</span><span class="translate" style="padding-left: 10px; font-size: 10px">Ignore for non linux OS</span></label>
</div>
<div class="input-field col s6 m4 l2">
<input class="value" id="command"/>
<label class="translate" for="command">System command:</label>
</div>
</div>
<div class="row announceValue">
<div class="input-field col s6 m4">
<select class="value" id="announce"></select>
<label class="translate" for="announce">Announce:</label>
&nbsp;<a class="waves-effect waves-light btn translate" id="play">play</a>
</div>
<div class="file-field input-field col s6 m4">
<div class="btn">
<span class="translate">File</span>
<input type="file" accept=".mp3,audio/*" id="files" name="files[]" multiple />
</div>
<div class="file-path-wrapper">
<input class="file-path validate" type="text">
</div>
</div>
</div>
<div class="row announce">
<div class="input-field col s4 m4 l2">
<input class="value" id="annoTimeout" type="number" min="0" max="1000" />
<label class="translate" for="annoTimeout">Announce timeout (sec):</label>
</div>
<div class="input-field col s4 m4 l2">
<input class="value" id="annoDuration" type="number" min="0" max="99"/>
<label class="translate" for="annoDuration">Announce length (sec):</label>
</div>
<div class="input-field col s4 m4 l2">
<input class="value" id="annoVolume" type="number" min="0" max="100"/>
<label class="translate" for="annoVolume">Announce volume (%):</label>
</div>
</div>
<div class="row">
</div>
<div class="row variable">
<div class="input-field col s6 m4" id="tr_cache">
<input class="value" id="cache" type="checkbox" />
<label class="translate" for="cache">Cache:</label>
</div>
<div class="input-field col s6 m4" id="tr_cacheExpiryDays" >
<input class="value" id="cacheExpiryDays" size="5" />
<label class="translate" for="tr_cacheExpiryDays">Cache-Expiry:</label>
</div>
</div>
<div id="tr_server" class="row variable">
<div class="input-field col s6 m4 l2">
<input class="value" id="server"/>
<label class="translate" for="server">Server:</label>
<select class="value googleHome" id="googleHome">
<option value="" class="translate">none</option>
</select>
<a class="waves-effect waves-light btn translate googleHome" style="font-size: 10px; margin-left: 10px;" id="search">Browse</a>
</div>
</div>
<div id="tr_port" class="row variable">
<div class="input-field col s6 m4 l2">
<input class="value" id="port" size="5" maxlength="5"/>
<label class="translate" for="port">Port:</label>
</div>
</div>
<div class="row variable">
<div id="tr_user" class="input-field col s6 m4 l2">
<input class="value" id="user" />
<label class="translate" for="user">User:</label>
</div>
<div id="tr_pass"class="input-field col s6 m4 l2">
<input class="value" id="pass" />
<label class="translate" for="pass">Password:</label>
</div>
</div>
<div id="tr_instance" class="row variable">
<div class="input-field col s6 m4 l2">
<label class="translate" for="instance">Browser instance:</label>
<input class="value" id="instance" />
</div>
</div>
<div id="tr_device" class="row variable">
<div class="input-field col s6 m4 l2">
<select class="value" id="device">
<option value="" class="translate">All</option>
</select>
<label class="translate" for="device">Device:</label>
</div>
</div>
<div id="tr_cDevice" class="row variable">
<div class="input-field col s6 m4 l2">
<select class="value" id="cDevice">
<option value="" class="translate">All</option>
</select>
<label class="translate" for="cDevice">Device:</label>
</div>
</div>
<div id="tr_mpd_device" class="row variable">
<div class="input-field col s6 m4 l2">
<select class="value" id="mpd_device">
<option value="" class="translate">All</option>
</select>
<label class="translate" for="mpd_device">Device:</label>
</div>
</div>
<div id="tr_web" class="row variable">
<div class="input-field col s6 m4 l2">
<select class="value" id="web"></select>
<label class="translate" for="web">Web instance:</label>
</div>
</div>
<div id="tr_webServer" class="row variable">
<div class="input-field col s6 m4 l2">
<select class="value" id="webServer"></select>
<label class="translate" for="webServer">Web server IP:</label>
</div>
</div>
<div id="tr_voice" class="row engine" >
<div class="input-field col s6 m4 l2">
<select class="value" id="voice"></select>
<label class="translate" for="voice">Voice:</label>
</div>
</div>
<div id="tr_key" class="row engine" >
<div class="input-field col s6 m4 l2">
<input class="value" id="key" type="text"/>
<label class="translate" for="key">API Key:</label>
</div>
</div>
<div id="tr_emotion" class="row engine" >
<div class="input-field col s6 m4 l2">
<select class="value" id="emotion"></select>
<label class="translate" for="emotion">Emotion:</label>
</div>
</div>
<div id="tr_drunk" class="row engine" >
<div class="input-field col s6 m4 l2">
<input type="checkbox" class="value" id="drunk"/>
<label class="translate" for="drunk">Drunk:</label>
</div>
</div>
<div id="tr_ill" class="row engine" >
<div class="input-field col s6 m4 l2">
<input type="checkbox" class="value" id="ill"/>
<label class="translate" for="ill">Ill:</label>
</div>
</div>
<div id="tr_robot" class="row engine" >
<div class="input-field col s6 m4 l2">
<input type="checkbox" class="value" id="robot"/>
<label class="translate" for="robot">Robot:</label>
</div>
</div>
<div id="tr_accessKey" class="row engine" >
<div class="input-field col s6 m4 l2">
<label class="translate" for="accessKey">Access Key:</label>
<input class="value" id="accessKey" type="text"/>
</div>
</div>
<div id="tr_secretKey" class="row engine" >
<div class="input-field col s6 m4 l2">
<label class="translate" for="secretKey">Secret Key:</label>
<input class="value" id="secretKey" type="password"/>
</div>
</div>
<div id="tr_region" class="row engine" >
<div class="input-field col s6 m4 l2">
<input class="value" id="region" type="text"/>
<label class="translate" for="region">AWS Region:</label>
</div>
</div>
<div id="tr_cloud" class="row engine" >
<div class="input-field col s6 m4 l2">
<select class="value" id="cloud">
<option value="" class="translate">Install first cloud adapter</option>
</select>
<label class="translate" for="cloud">Cloud instance:</label>
</div>
</div>
</div>
</div>
<div id="drop_zone" style="display: none" class="translate">place here</div>
</div>
</body>
</html>
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

+50
View File
@@ -0,0 +1,50 @@
// DO NOT EDIT THIS FILE!!! IT WILL BE AUTOMATICALLY GENERATED FROM src/i18n
/*global systemDictionary:true */
'use strict';
systemDictionary = {
"sayIt adapter settings": { "en": "sayIt adapter settings", "de": "sayIt Einstellungen", "ru": "sayIt Настройки", "pt": "configurações do adaptador sayIt", "nl": "sayIt adapter-instellingen", "fr": "sayIt paramètres de l'adaptateur", "it": "impostazioni dell'adattatore sayIt", "es": "sayIt configuración del adaptador", "pl": "sayTo ustawienia adaptera"},
"Language:": { "en": "Language", "de": "Sprache", "ru": "Язык", "pt": "Língua", "nl": "Taal", "fr": "La langue", "it": "linguaggio", "es": "Idioma", "pl": "Język"},
"Type:": { "en": "Output in", "de": "Ausgabe durch", "ru": "Вывод звука", "pt": "Saída em", "nl": "Uitgang in", "fr": "Sortie dans", "it": "Uscita in", "es": "Salida en", "pl": "Wyjście w"},
"Cache:": { "en": "Cache received audio files", "de": "Cache benutzen", "ru": "Кэшировать полученные аудио-файлы", "pt": "Cache recebido arquivos de áudio", "nl": "Cache ontvangen audiobestanden", "fr": "Cache les fichiers audio reçus", "it": "La cache ha ricevuto file audio", "es": "Caché recibió archivos de audio", "pl": "Pamięć podręczna otrzymała pliki audio"},
"Server:": { "en": "Server", "de": "Server", "ru": "Сервер", "pt": "Servidor", "nl": "Server", "fr": "Serveur", "it": "server", "es": "Servidor", "pl": "serwer"},
"Port:": { "en": "Port", "de": "Port", "ru": "Порт", "pt": "Porta", "nl": "Haven", "fr": "Port", "it": "Porta", "es": "Puerto", "pl": "Port"},
"User:": { "en": "User", "de": "Anwender", "ru": "Пользователь", "pt": "Do utilizador", "nl": "Gebruiker", "fr": "Utilisateur", "it": "Utente", "es": "Usuario", "pl": "Użytkownik"},
"Password:": { "en": "Password", "de": "Kennwort", "ru": "Пароль", "pt": "Senha", "nl": "Wachtwoord", "fr": "Mot de passe", "it": "Parola d'ordine", "es": "Contraseña", "pl": "Hasło"},
"Browser instance:": { "en": "Browser instance", "de": "Browser-Instanz", "ru": "ID броузера", "pt": "Instância do navegador", "nl": "Browserinstantie", "fr": "Instance du navigateur", "it": "Istanza del browser", "es": "Instancia del navegador", "pl": "Browser instance"},
"Device:": { "en": "Device", "de": "Gerät", "ru": "Устройство", "pt": "Dispositivo", "nl": "Apparaat", "fr": "Dispositif", "it": "Dispositivo", "es": "Dispositivo", "pl": "Urządzenie"},
"Web server IP:": { "en": "Web server IP", "de": "Web server IP", "ru": "IP Веб сервера", "pt": "IP do servidor da Web", "nl": "Webserver IP", "fr": "Adresse IP du serveur Web", "it": "IP del server Web", "es": "Servidor web IP", "pl": "Adres IP serwera WWW"},
"All": { "en": "All", "de": "Alle", "ru": "Все", "pt": "Todos", "nl": "Alle", "fr": "Tout", "it": "Tutti", "es": "Todas", "pl": "Wszystko"},
"Web instance:": { "en": "Web instance", "de": "Web instance", "ru": "Web instance", "pt": "Instância da Web", "nl": "Web-instantie", "fr": "Instance Web", "it": "Istanza Web", "es": "Instancia web", "pl": "Instancja internetowa"},
"Voice:": { "en": "Voice", "de": "Stimme", "ru": "Голос", "pt": "Voz", "nl": "Stem", "fr": "Voix", "it": "Voce", "es": "Voz", "pl": "Głos"},
"API Key:": { "en": "API Key", "de": "API Key", "ru": "API Key", "pt": "Chave API", "nl": "API sleutel", "fr": "clé API", "it": "Chiave API", "es": "Clave API", "pl": "Klucz API"},
"Emotion:": { "en": "Emotion", "de": "Emotion", "ru": "Емоциональный окрас", "pt": "Emoção", "nl": "Emotie", "fr": "Émotion", "it": "Emozione", "es": "Emoción", "pl": "Emocja"},
"Drunk:": { "en": "Drunk", "de": "Betrunken", "ru": "Пьяный голос", "pt": "Bêbado", "nl": "Dronken", "fr": "Ivre", "it": "Ubriaco", "es": "Borracho", "pl": "Pijany"},
"Ill:": { "en": "Ill", "de": "Krank", "ru": "Больной голос", "pt": "Eu vou", "nl": "Ziek", "fr": "Mauvais", "it": "Malato", "es": "Enfermo", "pl": "Chory"},
"Robot:": { "en": "Robot", "de": "Roboter", "ru": "Голос робота", "pt": "Robô", "nl": "Robot", "fr": "Robot", "it": "Robot", "es": "Robot", "pl": "Robot"},
"Announce:": { "en": "Announce", "de": "Ankündigung", "ru": "Извещение", "pt": "Anunciar", "nl": "aankondigen", "fr": "Annoncer", "it": "Annunciare", "es": "Anunciar", "pl": "Ogłosić"},
"place here": { "en": "Place files here", "de": "Dateien hier ablegen", "ru": "Перетащите файлы сюда", "pt": "Coloque arquivos aqui", "nl": "Plaats hier bestanden", "fr": "Placez les fichiers ici", "it": "Inserisci i file qui", "es": "Coloque los archivos aquí", "pl": "Umieść pliki tutaj"},
"Announce timeout (sec):": { "en": "Announce timeout (sec)", "de": "Ankündigungstimeout (Sek)", "ru": "Таймаут извещения (сек)", "pt": "Anular o tempo limite (seg)", "nl": "Announce time-out (sec)", "fr": "Annoncer le délai (sec)", "it": "Annuncia timeout (sec)", "es": "Anunciar tiempo de espera (sec)", "pl": "Ogłaszaj limit czasu (sek)"},
"Announce length (sec):": { "en": "Announce length (sec)", "de": "Ankündigunglänge (Sek)", "ru": "Длительность извещения (сек)", "pt": "Anunciar o comprimento (seg)", "nl": "Kondig lengte (sec)", "fr": "Annoncer la longueur (sec)", "it": "Annunciare la lunghezza (sec)", "es": "Anunciar longitud (sec)", "pl": "Ogłaszaj długość (s)"},
"API Key is not set!": { "en": "API Key is not set!", "de": "API Key ist leer!", "ru": "API Key отсутствует!", "pt": "A chave da API não está definida!", "nl": "API-sleutel is niet ingesteld!", "fr": "La clé de l'API n'est pas définie!", "it": "Chiave API non impostata!", "es": "¡La clave API no está configurada!", "pl": "Klucz API nie jest ustawiony!"},
"System command:": { "en": "System command", "de": "Systemkommando", "ru": "Системный вызов", "pt": "Comando do sistema", "nl": "Systeemopdracht", "fr": "Commande système", "it": "Comando di sistema", "es": "Comando del sistema", "pl": "Polecenie systemowe"},
"Announce volume (%):": { "en": "Announce volume(%)", "de": "Ankündigungslautstärke(%)", "ru": "Громкость извещения(%)", "pt": "Anunciar volume (%)", "nl": "Volume aankondigen (%)", "fr": "Annoncer le volume (%)", "it": "Annuncia volume (%)", "es": "Anunciar volumen (%)", "pl": "Ogłaszaj objętość (%)"},
"Linux player:": { "en": "Linux player", "de": "Linux-Player", "ru": "Linux плейер", "pt": "Jogador Linux", "nl": "Linux-speler", "fr": "Lecteur Linux", "it": "Lettore Linux", "es": "Reproductor de Linux", "pl": "Odtwarzacz Linux"},
"Ignore for non linux OS": { "en": "Ignore for non linux OS", "de": "Ignorieren für nicht linux OS", "ru": "Игнорировать для не linux OS", "pt": "Ignorar para SO não linux", "nl": "Negeren voor niet-Linux OS", "fr": "Ignorer pour les systèmes d'exploitation autres que Linux", "it": "Ignora per sistema operativo non Linux", "es": "Ignorar para el sistema operativo no Linux", "pl": "Zignoruj dla systemu operacyjnego non linux"},
"Access Key:": { "en": "Access Key", "de": "Access Key", "ru": "Access Key", "pt": "Chave de acesso", "nl": "Toegangssleutel", "fr": "Clef d'accès", "it": "Chiave di accesso", "es": "Llave de acceso", "pl": "Klucz dostępu"},
"Secret Key:": { "en": "Secret Key", "de": "Secret Key", "ru": "Secret Key", "pt": "Chave secreta", "nl": "Geheime sleutel", "fr": "Clef secrète", "it": "Chiave segreta", "es": "Llave secreta", "pl": "Sekretny klucz"},
"AWS Region:": { "en": "AWS Region", "de": "AWS Region", "ru": "AWS регион", "pt": "Região da AWS", "nl": "AWS-regio", "fr": "Région AWS", "it": "Regione AWS", "es": "Región de AWS", "pl": "Region AWS"},
"Cloud instance:": { "en": "Cloud instance", "de": "Cloud-Instanz", "ru": "Cloud драйвер", "pt": "Instância de nuvem", "nl": "Cloud instantie", "fr": "Instance de cloud", "it": "Istanza Cloud", "es": "Instancia de la nube", "pl": "Instancja chmury"},
"Cache-Expiry:": { "en": "Cache-Expiry", "de": "Cache-Ablauf", "ru": "Срок хранения кэш", "pt": "Cache-Expiração", "nl": "Cache-Vervaldatum", "fr": "Cache-Expiration", "it": "Cache-scadenza", "es": "Caché-expiración", "pl": "Cache-Expiry"},
"Browse": { "en": "Browse", "de": "Suchen", "ru": "Искать", "pt": "Squeaky toy", "nl": "Blader", "fr": "Feuilleter", "it": "Navigare", "es": "Vistazo", "pl": "Paść się"},
"select": { "en": "select", "de": "auswählen", "ru": "выбрать", "pt": "selecione", "nl": "kiezen", "fr": "sélectionner", "it": "selezionare", "es": "seleccionar", "pl": "Wybierz"},
"error": { "en": "error", "de": "Fehler", "ru": "ошибка", "pt": "erro", "nl": "fout", "fr": "Erreur", "it": "errore", "es": "error", "pl": "błąd"},
"IP not accessible for server": { "en": "IP is not accessible for the device", "de": "IP ist für dieses Gerät nicht erreichbar", "ru": "Этот IP недоступен для устройства", "pt": "IP não está acessível para o dispositivo", "nl": "IP is niet toegankelijk voor het apparaat", "fr": "L'adresse IP n'est pas accessible pour l'appareil", "it": "L'IP non è accessibile per il dispositivo", "es": "IP no es accesible para el dispositivo", "pl": "Adres IP jest niedostępny dla urządzenia"},
"Install first cloud adapter": { "en": "Install cloud adapter at first", "de": "Installieren Sie zuerst den Cloud-Adapter", "ru": "Сначала установить облачный адаптер", "pt": "Instale o adaptador de nuvem primeiro", "nl": "Installeer eerst de cloud-adapter", "fr": "Installer l'adaptateur cloud au début", "it": "Installare inizialmente l'adattatore cloud", "es": "Instalar el adaptador de nube al principio", "pl": "Najpierw zainstaluj adapter chmury"},
"tooltip_type": { "en": "Specify where the voice must be played", "de": "Damit wird gesetzt, wo die Sprache ausgegeben wird", "ru": "Укажите как и где будет выводится голос", "pt": "Especifique onde a voz deve ser tocada", "nl": "Geef op waar de stem moet worden afgespeeld", "fr": "Précisez où la voix doit être jouée", "it": "Specificare dove deve essere suonata la voce", "es": "Especifique dónde debe reproducirse la voz", "pl": "Określ, gdzie musi być odtwarzany głos"},
"tooltip_command": { "en": "This command will be executed, to use the custom system player", "de": "Dieses Kommando wird ausgeführt, um eigenen System-Player zu benutzen", "ru": "Эта команда выполнится для проигрывания с собственным плеером", "pt": "Este comando será executado para usar o player do sistema personalizado", "nl": "Deze opdracht wordt uitgevoerd om de aangepaste systeemspeler te gebruiken", "fr": "Cette commande sera exécutée pour utiliser le lecteur système personnalisé", "it": "Questo comando verrà eseguito, per utilizzare il player di sistema personalizzato", "es": "Este comando se ejecutará para usar el reproductor de sistema personalizado", "pl": "To polecenie zostanie wykonane, aby użyć niestandardowego odtwarzacza systemu"},
"File": { "en": "File", "de": "Datei", "ru": "файл", "pt": "Arquivo", "nl": "het dossier", "fr": "Fichier", "it": "File", "es": "Expediente", "pl": "Plik"},
"tree": { "en": "tree", "de": "Baum", "ru": "дерево", "pt": "árvore", "nl": "boom", "fr": "arbre", "it": "albero", "es": "árbol", "pl": "drzewo"},
"play": { "en": "play", "de": "abspielen", "ru": "играть", "pt": "Toque", "nl": "spelen", "fr": "jouer", "it": "giocare", "es": "jugar", "pl": "grać"},
"Adapter must be enabled": { "en": "Adapter must be enabled", "de": "Adapter muss aktiviert sein", "ru": "Адаптер должен быть включен", "pt": "O adaptador deve estar ativado", "nl": "Adapter moet zijn ingeschakeld", "fr": "L'adaptateur doit être activé", "it": "L'adattatore deve essere abilitato", "es": "El adaptador debe estar habilitado", "pl": "Adapter musi być włączony"}
};