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

Kendrick Lamar vira Will Smith em clipe: entenda como funciona o deepfake

Kendrick Lamar se transforma em Will Smith no clipe de "The Heart Part 5" - Reprodução / Youtube
Kendrick Lamar se transforma em Will Smith no clipe de "The Heart Part 5" Imagem: Reprodução / Youtube

Ellen Alves

Colaboração para Tilt, do Rio de Janeiro

09/05/2022 17h48

O rapper Kendrick Lamar lançou neste último domingo (08) o clipe da música "The Heart Part 5" e o vídeo está dando o que falar. Durante o clipe, o cantor se transforma em outros artistas negros, como Kanye West e Will Smith. A tecnologia utilizada para sobrepor o rosto do músico trata-se de deepfake, uma espécie de ilusionismo digital.

A técnica usa inteligência artificial IA para trocar rostos, mudar expressões faciais e até mesmo criar áudios sintéticos digitais, permitindo a criação de conteúdos sem a presença da pessoa. Apesar da impressão negativa em torno do termo deepfake (as pessoas não querem ser associadas à palavra "fake"), a tecnologia está cada vez mais popular no campo do entretenimento.

Durante o vídeo, a letra da música se alinha a quem Kendrick está interpretando naquele momento.

Como funciona um deepfake

O que chamamos hoje de deepfake é o uso da inteligência artificial para manipular digitalmente um conteúdo de áudio ou vídeo. A palavra vem da junção dos termos "deep learning", que é uma abordagem do aprendizado de máquinas, com "fake" (falso). O computador aprende várias informações e depois consegue replicá-las.

Ou seja, para criar um vídeo deepfake o sistema precisa ser alimentado com fotos e vídeos em que uma determinada personalidade ou pessoa anônima aparece. Quanto mais material existir, maiores são as chances de sucesso. Com base nisso, a IA aprende como a pessoa se comporta, a a reconhecer padrões de movimento, características do rosto ou da voz.

Depois de todo conteúdo detalhado e analisado, o sistema é preparado para replicar ações como movimentos e falas parecidas com o original. Neste momento é utilizado uma técnica chamada rede contraditória generativa (GAN, na sigla em inglês).

Nesse estágio são criadas várias imagens que são diretamente comparadas com as de origem, presentes no banco de dados. A correção é feita automaticamente e caso seja encontrado algum erro, o próprio sistema se encarrega de fazer a alteração montando uma nova imagem. O que otimiza o processo até o resultado final.

É possível reconhecer deepfakes?

Algumas dicas ajudam a reconhecer se o vídeo que você está assistindo possui manipulação deepfake ou não.

  1. Atenção a movimentos esquisitos e também ao tamanho desproporcional do rosto;
  2. Vídeos com imagens ruins enganam com mais facilidade;
  3. Caso o vídeo tenha áudio, atenção a sincronia do som com a boca;
  4. É mais fácil perceber manipulação em vídeos assistidos em tela cheia e em melhor qualidade;
  5. Pesquise a procedência da informação ada no vídeo. Se a informação não saiu em veículos confiáveis, certamente é falsa.

A tendência é que a técnica se popularize e e a estar disponível mesmo para quem não trabalha com tecnologia nos próximos anos. Via aplicativos de celular, a exemplo do Reface App.