{"id":3621,"date":"2021-06-28T17:10:45","date_gmt":"2021-06-28T15:10:45","guid":{"rendered":"http:\/\/www.Olipress.it\/SitoNew\/?page_id=3621"},"modified":"2023-07-14T12:39:08","modified_gmt":"2023-07-14T10:39:08","slug":"windistri","status":"publish","type":"page","link":"https:\/\/olipress.it\/olipress\/windistri","title":{"rendered":"Windistri"},"content":{"rendered":"<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"background-color: rgba(255,255,255,0);background-position: center center;background-repeat: no-repeat;border-width: 0px 0px 0px 0px;border-color:#eae9e9;border-style:solid;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start\" style=\"max-width:2080px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column\"><div class=\"fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column\" style=\"background-position:left top;background-repeat:no-repeat;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;padding: 0px 0px 0px 0px;\"><a class=\"fusion-modal-text-link\" href=\"#\"><!DOCTYPE html><br \/>\n<html lang=\"en\"><br \/>\n<head><br \/>\n  <title>Microsoft Cognitive Services Speech SDK JavaScript Sample for Speech Synthesis<\/title><br \/>\n  <meta charset=\"utf-8\" \/><br \/>\n  <script src=\"https:\/\/ajax.aspnetcdn.com\/ajax\/jquery\/jquery-3.6.0.min.js\"><\/script><\/p>\n<style>\n    body {\n      font-family: 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif;\n      font-size: 14px;\n    }<\/p>\n<p>    table, th, td {\n      border: 1px solid #f1f1f1;\n      border-collapse: collapse;\n    }<\/p>\n<p>    th, td {\n      padding: 10px;\n    }<\/p>\n<p>    textarea {\n      font-family: Arial,sans-serif;\n    }<\/p>\n<p>    .mode {\n      font-size: 18px;\n    }<\/p>\n<p>    .highlight{\n      background-color: yellow;\n    }<\/p>\n<p>    input:not(disabled) {\n      font-weight: bold;\n      color: black;\n    }<\/p>\n<p>    button {\n      padding: 4px 8px;\n      background: #0078d4;\n      color: #ffffff;\n    }<\/p>\n<p>    button:disabled {\n      padding: 4px 8px;\n      background: #ccc;\n      color: #666;\n    }<\/p>\n<p>    input[type=radio] {\n      position: relative;\n      z-index: 1;\n    }<\/p>\n<p>    input[type=radio] + label {\n      padding: 8px 4px 8px 30px;\n      margin-left: -30px;\n    }<\/p>\n<p>    input[type=radio]:checked + label {\n      background: #0078d4;\n      color: #ffffff;\n    }\n  <\/style>\n<p><\/head><br \/>\n<body><\/p>\n<div id=\"warning\">\n<h1 style=\"font-weight:500;\">Speech Speech SDK not found<br \/>\n      (microsoft.cognitiveservices.speech.sdk.bundle.js missing).<\/h1>\n<\/p><\/div>\n<div id=\"content\" style=\"display:none\">\n<table>\n<tr>\n<td><\/td>\n<td>\n<h1 style=\"font-weight:500;\">Microsoft Cognitive Services Speech SDK JavaScript Sample for Speech Synthesis<\/h1>\n<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">\n          <label for=\"subscriptionKey\"><br \/>\n            <a href=\"https:\/\/docs.microsoft.com\/azure\/cognitive-services\/speech-service\/get-started\" rel=\"noreferrer noopener\" target=\"_blank\">Subscription Key<\/a><br \/>\n          <\/label>\n        <\/td>\n<td><input id=\"subscriptionKey\" type=\"text\" size=\"40\" placeholder=\"ec606d0783c54dc8a7f0c67f5f3ae741\" value=\"ec606d0783c54dc8a7f0c67f5f3ae741\"><\/td>\n<\/tr>\n<tr>\n<td align=\"right\"><label for=\"regionOptions\">Region<\/label><\/td>\n<td>\n<!--          see https:\/\/aka.ms\/csspeech\/region for more details--><br \/>\n          <select id=\"regionOptions\"><option value=\"westus\" selected=\"selected\">West US<\/option><option value=\"westus2\">West US2<\/option><option value=\"eastus\">East US<\/option><option value=\"eastus2\">East US2<\/option><option value=\"centralus\">Central US<\/option><option value=\"northcentralus\">North Central US<\/option><option value=\"southcentralus\">South Central US<\/option><option value=\"westcentralus\">West Central US<\/option><option value=\"canadacentral\">Canada Central<\/option><option value=\"brazilsouth\">Brazil South<\/option><option value=\"eastasia\">East Asia<\/option><option value=\"southeastasia\">South East Asia<\/option><option value=\"australiaeast\">Australia East<\/option><option value=\"centralindia\">Central India<\/option><option value=\"japaneast\">Japan East<\/option><option value=\"japanwest\">Japan West<\/option><option value=\"koreacentral\">Korea Central<\/option><option value=\"northeurope\" selected>North Europe<\/option><option value=\"westeurope\">West Europe<\/option><option value=\"francecentral\">France Central<\/option><option value=\"switzerlandnorth\">Switzerland North<\/option><option value=\"uksouth\">UK South<\/option><option value=\"chinaeast2\">China East2 (azure.cn)<\/option><option value=\"chinanorth2\">China North2 (azure.cn)<\/option><\/select>\n        <\/td>\n<\/tr>\n<tr>\n<td align=\"right\"><label for=\"voiceOptions\">Voice<\/label><\/td>\n<td>\n          <button id=\"updateVoiceListButton\">Update Voice List<\/button><br \/>\n          <select id=\"voiceOptions\"><option value=\"Microsoft Server Speech Text to Speech Voice (it-IT, ElsaNeural)\" selected=\"selected\">it-IT, ElsaNeural<\/option><\/select>\n        <\/td>\n<\/tr>\n<tr>\n<td align=\"right\"><label for=\"formatOptions\">Format<\/label><\/td>\n<td>\n          <select id=\"formatOptions\"><option>Waiting for SDK loading.<\/option><\/select><br \/>\n          (riff pcm, mp3, ogg and webm formats are supported for playback.)\n        <\/td>\n<\/tr>\n<tr>\n<td align=\"right\"><label for=\"isSSML\">Is SSML<\/label><\/td>\n<td>\n          <input type=\"checkbox\" id=\"isSSML\" name=\"isSSML\" value=\"ssml\">\n        <\/td>\n<\/tr>\n<tr>\n<td align=\"right\"><label for=\"synthesisText\">Text<\/label><\/td>\n<td>\n          <textarea id=\"synthesisText\" style=\"display: inline-block;width:500px;height:100px\"\n                 placeholder=\"Input text or ssml for synthesis.\"><\/textarea>\n        <\/td>\n<\/tr>\n<tr>\n<td><\/td>\n<td>\n          <button id=\"startSynthesisAsyncButton\">Start synthesis<\/button><br \/>\n          <button id=\"pauseButton\">Pause<\/button><br \/>\n          <button id=\"resumeButton\">Resume<\/button><br \/>\n          <button id=\"downloadButton\">Download<\/button>\n        <\/td>\n<\/tr>\n<tr>\n<td align=\"right\" valign=\"top\"><label for=\"resultsDiv\">Results<\/label><\/td>\n<td><textarea id=\"resultsDiv\" readonly style=\"display: inline-block;width:500px;height:50px\"><\/textarea><\/td>\n<\/tr>\n<tr>\n<td align=\"right\" valign=\"top\"><label for=\"talkingHeadDiv\"><br \/>\n          <a href=\"https:\/\/docs.microsoft.com\/azure\/cognitive-services\/speech-service\/how-to-speech-synthesis-viseme?pivots=programming-language-javascript\" rel=\"noreferrer noopener\" target=\"_blank\">Talking Head<\/a><\/label><\/td>\n<td>\n<div id=\"talkingHeadDiv\" style=\"display: inline-block;width:800px;\"><\/div>\n<\/td>\n<\/tr>\n<tr>\n<td align=\"right\" valign=\"top\"><label for=\"eventsDiv\">Events<\/label><\/td>\n<td><textarea id=\"eventsDiv\" readonly style=\"display: inline-block;width:500px;height:200px\"><\/textarea><\/td>\n<\/tr>\n<tr>\n<td align=\"right\" valign=\"top\"><label for=\"highlightDiv\">Highlight<\/label><\/td>\n<td>\n<div id=\"highlightDiv\" style=\"display: inline-block;width:800px;\"><\/div>\n<\/td>\n<\/tr>\n<\/table><\/div>\n<p>  <!-- Speech SDK reference sdk. --><br \/>\n  <script src=\"https:\/\/aka.ms\/csspeech\/jsbrowserpackageraw\"><\/script><\/p>\n<p>  <!-- Speech SDK Authorization token --><br \/>\n  <script>\n  \/\/ Note: Replace the URL with a valid endpoint to retrieve\n  \/\/       authorization tokens for your subscription.\n  var authorizationEndpoint = \"token.php\";<\/p>\n<p>  function RequestAuthorizationToken() {\n    if (authorizationEndpoint) {\n      var a = new XMLHttpRequest();\n      a.open(\"GET\", authorizationEndpoint);\n      a.setRequestHeader(\"Content-Type\", \"application\/x-www-form-urlencoded\");\n      a.send(\"\");\n      a.onload = function() {\n          var token = JSON.parse(atob(this.responseText.split(\".\")[1]));\n          regionOptions.value = token.region;\n          authorizationToken = this.responseText;\n          subscriptionKey.disabled = true;\n          subscriptionKey.value = \"using authorization token (hit F5 to refresh)\";\n          console.log(\"Got an authorization token: \" + token);\n      }\n    }\n  }\n  <\/script><\/p>\n<p>  <!-- Speech SDK USAGE --><br \/>\n  <script>\n    \/\/ On document load resolve the Speech SDK dependency\n    function Initialize(onComplete) {\n      if (!!window.SpeechSDK) {\n        document.getElementById('content').style.display = 'block';\n        document.getElementById('warning').style.display = 'none';\n        onComplete(window.SpeechSDK);\n      }\n    }\n  <\/script><\/p>\n<p>  <!-- Browser Hooks --><br \/>\n  <script>\n    \/\/ status fields and start button in UI\n    var resultsDiv,\n        eventsDiv,\n        talkingHeadDiv,\n        highlightDiv;\n    var startSynthesisAsyncButton, pauseButton, resumeButton, downloadButton;\n    var updateVoiceListButton;<\/p>\n<p>    \/\/ subscription key and region for speech services.\n    var subscriptionKey, regionOptions;\n    var authorizationToken;\n    var voiceOptions, isSsml;\n    var SpeechSDK;\n    var synthesisText;\n    var synthesizer;\n    var player;\n    var wordBoundaryList = [];<\/p>\n<p>    function getExtensionFromFormat(format) {\n      format = format.toLowerCase();\n      if (format.includes('mp3')) {\n        return 'mp3';\n      } else if (format.includes('ogg')) {\n        return 'ogg';\n      } else if (format.includes('webm')) {\n        return 'webm';\n      } else if (format.includes('ogg')) {\n        return 'ogg';\n      } else if (format.includes('silk')) {\n        return 'silk';\n      } else if (format.includes('riff')) {\n        return 'wav';\n      } else {\n        return 'pcm';\n      }\n    }<\/p>\n<p>    document.addEventListener(\"DOMContentLoaded\", function () {\n      startSynthesisAsyncButton = document.getElementById(\"startSynthesisAsyncButton\");\n      updateVoiceListButton = document.getElementById(\"updateVoiceListButton\");\n      pauseButton = document.getElementById(\"pauseButton\");\n      resumeButton = document.getElementById(\"resumeButton\");\n      downloadButton = document.getElementById(\"downloadButton\");\n      subscriptionKey = document.getElementById(\"subscriptionKey\");\n      regionOptions = document.getElementById(\"regionOptions\");\n      resultsDiv = document.getElementById(\"resultsDiv\");\n      eventsDiv = document.getElementById(\"eventsDiv\");\n      voiceOptions = document.getElementById(\"voiceOptions\");\n      isSsml = document.getElementById(\"isSSML\");\n      talkingHeadDiv = document.getElementById(\"talkingHeadDiv\");\n      highlightDiv = document.getElementById(\"highlightDiv\");<\/p>\n<p>      setInterval(function () {\n        if (player !== undefined) {\n          const currentTime = player.currentTime;\n          var wordBoundary;\n          for (const e of wordBoundaryList) {\n            if (currentTime * 1000 > e.audioOffset \/ 10000) {\n              wordBoundary = e;\n            } else {\n              break;\n            }\n          }\n          if (wordBoundary !== undefined) {\n            highlightDiv.innerHTML = synthesisText.value.substr(0, wordBoundary.textOffset) +\n                    \"<span class='highlight'>\" + wordBoundary.text + \"<\/span>\" +\n                    synthesisText.value.substr(wordBoundary.textOffset + wordBoundary.wordLength);\n          } else {\n            highlightDiv.innerHTML = synthesisText.value;\n          }\n        }\n      }, 50);<\/p>\n<p>      updateVoiceListButton.addEventListener(\"click\", function () {\n        var request = new XMLHttpRequest();\n        request.open('GET',\n                'https:\/\/' + regionOptions.value + \".tts.speech.\" +\n                (regionOptions.value.startsWith(\"china\") ? \"azure.cn\" : \"microsoft.com\") +\n                        \"\/cognitiveservices\/voices\/list\", true);\n        if (authorizationToken) {\n          request.setRequestHeader(\"Authorization\", \"Bearer \" + authorizationToken);\n        } else {\n          if (subscriptionKey.value === \"\" || subscriptionKey.value === \"subscription\") {\n            alert(\"Please enter your Microsoft Cognitive Services Speech subscription key!\");\n            return;\n          }\n          request.setRequestHeader(\"Ocp-Apim-Subscription-Key\", subscriptionKey.value);\n        }<\/p>\n<p>        request.onload = function() {\n          if (request.status >= 200 && request.status < 400) {\n            const response = this.response;\n            const defaultVoice = \"JennyNeural\";\n            let selectId;\n            const data = JSON.parse(response);\n            voiceOptions.innerHTML = \"\";\n            data.forEach((voice, index) => {\n              voiceOptions.innerHTML += \"<option value=\\\"\" + voice.Name + \"\\\">\" + voice.Name + \"<\/option>\";\n              if (voice.Name.indexOf(defaultVoice) > 0) {\n                selectId = index;\n              }\n            });\n            voiceOptions.selectedIndex = selectId;\n            voiceOptions.disabled = false;\n          } else {\n            window.console.log(this);\n            eventsDiv.innerHTML += \"cannot get voice list, code: \" + this.status + \" detail: \" + this.statusText + \"\\r\\n\";\n          }\n        };<\/p>\n<p>        request.send()\n      });<\/p>\n<p>      pauseButton.addEventListener(\"click\", function () {\n        player.pause();\n        pauseButton.disabled = true;\n        resumeButton.disabled = false;\n      });<\/p>\n<p>      resumeButton.addEventListener(\"click\", function () {\n        player.resume();\n        pauseButton.disabled = false;\n        resumeButton.disabled = true;\n      });<\/p>\n<p>      startSynthesisAsyncButton.addEventListener(\"click\", function () {\n        resultsDiv.innerHTML = \"\";\n        eventsDiv.innerHTML = \"\";\n        wordBoundaryList = [];\n        synthesisText = document.getElementById(\"synthesisText\");<\/p>\n<p>        \/\/ if we got an authorization token, use the token. Otherwise use the provided subscription key\n        var speechConfig;\n        if (authorizationToken) {\n          speechConfig = SpeechSDK.SpeechConfig.fromAuthorizationToken(authorizationToken, regionOptions.value);\n        } else {\n          if (subscriptionKey.value === \"\" || subscriptionKey.value === \"subscription\") {\n            alert(\"Please enter your Microsoft Cognitive Services Speech subscription key!\");\n            return;\n          }\n          speechConfig = SpeechSDK.SpeechConfig.fromSubscription(subscriptionKey.value, regionOptions.value);\n        }<\/p>\n<p>        speechConfig.speechSynthesisVoiceName = voiceOptions.value;\n        speechConfig.speechSynthesisOutputFormat = formatOptions.value;<\/p>\n<p>        player = new SpeechSDK.SpeakerAudioDestination();\n        player.onAudioStart = function(_) {\n          window.console.log(\"playback started\");\n          setTimeout(function(){ $(\"svg path :first-child\").each( function(i) {this.beginElement();}); }, 0.5);\n        }\n        player.onAudioEnd = function (_) {\n          window.console.log(\"playback finished\");\n          eventsDiv.innerHTML += \"playback finished\" + \"\\r\\n\";\n          startSynthesisAsyncButton.disabled = false;\n          downloadButton.disabled = false;\n          pauseButton.disabled = true;\n          resumeButton.disabled = true;\n          wordBoundaryList = [];\n        };<\/p>\n<p>        var audioConfig  = SpeechSDK.AudioConfig.fromSpeakerOutput(player);<\/p>\n<p>        synthesizer = new SpeechSDK.SpeechSynthesizer(speechConfig, audioConfig);<\/p>\n<p>        \/\/ The event synthesizing signals that a synthesized audio chunk is received.\n        \/\/ You will receive one or more synthesizing events as a speech phrase is synthesized.\n        \/\/ You can use this callback to streaming receive the synthesized audio.\n        synthesizer.synthesizing = function (s, e) {\n          window.console.log(e);\n          eventsDiv.innerHTML += \"(synthesizing) Reason: \" + SpeechSDK.ResultReason[e.result.reason] +\n                  \"Audio chunk length: \" + e.result.audioData.byteLength + \"\\r\\n\";\n        };<\/p>\n<p>        \/\/ The synthesis started event signals that the synthesis is started.\n        synthesizer.synthesisStarted = function (s, e) {\n          window.console.log(e);\n          eventsDiv.innerHTML += \"(synthesis started)\" + \"\\r\\n\";\n          pauseButton.disabled = false;\n        };<\/p>\n<p>        \/\/ The event synthesis completed signals that the synthesis is completed.\n        synthesizer.synthesisCompleted = function (s, e) {\n          console.log(e);\n          eventsDiv.innerHTML += \"(synthesized)  Reason: \" + SpeechSDK.ResultReason[e.result.reason] +\n                  \" Audio length: \" + e.result.audioData.byteLength + \"\\r\\n\";\n        };<\/p>\n<p>        \/\/ The event signals that the service has stopped processing speech.\n        \/\/ This can happen when an error is encountered.\n        synthesizer.SynthesisCanceled = function (s, e) {\n          const cancellationDetails = SpeechSDK.CancellationDetails.fromResult(e.result);\n          let str = \"(cancel) Reason: \" + SpeechSDK.CancellationReason[cancellationDetails.reason];\n          if (cancellationDetails.reason === SpeechSDK.CancellationReason.Error) {\n            str += \": \" + e.result.errorDetails;\n          }\n          window.console.log(e);\n          eventsDiv.innerHTML += str + \"\\r\\n\";\n          startSynthesisAsyncButton.disabled = false;\n          downloadButton.disabled = false;\n          pauseButton.disabled = true;\n          resumeButton.disabled = true;\n        };<\/p>\n<p>        \/\/ This event signals that word boundary is received. This indicates the audio boundary of each word.\n        \/\/ The unit of e.audioOffset is tick (1 tick = 100 nanoseconds), divide by 10,000 to convert to milliseconds.\n        synthesizer.wordBoundary = function (s, e) {\n          window.console.log(e);\n          eventsDiv.innerHTML += \"(WordBoundary), Text: \" + e.text + \", Audio offset: \" + e.audioOffset \/ 10000 + \"ms.\" + \"\\r\\n\";\n          wordBoundaryList.push(e);\n        };<\/p>\n<p>        synthesizer.visemeReceived = function (s, e) {\n          window.console.log(e);\n          eventsDiv.innerHTML += \"(Viseme), Audio offset: \" + e.audioOffset \/ 10000 + \"ms. Viseme ID: \" + e.visemeId + '\\n';\n          talkingHeadDiv.innerHTML = e.animation.replaceAll(\"begin=\\\"0.5s\\\"\", \"begin=\\\"indefinite\\\"\");\n          $(\"svg\").width('500px').height('500px');\n        }<\/p>\n<p>        synthesizer.bookmarkReached = function (s, e) {\n          window.console.log(e);\n          eventsDiv.innerHTML +=  \"(Bookmark reached), Audio offset: \" + e.audioOffset \/ 10000 + \"ms. Bookmark text: \" + e.text + '\\n';\n        }<\/p>\n<p>        const complete_cb = function (result) {\n          if (result.reason === SpeechSDK.ResultReason.SynthesizingAudioCompleted) {\n            resultsDiv.innerHTML += \"synthesis finished\";\n          } else if (result.reason === SpeechSDK.ResultReason.Canceled) {\n            resultsDiv.innerHTML += \"synthesis failed. Error detail: \" + result.errorDetails;\n          }\n          window.console.log(result);\n          synthesizer.close();\n          synthesizer = undefined;\n        };\n        const err_cb = function (err) {\n          startSynthesisAsyncButton.disabled = false;\n          downloadButton.disabled = false;\n          phraseDiv.innerHTML += err;\n          window.console.log(err);\n          synthesizer.close();\n          synthesizer = undefined;\n        };<\/p>\n<p>        if (!synthesisText.value) {\n          alert(\"Please enter synthesis content.\");\n          return;\n        }<\/p>\n<p>        startSynthesisAsyncButton.disabled = true;\n        downloadButton.disabled = true;<\/p>\n<p>        if (isSsml.checked) {\n          synthesizer.speakSsmlAsync(synthesisText.value,\n                  complete_cb,\n                  err_cb);\n        } else {\n          synthesizer.speakTextAsync(synthesisText.value,\n                  complete_cb,\n                  err_cb);\n        }\n      });<\/p>\n<p>      downloadButton.addEventListener(\"click\", function () {\n        resultsDiv.innerHTML = \"\";\n        eventsDiv.innerHTML = \"\";\n        synthesisText = document.getElementById(\"synthesisText\");<\/p>\n<p>        var speechConfig;<\/p>\n<p>        \/\/ if we got an authorization token, use the token. Otherwise use the provided subscription key\n        if (authorizationToken) {\n          speechConfig = SpeechSDK.SpeechConfig.fromAuthorizationToken(authorizationToken, regionOptions.value);\n        } else {\n          if (subscriptionKey.value === \"\" || subscriptionKey.value === \"subscription\") {\n            alert(\"Please enter your Microsoft Cognitive Services Speech subscription key!\");\n            return;\n          }\n          speechConfig = SpeechSDK.SpeechConfig.fromSubscription(subscriptionKey.value, regionOptions.value);\n        }<\/p>\n<p>        speechConfig.speechSynthesisVoiceName = voiceOptions.value;\n        speechConfig.speechSynthesisOutputFormat = formatOptions.value;<\/p>\n<p>        synthesizer = new SpeechSDK.SpeechSynthesizer(speechConfig, null);<\/p>\n<p>        synthesizer.SynthesisCanceled = function (s, e) {\n          const cancellationDetails = SpeechSDK.CancellationDetails.fromResult(e.result);\n          let str = \"(cancel) Reason: \" + SpeechSDK.CancellationReason[cancellationDetails.reason];\n          if (cancellationDetails.reason === SpeechSDK.CancellationReason.Error) {\n            str += \": \" + e.result.errorDetails;\n          }\n          window.console.log(e);\n          eventsDiv.innerHTML += str + \"\\r\\n\";\n          resultsDiv.innerHTML = str;\n          startSynthesisAsyncButton.disabled = false;\n          downloadButton.disabled = false;\n          pauseButton.disabled = true;\n          resumeButton.disabled = true;\n        };<\/p>\n<p>        synthesizer.synthesisCompleted = function (s, e) {\n            resultsDiv.innerHTML = \"synthesis finished\";\n            synthesizer.close();\n            a = document.createElement('a');\n            url = window.URL.createObjectURL(new Blob([e.result.audioData]));\n            a.href = url;\n            a.download = 'synth.' + getExtensionFromFormat(formatOptions.options[formatOptions.selectedIndex].text);\n            document.body.appendChild(a);\n            a.click();\n            setTimeout(function () {\n                document.body.removeChild(a);\n                window.URL.revokeObjectURL(url);\n            }, 0);\n            startSynthesisAsyncButton.disabled = false;\n            downloadButton.disabled = false;\n        };<\/p>\n<p>        if (!synthesisText.value) {\n          alert(\"Please enter synthesis content.\");\n        }<\/p>\n<p>        startSynthesisAsyncButton.disabled = true;\n        downloadButton.disabled = true;<\/p>\n<p>        if (isSsml.checked) {\n          synthesizer.speakSsmlAsync(synthesisText.value);\n        } else {\n          synthesizer.speakTextAsync(synthesisText.value);\n        }\n      });<\/p>\n<p>      Initialize(function (speechSdk) {\n        SpeechSDK = speechSdk;\n        startSynthesisAsyncButton.disabled = false;\n        downloadButton.disabled = false;\n        pauseButton.disabled = true;\n        resumeButton.disabled = true;<\/p>\n<p>        formatOptions.innerHTML = \"\";\n        Object.keys(SpeechSDK.SpeechSynthesisOutputFormat).forEach(format => {\n          if (isNaN(format) && !format.includes('Siren')) {\n            formatOptions.innerHTML += \"<option value=\\\"\" + SpeechSDK.SpeechSynthesisOutputFormat&#091;format&#093; + \"\\\">\" + format + \"<\/option>\"\n          }}\n        );\n        formatOptions.selectedIndex = SpeechSDK.SpeechSynthesisOutputFormat.Audio24Khz48KBitRateMonoMp3;<\/p>\n<p>        \/\/ in case we have a function for getting an authorization token, call it.\n        if (typeof RequestAuthorizationToken === \"function\") {\n          RequestAuthorizationToken();\n        }\n      });\n    });\n  <\/script><br \/>\n<\/body><br \/>\n<\/html><\/a><\/div><style type=\"text\/css\">.fusion-body .fusion-builder-column-0{width:100% !important;margin-top : 0px;margin-bottom : 20px;}.fusion-builder-column-0 > .fusion-column-wrapper {padding-top : 0px !important;padding-right : 0px !important;margin-right : 1.92%;padding-bottom : 0px !important;padding-left : 0px !important;margin-left : 1.92%;}@media only screen and (max-width:1024px) {.fusion-body .fusion-builder-column-0{width:100% !important;order : 0;}.fusion-builder-column-0 > .fusion-column-wrapper {margin-right : 1.92%;margin-left : 1.92%;}}@media only screen and (max-width:640px) {.fusion-body .fusion-builder-column-0{width:100% !important;order : 0;}.fusion-builder-column-0 > .fusion-column-wrapper {margin-right : 1.92%;margin-left : 1.92%;}}<\/style><\/div><\/div><style type=\"text\/css\">.fusion-body .fusion-flex-container.fusion-builder-row-1{ padding-top : 0px;margin-top : 0px;padding-right : 0px;padding-bottom : 0px;margin-bottom : 0px;padding-left : 0px;}<\/style><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\r\n<title>Windistri - Olipress S.R.L<\/title>\r\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\r\n<link rel=\"canonical\" href=\"https:\/\/olipress.it\/olipress\/windistri\" \/>\r\n<meta property=\"og:locale\" content=\"it_IT\" \/>\r\n<meta property=\"og:type\" content=\"article\" \/>\r\n<meta property=\"og:title\" content=\"Windistri - Olipress S.R.L\" \/>\r\n<meta property=\"og:url\" content=\"https:\/\/olipress.it\/olipress\/windistri\" \/>\r\n<meta property=\"og:site_name\" content=\"Olipress S.R.L\" \/>\r\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/olipress\" \/>\r\n<meta property=\"article:modified_time\" content=\"2023-07-14T10:39:08+00:00\" \/>\r\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\r\n<meta name=\"twitter:label1\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minuti\" \/>\r\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/olipress.it\/olipress\/#organization\",\"name\":\"Olipress srl\",\"url\":\"https:\/\/olipress.it\/olipress\/\",\"sameAs\":[\"https:\/\/www.facebook.com\/olipress\",\"https:\/\/www.instagram.com\/olipress_pergola\/?hl=it\"],\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/olipress.it\/olipress\/#logo\",\"inLanguage\":\"it-IT\",\"url\":\"http:\/\/www.olipress.it\/SitoNew\/wp-content\/uploads\/2020\/05\/OlipressLogo.jpg\",\"contentUrl\":\"http:\/\/www.olipress.it\/SitoNew\/wp-content\/uploads\/2020\/05\/OlipressLogo.jpg\",\"width\":225,\"height\":225,\"caption\":\"Olipress srl\"},\"image\":{\"@id\":\"https:\/\/olipress.it\/olipress\/#logo\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/olipress.it\/olipress\/#website\",\"url\":\"https:\/\/olipress.it\/olipress\/\",\"name\":\"Olipress S.R.L\",\"description\":\"Azienda Informatica\",\"publisher\":{\"@id\":\"https:\/\/olipress.it\/olipress\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/olipress.it\/olipress\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/olipress.it\/olipress\/windistri#webpage\",\"url\":\"https:\/\/olipress.it\/olipress\/windistri\",\"name\":\"Windistri - Olipress S.R.L\",\"isPartOf\":{\"@id\":\"https:\/\/olipress.it\/olipress\/#website\"},\"datePublished\":\"2021-06-28T15:10:45+00:00\",\"dateModified\":\"2023-07-14T10:39:08+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/olipress.it\/olipress\/windistri#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/olipress.it\/olipress\/windistri\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/olipress.it\/olipress\/windistri#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/olipress.it\/olipress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Windistri\"}]}]}<\/script>\r\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Windistri - Olipress S.R.L","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/olipress.it\/olipress\/windistri","og_locale":"it_IT","og_type":"article","og_title":"Windistri - Olipress S.R.L","og_url":"https:\/\/olipress.it\/olipress\/windistri","og_site_name":"Olipress S.R.L","article_publisher":"https:\/\/www.facebook.com\/olipress","article_modified_time":"2023-07-14T10:39:08+00:00","twitter_card":"summary_large_image","twitter_misc":{"Tempo di lettura stimato":"3 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Organization","@id":"https:\/\/olipress.it\/olipress\/#organization","name":"Olipress srl","url":"https:\/\/olipress.it\/olipress\/","sameAs":["https:\/\/www.facebook.com\/olipress","https:\/\/www.instagram.com\/olipress_pergola\/?hl=it"],"logo":{"@type":"ImageObject","@id":"https:\/\/olipress.it\/olipress\/#logo","inLanguage":"it-IT","url":"http:\/\/www.olipress.it\/SitoNew\/wp-content\/uploads\/2020\/05\/OlipressLogo.jpg","contentUrl":"http:\/\/www.olipress.it\/SitoNew\/wp-content\/uploads\/2020\/05\/OlipressLogo.jpg","width":225,"height":225,"caption":"Olipress srl"},"image":{"@id":"https:\/\/olipress.it\/olipress\/#logo"}},{"@type":"WebSite","@id":"https:\/\/olipress.it\/olipress\/#website","url":"https:\/\/olipress.it\/olipress\/","name":"Olipress S.R.L","description":"Azienda Informatica","publisher":{"@id":"https:\/\/olipress.it\/olipress\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/olipress.it\/olipress\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/olipress.it\/olipress\/windistri#webpage","url":"https:\/\/olipress.it\/olipress\/windistri","name":"Windistri - Olipress S.R.L","isPartOf":{"@id":"https:\/\/olipress.it\/olipress\/#website"},"datePublished":"2021-06-28T15:10:45+00:00","dateModified":"2023-07-14T10:39:08+00:00","breadcrumb":{"@id":"https:\/\/olipress.it\/olipress\/windistri#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/olipress.it\/olipress\/windistri"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/olipress.it\/olipress\/windistri#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/olipress.it\/olipress\/"},{"@type":"ListItem","position":2,"name":"Windistri"}]}]}},"_links":{"self":[{"href":"https:\/\/olipress.it\/olipress\/wp-json\/wp\/v2\/pages\/3621"}],"collection":[{"href":"https:\/\/olipress.it\/olipress\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/olipress.it\/olipress\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/olipress.it\/olipress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/olipress.it\/olipress\/wp-json\/wp\/v2\/comments?post=3621"}],"version-history":[{"count":3,"href":"https:\/\/olipress.it\/olipress\/wp-json\/wp\/v2\/pages\/3621\/revisions"}],"predecessor-version":[{"id":4598,"href":"https:\/\/olipress.it\/olipress\/wp-json\/wp\/v2\/pages\/3621\/revisions\/4598"}],"wp:attachment":[{"href":"https:\/\/olipress.it\/olipress\/wp-json\/wp\/v2\/media?parent=3621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}