;(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

IA "ressuscita" quem já morreu e rende enxurradas de memes na internet

Reprodução
Imagem: Reprodução

Gabriel Toueg

Colaboração para Tilt

04/03/2021 11h30

Ao que parece, a série "Black Mirror", da Netflix, é menos futurista do que gostaríamos de acreditar, ela faz mais o estilo "a arte imita a vida". Ao menos é o que faz pensar quando conhecemos a Deep Nostalgia, uma plataforma lançada no fim de fevereiro que usa inteligência artificial para dar um último "sopro de vida" a pessoas que já morreram.

Com ela, fotos estáticas são transformadas em vídeos de alguns segundos. Hospedada na plataforma de genealogia MyHeritage, ela usa vídeos pré-gravados de movimentos da face humana, busca a que melhor se encaixa ao rosto da imagem e o aplica para criar uma pequena cena em movimento.

A animação é criada usando a tecnologia Live Portrait, desenvolvida pela empresa israelense D-ID.

Desde que foi lançada, a ferramenta tem sido usada para "dar vida" a várias personalidades do ado, no tuíte abaixo dá para ver o "retrato-vivo" da física e química polonesa Marie Curie, cujas pesquisas resultaram na descoberta da radioatividade.

Antes de fazer a transformação acontecer, a tecnologia limpa a foto e melhora sua qualidade, quando necessário. O vídeo final fica com 10 a 20 segundos (a duração varia conforme o tempo do vídeo pré-gravado usado na animação).

A ferramenta é gratuita e, além de funcionar no site da plataforma MyHeritage, tem apps que podem ser baixados na App Store e no Google Play.

Caiu na internet... viralizou

Algumas das imagens que deram vida aos que já se foram acabaram viralizando nas redes sociais estampando rostos famosos de outras eras, como Abraham Lincoln, Franz Kafka, Frida Kahlo, Van Gogh, Mozart, Schubert, Alan Turing, entre inúmeros outros.

Vários internautas começaram então a fazer as suas próprias criações usando fotos de pinturas, posters antigos de cinema, imagens de bancos de fotos... Tudo pelo meme, não é mesmo?

Como usar a ferramenta?

Se a curiosidade cresceu por aí, saiba que basta criar uma conta no MyHeritage, informando seu email, fornecendo alguns outros dados pessoais e concordando com os termos e condições do site, para fazer o seu próprio vídeo. A conta gratuita, contudo, permite animar apenas cinco fotos, e os vídeos ficam todos com uma marca d'água.

Segundo a empresa, a privacidade está protegida. "A animação e melhoria ocorrem nos servidores do MyHeritage e nem as fotos nem os vídeos são compartilhados com terceiros", diz em seu site. "MyHeritage não é dono do vídeo resultante; ele pertence a você. (...) O mesmo se aplica às fotos."

A versão paga custa atualmente US$ 16,58 (cerca de R$ 95) por mês, dando o ilimitado à ferramenta e a s sem a marca d'água. O site MyHeritage também tem opções de conta que dão o à funcionalidades além da Deep Nostalgia. O valor mensal varia entre R$ 22,42 e R$ 49,92.

Nosso teste

A reportagem de Tilt testou a ferramenta com uma foto antiga, tirada de um documento de viagem de 1957. O resultado foi espantoso. O personagem mexe o rosto, olha em diferentes direções, pisca os olhos e até esboça um pequeno sorriso, que não aparece na imagem original. Uma espécie de "grampo" no topo da foto original estragou um pouco a experiência. Usar fotos mais limpas e sem interferências obviamente funcionará melhor.

Um teste feito com a icônica imagem de Albert Einstein com a língua de fora ficou bizarro: a língua parece congelada enquanto o rosto do cientista se move para todos os lados.

Uma outra foto, de 1989, do autor dessa matéria, também teve um resultado impressionante. Como a imagem é de uma criança, um vídeo diferente foi usado para gerar a animação, então os gestos e a duração variaram um pouco em relação à primeira imagem: o sorriso é mais marcado, o personagem olha para mais direções e move mais o rosto. Mas é possível notar um deslocamento não natural dos olhos em alguns frames, dando um aspecto um pouco perturbador!

É possível ainda usar a ferramenta em fotos com várias pessoas. A Deep Nostalgia analisa a imagem e pergunta qual rosto você deseja animar, deixando os demais estáticos.

"Você tem um 'momento uau' quando vê uma foto de família preciosa ganhar vida com a Deep Nostalgia", disse o fundador e CEO do MyHeritage, Gilad Japhet. "Ver o rosto de nossos amados ancestrais ganharem vida em uma simulação de vídeo nos permite imaginar como eles poderiam ter sido na realidade e fornece uma maneira nova e profunda de nos conectarmos com a nossa história familiar".