Alexa na každém kroku

21. 11. 2019

Sdílet

Autor: Amazon
Alexa od Amazonu získává náskok před ostatními virtuálními asistenty. Vývojáři chtějí, aby vás doprovázela doslova na každém kroku.

Rohid Prasad, muž, který v Amazonu vdechl život virtuální asistentce Alexe, má sám doma sedmnáct chytrých reproduktorů. Rád prý vlastní technologii testuje sám na sobě a tvrdí, že takové množství není dostatečné. V rozhovoru pro BBC hovořil o dalším rozšiřování Alexy, která se má stát ještě chytřejší a doprovázet uživatele kamkoliv se pohne. A to doslova. Než se tak stane, bude ale muset zapracovat na svém kontextuálním uvažování.

„Pokud přijdete do obchodu a zeptáte se Alexy, kde najdete rajčata, bude muset znát kontext. V tomto případě plán obchodu, aby vás poslala ke správnému regálu. Obdobně, když budete ubytovaní v hotelu a budete chtít zjistit otevírací dobu bazénu, nesmí vám odpovědět otevírací dobou městského bazénu, ale toho hotelového,“ přibližuje Prasad.

Za účelem dosažení tohoto cíle Amazon vyvinul sluchátka s Alexou a testuje další nositelnou elektroniku, včetně brýlí nebo třeba chytrého prstenu. Čím víc uživatelů je bude využívat, tím více dat vývojáři získají a tím víc budou moct zdokonalit algoritmy, na základě kterých Alexa funguje.

Chytrých zařízení existuje už celá řada a každý týden zpracovávají miliardu uživatelských dotazů, Amazon má však díky Alexe a její široké integraci napříč nejrůznějšími značkami navrch. Dle průzkumu společnosti Canalys se chytrých reproduktorů od Amazonu během uplynulého kvartálu prodalo třikrát tolik co těch od Googlu a zatímco prodeje konkurence stagnují, Amazon neustále roste. Google sice těží z propojení s Androidem, vývoj Alexy jde však rychle dopředu. Dle Prasada se její chybovost během uplynulých pěti let čtyřnásobně snížila.

Pro řadu uživatelů navíc jistě bude atraktivní možnost vybrat si pro Alexu hlas některých celebrit, přičemž Amazon prý uvažuje i o možnosti udělat svého virtuálního asistenta genderově neutrálním, respektive mít možnost vybrat si, zda z Alexy nebude spíš Alex.

S čím se však vývojáři virtuálních asistentů musejí potýkat, jsou rapidně rostoucí očekávání a požadavky uživatelů, kterým často ani ten nejrychlejší vývoj nestačí. Navíc, u uživatelů je třeba získat důvěru, mají-li být obklopeni mikrofony.

Ta se přitom nedávno otřásla i v případě Amazonu, když se ukázalo, že záznamy pořízené skrz Alexu zpracovávala a analyzovala další firma. Amazon následně sice usnadnil možnost se z tohoto procesování dat vyvázat, dle Prasada je však supervize lidmi pro vývojáře naprosto zásadní a bude pokračovat.

Cyber25

„Takto analyzujeme méně než jedno procento dat, která přes Alexu projdou,“ ujišťuje. „Alexe lze také přikázat, ať vám poví, co slyšela a pokud se vám to nebude líbit nebo vám to bude nepříjemné, můžete to smazat. A je třeba si uvědomit, že ta zařízení neposlouchají pořád, ale jen pokud je aktivujete aktivačním slovem. Navíc Alexu můžete ztlumit a je velice transparentní. Když nějaká data posílá do cloudu, rozsvítí se modré světlo.“

Přesto, v čím více zařízeních Alexa bude přítomna, tím víc se bude vtírat otázka, zda to bude uživatelům dostatečně patrné...

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »