Vue normale

Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.
À partir d’avant-hierFlux principal

Sora ferme - Comment sauvegarder vos vidéos IA avant la coupure

Par : Korben
25 mars 2026 à 14:22

Sora, c’est fini les amis !

Hé oui, cest chacals d'OpenAI ferment leur plateforme de vidéos IA, et franchement, ça me rend un peu triste. À vrai dire, même si c’était que de la vidéo générée à partir de prompts, moi je me marrais bien. C'était fun de regarder le produit de ses prompts mais aussi de regarder les conneries des autres. Les versions québécoises, aïe aïe aïe, c’était quelque chose quand même !

Mais bon, le plus urgent maintenant, c’est de sauvegarder vos vidéos avant que tout disparaisse. OpenAI n’a pas encore communiqué de date précise pour la coupure, juste un vague « on vous dira bientôt ». Du coup, autant ne pas traîner, parce que quand ce genre de service cloud ferme, en général c’est pas 6 mois de préavis qu’on vous file...

Depuis la fuite du modèle jusqu’à aujourd’hui, Sora aura fait parler de lui. Côté raisons, c’est Fidji Simo (la patronne de la division Applications) qui a lâché le morceau : ils éparpillent leurs efforts sur trop d’apps, d’API et de stacks serveur différents, et ça les ralentit. En gros, entre préparer une entrée en bourse pour fin 2026 et cramer du GPU H100 sur des vidéos de chats en IA, le choix est vite fait. L’équipe de recherche Sora, elle, continuera à bosser sur la simulation de mondes 3D... mais pour la robotique. Et le fameux deal à 1 milliard de dollars avec Disney pour des films et séries ? Pouf, magie magie, c'est envolé !!

Faut dire que les chiffres n’étaient pas glorieux non plus. Après un lancement en fanfare fin 2024 (et une app iOS lancée à l’automne 2025 qui avait cartonné dans les charts), les téléchargements sur l’App Store avaient plongé de 32% entre novembre et décembre 2025. La hype, ça dure qu’un temps.

Mais maintenant les gens, on passe aux choses sérieuses !

Sora Backup - le script qui sauve vos vidéos

Je n'avais absolument pas de temps aujourd'hui, mais j'ai quand même taffé pour vous développer un petit script JavaScript qui récupère TOUTES vos vidéos Sora d’un coup, avec les prompts et les métadonnées, et qui vous génère un joli ZIP prêt à archiver. Pas besoin d’installer quoi que ce soit, pas d’extension louche. Vous avez juste besoin d'être connecté à votre profil Sora et d'un navigateur.

Comment ça marche

Allez sur sora.com , connectez-vous à votre compte, puis ouvrez la console JavaScript de votre navigateur (F12 sur Chrome ou Firefox, onglet Console). Ensuite, glissez-déplacez ou collez le script ci-dessous dedans et appuyez sur Entrée.

Le script va automatiquement récupérer votre token d’authentification (pas besoin de le chercher vous-même), puis il va paginer sur votre profil Sora pour récupérer tous vos posts publiés. Pour chaque post, il extrait les vidéos attachées (MP4), les télécharge, et empaquette le tout dans un fichier ZIP directement dans votre navigateur.

Y’a même un fichier manifest.json dans le ZIP qui contient tous vos prompts, les dimensions, les durées, les permalinks, les dates de création... bref, tout ce qu’il faut pour retrouver vos petits. Le ZIP est généré en format STORE (pas compressé, parce que compresser du MP4 ça sert à rien), avec un calcul CRC32 maison et sans aucune librairie externe.

Le script complet

Voici le code à coller dans la console :

// ==========================================================
// SORA BACKUP - Sauvegarde complète vidéos + images + prompts par Korben
// ==========================================================
// Usage : Ouvrir https://sora.com, F12 > Console, coller ce script
// Les fichiers sont téléchargés via le navigateur (dossier Downloads)
// Un fichier manifest.json récapitule tout (prompts, metadata, URLs)
// ==========================================================

(async () => {
 // --- Mini ZIP builder (STORE, pas de lib externe) ---
 const crc32table = new Uint32Array(256);
 for (let i = 0; i < 256; i++) {
 let c = i;
 for (let j = 0; j < 8; j++) c = (c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1);
 crc32table[i] = c;
 }
 function crc32(buf) {
 let c = 0xFFFFFFFF;
 for (let i = 0; i < buf.length; i++) c = crc32table[(c ^ buf[i]) & 0xFF] ^ (c >>> 8);
 return (c ^ 0xFFFFFFFF) >>> 0;
 }
 const zipFiles = []; // {name, data (Uint8Array), crc, size}

 const PAGE_SIZE = 50;
 const DELAY_MS = 1500;
 const manifest = [];
 let totalDownloaded = 0;
 let totalErrors = 0;

 // --- Auth : récupérer le Bearer token ---
 // OPTION 1 : Coller ton token ici (Network tab > Authorization header)
 // OPTION 2 : Laisser vide, le script tentera de le récupérer auto
 let AUTH_TOKEN = '';

 async function getAuthToken() {
 if (AUTH_TOKEN) return AUTH_TOKEN;

 // Auto-detect : endpoint session ChatGPT
 for (const path of ['/api/auth/session', '/backend-api/auth/session']) {
 try {
 const r = await fetch(path, { credentials: 'include' });
 if (r.ok) {
 const json = await r.json();
 if (json.accessToken) {
 AUTH_TOKEN = json.accessToken;
 console.log(' 🔑 Token récupéré automatiquement');
 return AUTH_TOKEN;
 }
 }
 } catch(e) {}
 }

 // Fallback : demander à l'utilisateur
 const input = prompt(
 'Token non trouvé automatiquement.\n\n' +
 'Pour le récupérer :\n' +
 '1. F12 > onglet Réseau\n' +
 '2. Rafraîchis la page\n' +
 '3. Clique sur une requête /backend/...\n' +
 '4. Copie le header Authorization\n\n' +
 'Colle le token ici (Bearer eyJ...):'
 );
 if (input) {
 AUTH_TOKEN = input.replace(/^Bearer\s+/i, '').trim();
 return AUTH_TOKEN;
 }

 console.error(' ❌ Pas de token. Annulation.');
 return null;
 }

 // --- Fetch API avec auth ---
 async function apiFetch(url) {
 const token = await getAuthToken();
 const headers = {};
 if (token) headers['Authorization'] = 'Bearer ' + token;

 // oai-device-id requis par certains endpoints
 const deviceId = localStorage.getItem('oai-did') || '';
 if (deviceId) headers['oai-device-id'] = deviceId;

 const resp = await fetch(url, {
 method: 'GET',
 credentials: 'include',
 headers
 });

 if (!resp.ok) throw new Error(`HTTP ${resp.status} for ${url}`);
 return resp.json();
 }

 // --- Pagination générique ---
 async function fetchAllPages(baseUrl, dataField = 'data', cursorParam = 'after', cursorField = 'last_id') {
 let allItems = [];
 let cursor = '';
 let page = 0;

 while (true) {
 let url = baseUrl;
 if (cursor) url += `&${cursorParam}=${cursor}`;

 console.log(` 📄 Page ${++page} (${allItems.length} items so far)...`);
 const json = await apiFetch(url);

 const items = json[dataField];
 if (!Array.isArray(items) || items.length === 0) break;

 allItems = allItems.concat(items);
 cursor = json[cursorField] || '';

 if (!json.has_more && !cursor) break;
 await sleep(DELAY_MS);
 }

 return allItems;
 }

 // Variante pour les endpoints project_y (cursor-based)
 async function fetchAllPagesCursor(baseUrl) {
 let allItems = [];
 let cursor = '';
 let page = 0;

 while (true) {
 let url = baseUrl;
 if (cursor) url += `&cursor=${cursor}`;

 console.log(` 📄 Page ${++page} (${allItems.length} items so far)...`);
 const json = await apiFetch(url);

 const items = json.items;
 if (!Array.isArray(items) || items.length === 0) break;

 allItems = allItems.concat(items);
 cursor = json.cursor || '';

 if (!cursor) break;
 await sleep(DELAY_MS);
 }

 return allItems;
 }

 function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }

 // --- Extraire URL du média depuis une generation ---
 function getMediaUrl(gen) {
 return gen?.encodings?.source?.path
 || gen?.downloadable_url
 || gen?.url
 || '';
 }

 // --- Extraire le prompt (peut être dans actions, prompt, ou input_text) ---
 function getPrompt(item, gen) {
 // Prompt direct
 if (gen?.prompt) return gen.prompt;
 if (item?.prompt) return item.prompt;
 if (item?.input_text) return item.input_text;
 // Storyboard : les actions sont les descriptions des scènes
 if (item?.actions && typeof item.actions === 'object') {
 return Object.entries(item.actions)
 .sort((a,b) => Number(a[0]) - Number(b[0]))
 .map(([frame, desc]) => `[frame ${frame}] ${desc}`)
 .join(' | ');
 }
 if (gen?.actions && typeof gen.actions === 'object') {
 return Object.entries(gen.actions)
 .sort((a,b) => Number(a[0]) - Number(b[0]))
 .map(([frame, desc]) => `[frame ${frame}] ${desc}`)
 .join(' | ');
 }
 return '';
 }

 // --- Dérouler les items du profil Sora en items plats ---
 function flattenProfileItems(items) {
 const flat = [];
 for (const item of items) {
 const post = item.post || item;
 const attachments = post.attachments || [];
 if (attachments.length === 0) continue;

 for (const att of attachments) {
 const url = att.encodings?.source?.path || att.downloadable_url || att.url || '';
 if (!url) continue;

 flat.push({
 id: post.id || att.generation_id || '',
 generation_id: att.generation_id || '',
 task_id: att.task_id || '',
 title: att.title || post.discovery_phrase || '',
 prompt: post.text || '',
 emoji: post.emoji || '',
 type: att.generation_type || att.kind || '',
 width: att.width || 0,
 height: att.height || 0,
 duration_s: att.duration_s || 0,
 is_public: !!post.posted_to_public,
 created_at: post.posted_at ? new Date(post.posted_at * 1000).toISOString() : '',
 url: url,
 permalink: post.permalink || '',
 username: item.profile?.username || '',
 });
 }
 }
 return flat;
 }

 // --- Sanitize filename ---
 function sanitize(name) {
 return name.replace(/[<>:"\/\\|?*\x00-\x1f]/g, '_').substring(0, 100);
 }

 // --- Ajouter un fichier au ZIP ---
 async function addToZip(url, filename) {
 try {
 const resp = await fetch(url);
 if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
 const buf = await resp.arrayBuffer();
 const data = new Uint8Array(buf);
 zipFiles.push({ name: filename, data, crc: crc32(data), size: data.length });
 totalDownloaded++;
 return true;
 } catch(e) {
 console.warn(` ⚠️ Erreur ${filename}:`, e.message);
 totalErrors++;
 return false;
 }
 }

 // --- Déduire l'extension ---
 function getExt(url, type) {
 if (!url) return type === 'video' ? '.mp4' : '.png';
 const m = url.match(/\.(mp4|webm|mov|png|jpg|jpeg|webp|gif)/i);
 return m ? '.' + m[1].toLowerCase() : (type === 'video' ? '.mp4' : '.png');
 }

 // ==========================================================
 // MAIN
 // ==========================================================
 const origin = window.location.origin;
 console.log('🎬 SORA BACKUP - Démarrage');
 console.log('='.repeat(50));

 // 1. Mes posts Sora (profil)
 console.log('\n📦 1/2 - Récupération de mes posts Sora...');
 let myPosts = [];
 try {
 myPosts = await fetchAllPagesCursor(
 `${origin}/backend/project_y/profile_feed/me?limit=${PAGE_SIZE}&cut=nf2`
 );
 console.log(`  ${myPosts.length} posts de profil`);
 // Debug premier item
 if (myPosts.length > 0) {
 const first = myPosts[0];
 console.log(' 🔍 Premier item - clés:', Object.keys(first).join(', '));
 console.log(' 🔍 URL:', first.url?.substring(0, 80) || 'none');
 console.log(' 🔍 DL:', first.downloadable_url?.substring(0, 80) || 'none');
 console.log(' 🔍 ENC:', first.encodings?.source?.path?.substring(0, 80) || 'none');
 console.log(' 🔍 GENS:', first.generations?.length || 'none');
 console.log(' 🔍 TITLE:', first.title || 'none');
 }
 } catch(e) {
 console.warn(' ⚠️ profil failed:', e.message);
 }

 // 2. Mes likes sur Sora
 console.log('\n📦 2/2 - Récupération de mes likes Sora...');
 let myLikes = [];
 try {
 myLikes = await fetchAllPagesCursor(
 `${origin}/backend/project_y/profile_feed/me?limit=${PAGE_SIZE}&cut=appearances`
 );
 if (myCameos.length) console.log(`  ${myCameos.length} cameos trouvés`);
 } catch(e) {}

 // --- Dérouler les generations et dédupliquer ---
 console.log('\n🔄 Extraction des vidéos...');
 const rawAll = [...myPosts, ...myLikes];
 const flatItems = flattenProfileItems(rawAll);

 const seen = new Set();
 const allItems = [];
 for (const item of flatItems) {
 if (item.id && seen.has(item.id)) continue;
 // Filtrer : vidéos uniquement
 const isVideo = item.type === 'video_gen' || item.url.includes('/videos/') || item.url.includes('.mp4');
 if (!isVideo) continue;
 if (item.id) seen.add(item.id);
 allItems.push(item);
 }

 console.log(`📊 Total unique: ${allItems.length} vidéos à télécharger`);
 console.log('='.repeat(50));

 // --- Construire le manifest et télécharger ---
 console.log('\n⬇️ Téléchargement en cours...');
 console.log('(Les fichiers arrivent dans ton dossier Downloads)');

 for (let i = 0; i < allItems.length; i++) {
 const meta = allItems[i];
 const url = meta.url;

 if (!url) {
 console.log(` ⏭️ [${i+1}/${allItems.length}] ${meta.id} - pas d'URL, skip`);
 meta.downloaded = false;
 manifest.push(meta);
 continue;
 }

 const type = (meta.task_type === 'image_gen' || url.match(/\.(png|jpg|jpeg|webp|gif)/i)) ? 'image' : 'video';
 const ext = getExt(url, type);
 const nameBase = meta.title
 ? sanitize(meta.title)
 : (meta.prompt ? sanitize(meta.prompt.substring(0, 60)) : meta.id);
 const filename = `sora_${String(i+1).padStart(4,'0')}_${nameBase}${ext}`;

 console.log(` ⬇️ [${i+1}/${allItems.length}] ${filename}`);
 meta.filename = filename;
 meta.downloaded = await addToZip(url, filename);
 manifest.push(meta);

 // Pause entre downloads pour pas surcharger
 if (i < allItems.length - 1) await sleep(800);
 }

 // --- Ajouter le manifest au ZIP ---
 console.log('\n📝 Ajout du manifest au ZIP...');
 const manifestData = new TextEncoder().encode(JSON.stringify(manifest, null, 2));
 zipFiles.push({ name: 'manifest.json', data: manifestData, crc: crc32(manifestData), size: manifestData.length });

 // --- Générer le ZIP (format STORE, pas de compression) ---
 console.log('\n📦 Génération du ZIP...');
 const enc = new TextEncoder();
 const blobParts = [];
 const centralParts = [];
 let offset = 0;

 for (const f of zipFiles) {
 const nameBytes = enc.encode(f.name);
 // Local file header (30 bytes + name)
 const lh = new ArrayBuffer(30);
 const lv = new DataView(lh);
 lv.setUint32(0, 0x04034b50, true);
 lv.setUint16(4, 20, true);
 lv.setUint16(8, 0, true); // STORE
 lv.setUint32(14, f.crc, true);
 lv.setUint32(18, f.size, true);
 lv.setUint32(22, f.size, true);
 lv.setUint16(26, nameBytes.length, true);
 blobParts.push(new Uint8Array(lh), nameBytes, f.data);

 // Central directory entry (46 bytes + name)
 const ch = new ArrayBuffer(46);
 const cv = new DataView(ch);
 cv.setUint32(0, 0x02014b50, true);
 cv.setUint16(4, 20, true);
 cv.setUint16(6, 20, true);
 cv.setUint16(10, 0, true); // STORE
 cv.setUint32(16, f.crc, true);
 cv.setUint32(20, f.size, true);
 cv.setUint32(24, f.size, true);
 cv.setUint16(28, nameBytes.length, true);
 cv.setUint32(42, offset, true);
 centralParts.push(new Uint8Array(ch), nameBytes);

 offset += 30 + nameBytes.length + f.size;
 }

 const centralSize = centralParts.reduce((s, p) => s + p.length, 0);
 const eocd = new ArrayBuffer(22);
 const ev = new DataView(eocd);
 ev.setUint32(0, 0x06054b50, true);
 ev.setUint16(8, zipFiles.length, true);
 ev.setUint16(10, zipFiles.length, true);
 ev.setUint32(12, centralSize, true);
 ev.setUint32(16, offset, true);

 const zipBlob = new Blob([...blobParts, ...centralParts, new Uint8Array(eocd)], { type: 'application/zip' });

 const zipName = `sora_backup_${new Date().toISOString().split('T')[0]}.zip`;
 const a = document.createElement('a');
 a.href = URL.createObjectURL(zipBlob);
 a.download = zipName;
 document.body.appendChild(a);
 a.click();
 document.body.removeChild(a);
 URL.revokeObjectURL(a.href);

 // --- Résumé ---
 const sizeMB = (zipBlob.size / 1024 / 1024).toFixed(1);
 console.log('\n' + '='.repeat(50));
 console.log('🎬 SORA BACKUP TERMINÉ');
 console.log(`  Vidéos dans le ZIP : ${totalDownloaded}`);
 console.log(`  Erreurs : ${totalErrors}`);
 console.log(` 📦 Fichier : ${zipName} (${sizeMB} MB)`);
 console.log(` 📝 manifest.json inclus dans le ZIP`);
 console.log('='.repeat(50));
})();

Quelques précisions

Si le token n’est pas récupéré automatiquement (ça peut arriver selon votre config), le script vous demandera de le coller manuellement. Pour le trouver, c’est simple : F12 > onglet Réseau > rafraîchissez la page > cliquez sur n’importe quelle requête vers /backend/... > copiez le header Authorization.

D’ailleurs, si la vidéo IA vous branche toujours, Higgsfield propose des séries entièrement générées par IA. C’est pas la même approche que Sora, mais c’est un signe que la vidéo IA ne meurt pas avec la fermeture d’un seul service.

Bon, bref, c’est la fin d’un truc sympa. Moi je préférais largement scroller sur Sora sur d'aller sur TikTok ou Instagram parce qu'au moins c'était drôle !

Merci à mes Patreons qui me permettent de prendre le temps de développer ce genre de petits outils pour vous. Sans eux, j’aurais jamais pu me poser une après-midi pour coder ça.

Source

Higgsfield - Le Netflix de l'IA où 4 personnes remplacent tout un studio

Par : Korben
21 mars 2026 à 08:00

100 millions de dollars, c'est ce que coûterait normalement la production d'un pilote de qualité ciné, d'après Higgsfield, une boite basée à San Francisco et fondée par Alex Mashrabov.

Et eux, ils l'ont fait en 4 jours avec une équipe de 4 personnes et quelques GPU. Bienvenue dans l'ère du streaming généré par IA !

La plateforme vient en effat de lancer ses Original Series , une sorte de Netflix où tout le catalogue est généré par IA. On y trouve 13 séries dispo (sci-fi, thriller, anime, comédie...) avec des titres comme Arena Zero, Spit & Glow ou encore Tails of Steel, plus 6 autres en préparation. Et tout ça, des dialogues aux effets visuels en passant par le doublage, est généré par intelligence artificielle (même si évidemment, y'a des humains derrière pour le scénario, le prompting et le montage).

Mais le truc fou je trouve, c'est le modèle communautaire. En fait, Higgsfield a organisé un concours qui a attiré plus de 8 700 créateurs venus de plus de 100 pays, comme ça plutôt que de produire en interne, ils laissent la communauté proposer des teasers. Les spectateurs votent alors pour ceux qu'ils préfèrent, et les gagnants se retrouvent à produire des séries complètes avec l'équipe.

Cela veut dire que n'importe qui avec une bonne idée et un bon sens du prompt peut devenir "réalisateur"... sans jamais toucher une caméra ni un plateau de tournage.

Côté boîte à outils, la plateforme ne fait pas les choses à moitié. Y'a le Cinema Studio 2.5 pour la génération vidéo , et la plateforme intègre des modèles tiers comme Kling 3.0 (vidéos de 15 secondes avec personnages cohérents), Sora 2 , Veo 3.1, et même du clonage vocal via ElevenLabs. Pour l'image, y'a Nano Banana Pro (oui, c'est le vrai nom) qui sort du 4K, et plus de 100 apps prêtes à l'emploi pour le face swap, les VFX ou la création de contenu commercial.

Par contre, tout ça repose sur des modèles tiers... donc le jour où OpenAI ou Google changent les conditions liées à leurs API, ça peut les secouer un peu.

Maintenant pour ceux qui se demandent si c'est gratuit, oui, y'a un tier free avec des crédits quotidiens via l'app mobile Diffuse. Sauf que les crédits partent trèèès vite, car générer une vidéo de 15 secondes en 4K, ça consomme pas mal de compute. Pour les gros volumes, faudra donc passer à la caisse.

Alors c'est pas encore 100% nickel mais j'ai été vraiment bluffé par cet épisode par exemple :

C'est vrai que le lipsync n'est pas toujours perfecto, que les mains font parfois n'importe quoi, et que la continuité entre les plans n'est pas toujours raccord.

Mais le concept est dingue quand même car là où il fallait un studio avec des centaines de techniciens, des caméras RED à 50 000 balles et des mois de post-production, y'a maintenant un pipeline automatisé qui prend un scénario et crache un épisode complet. Et le fait que les créateurs viennent du monde entier, sans formation ciné, ça change tout en terme de scénario et de diversité de contenus !

Donc, si vous voulez voir à quoi ressemble le cinéma actuel quand c'est l'IA qui tient la caméra, allez jeter un œil. C'est encore un peu brouillon mais ça progresse très vite (trop ?), je trouve...

Clair Obscur perd son prix à cause de la vilaine méchante pas belle IA générative

Par : Korben
21 décembre 2025 à 21:46

Clair Obscur: Expedition 33, c'est le jeu français qui a explosé tous les compteurs aux Game Awards 2025 avec 9 prix sur 12 nominations dont le très convoité Game of the Year. Un carton monstre pour Sandfall Interactive, le studio indé français.

Toutefois un petit drama vient d'avoir lieu... Une autre cérémonie, les Indie Game Awards viennent de lui retirer ses deux prix (GOTY et Best Debut Game) parce que... roulement de tambours... le studio a utilisé de l'IA générative pendant le développement. Et histoire d'en rajouter une couche, lors de leur candidature aux IGA, ils auraient déclaré ne pas avoir utilisé de gen-AI.

Oups...

Pour être plus précis, des artistes du studio ont utilisé quelques images générées par IA en tant que placeholders visuels, le temps de créer les vraies textures à la main. C'est une pratique hyper courante dans le dev de jeux vidéo, mais le problème c'est que quelques posters avec des textures IA sont passés entre les mailles du filet et se sont retrouvés dans la version finale lors du lancement. Rien de dramatique, juste des affiches en arrière-plan dans la zone de départ du jeu que le studio a retirés dans un patch quelques jours après la sortie.

Mais voilà, les Indie Game Awards ont une politique anti-IA extrêmement stricte et leur règlement interdit l'utilisation de l'IA générative y compris dans le processus de développement. Du coup, même si les éléments IA ont été retirés rapidement, ça suffit à disqualifier le titre.

L'usage d'IA avait été mentionné par le producteur François Meurisse dans une interview à El País dès juin 2025, mais c'est seulement après la cérémonie du 18 décembre que les IGA ont réagi. Et 2 jours plus tard, ils annonçaient la rétractation des prix... C'est donc Blue Prince qui récupère le GOTY et Sorry We're Closed (gratuit pour 24h sur l'Epic Games Store) qui empoche le Best Debut Game.

Si vous êtes fan de Clair Obscur: Expedition 33, rassurez-vous, le jeu garde ses 9 prix aux Game Awards, dont le Game of the Year principal. Après si vous voulez mon avis, on nage quand même en plein délire car si on pousse cette logique, qu'est-ce qu'on fait des devs qui utilisent ChatGPT pour débugger du code ?

Pour moi, jeter Clair Obscur: Expedition 33 parce qu'ils ont utilisé un peu d'IA dans un cadre de développement uniquement, alors que ça n'a floué personne et que c'était purement technique pour faire un peu de remplissage en attendant les assets finaux, c'est comme disqualifier un film à Cannes parce que le scénariste a utilisé un correcteur orthographique ou refuser un Grammy Award parce qu'une chanson contient un sample...

Bref, IA ou pas, Clair Obscur reste un excellent jeu et j'ai hâte qu'on revienne au monde d'avant quand on jugeait les œuvres sur leurs qualités objectives.

Source

Docker offre ses images blindées à tout le monde - Enfin un peu de sécu sans vendre un rein

Par : Korben
18 décembre 2025 à 07:09

Si vous utilisez des conteneurs Docker au quotidien, vous allez sauter de joie car Docker vient d'annoncer que ses Docker Hardened Images (DHI), ces fameuses images ultra-sécurisées qui étaient réservées aux entreprises prêtes à cracher le pognon, sont maintenant gratuites pour tout le monde. Et c'est pas encore un truc limité avec des restrictions à la noix, non non... C'est du vrai open source sous licence Apache 2.0.

Ils proposent donc plus de 1 000 images conteneur prêtes à l'emploi, construites sur Debian et Alpine et ces images sont "durcies", c'est-à-dire qu'elles ont été débarrassées de tous les composants inutiles qui traînent habituellement dans les images de base et qui ne servent qu'à augmenter la surface d'attaque. Du coup, ça leur permet d'annoncer une réduction des vulnérabilités de plus de 95% par rapport aux images classiques. C'est pas maaaal, hein ?

Et ce qui est top c'est que chaque image embarque un SBOM complet (le fameux Software Bill of Materials), des données CVE transparentes accessibles publiquement, une preuve cryptographique d'authenticité et une provenance SLSA Level 3. Bref, c'est plutôt sérieux de ce que je capte.

Car faut dire que les attaques sur la supply chain logicielle, c'est devenu le cauchemar numéro un des développeurs. En 2025, ces attaques auraient causé plus de 60 milliards de dollars de dommages selon les estimations, soit le triple d'il y a quatre ans, du coup, avoir des images béton dès le départ, sans devoir se prendre la tête à tout vérifier soi-même, ça fait la diff.

Maintenant, si vous êtes une grosse boîte avec des besoins spécifiques, Docker propose aussi une version Enterprise payante avec des SLA garantis sur la remédiation des CVE, des images compatibles FIPS, des options de personnalisation et même un support étendu de 5 ans après la fin du support officiel. Des entreprises comme Adobe et Qualcomm ont déjà fait le saut mais pour nous, utilisateurs lambdas et autres développeurs qui bossons sur nos projets perso ou des startups incroyables du futur, la version gratuite devrait largement suffire.

Et en cadeau bonux, sachez que l'assistant IA de Docker peut maintenant scanner vos conteneurs existants et vous recommander automatiquement les images durcies équivalentes. Y'a même des Hardened Helm Charts pour Kubernetes et des serveurs MCP durcis (MongoDB, Grafana, GitHub...). Que demande le peuple ?

Voilà, si vous voulez vous y mettre, tout est dispo sur le Docker Hub sans aucune restriction d'usage ni abonnement requis. Foncez !

Source

Votre cerveau compresse les images 40 fois mieux qu'un algo

Par : Korben
7 novembre 2025 à 08:50

Vous avez, j’imagine, probablement des dizaines de milliers de photos sur votre disque dur. Ça représente peut-être quelques centaines de Go, peut-être 1 To si vous êtes à l’aise en espace de stockage. C’est beaucoup ?

Pas tant que ça si on pense un peu à votre cerveau. Lui, il stocke depuis toujours des décennies de souvenirs dans environ 1,5 kg de matière organique qui consomme moins qu’une ampoule LED.

Comment est-ce qu’il fait ?

Hé bien, une équipe du Weizmann Institute of Science vient peut-être de le découvrir et au passage, changer la compression d’images telle qu’on la connaît.

Le projet s’appelle Brain-IT , et leur idée c’est de reconstruire des images à partir des signaux fMRI (imagerie par résonance magnétique fonctionnelle) de votre cerveau. En gros, ils scannent votre activité cérébrale pendant que vous regardez une image, et ils arrivent à reconstruire ce que vous avez vu. Le papier scientifique est dispo sur arXiv si vous parlez leur langue.

Évidemment, ce genre de recherche, c’est pas nouveau mais Brain-IT est plutôt un franc succès car le process permet d’obtenir les mêmes résultats que les méthodes précédentes avec seulement 1 heure de données fMRI, contre 40 heures pour les autres approches.

En gros, ça représente 97,5% de données en moins pour obtenir le même résultat. Trop fort non ?

En fait, si Brain-IT peut faire ça, c’est parce que les scientifiques ont découvert comment votre cerveau compresse les images de manière hyper efficace. Et d’ailleurs, ce truc pourrait bien inspirer de nouveaux algorithmes de compression pour nos ordis.

Brain-IT utilise en fait ce qu’ils appellent un “Brain Interaction Transformer” (BIT). C’est un système qui identifie des “clusters fonctionnels” de voxels cérébraux. Un voxel, c’est l’équivalent d’un pixel mais en 3D, et chaque voxel représente environ 1 million de cellules dans votre cerveau.

Le truc génial, c’est que ces clusters fonctionnels sont partagés entre différentes personnes, comme si nous avions tous la même bibliothèque de “primitives visuelles” câblée dans nos têtes. Ce sont des schémas de base que notre cerveau utilise pour reconstruire n’importe quelle image.

Brain-IT reconstruit donc les images en deux passes. D’abord les structures de bas niveau (les formes, les contours), puis les détails sémantiques de haut niveau (c’est un chat, c’est un arbre, c’est votre tante Huguette). C’est un peu comme le JPEG progressif que l’on voyait s’afficher lentement avec nos modem 56K, mais en infiniment plus smart.

Du coup, si on comprend comment le cerveau compresse les images, on pourrait créer de nouveaux formats vidéo ultra-légers. Imaginez un Netflix ou un Youtube qui streame en “brain-codec” à 1/40e de la bande passante actuelle. Ça changerait pas mal de choses… Et c’est pareil pour l’IA générative car actuellement, on entraîne des modèles avec des millions d’images durant des jours alors que notre cerveau, lui, apprend à reconnaître un visage en quelques expositions.

Et grâce à ses modèles de diffusion, Brain-IT est même capable de reconstruire visuellement ce que voit le cerveau ! Par contre, Brain-IT n’a pour le moment été testé que sur des images “vues” et pas des choses imaginées…

Mais les scientifiques n’écartent pas l’idée que ce soit possible donc ce n’est qu’une question de temps avant qu’on puisse capturer en image ses rêves par exemple.

Voilà, j’ai trouvé ça cool parce que ça montre que notre cerveau est probablement le meilleur système de compression d’images jamais créé et qu’on commence à peine à comprendre comment il fonctionne.

Merci Dame Nature !

Voilà, si vous voulez creuser, le code et les détails techniques sont sur la page du projet Brain-IT , et le paper complet est dispo sur arXiv .

Source

Microsoft releases Pix2Gif AI tool to turn still images into GIFs

Par : Guru@TWCN
18 mars 2024 à 08:13

image to GIFMicrosoft is focusing more on AI tools that can do various things. Copilot is its most ambitious AI tool based on ChatGPT. Now, the Microsoft research team has introduced a new AI tool Pix2Gif that can turn a still image into a GIF automatically. Pix2Gif AI tool turns still images into GIFs Microsoft, like other […]

The post Microsoft releases Pix2Gif AI tool to turn still images into GIFs appeared first on TheWindowsClub News.

❌
❌