Guía paso a paso de Integración de face-detector

Explicación paso a paso de como hacer uso del componente web en un archivo .html

Este documento describe paso a paso cómo crear un proyecto desde cero que reproduzca como hacer uso deface-detector-js-example de jaak-ai en un entorno sencillo con HTML, Javascript y CSS.

🚀 Prerrequisitos

  • Node.js v14 o superior instalado en tu máquina.
  • npm v6 o superior.
  • Editor de código (Visual Studio Code, WebStorm, etc.).
  • Conexión a Internet para cargar el componente desde un CDN.

📂 1. Crear la Carpeta del Proyecto

  1. Abre tu terminal y ejecuta:

    mkdir face-detector-example
    cd face-detector-example
  2. (Opcional) Inicializa un repositorio Git para control de versiones:

    git init
  3. Abre la carpeta en tu editor de código.

🛠️ 2. Levantar servidor local(Opción de Desarrollo)

Para poder ver los cambios en tiempo real sin refrescar manualmente el navegador, utilizaremos live-server.

  • Instalación global (requiere permisos de administrador):

    npm install -g live-server
  • O bien ejecutarlo con npx sin instalación global:

    npx live-server --port=8000

⚙️ 3. Crear el Archivo index.html

En la raíz del proyecto, crea un archivo llamado index.html y agrega el siguiente contenido:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Face Detector Usage</title>
  <!-- Importa el componente desde unpkg -->
  <script type="module" src="https://unpkg.com/@jaak.ai/face-detector"></script>
</head>
<body>
  <div class="content">
    <div class="card">
      <div class="card-title">
        <h1>Face Detector</h1>
      </div>

      <!-- Overlay de carga -->
      <div id="loading" class="loading">Cargando...</div>

      <!-- Contenedor del componente -->
      <div class="frame">
        <div class="component-container">
          <face-detector id="faceDetector"></face-detector>
        </div>
      </div>
    </div>
  </div>

  <!-- Estilos inline para simplicidad -->
  <style>
    .content {
      height: 90vh;
      display: flex;
      align-items: center;
      justify-content: center;
      padding: 10px;
      margin-top: 1rem;
    }
    .card {
      border-radius: 10px;
      border: solid 1px #e5e5e5;
      box-shadow: 0 10px 40px 0 rgba(32, 41, 69, 0.1);
      height: 100%;
      max-height: 560px;
      width: 80%;
    }
    .card-title {
      text-align: center;
      margin-bottom: 20px;
    }
    .frame {
      position: relative;
      width: 100%;
      height: calc(560px - 80px); /* Altura total menos título */
      overflow: hidden;
    }
    .component-container {
      position: absolute;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      flex-direction: column;
    }
    .loading {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, 0.5);
      color: white;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 1.2rem;
      z-index: 10;
    }
  </style>

  <!-- Lógica de configuración y eventos -->
  <script type="module">
    // ✨ Seleccionamos el componente en el DOM
    const faceDetector = document.querySelector('face-detector');
    const loading = document.getElementById('loading');

    // Ocultamos el overlay de carga inicialmente
    loading.style.display = 'none';

    // 📑 Configuración del componente
    const config = {
      mode: 'video-camera',           // Modo de captura: cámara o archivo
      timerStyles: {                  // Opciones de estilo del temporizador
        width: 80,
        height: 80,
        fontSize: 40,
        posY: 70,
      },
      width: '100%',                  // Ancho del componente
      height: '100%',                 // Alto del componente
      offlineModel: false,            // Si usa o no modelo offline
      validateCamera: true,           // Validar acceso a cámara
      enableInstructions: true,       // Mostrar instrucciones en pantalla
      delayInstructions: 1000,        // Tiempo antes de mostrar instrucciones (ms)
      delayReplayInstructions: 3000,  // Retraso para repetir instrucciones (ms)
      autoRecorder: true,             // Inicio automático de grabación
    };
    faceDetector.config = config;

    // 🔔 Manejo de eventos de estado
    faceDetector.addEventListener('status', (event) => {
      console.log('Status event:', event.detail);
      if (event.detail === 'loading') {
        loading.style.display = 'flex';
      } else {
        loading.style.display = 'none';
      }
    });

    // ⚠️ Manejo de errores del componente
    faceDetector.addEventListener('componentError', (event) => {
      console.error('Error event:', event.detail);
      // Aquí puedes mostrar una alerta o mensaje al usuario
    });

    // 📤 Recepción de resultados de captura (base64)
    faceDetector.addEventListener('fileResult', (event) => {
      console.log('Video capturado con éxito:', event.detail);
      sendVideoToVerify(event.detail.base64);
    });

    // Función de ejemplo para enviar video al servidor
    function sendVideoToVerify(videoBase64) {
      console.log('Enviando video para verificación:', videoBase64);
      stop();
      // Simulación de llamada a API...
      setTimeout(() => {
        console.log('Reiniciando componente tras verificación');
        restart();
      }, 3000);
    }

    // Métodos auxiliares del componente
    function stop() {
      faceDetector.stopComponent();     // Detiene la captura/temporizador
    }
    function restart() {
      faceDetector.restartComponent();  // Reinicia el flujo interno
      faceDetector.resetFaceDetector(); // Limpia datos de la sesión previa
    }
  </script>
</body>
</html>

📖 4. Explicación de la Configuración

  • mode: Determina si la captura es desde la cámara ("video-camera") o desde un archivo local.
  • timerStyles: Objeto para personalizar la apariencia del temporizador de cuenta regresiva.
  • width / height: Tamaño del área de video dentro del componente.
  • offlineModel: Si true, carga un modelo que no requiera conexión a Internet.
  • validateCamera: Verifica permisos de cámara antes de iniciar.
  • enableInstructions: Muestra guías visuales al usuario durante el proceso.
  • delayInstructions y delayReplayInstructions: Retrasos en milisegundos para mostrar o repetir instrucciones.
  • autoRecorder: Si true, inicia automáticamente la grabación cuando el modelo esté listo.

⚙️ 5. Eventos Principales

  • status: Indica el estado interno del componente. Valores frecuentes:

    • "loading": Cargando modelo o recursos.
    • "ready": Listo para capturar.
    • "capturing": Grabando video.
  • componentError: Dispara cuando ocurre un error interno (p.ej., sin permisos de cámara).

    • event.detail contiene el mensaje o código de error.
  • fileResult: Se emite al finalizar la captura de video.

    • event.detail.base64 contiene el vídeo en formato Base64.

🛠️ 6. Métodos Útiles del Componente

MétodoDescripción
stopComponent()Detiene la grabación o temporizador activo.
restartComponent()Reinicia el flujo de captura (temporizador, cámara).
resetFaceDetector()Limpia datos y estados previos del detector facial.

✅ 7. Ejecutar la Aplicación

  1. En la terminal, dentro de la carpeta del proyecto, lanza el servidor:
npx live-server --port=8000

  1. Abre tu navegador en http://localhost:8000.
  2. Verifica en la consola de desarrollador los logs de eventos.

🎉 8. Felicidades, has terminado!

Con esto tendrás un proyecto idéntico al ejemplo face-detector-js-example, totalmente funcional.