;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

"Meu tio morreu": não, a Alexa não ficou insensível; entenda o que rolou

Caixa de som Echo Dot, da Amazon - Grant Hindsley/AFP
Caixa de som Echo Dot, da Amazon Imagem: Grant Hindsley/AFP

Marcella Duarte

Colaboração para Tilt

21/05/2021 11h42

Um vídeo que viralizou esta semana nas redes sociais mostra a Alexa, a inteligência artificial da Amazon, dando uma resposta um tanto insensível.

Um rapaz triste diz "meu tio morreu hoje" para um Echo Dot, e a assistente virtual responde com uma piada infame. "Toc, toc!", "Quem é?", "Não é seu tio".

Veja a seguir no post de Carlos Eduardo, no Instagram:

Mas calma: a Alexa não perdeu a noção.

Esta não é a resposta padrão para este tipo de frase. Foi algo simulado, não espontâneo. Isso pode ser feito seguindo uma rotina personalizada, ensinada a ela. Fizemos o teste, e ela responde apenas: "Sinto muito pela sua perda".

"Esse vídeo não representa uma resposta padrão da Alexa. Clientes podem personalizar reações, criando rotinas pelo app de Alexa, ou desenvolvendo Skills, de forma que definem respostas ou ações personalizadas a partir de comandos que funcionam somente em seus próprios dispositivos e contas", declarou a Amazon em nota a Tilt.

Qual foi o truque?

É possível criar diversas ações para a assistente virtual. Por exemplo, ao dizer "Alexa, bom dia", ela pode ser programada para responder com uma frase motivacional, ou ler a agenda de compromissos; ao falar "Alexa, boa noite", ela pode apagar luzes inteligentes da casa, citando outro exemplo.

No caso do vídeo que viralizou, o rapaz criou uma rotina bem específica, em que a frase "Alexa, meu tio morreu hoje" disparava três falas em sequência. Ou seja, foi apenas uma simulação de conversa —não importa o que fosse respondido sobre ouvir uma piada, a assistente iria contá-la de qualquer forma.

Como criar uma rotina

@tilt_uol

Você já viu essa resposta da #Alexa por aqui? Esta não é uma resposta padrão da assistente virtual, mas sim uma rotina personalizada.

? Future - TikTok

Rotinas personalizadas podem ser facilmente criadas por meio do aplicativo Alexa para smartphone (disponível para Android ou iOS). Seja para brincadeiras ou algo realmente útil. Se quiser, siga o o a o:

  1. Abra o app e toque em "Mais", no canto inferior direito. Selecione "Rotinas";
  2. Toque em "+", no canto superior direito;
  3. Dê um nome para a sua rotina;
  4. Em "Quando isto acontecer", escolha qual interação vai disparar a rotina (pode ser uma frase dita, um horário do dia, um alarme);
  5. No caso de uma fala sua, vá em "Voz" e escreva o que vai dizer;
  6. Toque em "Adicionar ação" e defina como a Alexa deve reagir: pode ser uma mensagem, uma das frases prontas dela, a reprodução de uma música e muito mais;
  7. Para que ela diga algo totalmente personalizado, é preciso escolher "Mensagens" e "Enviar aviso";
  8. Escreva o que ela deve falar, toque em avançar e escolha em quais dispositivos (caso tenha mais de um Echo); avance novamente para confirmar;
  9. Para fazer como no vídeo, com uma pausa entre frases, é preciso criar mais de uma mensagem;
  10. Ao completar, toque em "Salvar", no canto superior direito, para que a rotina fique disponível. Ela pode ser desativada ou excluída a qualquer momento.