Ramos da InformáticaMundoJSGuia Prático: IA Client-Side com Transformers.js e Alpine.js

Guia Prático: IA Client-Side com Transformers.js e Alpine.js

Transformers.js: Como Implementar Inteligência Artificial no Navegador de Forma Simples e Eficiente

-

Descubra como rodar modelos de Inteligência Artificial direto no navegador usando Transformers.js. Aprenda a fazer análise de sentimentos e detecção de objetos em imagens com JavaScript.

Introdução ao Transformers.js

Transformers.js, da Hugging Face, é uma biblioteca que fornece uma API chamada pipeline. Essa API facilita a integração de tarefas de IA no navegador, como:

  • Análise de sentimentos
  • Resumo de texto
  • Tradução de idiomas
  • Classificação de imagens e áudio
  • Reconhecimento de objetos em imagens

A biblioteca é projetada para ser simples e eficiente, com suporte para uso progressivo (carregando recursos apenas quando necessário).

Detectando sentimentos

Para detectar sentimento em um texto, você precisa usar o sentiment-analysis como este exemplo:

Dica de Leitura: Se você está interessado em explorar mais aplicações de Inteligência Artificial, especialmente em contextos de desenvolvimento de sistemas e automação, então nosso artigo sobre PicoClaw: Assistente de Inteligência Artificial Ultra-Leve para IoT e Raspberry Pi pode ser exatamente o que você precisa para levar sua criatividade ao próximo nível.

import { pipeline } from 'https://cdn.jsdelivr.net/npm/@huggingface/[email protected]';

const classifier = await pipeline('sentiment-analysis')

Então, você passa uma string classifier para a entrada:

let result = await classifier('input');

Isso retorna um array de resultados (no meu caso, sempre um array com um único resultado) onde cada resultado é um objeto com um rótulo e uma pontuação:

{
    "label": "POSITIVE",
    "score": 0.9984346628189087
}

Em uma aplicação real, você poderia usar isso para fornecer feedback em tempo real sobre a entrada do usuário. Consigo imaginar isso sendo útil para representantes de atendimento ao cliente, ajudando a garantir que eles sejam positivos em suas respostas. Eu criei um simples demo com Alpine.js que você pode ver abaixo. Para testar, basta começar a escrever e optar por algo desagradável ou alegre, você decide.

Agora, este exemplo simples ficou assim:

HTML:

<p>
	Digite algo na caixa, e o sentimento percebido será exibido.
</p>
<textarea id="input"></textarea>
<div id="result"></div>

CSS:

textarea {
	width: 500px;
	height: 200px;
}

JAVASCRIPT

import { pipeline } from 'https://cdn.jsdelivr.net/npm/@huggingface/[email protected]';

const classifier = await pipeline('sentiment-analysis');
let $result = document.querySelector('#result');
let $input = document.querySelector('textarea');
$input.addEventListener('input', doSentiment, false);

async function doSentiment() {
	if($input.value.trim() === '') return;
	let sentiment = (await classifier($input.value))[0];
	console.log(sentiment);
	$result.innerHTML = `<strong>${sentiment.label}</strong> (${sentiment.score})`;
}

Detecção de Objetos em Imagens

Para o próximo exemplo, construí um demo que modifica o exemplo do guia “Building a Vanilla JS Application” (Construindo uma Aplicação JS Vanilla). Este guia é excelente (você pode testar o demo também) e oferece um bom exemplo de outro recurso poderoso: encontrar objetos em imagens.

No guia, eles explicam como este pipeline pode encontrar objetos e, opcionalmente, ser personalizado para ajustar o nível de confiança antes de adicionar um resultado. Além disso, você pode configurar se as caixas delimitadoras devem ser expressas em pixels ou em porcentagens da imagem original.

O demo deles realmente adiciona caixas delimitadoras visíveis e rótulos à imagem original. No entanto, vamos tentar algo mais simples: usar a câmera do dispositivo para determinar se tiramos uma foto de um gato.

Para o meu exemplo, utilizei Alpine.js. Meu código front-end consiste em apenas um botão para ativar a câmera (ou um seletor de arquivos no desktop) e um local para exibir os resultados:

<h2>Is Cat?</h2>
<div x-data="cameraApp">
	<input type="file" capture="camera" accept="image/*" @change="gotPic" :disabled="working">
	<template x-if="imageSrc">
		<p>
		<img :src="imageSrc">
		</p>
	</template>
	<div x-html="status"></div>
</div>

O JavaScript é um pouco mais complexo. Vou pular algumas partes relacionadas ao Alpine.js e focar principalmente no Transformers.js. No método init do Alpine.js, eu espero o pipeline carregar o código necessário:

this.detector = await pipeline("object-detection", "Xenova/detr-resnet-50");

Aqui, o pipeline object-detection é carregado com o modelo Xenova/detr-resnet-50. Isso configura o detector para estar pronto para processar imagens e identificar objetos. A partir desse ponto, você pode utilizar o detector para analisar imagens capturadas ou selecionadas.

Depois que isso é concluído, o usuário pode realmente clicar no botão. O que acontece quando você tira uma foto (ou seleciona uma imagem)? Primeiro, eu obtenho a imagem selecionada a partir do evento:

Primeiro, capturamos o arquivo de imagem selecionado:

let file = e.target.files[0];
if (!file) return;

Se nenhum arquivo for selecionado, o código retorna imediatamente.


Configurar o Leitor de Arquivos

Configuramos um leitor de arquivos para obter os dados da imagem como uma URL codificada em base64:

let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = async e => {

Trabalhar com os Dados no onload

Dentro do método onload, o código realiza duas ações principais:

  1. Exibir um Miniatura da Imagem O resultado da leitura do arquivo (data URL) é atribuído ao DOM para exibir uma miniatura da imagem:javascriptCopiar códigothis.imageSrc = e.target.result;
  2. Detectar Objetos na Imagem O pipeline do detector é usado para processar a imagem e detectar objetos:javascriptCopiar códigolet output = await this.detector(e.target.result, { threshold: 0.5, percentage: true, });
    • threshold: 0.5: Define o nível mínimo de confiança para considerar um objeto como detectado.
    • percentage: true: Faz com que as coordenadas das caixas delimitadoras sejam retornadas em porcentagens da imagem original, em vez de pixels.

Resultado

O método retorna um array de objetos. Cada objeto contém:

  • Label: O que o modelo acha que é o objeto detectado.
  • Bounding Box: As coordenadas da área onde o objeto foi encontrado.
  • Confidence Score: A confiança do modelo na detecção.

Vamos usar esta imagem:

trans2.jpg
Imagem utilizada para este exemplo Transformers.js

E este é o resultado:

[
    {
        "score": 0.9479293823242188,
        "label": "book",
        "box": {
            "xmin": -0.02235063910484314,
            "ymin": 0.6216115802526474,
            "xmax": 0.3279511630535126,
            "ymax": 0.7934765964746475
        }
    },
    {
        "score": 0.9981929063796997,
        "label": "cat",
        "box": {
            "xmin": 0.23074954748153687,
            "ymin": 0.047968536615371704,
            "xmax": 0.7742043137550354,
            "ymax": 0.8249835669994354
        }
    },
    {
        "score": 0.7411214113235474,
        "label": "book",
        "box": {
            "xmin": 0.44809791445732117,
            "ymin": 0.6813655197620392,
            "xmax": 1.0155799686908722,
            "ymax": 0.985151618719101
        }
    },
    {
        "score": 0.5772241353988647,
        "label": "book",
        "box": {
            "xmin": 0.17918723821640015,
            "ymin": 0.6792456209659576,
            "xmax": 1.0064586997032166,
            "ymax": 0.9803193509578705
        }
    }
]

Eu diria que os resultados relacionados ao livro são inválidos, mas talvez façam sentido? O gato, é claro, está perfeito.

Dado esse resultado, usei o seguinte código para procurar por “cat” ou “cats”:

let labels = output.map(i => i.label);
let isCat = labels.includes('cat') || labels.includes('cats');

Provavelmente, eu poderia ter feito isso em uma linha, e não em duas, mas é por isso que não consigo passar no processo técnico do Google.

Certo, com isso, você pode apontar seu telefone (ou escolher um arquivo) para um gato, e ele verificará se um gato foi encontrado. Surpreendentemente, não havia gatos no meu escritório, então tive que me levantar e sair. Primeiro, um teste negativo:

O código-fonte completo pode ser encontrado aqui: GitHub – ai-testingzone. Você pode testá-lo online neste link: Demo Online, mas lembre-se de que, se estiver em um computador desktop, será necessário fornecer um arquivo local em vez de usar a câmera.

Observação sobre o desempenho

Você notará que leva até cerca de dez segundos para funcionar. Embora não seja extremamente rápido, tudo é processado no próprio dispositivo, o que é uma troca justa, na minha opinião.

Essa tradução foi baseada no artigo brilhantemente divertido e informativo de Raymond Camden, intitulado “Using Transformers.js for AI in the Browser”. O texto original pode ser encontrado aqui.

E olha, foi uma jornada cheia de descobertas! Desde análises sentimentais até a épica busca pelo gato Wednesday (desculpa, Zelda, você é ótima também). Agora, se você leu até aqui e não tentou apontar seu celular para um gato real ou uma foto, você pode estar perdendo o principal propósito dessa leitura. 🐱📸

Nota com humor: Se o Raymond não conseguiu passar na entrevista do Google por usar duas linhas de código em vez de uma, pelo menos ele já passou no teste do “domínio da fofura felina”, o que, convenhamos, é muito mais importante no mundo da IA!

VAI GOSTAR: Livros de Inteligência Artificial com JavaScript e TypeScript em Português

Referências da Editoria sobre o Transformers.js

Selecionamos um conjunto de referências sobre o tema.

1. Documentação do Transformers.js

A Hugging Face oferece uma documentação oficial abrangente que cobre pipelines, modelos disponíveis, exemplos e personalização.


2. Repositório do Transformers.js

Se você está interessado no código-fonte ou em contribuições para o Transformers.js, o GitHub oficial é uma ótima referência.


3. Uso de Modelos Pré-Treinados com Hugging Face

A Hugging Face é líder no fornecimento de modelos pré-treinados. Você pode explorar uma ampla variedade de modelos para diferentes tarefas diretamente no repositório deles.


4. Web AI com TensorFlow.js

Se o Transformers.js te fascinou, explore o TensorFlow.js, outra biblioteca poderosa para rodar IA diretamente no navegador. Ele permite desde aprendizado de máquina simples até redes neurais complexas.


5. Demais Bibliotecas para IA no Navegador

Além do Transformers.js, considere explorar:

  • ONNX.js: Focado em inferência de modelos ONNX no navegador.
  • Brain.js: Uma biblioteca JavaScript mais leve para redes neurais.

6. Performance e Otimização

Para quem quer entender mais sobre como otimizar IA no navegador:

  • Artigo: “How to Optimize Machine Learning Models for Edge Devices”
    • Link: Medium

7. Estudos de Caso em IA no Navegador

  • Google Chrome AI Experiments: Uma coleção de projetos baseados em IA rodando em navegadores.

8. Comunidades e Fóruns

Troque ideias e descubra novas abordagens:

  • Reddit: Comunidade sobre Machine Learning e Web Dev.
    • r/MachineLearning
    • r/WebDev

9. Livros sobre IA no Front-End


10. Blog do Raymond Camden

O autor do artigo traduzido é uma referência em JavaScript, desenvolvimento web e tópicos como Progressive Web Apps e IA.

Perguntas Frequentes (FAQ) sobre o Transformers.js

O que é exatamente o Transformers.js?

É uma biblioteca em JavaScript mantida pela Hugging Face que permite executar modelos de Inteligência Artificial diretamente no navegador (client-side) ou no Node.js. Ela utiliza o ONNX Runtime para rodar modelos pré-treinados, permitindo implementar tarefas complexas — como análise de sentimentos, visão computacional e LLMs — sem depender de um servidor backend ou de APIs pagas na nuvem.

Quais as principais vantagens de rodar IA direto no navegador?

As maiores vantagens são privacidade, redução de custos e funcionamento offline. Como todo o processamento acontece na máquina do usuário, dados sensíveis (fotos, textos, documentos) não são enviados para servidores de terceiros. Além de zerar os custos com APIs de inferência (como as da OpenAI), o sistema continua funcionando perfeitamente sem internet após o modelo ser baixado e guardado no cache do navegador.

O Transformers.js consegue usar a Placa de Vídeo (GPU) do usuário?

Sim! A partir da versão 3 (e com grandes melhorias na recém-chegada versão 4), o Transformers.js oferece suporte total ao WebGPU. Isso permite que a biblioteca acesse a aceleração de hardware da placa de vídeo do usuário de forma nativa no navegador, o que é fundamental para rodar modelos pesados de geração de texto ou processamento de imagem em tempo real, evitando travamentos na CPU.

Baixar os modelos de IA não deixa a aplicação pesada ou lenta?

Esse é o principal trade-off. O primeiro carregamento da aplicação exigirá o download do modelo, que pode variar de dezenas de megabytes a alguns gigabytes. No entanto, para contornar isso, o Transformers.js utiliza modelos quantizados (versões altamente comprimidas e otimizadas como q4 ou q8) e os armazena no cache do navegador. Portanto, o download ocorre apenas uma vez; nos acessos seguintes, a inferência começa de forma quase instantânea.

Ramos da Informática
Ramos da Informáticahttps://ramosdainformatica.com.br
Ramos da Informática é um hub de comunidade dedicado a linguagens de programação, banco de dados, DevOps, Internet das Coisas (IoT), tecnologias da Indústria 4.0, cibersegurança e startups. Com curadoria de conteúdos de qualidade, o projeto é mantido por Ramos de Souza Janones.

Mais recentes

Como aprender a programar, um guia definitivo

Última atualização em 23/04/2026. Guia completo sobre: Como aprender a programar. Espero que este “guia” ou “manifesto”, como prefiro chamar, seja...

Stream Deck para Desenvolvedores: o Console de Comando do Futuro

Esqueça os streamers. Descubra como o Stream Deck se tornou o hardware essencial para Engenheiros de IA e Full...

Como Usar o Skills in Chrome no Brasil: Tutorial Completo de IA

A inteligência artificial já faz parte do nosso fluxo de trabalho, mas ter que reescrever os mesmos prompts repetidamente...

Context Engineering: Como Arquitetar Dados para LLMs e RAG

Na edição desta newsletter intitulada “Engenharia de Prompt: Não é só mais uma buzzword“: https://www.linkedin.com/pulse/engenharia-de-prompt-n%C3%A3o-%C3%A9-s%C3%B3-mais-uma-buzzword-de-souza-janones-tpkxf tratei sobre o tema...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Aprender Idiomas com Google Tradutor: Na Prática

O Google está lançando um novo recurso experimental com tecnologia de IA no Google Tradutor, projetado para ajudar as...

Comunidades Internacionais de Desenvolvedores

Descubra as melhores comunidades internacionais de devs para 2026: GitHub, Stack Overflow, Discord e mais. Comparativo de salários Brasil vs. exterior e guia de carreira remota.

Mais Lidos

Robótica e Programação para Crianças: O Guia Definitivo

Descubra como ensinar robótica e programação para crianças e...

SQL DISTINCT e GROUP BY: Guia Real de Soluções

Este artigo tem como objetivo mostrar as diferenças entre...

Gestão de Atendimento Multicanal: O Guia Definitivo para Izing

Vamos conhecer mais um projeto open source brasileiro? O...

Empoderar Startups Brasileiras: Guia de Aceleração ESG

Devido ao sucesso da primeira edição, que impulsionou soluções...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Você vai gostarrelacionados
Continue aprendendo

E-Zine Dev Ramos

Quer dominar arquitetura e IA?

Junte-se a +10.000 profissionais. Receba semanalmente estratégias de Node.js, React e IA que nunca publicamos no blog.

Assinar Gratuitamente Zero spam. Cancele quando quiser.