# Tilín Meme Studio — intercambio facial en fotografías

El editor nuevo está en **`foto-ia.html`**. Ejecuta un pipeline neuronal en el navegador: detección SCRFD, reconocimiento ArcFace, intercambio InSwapper y mezcla del resultado generado sobre la foto. No utiliza un servidor de procesamiento ni una API de pago.

Se verificó el pipeline real de una y dos caras en Chromium de escritorio con WASM, incluidas exportaciones PNG/JPG y similitud de identidad. **No equivale a una certificación en Motorola Edge 40 Pro.** Consultá [TEST_RESULTS.md](TEST_RESULTS.md) y los [ejemplos antes/después](docs/VERIFICACION_FOTOS.md).

## Abrirlo desde Chrome en Android

Una rama de GitHub contiene código: no es una dirección web de la aplicación. La aplicación necesita un origen **HTTPS**; abrir los HTML como `file://` no permite cargar correctamente los módulos y el worker.

Una opción de alojamiento gratuito, configurable desde el teléfono, es Cloudflare Pages:

1. Conectá este repositorio a un proyecto de Pages y seleccioná la rama `codex/photo-face-swap`.
2. Usá un sitio estático, sin framework ni comando de compilación, con la raíz del repositorio como directorio publicado.
3. Abrí la URL HTTPS asignada en una pestaña normal de Chrome y entrá en **Fotos con IA**, o agregá `/foto-ia.html` a esa URL.
4. Desde el menú de Chrome podés agregarla a la pantalla de inicio si el navegador ofrece instalarla.

No se publicó un sitio automáticamente. El alojamiento sirve archivos; **las fotos y la inferencia permanecen en el teléfono**. GitHub Pages también sirve para publicar archivos estáticos, pero su disponibilidad gratuita depende de la visibilidad del repositorio y del plan de la cuenta; este repositorio es privado.

Para desarrollo en una computadora, `npm run serve` inicia un servidor en localhost. Ese servidor no ejecuta IA y no es necesario para usar una publicación HTTPS desde el teléfono.

## Preparar el motor en el teléfono

Los modelos no se distribuyen dentro de este repositorio. Antes de descargarlos, leé **`MODEL_LICENSES.md`**: los pesos oficiales de InsightFace tienen condiciones de **investigación no comercial**, diferentes de MIT. El uso recreativo privado no equivale automáticamente a una autorización de investigación. Usá únicamente pesos para los que dispongas de los derechos necesarios.

1. Descargá desde la publicación oficial:
   - [inswapper_128.onnx](https://github.com/deepinsight/insightface/releases/download/v0.7/inswapper_128.onnx), 554.253.681 bytes.
   - [buffalo_l.zip](https://github.com/deepinsight/insightface/releases/download/v0.7/buffalo_l.zip), 288.621.354 bytes.
2. En el editor, importá ambos archivos desde Descargas. También se admiten los archivos individuales `det_10g.onnx` y `w600k_r50.onnx` junto a `inswapper_128.onnx`.
3. La aplicación extrae solamente el detector y el reconocedor necesarios del ZIP. No carga modelos de edad, género ni landmarks adicionales.
4. Los pesos quedan en almacenamiento local del navegador. Se pueden borrar desde el editor. Chrome puede eliminar almacenamiento bajo presión; no se promete persistencia permanente.

La descarga inicial completa ronda **843 MB**. La RAM necesaria es mayor que el tamaño de los archivos. La aplicación carga los modelos por etapas y libera las sesiones entre detección, reconocimiento e intercambio.

## Procesar una fotografía

1. Cargá la foto de destino y una foto fuente con una cara visible.
2. Detectá las caras y seleccioná el rostro fuente y el destino en los controles visuales.
3. Ejecutá el intercambio y compará antes/después.
4. Descargá PNG o JPG. PNG evita una segunda compresión con pérdida; no reconstruye detalles ausentes.

El segundo rostro se controla mediante una fuente y una asignación independientes cuando se activa esa opción. Los destinos se detectan sobre la foto original; no se vuelven a detectar sobre el primer resultado. Su estado de verificación se informa separadamente en `TEST_RESULTS.md`.

La cancelación termina el worker. Cargar otra foto o cambiar una asignación invalida el resultado anterior. No se agregan las capas manuales del editor heredado al resultado neuronal.

## Calidad y límites

- InSwapper genera cada parche facial a **128 × 128 píxeles nativos**. Conservar las dimensiones de una foto grande no garantiza el mismo detalle facial que el original.
- WebGPU se intenta cuando está disponible. Si la creación o ejecución falla en modo automático, se reintenta con WASM. Disponer de WebGPU no demuestra que el grafo completo funcione en un teléfono determinado.
- WASM usa un hilo para funcionar sin exigir aislamiento entre orígenes. Puede ser lento; no se garantizan tiempos concretos sin medición.
- El editor informa errores de tamaño y memoria en vez de reducir silenciosamente una foto.
- La primera carga del runtime requiere internet: ONNX Runtime Web 1.23.2 y fflate 0.8.2 se obtienen de jsDelivr. El service worker conserva archivos utilizados para próximas aperturas; los modelos se almacenan aparte. La primera ejecución sin conexión no está soportada.
- No hay restauración facial adicional ni promesa de salida facial HD.
- No hay intercambio por IA en videos ni GIF en esta etapa.

## Pruebas

`npm install` instala las herramientas de desarrollo. Las dependencias de pruebas no son necesarias en el teléfono.

- `npm test`: pruebas numéricas del preprocesamiento, alineación, embeddings, protobuf y mezcla.
- `npm run test:browser`: controles y errores del editor en Chromium.
- `npm run test:inference`: inferencia con los modelos reales y fotografías de prueba, cuando están disponibles los assets de prueba.

La configuración de GitHub Actions acompaña el código. Descargar pesos o instalar Chromium no demuestra por sí solo una inferencia exitosa. Las imágenes de pruebas y pesos se descargan a almacenamiento temporal; no se agregan al historial Git.

## Editor anterior

`index.html` conserva la importación de fotos/GIF/videos, dos capas **manuales**, textos, keyframes y exportaciones existentes. Sus límites siguen siendo los de la beta: imagen hasta 1920 px, GIF hasta 4 s/480 px/8 FPS y WebM **sin audio**. Esas funciones no se presentan como IA ni como el hito de video solicitado.

## Privacidad y uso responsable

No hay subida de fotos, telemetría, cuentas de usuario, créditos ni marcas de agua. Las solicitudes de red sirven archivos de aplicación, librerías y descargas explícitas de modelos. Usá imágenes con consentimiento y señalá los montajes cuando puedan confundirse con contenido auténtico.

El código original mantiene MIT. Las librerías, los pesos y las imágenes de pruebas tienen condiciones independientes: ver `MODEL_LICENSES.md`.
