UNPKG

iobroker.sonus

Version:

With this adapter you can control ioBroker with voice in many different languages

490 lines (429 loc) 22.6 kB
<html> <head> <!-- Load ioBroker scripts and styles--> <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="../../js/translate.js"></script> <script type="text/javascript" src="../../lib/js/materialize.js"></script> <script type="text/javascript" src="../../js/adapter-settings.js"></script> <!-- Load our own files --> <link rel="stylesheet" type="text/css" href="style.css"/> <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; } .m .row { margin-bottom: 0; } </style> <script type="text/javascript"> var secret; /* //webkitURL is deprecated but nevertheless var URL = window.URL || window.webkitURL; var gumStream; //stream from getUserMedia() var rec; //Recorder.js object var input; //MediaStreamAudioSourceNode we'll be recording // shim for AudioContext when it's not avb. var AudioContext = window.AudioContext || window.webkitAudioContext; var audioContext; //audio context to help us record var $recordButton; var recording = false; var samples = []; function showAudio(blob, i) { var url = URL.createObjectURL(blob); var au = document.createElement('audio'); var li = document.createElement('li'); var link = document.createElement('a'); var del = document.createElement('button'); del.innerHTML = _('Delete'); del.className = 'button-delete'; //add controls to the <audio> element au.controls = true; au.src = url; //save to disk link link.href = url; link.download = i + '.wav'; // download forces the browser to download the file using the filename link.innerHTML = 'Save to disk'; // add the new audio element to li li.appendChild(au); // add the filename to the li li.appendChild(document.createTextNode(i + '.wav ')); // add the save to disk link to li li.appendChild(link); // add delete button li.appendChild(del); // add the li element to the ol return li; } function addToList(blob) { samples.push(blob); var $list = $('#audio_list').html(''); for (var i = 0; i < samples.length; i++) { $list.append(showAudio(samples[i])); } } function startRecording() { var constraints = {audio: true, video: false}; recording = true; $recordButton.find('.translate').text(_('Stop')); // We're using the standard promise based getUserMedia() // https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia navigator.mediaDevices.getUserMedia(constraints) .then(function (stream) { console.log('getUserMedia() success, stream created, initializing Recorder.js ...'); // create an audio context after getUserMedia is called // sampleRate might change after getUserMedia is called, like it does on macOS when recording through AirPods // the sampleRate defaults to the one set in your OS for your playback device audioContext = new AudioContext(); // update the format document.getElementById('formats').innerHTML = 'Format: 1 channel pcm @ ' + audioContext.sampleRate/1000 + 'kHz'; // assign to gumStream for later use gumStream = stream; // use the stream input = audioContext.createMediaStreamSource(stream); // Create the Recorder object and configure to record mono sound (1 channel) // Recording 2 channels will double the file size rec = new Recorder(input, {numChannels: 1}); // start the recording process rec.record(); console.log('Recording started'); }).catch(function (err) { recording = false; $recordButton.find('.translate').text(_('Record')); }); } function stopRecording() { recording = false; $recordButton.find('.translate').text(_('Rec')); rec.stop(); //stop microphone access gumStream.getAudioTracks()[0].stop(); //create the wav blob and pass it on to createDownloadLink rec.exportWAV(addToList); } function initRecord() { $recordButton = $('#recordButton'); $recordButton.on('click', function () { recording ? stopRecording() : startRecording(); }); }*/ function fillInstances(current) { getAdapterInstances('text2command', function (instances) { var $select = $('#text2command'); for (var i = 0; i < instances.length; i++) { var n = instances[i]._id.replace('system.adapter.', ''); $select.append('<option value="' + n + '">' + n + '</option>'); } $select.val(current); $select.select(); }); } function uploadFile(file, callback) { var reader = new FileReader(); // Closure to capture the file information. reader.onload = function(e) { socket.emit('writeFile', 'sonus.' + instance, '/model.mdl', 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 f = files[0]; if (f.size > 1024 * 1024) { showMessage(_('File %s is too big. Maximum 5MB', escape(f.name))); $('#files').val(''); return; } uploadFile(f, function (name) { $('#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(); } function load(settings, onChange) { if (!settings) return; socket.emit('getObject', 'system.config', function (err, obj) { secret = (obj.native ? obj.native.secret : '') || 'Zgfr56gFe87jJOM'; settings.googleJson = decrypt(secret, settings.googleJson); $('.value').each(function () { var $key = $(this); var id = $key.attr('id'); if ($key.attr('type') === 'checkbox') { // do not call onChange direct, because onChange could expect some arguments $key.prop('checked', settings[id]) .on('change', () => onChange()) ; } else { // do not call onChange direct, because onChange could expect some arguments $key.val(settings[id]) .on('change', () => onChange()) .on('keyup', () => onChange()) ; } }); fillInstances(settings.text2command || ''); //initRecord(); document.getElementById('files').addEventListener('change', handleFileSelect, false); 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); // reinitialize all the Materialize labels on the page if you are dynamically adding inputs: typeof M !== 'undefined' && M.updateTextFields(); typeof M !== 'undefined' && $('#language').select(); }); } // This will be called by the admin adapter when the user presses the save button 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(); } }); obj.googleJson = encrypt(secret, obj.googleJson); callback(obj); } </script> </head> <body> <div class="m adapter-container"> <div class="row"> <div class="col s12 m4 l2"> <img src="sonus.png" class="logo"> </div> </div> <div class="row"> <div class="col s6 input-field"> <select class="value" id="language"> <option value="de-DE">Deutsch (Deutschland)</option> <option value="en-US">English (United States)</option> <option value="ru-RU">Русский (Россия)</option> <option value="af-ZA">Afrikaans (Suid-Afrika)</option> <option value="am-ET">አማርኛ (ኢትዮጵያ)</option> <option value="hy-AM">Հայ (Հայաստան)</option> <option value="az-AZ">Azərbaycan (Azərbaycan)</option> <option value="id-ID">Bahasa Indonesia (Indonesia)</option> <option value="ms-MY">Bahasa Melayu (Malaysia)</option> <option value="bn-BD">বাংলা (বাংলাদেশ)</option> <option value="bn-IN">বাংলা (ভারত)</option> <option value="ca-ES">Català (Espanya)</option> <option value="cs-CZ">Čeština (Česká republika)</option> <option value="da-DK">Dansk (Danmark)</option> <option value="en-AU">English (Australia)</option> <option value="en-CA">English (Canada)</option> <option value="en-GH">English (Ghana)</option> <option value="en-GB">English (Great Britain)</option> <option value="en-IN">English (India)</option> <option value="en-IE">English (Ireland)</option> <option value="en-KE">English (Kenya)</option> <option value="en-NZ">English (New Zealand)</option> <option value="en-NG">English (Nigeria)</option> <option value="en-PH">English (Philippines)</option> <option value="en-SG">English (Singapore)</option> <option value="en-ZA">English (South Africa)</option> <option value="en-TZ">English (Tanzania)</option> <option value="es-AR">Español (Argentina)</option> <option value="es-BO">Español (Bolivia)</option> <option value="es-CL">Español (Chile)</option> <option value="es-CO">Español (Colombia)</option> <option value="es-CR">Español (Costa Rica)</option> <option value="es-EG">Español (Ecuador)</option> <option value="es-SV">Español (El Salvador)</option> <option value="es-ES">Español (España)</option> <option value="es-US">Español (Estados Unidos)</option> <option value="es-GT">Español (Guatemala)</option> <option value="es-HN">Español (Honduras)</option> <option value="es-MX">Español (México)</option> <option value="es-NI">Español (Nicaragua)</option> <option value="es-PA">Español (Panama)</option> <option value="es-PY">Español (Paraguay)</option> <option value="es-PE">Español (Perú)</option> <option value="es-PR">Español (Puerto Rico)</option> <option value="es-DO">Español (República Dominicana)</option> <option value="es-UY">Español (Uruguay)</option> <option value="es-VE">Español (Venezuela)</option> <option value="eu-ES">Euskara (Espainia)</option> <option value="fil-PH">Filipino (Pilipinas)</option> <option value="fr-CA">Français (Canada)</option> <option value="fr-FR">Français (France)</option> <option value="gl-ES">Galego (España)</option> <option value="ka-GE">ქართული (საქართველო)</option> <option value="gu-IN">ગુજરાતી (ભારત)</option> <option value="hr-HR">Hrvatski (Hrvatska)</option> <option value="zu-ZA">IsiZulu (Ningizimu Afrika)</option> <option value="is-IS">Íslenska (Ísland)</option> <option value="it-IT">Italiano (Italia)</option> <option value="jv-ID">Jawa (Indonesia)</option> <option value="kn-IN">ಕನ್ನಡ (ಭಾರತ)</option> <option value="km-KH">ភាសាខ្មែរ (កម្ពុជា)</option> <option value="lo-LA">ລາວ (ລາວ)</option> <option value="lv-LV">Latviešu (latviešu)</option> <option value="lt-LT">Lietuvių (Lietuva)</option> <option value="hu-HU">Magyar (Magyarország)</option> <option value="ml-IN">മലയാളം (ഇന്ത്യ)</option> <option value="mr-IN">मराठी (भारत)</option> <option value="nl-NL">Nederlands (Nederland)</option> <option value="ne-NP">नेपाली (नेपाल)</option> <option value="nb-NO">Norsk bokmål (Norge)</option> <option value="pl-PL">Polski (Polska)</option> <option value="pt-BR">Português (Brasil)</option> <option value="pt-PT">Português (Portugal)</option> <option value="ro-RO">Română (România)</option> <option value="si-LK">සිංහල (ශ්රී ලංකාව)</option> <option value="sk-SK">Slovenčina (Slovensko)</option> <option value="sl-SI">Slovenščina (Slovenija)</option> <option value="su-ID">Urang (Indonesia)</option> <option value="sw-TZ">Swahili (Tanzania)</option> <option value="sw-KE">Swahili (Kenya)</option> <option value="fi-FI">Suomi (Suomi)</option> <option value="sv-SE">Svenska (Sverige)</option> <option value="ta-IN">தமிழ் (இந்தியா)</option> <option value="ta-SG">தமிழ் (சிங்கப்பூர்)</option> <option value="ta-LK">தமிழ் (இலங்கை)</option> <option value="ta-MY">தமிழ் (மலேசியா)</option> <option value="te-IN">తెలుగు (భారతదేశం)</option> <option value="vi-VN">Tiếng Việt (Việt Nam)</option> <option value="tr-TR">Türkçe (Türkiye)</option> <option value="ur-PK">اردو (پاکستان)</option> <option value="ur-IN">اردو (بھارت)</option> <option value="el-GR">Ελληνικά (Ελλάδα)</option> <option value="bg-BG">Български (България)</option> <option value="sr-RS">Српски (Србија)</option> <option value="uk-UA">Українська (Україна)</option> <option value="he-IL">עברית (ישראל)</option> <option value="ar-IL">العربية (إسرائيل)</option> <option value="ar-JO">العربية (الأردن)</option> <option value="ar-AE">العربية (الإمارات)</option> <option value="ar-BH">العربية (البحرين)</option> <option value="ar-DZ">العربية (الجزائر)</option> <option value="ar-SA">العربية (السعودية)</option> <option value="ar-IQ">العربية (العراق)</option> <option value="ar-KW">العربية (الكويت)</option> <option value="ar-MA">العربية (المغرب)</option> <option value="ar-TN">العربية (تونس)</option> <option value="ar-OM">العربية (عُمان)</option> <option value="ar-PS">العربية (فلسطين)</option> <option value="ar-QA">العربية (قطر)</option> <option value="ar-LB">العربية (لبنان)</option> <option value="ar-EG">العربية (مصر)</option> <option value="fa-IR">فارسی (ایران)</option> <option value="hi-IN">हिन्दी (भारत)</option> <option value="th-TH">ไทย (ประเทศไทย)</option> <option value="ko-KR">한국어 (대한민국)</option> <option value="zh-TW">國語 (台灣)</option> <option value="yue-Hant-HK">廣東話 (香港)</option> <option value="ja-JP">日本語(日本)</option> <option value="zh-HK">普通話 (香港)</option> <option value="zh">普通话 (中国大陆)</option> </select> <label for="language" class="translate">Language</label> </div> </div> <div class="row"> <div class="col s6 input-field"> <input type="text" class="value" id="googleJson"/> <label for="googleJson" class="translate">Google credentials</label> </div> </div> <div class="row"> <div class="col s6 input-field"> <select class="value" id="text2command"> <option value="" class="translate">Choose instance</option> </select> <label for="text2command" class="translate">Use text2command:</label> </div> </div> <div class="row"> <div class="file-field input-field col s6 m4"> <div class="btn"> <input type="file" accept=".umdl,.pmdl" id="files" name="files[]" multiple /> <label class="translate" style="color: white">Upload own hotword model</label> </div> </div> <div class="file-field input-field col s6 m4"> <span class="translate">You can create the model here: </span> <a href="https://snowboy.kitt.ai/hotword/" target="_blank">snowboy.kitt.ai</a> </div> <div class="row"> <div class="input-field col s11 l4"> <input class="value" id="sensitivity" type="number" /> <label for="sensitivity" class="translate">Sensitivity</label> </div> </div> <!-- div class="col s6 input-field"> <input type="checkbox" class="value" id="rec"/> <span for="rec" class="translate">Use "rec" instead of "arecord"</span> </div> <div class="col s6 input-field"> <a id="recordButton" class="waves-effect waves-light btn"><i class="material-icons right">rec</i><span class="translate">Record</span></a> <span id="formats"></span> </div> <div class="col s6 input-field" id="audio_list"> </div--> </div> <div id="drop_zone" style="display: none" class="translate">place here</div> </div> </body> </html>