PageSourceSearch

https://www.ai-geminiomni.com/

html ai-geminiomni.com collected 2026-10-04 13:25:16 UTC 151,260 bytes, 820 lines download raw bytes

1<!DOCTYPE html><html lang="en" dir="ltr" class="bg-ink-950 text-zinc-100"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"><meta name="theme-color" content="#07070b"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="canonical" href="https://www.ai-geminiomni.com/"><title>Gemini Omni: Avatar, Flash, Free Access &amp; Pricing (2026)</title><meta name="description" content="What is Gemini Omni? Google's AI video model with a personal AI avatar and Omni Flash. Is it free? Get pricing, specs, official demos, use cases, the API roadmap and FAQ — 2026."><meta name="generator" content="Astro v5.18.1"><meta name="robots" content="index,follow,max-image-preview:large,max-snippet:-1,max-video-preview:-1"><meta name="google-adsense-account" content="ca-pub-1916766675410622"><link rel="alternate" hreflang="en" href="https://www.ai-geminiomni.com/"><link rel="alternate" hreflang="es" href="https://www.ai-geminiomni.com/es/"><link rel="alternate" hreflang="it" href="https://www.ai-geminiomni.com/it/"><link rel="alternate" hreflang="hi" href="https://www.ai-geminiomni.com/hi/"><link rel="alternate" hreflang="ar" href="https://www.ai-geminiomni.com/ar/"><link rel="alternate" hreflang="zh-CN" href="https://www.ai-geminiomni.com/zh/"><link rel="alternate" hreflang="ja" href="https://www.ai-geminiomni.com/ja/"><link rel="alternate" hreflang="ko" href="https://www.ai-geminiomni.com/ko/"><link rel="alternate" hreflang="fr" href="https://www.ai-geminiomni.com/fr/"><link rel="alternate" hreflang="de" href="https://www.ai-geminiomni.com/de/"><link rel="alternate" hreflang="nl" href="https://www.ai-geminiomni.com/nl/"><link rel="alternate" hreflang="pl" href="https://www.ai-geminiomni.com/pl/"><link rel="alternate" hreflang="pt-BR" href="https://www.ai-geminiomni.com/pt-BR/"><link rel="alternate" hreflang="ru" href="https://www.ai-geminiomni.com/ru/"><link rel="alternate" hreflang="tr" href="https://www.ai-geminiomni.com/tr/"><link rel="alternate" hreflang="id" href="https://www.ai-geminiomni.com/id/"><link rel="alternate" hreflang="vi" href="https://www.ai-geminiomni.com/vi/"><link rel="alternate" hreflang="th" href="https://www.ai-geminiomni.com/th/"><link rel="alternate" hreflang="ms" href="https://www.ai-geminiomni.com/ms/"><link rel="alternate" hreflang="tl" href="https://www.ai-geminiomni.com/tl/"><link rel="alternate" hreflang="bn" href="https://www.ai-geminiomni.com/bn/"><link rel="alternate" hreflang="ta" href="https://www.ai-geminiomni.com/ta/"><link rel="alternate" hreflang="te" href="https://www.ai-geminiomni.com/te/"><link rel="alternate" hreflang="mr" href="https://www.ai-geminiomni.com/mr/"><link rel="alternate" hreflang="he" href="https://www.ai-geminiomni.com/he/"><link rel="alternate" hreflang="fa" href="https://www.ai-geminiomni.com/fa/"><link rel="alternate" hreflang="ur" href="https://www.ai-geminiomni.com/ur/"><link rel="alternate" hreflang="x-default" href="https://www.ai-geminiomni.com/"><meta property="og:type" content="website"><meta property="og:site_name" content="Gemini Omni Info Hub"><meta property="og:title" content="Gemini Omni: Avatar, Flash, Free Access &#38; Pricing (2026)"><meta property="og:description" content="What is Gemini Omni? Google's AI video model with a personal AI avatar and Omni Flash. Is it free? Get pricing, specs, official demos, use cases, the API roadmap and FAQ — 2026."><meta property="og:url" content="https://www.ai-geminiomni.com/"><meta property="og:image" content="https://www.ai-geminiomni.com/og.svg"><meta property="og:locale" content="en"><meta property="og:locale:alternate" content="es"><meta property="og:locale:alternate" content="it"><meta property="og:locale:alternate" content="hi"><meta property="og:locale:alternate" content="ar"><meta property="og:locale:alternate" content="zh-CN"><meta property="og:locale:alternate" content="ja"><meta property="og:locale:alternate" content="ko"><meta property="og:locale:alternate" content="fr"><meta property="og:locale:alternate" content="de"><meta property="og:locale:alternate" content="nl"><meta property="og:locale:alternate" content="pl"><meta property="og:locale:alternate" content="pt-BR"><meta property="og:locale:alternate" content="ru"><meta property="og:locale:alternate" content="tr"><meta property="og:locale:alternate" content="id"><meta property="og:locale:alternate" content="vi"><meta property="og:locale:alternate" content="th"><meta property="og:locale:alternate" content="ms"><meta property="og:locale:alternate" content="tl"><meta property="og:locale:alternate" content="bn"><meta property="og:locale:alternate" content="ta"><meta property="og:locale:alternate" content="te"><meta property="og:locale:alternate" content="mr"><meta property="og:locale:alternate" content="he"><meta property="og:locale:alternate" content="fa"><meta property="og:locale:alternate" content="ur"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Gemini Omni: Avatar, Flash, Free Access &#38; Pricing (2026)"><meta name="twitter:description" content="What is Gemini Omni? Google's AI video model with a personal AI avatar and Omni Flash. Is it free? Get pricing, specs, official demos, use cases, the API roadmap and FAQ — 2026."><meta name="twitter:image" content="https://www.ai-geminiomni.com/og.svg">
1<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","inLanguage":"en","mainEntity":[{"@type":"Question","name":"What exactly is Gemini Omni?","acceptedAnswer":{"@type":"Answer","text":"Gemini Omni is Google's unified multimodal family. The production model is Gemini Omni 1.1 Flash (gemini-omni-1.1-flash), which generates video with native synced audio from text, image and video inputs inside one architecture. It supports scene extensions up to 40 seconds, first/last frame control, 360p drafts, and 4K upscaling."}},{"@type":"Question","name":"Is Gemini Omni free?","acceptedAnswer":{"@type":"Answer","text":"Partly. Gemini Omni Flash is free on Google Flow's free tier, YouTube Shorts and the YouTube Create app. Using Omni inside the standalone Gemini app requires a paid Google AI Plus, Pro or Ultra plan."}},{"@type":"Question","name":"How much does Gemini Omni cost?","acceptedAnswer":{"@type":"Answer","text":"Google AI Plus starts around US$7.99 per month, AI Pro is the most common creator tier, and AI Ultra is roughly US$100 per month. Two Omni Flash generations consume about 86% of the AI Pro daily quota, so budget retries carefully. The developer API will arrive with its own pricing."}}
1,{"@type":"Question","name":"When will it ship?","acceptedAnswer":{"@type":"Answer","text":"It already shipped. Google announced Gemini Omni on the Google I/O 2026 main stage on May 19, 2026, simultaneously publishing the official product page and demo videos."}},{"@type":"Question","name":"How does it relate to Veo 3.1?","acceptedAnswer":{"@type":"Answer","text":"Gemini Omni is the successor to Veo inside the Gemini app — Google explicitly says Omni \"will replace Veo in the Gemini app\". The video stack is now folded into the same architecture as Gemini text and image."}},{"@type":"Question","name":"Does it really generate sound?","acceptedAnswer":{"@type":"Answer","text":"Yes. Ambient sound, score and dialogue are produced in the same pass as the video — that's the whole reason for the 'omni' name."}},{"@type":"Question","name":"What is the current clip-length limit?","acceptedAnswer":{"@type":"Answer","text":"Single clips are up to 10 seconds, with scene extensions allowing up to 40 seconds total (10-second increments). Supports native audio, up to 5 photo references, video references up to 3 seconds, and multi-turn editing. Draft in 360p or upscale to 4K."}}
1,{"@type":"Question","name":"How will pricing work?","acceptedAnswer":{"@type":"Answer","text":"Gemini Omni requires a Google AI Plus, Pro or Ultra plan and you must be 18+. Some features (avatars, video-to-video editing) may be restricted in certain countries."}},{"@type":"Question","name":"What is the Gemini Omni AI avatar?","acceptedAnswer":{"@type":"Answer","text":"An optional digital version of you that lets Gemini generate videos which look and sound like you, with no need to re-upload photos each time — and only you can use your own avatar."}}]}</script>
vendor: 63 bytes, line 1
1<script async src="https://www.googletagmanager.com/gtag/js?id=
1G-R7WH0BH713
vendor: 11 bytes, line 1
1"></script>
1<script>(function(){const gaId = "G-R7WH0BH713";
2
3          window.dataLayer = window.dataLayer || [];
4          function gtag(){ dataLayer.push(arguments); }
5          gtag('js', new Date());
6          gtag('config', gaId, { anonymize_ip: true });
7        })();</script>
7<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1916766675410622" crossorigin="anonymous"></script>
7<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link rel="preconnect" href="https://accounts.google.com"><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@500;600;700&family=JetBrains+Mono:wght@400;500&family=Noto+Sans+Arabic:wght@400;500;600;700&family=Noto+Sans+Hebrew:wght@400;500;600;700&family=Noto+Sans+Thai:wght@400;500;600;700&display=swap"><link rel="stylesheet" href="/_astro/_slug_.CcK_mi-L.css">
8<style>.orbit-tag[data-astro-cid-bbe6dxrz]{animation:float 6s ease-in-out infinite}.orbit-tag[data-astro-cid-bbe6dxrz]:nth-child(2){animation-delay:.8s}.orbit-tag[data-astro-cid-bbe6dxrz]:nth-child(3){animation-delay:1.6s}.orbit-tag[data-astro-cid-bbe6dxrz]:nth-child(4){animation-delay:2.4s}
9</style></head> <body class="relative overflow-x-hidden font-sans antialiased"> <aside id="locale-banner" class="locale-banner" role="region" aria-label="Language recommendation banner" data-current-lang="en" data-default-lang="en" data-lang-labels="{&#34;zh&#34;:&#34;中文&#34;,&#34;en&#34;:&#34;English&#34;,&#34;ja&#34;:&#34;日本語&#34;,&#34;ko&#34;:&#34;한국어&#34;,&#34;es&#34;:&#34;Español&#34;,&#34;fr&#34;:&#34;Français&#34;,&#34;de&#34;:&#34;Deutsch&#34;,&#34;it&#34;:&#34;Italiano&#34;,&#34;nl&#34;:&#34;Nederlands&#34;,&#34;pl&#34;:&#34;Polski&#34;,&#34;pt-BR&#34;:&#34;Português&#34;,&#34;ru&#34;:&#34;Русский&#34;,&#34;tr&#34;:&#34;Türkçe&#34;,&#34;id&#34;:&#34;Bahasa Indonesia&#34;,&#34;vi&#34;:&#34;Tiếng Việt&#34;,&#34;th&#34;:&#34;ไทย&#34;,&#34;ms&#34;:&#34;Bahasa Melayu&#34;,&#34;tl&#34;:&#34;Filipino&#34;,&#34;hi&#34;:&#34;हिन्दी&#34;,&#34;bn&#34;:&#34;বাংলা&#34;,&#34;ta&#34;:&#34;தமிழ்&#34;,&#34;te&#34;:&#34;తెలుగు&#34;,&#34;mr&#34;:&#34;मराठी&#34;,&#34;ar&#34;:&#34;العربية&#34;,&#34;he&#34;:&#34;עברית&#34;,&#34;fa&#34;:&#34;فارسی&#34;,&#34;ur&#34;:&#34;اردو&#34;}" data-lang-urls="{&#34;en&#34;:&#34;/&#34;,&#34;es&#34;:&#34;/es/&#34;,&#34;it&#34;:&#34;/it/&#34;,&#34;hi&#34;:&#34;/hi/&#34;,&#34;ar&#34;:&#34;/ar/&#34;,&#34;zh&#34;:&#34;/zh/&#34;,&#34;ja&#34;:&#34;/ja/&#34;,&#34;ko&#34;:&#34;/ko/&#34;,&#34;fr&#34;:&#34;/fr/&#34;,&#34;de&#34;:&#34;/de/&#34;,&#34;nl&#34;:&#34;/nl/&#34;,&#34;pl&#34;:&#34;/pl/&#34;,&#34;pt-BR&#34;:&#34;/pt-BR/&#34;,&#34;ru&#34;:&#34;/ru/&#34;,&#34;tr&#34;:&#34;/tr/&#34;,&#34;id&#34;:&#34;/id/&#34;,&#34;vi&#34;:&#34;/vi/&#34;,&#34;th&#34;:&#34;/th/&#34;,&#34;ms&#34;:&#34;/ms/&#34;,&#34;tl&#34;:&#34;/tl/&#34;,&#34;bn&#34;:&#34;/bn/&#34;,&#34;ta&#34;:&#34;/ta/&#34;,&#34;te&#34;:&#34;/te/&#34;,&#34;mr&#34;:&#34;/mr/&#34;,&#34;he&#34;:&#34;/he/&#34;,&#34;fa&#34;:&#34;/fa/&#34;,&#34;ur&#34;:&#34;/ur/&#34;}" data-banner-copy="{&#34;en&#34;:{&#34;prompt&#34;:&#34;Choose another language to browse content adapted for your browser language preference.&#34;,&#34;continue&#34;:&#34;Continue&#34;,&#34;close&#34;:&#34;Close suggestion banner&#34;,&#34;selectLabel&#34;:&#34;Select preferred language&#34;,&#34;regionLabel&#34;:&#34;Language recommendation banner&#34;},&#34;zh&#34;:{&#34;prompt&#34;:&#34;选择另一语言以浏览适用于你浏览器语言偏好的内容。&#34;,&#34;continue&#34;:&#34;继续&#34;,&#34;close&#34;:&#34;关闭语言建议横幅&#34;,&#34;selectLabel&#34;:&#34;选择首选语言&#34;,&#34;regionLabel&#34;:&#34;语言推荐横幅&#34;},&#34;ja&#34;:{&#34;prompt&#34;:&#34;別の言語を選ぶと、ブラウザの言語設定に合わせたコンテンツを表示できます。&#34;,&#34;continue&#34;:&#34;続ける&#34;,&#34;close&#34;:&#34;言語提案バナーを閉じる&#34;,&#34;selectLabel&#34;:&#34;希望の言語を選択&#34;,&#34;regionLabel&#34;:&#34;言語おすすめバナー&#34;},&#34;ko&#34;:{&#34;prompt&#34;:&#34;다른 언어를 선택하면 브라우저 언어 설정에 맞는 콘텐츠를 볼 수 있습니다.&#34;,&#34;continue&#34;:&#34;계속&#34;,&#34;close&#34;:&#34;언어 제안 배너 닫기&#34;,&#34;selectLabel&#34;:&#34;원하는 언어 선택&#34;,&#34;regionLabel&#34;:&#34;언어 추천 배너&#34;},&#34;es&#34;:{&#34;prompt&#34;:&#34;Elija otro idioma para ver contenido adaptado a la preferencia de idioma de su navegador.&#34;,&#34;continue&#34;:&#34;Continuar&#34;,&#34;close&#34;:&#34;Cerrar banner de sugerencia de idioma&#34;,&#34;selectLabel&#34;:&#34;Seleccionar idioma preferido&#34;,&#34;regionLabel&#34;:&#34;Banner de recomendación de idioma&#34;},&#34;fr&#34;:{&#34;prompt&#34;:&#34;Choisissez une autre langue pour afficher le contenu adapté aux préférences linguistiques de votre navigateur.&#34;,&#34;continue&#34;:&#34;Continuer&#34;,&#34;close&#34;:&#34;Fermer la bannière de suggestion de langue&#34;,&#34;selectLabel&#34;:&#34;Sélectionner la langue préférée&#34;,&#34;regionLabel&#34;:&#34;Bannière de recommandation de langue&#34;},&#34;de&#34;:{&#34;prompt&#34;:&#34;Wählen Sie eine andere Sprache, um Inhalte entsprechend Ihrer Browser-Spracheinstellung anzuzeigen.&#34;,&#34;continue&#34;:&#34;Weiter&#34;,&#34;close&#34;:&#34;Sprachvorschlagsbanner schließen&#34;,&#34;selectLabel&#34;:&#34;Bevorzugte Sprache auswählen&#34;,&#34;regionLabel&#34;:&#34;Sprachempfehlungsbanner&#34;},&#34;it&#34;:{&#34;prompt&#34;:&#34;Scegli un'altra lingua per visualizzare contenuti adattati alle preferenze linguistiche del browser.&#34;,&#34;continue&#34;:&#34;Continua&#34;,&#34;close&#34;:&#34;Chiudi banner suggerimento lingua&#34;,&#34;selectLabel&#34;:&#34;Seleziona lingua preferita&#34;,&#34;regionLabel&#34;:&#34;Banner raccomandazione lingua&#34;},&#34;nl&#34;:{&#34;prompt&#34;:&#34;Kies een andere taal om content te bekijken die is afgestemd op de taalvoorkeur van je browser.&#34;,&#34;continue&#34;:&#34;Doorgaan&#34;,&#34;close&#34;:&#34;Sluit taalsuggestiebanner&#34;,&#34;selectLabel&#34;:&#34;Selecteer voorkeurstaal&#34;,&#34;regionLabel&#34;:&#34;Taalaanbevelingsbanner&#34;},&#34;pl&#34;:{&#34;prompt&#34;:&#34;Wybierz inny język, aby przeglądać treści dopasowane do preferencji językowych przeglądarki.&#34;,&#34;continue&#34;:&#34;Kontynuuj&#34;,&#34;close&#34;:&#34;Zamknij baner sugestii języka&#34;,&#34;selectLabel&#34;:&#34;Wybierz preferowany język&#34;,&#34;regionLabel&#34;:&#34;Baner rekomendacji języka&#34;},&#34;pt-BR&#34;:{&#34;prompt&#34;:&#34;Escolha outro idioma para ver conteúdo adaptado à preferência de idioma do seu navegador.&#34;,&#34;continue&#34;:&#34;Continuar&#34;,&#34;close&#34;:&#34;Fechar banner de sugestão de idioma&#34;,&#34;selectLabel&#34;:&#34;Selecionar idioma preferido&#34;,&#34;regionLabel&#34;:&#34;Banner de recomendação de idioma&#34;},&#34;ru&#34;:{&#34;prompt&#34;:&#34;Выберите другой язык, чтобы просматривать контент, адаптированный к языковым настройкам вашего браузера.&#34;,&#34;continue&#34;:&#34;Продолжить&#34;,&#34;close&#34;:&#34;Закрыть баннер предложения языка&#34;,&#34;selectLabel&#34;:&#34;Выберите предпочитаемый язык&#34;,&#34;regionLabel&#34;:&#34;Баннер рекомендации языка&#34;},&#34;tr&#34;:{&#34;prompt&#34;:&#34;Tarayıcı dil tercihinize uygun içeriği görmek için başka bir dil seçin.&#34;,&#34;continue&#34;:&#34;Devam&#34;,&#34;close&#34;:&#34;Dil önerisi başlığını kapat&#34;,&#34;selectLabel&#34;:&#34;Tercih edilen dili seçin&#34;,&#34;regionLabel&#34;:&#34;Dil önerisi başlığı&#34;},&#34;id&#34;:{&#34;prompt&#34;:&#34;Pilih bahasa lain untuk melihat konten yang disesuaikan dengan preferensi bahasa browser Anda.&#34;,&#34;continue&#34;:&#34;Lanjutkan&#34;,&#34;close&#34;:&#34;Tutup banner saran bahasa&#34;,&#34;selectLabel&#34;:&#34;Pilih bahasa pilihan&#34;,&#34;regionLabel&#34;:&#34;Banner rekomendasi bahasa&#34;},&#34;vi&#34;:{&#34;prompt&#34;:&#34;Chọn ngôn ngữ khác để xem nội dung phù hợp với tùy chọn ngôn ngữ trình duyệt của bạn.&#34;,&#34;continue&#34;:&#34;Tiếp tục&#34;,&#34;close&#34;:&#34;Đóng banner gợi ý ngôn ngữ&#34;,&#34;selectLabel&#34;:&#34;Chọn ngôn ngữ ưa thích&#34;,&#34;regionLabel&#34;:&#34;Banner đề xuất ngôn ngữ&#34;},&#34;th&#34;:{&#34;prompt&#34;:&#34;เลือกภาษาอื่นเพื่อดูเนื้อหาที่ปรับให้เข้ากับการตั้งค่าภาษาของเบราว์เซอร์ของคุณ&#34;,&#34;continue&#34;:&#34;ดำเนินการต่อ&#34;,&#34;close&#34;:&#34;ปิดแบนเนอร์แนะนำภาษา&#34;,&#34;selectLabel&#34;:&#34;เลือกภาษาที่ต้องการ&#34;,&#34;regionLabel&#34;:&#34;แบนเนอร์แนะนำภาษา&#34;},&#34;ms&#34;:{&#34;prompt&#34;:&#34;Pilih bahasa lain untuk melihat kandungan yang disesuaikan dengan pilihan bahasa pelayar anda.&#34;,&#34;continue&#34;:&#34;Teruskan&#34;,&#34;close&#34;:&#34;Tutup banner cadangan bahasa&#34;,&#34;selectLabel&#34;:&#34;Pilih bahasa pilihan&#34;,&#34;regionLabel&#34;:&#34;Banner cadangan bahasa&#34;},&#34;tl&#34;:{&#34;prompt&#34;:&#34;Pumili ng ibang wika upang makita ang content na naaayon sa preference ng wika ng browser mo.&#34;,&#34;continue&#34;:&#34;Magpatuloy&#34;,&#34;close&#34;:&#34;Isara ang banner ng mungkahi sa wika&#34;,&#34;selectLabel&#34;:&#34;Piliin ang gustong wika&#34;,&#34;regionLabel&#34;:&#34;Banner ng rekomendasyon sa wika&#34;},&#34;bn&#34;:{&#34;prompt&#34;:&#34;আপনার ব্রাউজারের ভাষার পছন্দ অনুযায়ী কনটেন্ট দেখতে অন্য ভাষা বেছে নিন।&#34;,&#34;continue&#34;:&#34;চালিয়ে যান&#34;,&#34;close&#34;:&#34;ভাষা পরামর্শ ব্যানার বন্ধ করুন&#34;,&#34;selectLabel&#34;:&#34;পছন্দের ভাষা নির্বাচন করুন&#34;,&#34;regionLabel&#34;:&#34;ভাষা সুপারিশ ব্যানার&#34;},&#34;ta&#34;:{&#34;prompt&#34;:&#34;உங்கள் உலாவி மொழி விருப்ப
9த்திற்கு ஏற்ப உள்ளடக்கத்தைப் பார்க்க வேறு மொழியைத் தேர்ந்தெடுக்கவும்.&#34;,&#34;continue&#34;:&#34;தொடரவும்&#34;,&#34;close&#34;:&#34;மொழி பரிந்துரை பேனரை மூடவும்&#34;,&#34;selectLabel&#34;:&#34;விருப்ப மொழியைத் தேர்ந்தெடுக்கவும்&#34;,&#34;regionLabel&#34;:&#34;மொழி பரிந்துரை பேனர்&#34;},&#34;te&#34;:{&#34;prompt&#34;:&#34;మీ బ్రౌజర్ భాషా ప్రాధాన్యతకు అనుగుణంగా కంటెంట్‌ను చూడటానికి మరొక భాషను ఎంచుకోండి.&#34;,&#34;continue&#34;:&#34;కొనసాగించు&#34;,&#34;close&#34;:&#34;భాష సూచన బ్యానర్‌ను మూసివేయి&#34;,&#34;selectLabel&#34;:&#34;ఇష్టమైన భాషను ఎంచుకోండి&#34;,&#34;regionLabel&#34;:&#34;భాష సిఫార్సు బ్యానర్&#34;},&#34;mr&#34;:{&#34;prompt&#34;:&#34;तुमच्या ब्राउझरच्या भाषा प्राधान्यानुसार सामग्री पाहण्यासाठी दुसरी भाषा निवडा.&#34;,&#34;continue&#34;:&#34;पुढे जा&#34;,&#34;close&#34;:&#34;भाषा सूचना बॅनर बंद करा&#34;,&#34;selectLabel&#34;:&#34;पसंतीची भाषा निवडा&#34;,&#34;regionLabel&#34;:&#34;भाषा शिफारस बॅनर&#34;},&#34;ar&#34;:{&#34;prompt&#34;:&#34;اختر لغة أخرى لعرض محتوى يتكيف مع تفضيلات لغة متصفحك.&#34;,&#34;continue&#34;:&#34;متابعة&#34;,&#34;close&#34;:&#34;إغلاق شريط اقتراح اللغة&#34;,&#34;selectLabel&#34;:&#34;اختر اللغة المفضلة&#34;,&#34;regionLabel&#34;:&#34;شريط توصية اللغة&#34;},&#34;he&#34;:{&#34;prompt&#34;:&#34;בחר שפה אחרת כדי לצפות בתוכן המותאם להעדפת השפה של הדפדפן שלך.&#34;,&#34;continue&#34;:&#34;המשך&#34;,&#34;close&#34;:&#34;סגור את באנר הצעת השפה&#34;,&#34;selectLabel&#34;:&#34;בחר שפה מועדפת&#34;,&#34;regionLabel&#34;:&#34;באנר המלצת שפה&#34;},&#34;fa&#34;:{&#34;prompt&#34;:&#34;زبان دیگری را انتخاب کنید تا محتوایی متناسب با ترجیح زبان مرورگر خود ببینید.&#34;,&#34;continue&#34;:&#34;ادامه&#34;,&#34;close&#34;:&#34;بستن بنر پیشنهاد زبان&#34;,&#34;selectLabel&#34;:&#34;انتخاب زبان ترجیحی&#34;,&#34;regionLabel&#34;:&#34;بنر پیشنهاد زبان&#34;},&#34;hi&#34;:{&#34;prompt&#34;:&#34;अपनी ब्राउज़र भाषा प्राथमिकता के अनुसार सामग्री देखने के लिए दूसरी भाषा चुनें।&#34;,&#34;continue&#34;:&#34;जारी रखें&#34;,&#34;close&#34;:&#34;भाषा सुझाव बैनर बंद करें&#34;,&#34;selectLabel&#34;:&#34;पसंदीदा भाषा चुनें&#34;,&#34;regionLabel&#34;:&#34;भाषा अनुशंसा बैनर&#34;},&#34;ur&#34;:{&#34;prompt&#34;:&#34;اپنی براؤزر زبان کی ترجیح کے مطابق مواد دیکھنے کے لیے دوسری زبان منتخب کریں۔&#34;,&#34;continue&#34;:&#34;جاری رکھیں&#34;,&#34;close&#34;:&#34;زبان کی تجویز بینر بند کریں&#34;,&#34;selectLabel&#34;:&#34;پسندیدہ زبان منتخب کریں&#34;,&#34;regionLabel&#34;:&#34;زبان کی سفارش بینر&#34;}}" style="display: none;" data-astro-cid-xujs2ijk> <div class="locale-banner-inner" data-astro-cid-xujs2ijk> <div class="locale-banner-text" data-astro-cid-xujs2ijk> <span id="locale-banner-message" data-astro-cid-xujs2ijk>Choose another language to browse content adapted for your browser language preference.</span> </div>
9 <div class="locale-banner-controls" data-astro-cid-xujs2ijk> <div class="locale-banner-actions" data-astro-cid-xujs2ijk> <div class="locale-banner-select-wrapper" data-astro-cid-xujs2ijk> <svg class="locale-banner-check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true" data-astro-cid-xujs2ijk> <polyline points="20 6 9 17 4 12" data-astro-cid-xujs2ijk></polyline> </svg> <select id="locale-banner-select" class="locale-banner-select" aria-label="Select preferred language" data-astro-cid-xujs2ijk> <option value="en" data-astro-cid-xujs2ijk>English</option><option value="es" selected data-astro-cid-xujs2ijk>Español</option><option value="it" selected data-astro-cid-xujs2ijk>Italiano</option><option value="hi" selected data-astro-cid-xujs2ijk>हिन्दी</option><option value="ar" selected data-astro-cid-xujs2ijk>العربية</option><option value="zh" selected data-astro-cid-xujs2ijk>中文</option><option value="ja" selected data-astro-cid-xujs2ijk>日本語</option><option value="ko" selected data-astro-cid-xujs2ijk>한국어</option><option value="fr" selected data-astro-cid-xujs2ijk>Français</option><option value="de" selected data-astro-cid-xujs2ijk>Deutsch</option><option value="nl" selected data-astro-cid-xujs2ijk>Nederlands</option><option value="pl" selected data-astro-cid-xujs2ijk>Polski</option><option value="pt-BR" selected data-astro-cid-xujs2ijk>Português</option><option value="ru" selected data-astro-cid-xujs2ijk>Русский</option><option value="tr" selected data-astro-cid-xujs2ijk>Türkçe</option><option value="id" selected data-astro-cid-xujs2ijk>Bahasa Indonesia</option><option value="vi" selected data-astro-cid-xujs2ijk>Tiếng Việt</option><option value="th" selected data-astro-cid-xujs2ijk>ไทย</option><option value="ms" selected data-astro-cid-xujs2ijk>Bahasa Melayu</option><option value="tl" selected data-astro-cid-xujs2ijk>Filipino</option><option value="bn" selected data-astro-cid-xujs2ijk>বাংলা</option><option value="ta" selected data-astro-cid-xujs2ijk>தமிழ்</option><option value="te" selected data-astro-cid-xujs2ijk>తెలుగు</option><option value="mr" selected data-astro-cid-xujs2ijk>मराठी</option><option value="he" selected data-astro-cid-xujs2ijk>עברית</option><option value="fa" selected data-astro-cid-xujs2ijk>فارسی</option><option value="ur" selected data-astro-cid-xujs2ijk>اردو</option> </select> <svg class="locale-banner-chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true" data-astro-cid-xujs2ijk> <polyline points="6 9 12 15 18 9" data-astro-cid-xujs2ijk></polyline> </svg> </div> <a id="locale-banner-continue" href="#" class="locale-banner-button" data-astro-cid-xujs2ijk> Continue </a> </div> <button id="locale-banner-close" class="locale-banner-close" aria-label="Close suggestion banner" type="button" data-astro-cid-xujs2ijk> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true" data-astro-cid-xujs2ijk> <line x1="18" y1="6" x2="6" y2="18" data-astro-cid-xujs2ijk></line> <line x1="6" y1="6" x2="18" y2="18" data-astro-cid-xujs2ijk></line> </svg> </button> </div> </div> </aside> 
9<script>
10  (() => {
11    try {
12      const banner = document.getElementById('locale-banner');
13      if (!banner) return;
14
15      const DISMISSED_KEY = 'apple_style_lang_banner_dismissed';
16      if (sessionStorage.getItem(DISMISSED_KEY) === '1') return;
17
18      const currentLang = banner.getAttribute('data-current-lang') || 'en';
19      const langUrls = JSON.parse(banner.getAttribute('data-lang-urls') || '{}');
20      const bannerCopy = JSON.parse(banner.getAttribute('data-banner-copy') || '{}');
21      const supportedLangs = Object.keys(langUrls);
22
23      const alias = { pt: 'pt-BR', zh: 'zh', iw: 'he', in: 'id', fil: 'tl', tl: 'tl' };
24
25      function match(raw) {
26        raw = (raw || '').toLowerCase();
27        if (!raw) return '';
28        for (let i = 0; i < supportedLangs.length; i++) {
29          if (supportedLangs[i].toLowerCase() === raw) return supportedLangs[i];
30        }
31        const base = raw.split('-')[0];
32        if (alias[base]) return alias[base];
33        for (let j = 0; j < supportedLangs.length; j++) {
34          const s = supportedLangs[j].toLowerCase();
35          if (s === base || s.split('-')[0] === base) return supportedLangs[j];
36        }
37        return '';
38      }
39
40      const prefs =
41        navigator.languages && navigator.languages.length
42          ? navigator.languages
43          : [navigator.language || 'en'];
44
45      let detectedLang = '';
46      for (let k = 0; k < prefs.length && !detectedLang; k++) {
47        detectedLang = match(prefs[k]);
48      }
49      if (!detectedLang) detectedLang = 'en';
50
51      if (detectedLang === currentLang) return;
52
53      const select = document.getElementById('locale-banner-select');
54      const continueBtn = document.getElementById('locale-banner-continue');
55      const closeBtn = document.getElementById('locale-banner-close');
56      const msg = document.getElementById('locale-banner-message');
57
58      function applyBannerCopy(lang) {
59        const copy = bannerCopy[lang] || bannerCopy.en || {};
60        if (msg) msg.textContent = copy.prompt || '';
61        if (continueBtn) continueBtn.textContent = copy.continue || '';
62        if (select) select.setAttribute('aria-label', copy.selectLabel || '');
63        if (closeBtn) closeBtn.setAttribute('aria-label', copy.close || '');
64        banner.setAttribute('aria-label', copy.regionLabel || '');
65      }
66
67      if (select) select.value = detectedLang;
68      applyBannerCopy(detectedLang);
69
70      function updateContinueTarget() {
71        if (!select || !continueBtn) return;
72        const target = select.value;
73        continueBtn.setAttribute('href', langUrls[target] || '/');
74        applyBannerCopy(target);
75      }
76
77      if (select) select.addEventListener('change', updateContinueTarget);
78
79      if (closeBtn) {
80        closeBtn.addEventListener('click', () => {
81          banner.style.display = 'none';
82          sessionStorage.setItem(DISMISSED_KEY, '1');
83        });
84      }
85
86      updateContinueTarget();
87      banner.style.display = 'block';
88    } catch (e) {}
89  })();
90</script>
90  <div aria-hidden="true" class="pointer-events-none fixed inset-0 -z-10 mask-fade-b"> <div class="absolute -top-40 left-1/2 h-[600px] w-[1200px] -translate-x-1/2 rounded-full bg-violet-500/20 blur-3xl"></div> <div class="absolute right-[-200px] top-40 h-[500px] w-[500px] rounded-full bg-cyan-400/10 blur-3xl"></div> <div class="absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-white/15 to-transparent"></div> </div> <header class="sticky top-0 z-40 border-b border-white/5 bg-ink-950/70 backdrop-blur-md"> <div class="container-x flex h-16 items-center justify-between gap-4"> <a href="/" class="flex shrink-0 items-center gap-2.5 font-display text-base font-semibold tracking-tight text-white"> <span class="grid h-7 w-7 shrink-0 place-items-center rounded-lg bg-brand-gradient text-ink-950 shadow-glow"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="currentColor" d="M12 2l1.7 7.3L21 11l-7.3 1.7L12 20l-1.7-7.3L3 11l7.3-1.7L12 2z"></path> </svg> </span> <span class="whitespace-nowrap">Gemini Omni</span> </a> <nav aria-label="Primary" class="hidden lg:block"> <ul class="flex items-center gap-1 text-sm text-zinc-300"> <li> <a href="#showcase" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Demos </a> </li><li> <a href="#features" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Features </a> </li><li> <a href="#specs" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Specs </a> </li><li> <a href="#free" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Free vs paid </a> </li><li> <a href="/prompt-generator/" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Prompt builder </a> </li><li> <a href="/video-studio/" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Video Studio </a> </li><li> <a href="/pricing/" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Pricing </a> </li><li> <a href="/blog/" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> Articles </a> </li><li> <a href="#faq" class="whitespace-nowrap rounded-full px-3 py-1.5 transition-colors hover:bg-white/[0.06] hover:text-white"> FAQ </a> </li> </ul> </nav> <div class="flex shrink-0 items-center gap-2"> <div data-auth class="relative flex items-center gap-2"> <button type="button" data-open-login data-auth-signed-out class="chip cursor-pointer hover:border-violet-400/40 hover:text-white"> Sign in </button> <a href="/pricing/" data-auth-points hidden aria-label="Available credits" title="Credits" class="hidden items-center gap-1.5 rounded-full border border-violet-400/30 bg-violet-500/10 px-3 py-1 text-xs font-semibold text-violet-100 transition-colors hover:border-violet-400/60 hover:bg-violet-500/15 hover:text-white"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="currentColor" d="M13 2L3 14h7l-1 8 10-12h-7l1-8z"></path> </svg> <span data-auth-points-value class="tabular-nums">0</span> </a> <button type="button" data-auth-signed-in hidden aria-haspopup="menu" aria-expanded="false" class="flex items-center gap-2 rounded-full border border-white/10 bg-white/[0.04] py-1 pl-1 pr-3 text-sm transition-colors hover:border-violet-400/40"> <span data-auth-avatar class="grid h-7 w-7 place-items-center overflow-hidden rounded-full bg-brand-gradient text-xs font-semibold uppercase text-ink-950"></span> <span data-auth-name class="hidden max-w-[8rem] truncate text-zinc-200 sm:inline"></span> <svg viewBox="0 0 24 24" class="hidden h-3 w-3 opacity-60 sm:inline" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M6 9l6 6 6-6"></path> </svg> </button> <div data-auth-menu hidden role="menu" class="absolute right-0 top-full z-50 mt-2 w-64 max-w-[calc(100vw-1rem)] origin-top-right rounded-2xl border border-white/10 bg-ink-900/95 p-3 shadow-xl backdrop-blur"> <div class="flex items-center gap-3 border-b border-white/5 px-2 pb-3"> <span data-auth-avatar-lg class="grid h-10 w-10 shrink-0 place-items-center overflow-hidden rounded-full bg-brand-gradient text-sm font-semibold uppercase text-ink-950"></span> <div class="min-w-0"> <p data-auth-name-full class="truncate text-sm font-semibold text-white"></p> <p data-auth-email class="truncate text-xs text-zinc-400"></p> </div> </div> <button type="button" data-auth-logout class="mt-3 flex w-full items-center justify-center gap-2 rounded-xl border border-rose-400/30 bg-rose-500/10 px-3 py-2 text-sm font-semibold text-rose-200 transition-colors hover:bg-rose-500/15"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M15 12H4m0 0l4-4m-4 4l4 4M9 4h7a2 2 0 012 2v12a2 2 0 01-2 2H9"></path> </svg> Log out </button> </div> </div> 
90<script>(function(){const API_BASE = "https://www.gushanai.com/api";
91const APP_KEY = "gemini_omni_4561";
92const HTML_LANG = "en";
93
94  (() => {
95    if (typeof window === 'undefined') return;
96
97    const AUTH_TOKEN_KEY = 'auth_token';
98    const USER_INFO_KEY = 'user_info';
99    const AUTH_CHANGED_EVENT = 'gemini-omni:auth-changed';
100    const REFRESH_USER_EVENT = 'gemini-omni:refresh-user';
101    const SESSION_REFRESHED_KEY = 'gemini-omni:auth-refreshed';
102
103    const root = document.querySelector('[data-auth]');
104    if (!root) return;
105
106    const signedOutEl = root.querySelector('[data-auth-signed-out]');
107    const signedInEl = root.querySelector('[data-auth-signed-in]');
108    const menuEl = root.querySelector('[data-auth-menu]');
109    const avatarEl = root.querySelector('[data-auth-avatar]');
110    const avatarLgEl = root.querySelector('[data-auth-avatar-lg]');
111    const nameEl = root.querySelector('[data-auth-name]');
112    const nameFullEl = root.querySelector('[data-auth-name-full]');
113    const emailEl = root.querySelector('[data-auth-email]');
114    const logoutBtn = root.querySelector('[data-auth-logout]');
115    const pointsEl = root.querySelector('[data-auth-points]');
116    const pointsValueEl = root.querySelector('[data-auth-points-value]');
117
118    let pointsFormatter;
119    try {
120      pointsFormatter = new Intl.NumberFormat(HTML_LANG);
121    } catch {
122      pointsFormatter = new Intl.NumberFormat('en');
123    }
124
125    const getToken = () => window.localStorage.getItem(AUTH_TOKEN_KEY);
126    const getUser = () => {
127      const raw = window.localStorage.getItem(USER_INFO_KEY);
128      if (!raw) return null;
129      try {
130        return JSON.parse(raw);
131      } catch {
132        return null;
133      }
134    };
135
136    const initials = (user) => {
137      const src = (user?.nickName || user?.email || '').trim();
138      if (!src) return '?';
139      const ch = src.codePointAt(0);
140      return ch ? String.fromCodePoint(ch).toUpperCase() : '?';
141    };
142
143    const renderAvatar = (el, user) => {
144      if (!el) return;
145      el.innerHTML = '';
146      if (user?.avatarUrl) {
147        const img = document.createElement('img');
148        img.src = user.avatarUrl;
149        img.alt = user.nickName || user.email || '';
150        img.referrerPolicy = 'no-referrer';
151        img.className = 'h-full w-full object-cover';
152        el.appendChild(img);
153      } else {
154        el.textContent = initials(user);
155      }
156    };
157
158    const closeMenu = () => {
159      menuEl?.setAttribute('hidden', '');
160      signedInEl?.setAttribute('aria-expanded', 'false');
161      if (menuEl) menuEl.style.right = '';
162    };
163
164    const adjustMenuPosition = () => {
165      if (!menuEl) return;
166      menuEl.style.right = '';
167      const rect = menuEl.getBoundingClientRect();
168      const minMargin = 8;
169      if (rect.left < minMargin) {
170        const shift = minMargin - rect.left;
171        menuEl.style.right = `-${shift}px`;
172      } else if (rect.right > window.innerWidth - minMargin) {
173        const overflow = rect.right - (window.innerWidth - minMargin);
174        menuEl.style.right = `${overflow}px`;
175      }
176    };
177
178    const openMenu = () => {
179      menuEl?.removeAttribute('hidden');
180      signedInEl?.setAttribute('aria-expanded', 'true');
181      adjustMenuPosition();
182    };
183
184    const renderPoints = (user) => {
185      if (!pointsEl) return;
186      const total = Number(user?.wallet?.points?.totalBalance);
187      if (Number.isFinite(total) && total >= 0) {
188        if (pointsValueEl) pointsValueEl.textContent = pointsFormatter.format(total);
189        pointsEl.removeAttribute('hidden');
190        pointsEl.classList.remove('hidden');
191        pointsEl.classList.add('inline-flex');
192      } else {
193        pointsEl.setAttribute('hidden', '');
194        pointsEl.classList.add('hidden');
195        pointsEl.classList.remove('inline-flex');
196      }
197    };
198
199    const render = () => {
200      const token = getToken();
201      const user = getUser();
202      if (token && user) {
203        signedOutEl?.setAttribute('hidden', '');
204        signedInEl?.removeAttribute('hidden');
205        renderAvatar(avatarEl, user);
206        renderAvatar(avatarLgEl, user);
207        const display = user.nickName || user.email || '';
208        if (nameEl) nameEl.textContent = display;
209        if (nameFullEl) nameFullEl.textContent = user.nickName || user.email || '';
210        if (emailEl) emailEl.textContent = user.email || '';
211        renderPoints(user);
212      } else {
213        signedInEl?.setAttribute('hidden', '');
214        signedOutEl?.removeAttribute('hidden');
215        renderPoints(null);
216        closeMenu();
217      }
218    };
219
220    const apiRequest = async (path, body) => {
221      const headers = { 'Content-Type': 'application/json', 'x-app-key': APP_KEY };
222      const token = getToken();
223      if (token) headers.Authorization = token;
224      const res = await fetch(`${API_BASE}${path}`, {
225        method: 'POST',
226        headers,
227        body: JSON.stringify(body || {}),
228      });
229      let env;
230      try {
231        env = await res.json();
232      } catch {
233        env = { code: res.status, message: `HTTP ${res.status}` };
234      }
235      if (!env || (env.code !== 200 && env.code !== 0)) {
236        const err = new Error(env?.message || `HTTP ${res.status}`);
237        err.code = env?.code ?? res.status;
238        err.status = res.status;
239        throw err;
240      }
241      return env.data;
242    };
243
244    const clearAuth = () => {
245      window.localStorage.removeItem(AUTH_TOKEN_KEY);
246      window.localStorage.removeItem(USER_INFO_KEY);
247      try {
248        window.sessionStorage.removeItem(SESSION_REFRESHED_KEY);
249      } catch {}
250      window.dispatchEvent(new CustomEvent(AUTH_CHANGED_EVENT, { detail: { token: null, user: null } }));
251    };
252
253    const refreshIfNeeded = async () => {
254      const token = getToken();
255      if (!token) return;
256      let alreadyRefreshed = false;
257      try {
258        alreadyRefreshed = window.sessionStorage.getItem(SESSION_REFRESHED_KEY) === '1';
259      } catch {}
260      if (alreadyRefreshed) return;
261      try {
262        const refreshData = await apiRequest('/auth/refresh', {});
263        if (refreshData?.token) {
264          window.localStorage.setItem(AUTH_TOKEN_KEY, refreshData.token);
265        }
266        const user = await apiRequest('/mine/info', {});
267        if (user) {
268          window.localStorage.setItem(USER_INFO_KEY, JSON.stringify(user));
269        }
270        try {
271          window.sessionStorage.setItem(SESSION_REFRESHED_KEY, '1');
272        } catch {}
273        window.dispatchEvent(
274          new CustomEvent(AUTH_CHANGED_EVENT, { detail: { token: getToken(), user } })
275        );
276      } catch (err) {
277        const status = err && (err.status || err.code);
278        if (status === 401 || status === 403) {
279          clearAuth();
280        }
281      }
282    };
283
284    signedInEl?.addEventListener('click', (e) => {
285      e.stopPropagation();
286      if (menuEl?.hasAttribute('hidden')) openMenu();
287      else closeMenu();
288    });
289
290    logoutBtn?.addEventListener('click', (e) => {
291      e.stopPropagation();
292      clearAuth();
293      closeMenu();
294    });
295
296    document.addEventListener('click', (e) => {
297      if (!root.contains(e.target)) closeMenu();
298    });
299
300    document.addEventListener('keydown', (e) => {
301      if (e.key === 'Escape') closeMenu();
302    });
303
304    window.addEventListener(AUTH_CHANGED_EVENT, render);
305
306    window.addEventListener(REFRESH_USER_EVENT, async () => {
307      if (!getToken()) return;
308      try {
309        const user = await apiRequest('/mine/info', {});
310        if (user) {
311          window.localStorage.setItem(USER_INFO_KEY, JSON.stringify(user));
312          window.dispatchEvent(
313            new CustomEvent(AUTH_CHANGED_EVENT, { detail: { token: getToken(), user } })
314          );
315        }
316      } catch (err) {
317        const status = err && (err.status || err.code);
318        if (status === 401 || status === 403) {
319          clearAuth();
320        }
321      }
322    });
323
324    render();
325    refreshIfNeeded();
326  })();
327})();</script>
327 <div class="relative" data-lang-switcher> <button type="button" class="chip hover:border-violet-400/40 hover:text-white" aria-label="Switch language" aria-haspopup="listbox" aria-expanded="false" data-lang-toggle> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" d="M12 3v18M3 12h18M5.5 7.5c4 3 9 3 13 0M5.5 16.5c4-3 9-3 13 0"></path> </svg> <span class="hidden sm:inline">English</span> <svg viewBox="0 0 24 24" class="h-3 w-3 opacity-60" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M6 9l6 6 6-6"></path> </svg> </button> <div class="absolute end-0 z-50 mt-2 hidden max-h-[min(60vh,420px)] w-48 origin-top-right overflow-y-auto overscroll-contain rtl:origin-top-left rounded-2xl border border-white/10 bg-ink-900/95 p-1.5 shadow-xl backdrop-blur" role="listbox" data-lang-menu> <a href="/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors bg-white/[0.06] text-white" role="option" aria-selected="true" hreflang="en"> <span>English</span> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5 text-violet-300" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l5 5 9-11"></path> </svg> </a><a href="/es/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="es"> <span>Español</span>  </a><a href="/it/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="it"> <span>Italiano</span>  </a><a href="/hi/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="hi"> <span>हिन्दी</span>  </a><a href="/ar/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ar"> <span>العربية</span>  </a><a href="/zh/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="zh"> <span>中文</span>  </a><a href="/ja/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ja"> <span>日本語</span>  </a><a href="/ko/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ko"> <span>한국어</span>  </a><a href="/fr/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="fr"> <span>Français</span>  </a><a href="/de/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="de"> <span>Deutsch</span>  </a><a href="/nl/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="nl"> <span>Nederlands</span>  </a><a href="/pl/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="pl"> <span>Polski</span>  </a><a href="/pt-BR/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="pt-BR"> <span>Português</span>  </a><a href="/ru/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ru"> <span>Русский</span>  </a><a href="/tr/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="tr"> <span>Türkçe</span>  </a><a href="/id/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="id"> <span>Bahasa Indonesia</span>  </a><a href="/vi/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="vi"> <span>Tiếng Việt</span>  </a><a href="/th/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="th"> <span>ไทย</span>  </a>
327<a href="/ms/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ms"> <span>Bahasa Melayu</span>  </a><a href="/tl/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="tl"> <span>Filipino</span>  </a><a href="/bn/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="bn"> <span>বাংলা</span>  </a><a href="/ta/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ta"> <span>தமிழ்</span>  </a><a href="/te/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="te"> <span>తెలుగు</span>  </a><a href="/mr/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="mr"> <span>मराठी</span>  </a><a href="/he/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="he"> <span>עברית</span>  </a><a href="/fa/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="fa"> <span>فارسی</span>  </a><a href="/ur/" class="flex items-center justify-between rounded-xl px-3 py-2 text-sm transition-colors text-zinc-300 hover:bg-white/[0.04] hover:text-white" role="option" aria-selected="false" hreflang="ur"> <span>اردو</span>  </a> </div> </div> <button type="button" class="grid h-9 w-9 place-items-center rounded-full border border-white/10 bg-white/[0.04] text-zinc-200 transition-colors hover:border-violet-400/40 hover:text-white lg:hidden" aria-label="Menu" aria-expanded="false" aria-controls="mobile-menu" data-mobile-toggle> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" d="M4 7h16M4 12h16M4 17h16"></path> </svg> </button> </div> </div> <div id="mobile-menu" class="lg:hidden hidden border-t border-white/5 bg-ink-950/95 backdrop-blur"> <ul class="container-x flex flex-col gap-1 py-3 text-sm text-zinc-300"> <li> <a href="#showcase" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Demos </a> </li><li> <a href="#features" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Features </a> </li><li> <a href="#specs" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Specs </a> </li><li> <a href="#architecture" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Architecture </a> </li><li> <a href="#cases" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Use cases </a> </li><li> <a href="#comparison" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Compare </a> </li><li> <a href="#free" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Free vs paid </a> </li><li> <a href="#timeline" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Timeline </a> </li><li> <a href="/prompt-generator/" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link>
327 Prompt builder </a> </li><li> <a href="/video-studio/" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Video Studio </a> </li><li> <a href="/pricing/" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Pricing </a> </li><li> <a href="/blog/" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Articles </a> </li><li> <a href="#faq" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> FAQ </a> </li><li> <a href="#sources" class="block rounded-lg px-3 py-2 transition-colors hover:bg-white/[0.06] hover:text-white" data-mobile-link> Sources </a> </li> </ul> </div> </header> 
327<script>
328  (() => {
329    const toggle = document.querySelector('[data-mobile-toggle]');
330    const menu = document.getElementById('mobile-menu');
331    if (toggle && menu) {
332      const close = () => { menu.classList.add('hidden'); toggle.setAttribute('aria-expanded', 'false'); };
333      const open = () => { menu.classList.remove('hidden'); toggle.setAttribute('aria-expanded', 'true'); };
334      toggle.addEventListener('click', () => menu.classList.contains('hidden') ? open() : close());
335      menu.querySelectorAll('[data-mobile-link]').forEach((el) => el.addEventListener('click', close));
336    }
337
338    const switcher = document.querySelector('[data-lang-switcher]');
339    if (switcher) {
340      const langToggle = switcher.querySelector('[data-lang-toggle]');
341      const langMenu = switcher.querySelector('[data-lang-menu]');
342      const closeLang = () => { langMenu.classList.add('hidden'); langToggle.setAttribute('aria-expanded', 'false'); };
343      const openLang = () => { langMenu.classList.remove('hidden'); langToggle.setAttribute('aria-expanded', 'true'); };
344      langToggle.addEventListener('click', (e) => {
345        e.stopPropagation();
346        langMenu.classList.contains('hidden') ? openLang() : closeLang();
347      });
348      document.addEventListener('click', (e) => {
349        if (!switcher.contains(e.target)) closeLang();
350      });
351      document.addEventListener('keydown', (e) => {
352        if (e.key === 'Escape') closeLang();
353      });
354    }
355  })();
356</script>
356 <main>  <section class="relative overflow-hidden pt-20 pb-16 sm:pt-28 sm:pb-24" data-astro-cid-bbe6dxrz> <div class="container-x" data-astro-cid-bbe6dxrz> <div class="grid items-center gap-12 lg:grid-cols-[1.1fr_0.9fr]" data-astro-cid-bbe6dxrz> <div class="reveal" data-astro-cid-bbe6dxrz> <span class="chip mb-6 border-violet-400/30 text-violet-200" data-astro-cid-bbe6dxrz> <span class="relative flex h-2 w-2" data-astro-cid-bbe6dxrz> <span class="absolute inline-flex h-full w-full animate-ping rounded-full bg-violet-400 opacity-70" data-astro-cid-bbe6dxrz></span> <span class="relative inline-flex h-2 w-2 rounded-full bg-violet-400" data-astro-cid-bbe6dxrz></span> </span> Omni 1.1 Flash · Production-ready video generation &amp; editing </span> <h1 class="font-display text-4xl font-semibold leading-[1.05] tracking-tight text-white sm:text-5xl lg:text-6xl" data-astro-cid-bbe6dxrz> <span class="text-gradient" data-astro-cid-bbe6dxrz>Gemini Omni</span> <br data-astro-cid-bbe6dxrz> <span class="text-zinc-100" data-astro-cid-bbe6dxrz>Speak it. See it. Share it.</span> </h1> <p class="mt-6 max-w-xl text-base leading-relaxed text-zinc-400 sm:text-lg" data-astro-cid-bbe6dxrz> Gemini Omni 1.1 Flash launched August 27, 2026 — Google&#39;s production-ready update with scene extensions up to 40 seconds, first and last frame control, 360p draft mode, 4K upscaling, and video references. It replaces Veo inside the Gemini app and is available across Google Flow, YouTube Shorts, Google Vids, Google AI Studio and the Gemini Enterprise Agent Platform. </p> <div data-hero-ctas data-signed-in="false" class="group/hero mt-8 flex flex-wrap items-center gap-3" data-astro-cid-bbe6dxrz> <button type="button" data-open-login class="btn-primary group-data-[signed-in=true]/hero:hidden" data-astro-cid-bbe6dxrz> Try Gemini Omni <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true" data-astro-cid-bbe6dxrz> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6" data-astro-cid-bbe6dxrz></path> </svg> </button> <a href="/prompt-generator/" class="btn-primary hidden group-data-[signed-in=true]/hero:inline-flex" data-astro-cid-bbe6dxrz> Open the prompt builder <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true" data-astro-cid-bbe6dxrz> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6" data-astro-cid-bbe6dxrz></path> </svg> </a> <a href="/prompt-generator/" class="btn-ghost group-data-[signed-in=true]/hero:hidden" data-astro-cid-bbe6dxrz> Open the prompt builder </a> <span class="btn-ghost hidden cursor-default opacity-90 group-data-[signed-in=true]/hero:inline-flex" aria-disabled="true" data-astro-cid-bbe6dxrz> <svg viewBox="0 0 24 24" class="h-4 w-4 text-emerald-300" aria-hidden="true" data-astro-cid-bbe6dxrz> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l4.5 4.5L19 7" data-astro-cid-bbe6dxrz></path> </svg> You&#39;re on the list </span> <a href="#features" class="btn-ghost" data-astro-cid-bbe6dxrz>See the capabilities</a> <a href="/blog/" class="btn-ghost" data-astro-cid-bbe6dxrz>Articles</a> </div> <div class="mt-8 flex flex-wrap gap-2" data-astro-cid-bbe6dxrz> <span class="chip" data-astro-cid-bbe6dxrz>Unified model</span> <span class="chip" data-astro-cid-bbe6dxrz>Synced audio</span> <span class="chip" data-astro-cid-bbe6dxrz>In-chat editing</span> </div> </div> <div class="reveal relative" data-astro-cid-bbe6dxrz> <div class="relative mx-auto aspect-square w-full max-w-md" data-astro-cid-bbe6dxrz> <div class="absolute inset-0 rounded-full bg-brand-gradient opacity-20 blur-3xl" data-astro-cid-bbe6dxrz></div> <div class="absolute inset-8 rounded-full bg-brand-gradient opacity-30 blur-2xl animate-float" data-astro-cid-bbe6dxrz></div> <div class="absolute inset-0 grid place-items-center" data-astro-cid-bbe6dxrz> <div class="relative h-64 w-64 sm:h-72 sm:w-72" data-astro-cid-bbe6dxrz> <div class="absolute inset-0 rounded-full border border-white/15" data-astro-cid-bbe6dxrz></div> <div class="absolute inset-4 rounded-full border border-white/10" data-astro-cid-bbe6dxrz></div> <div class="absolute inset-10 rounded-full border border-white/10" data-astro-cid-bbe6dxrz></div> <div class="absolute inset-0 grid place-items-center" data-astro-cid-bbe6dxrz> <div class="grid h-24 w-24 place-items-center rounded-full bg-ink-900/80 backdrop-blur ring-1 ring-white/10 shadow-glow" data-astro-cid-bbe6dxrz> <span class="font-display text-2xl font-semibold text-gradient" data-astro-cid-bbe6dxrz>Omni</span> </div> </div> <div class="orbit-tag absolute left-1/2 top-0 -translate-x-1/2 -translate-y-1/2 chip border-violet-400/30 text-violet-200" data-astro-cid-bbe6dxrz>
357Text
358</div> <div class="orbit-tag absolute right-0 top-1/2 translate-x-1/2 -translate-y-1/2 chip border-cyan-400/30 text-cyan-200" data-astro-cid-bbe6dxrz>
359Image
360</div> <div class="orbit-tag absolute left-1/2 bottom-0 -translate-x-1/2 translate-y-1/2 chip border-indigo-400/30 text-indigo-200" data-astro-cid-bbe6dxrz>
361Video
362</div> <div class="orbit-tag absolute left-0 top-1/2 -translate-x-1/2 -translate-y-1/2 chip border-fuchsia-400/30 text-fuchsia-200" data-astro-cid-bbe6dxrz>
363Audio
364</div> </div> </div> </div> </div> </div> </div> </section>  
364<script>
365  (() => {
366    if (typeof window === 'undefined') return;
367    const root = document.querySelector('[data-hero-ctas]');
368    if (!root) return;
369    const AUTH_TOKEN_KEY = 'auth_token';
370    const AUTH_CHANGED_EVENT = 'gemini-omni:auth-changed';
371    const sync = () => {
372      let token = null;
373      try {
374        token = window.localStorage.getItem(AUTH_TOKEN_KEY);
375      } catch {}
376      root.setAttribute('data-signed-in', token ? 'true' : 'false');
377    };
378    window.addEventListener(AUTH_CHANGED_EVENT, sync);
379    sync();
380  })();
381</script>
381 <section class="py-8 sm:py-12" aria-labelledby="highlights-title"> <div class="container-x"> <h2 id="highlights-title" class="sr-only">Quick stats</h2> <div class="reveal grid gap-3 sm:grid-cols-2 lg:grid-cols-4"> <div class="card flex flex-col gap-1.5"> <span class="font-display text-3xl font-semibold tracking-tight text-gradient sm:text-4xl"> 10s · up to 40s </span> <span class="text-sm font-medium text-zinc-400">Clip length</span> </div><div class="card flex flex-col gap-1.5"> <span class="font-display text-3xl font-semibold tracking-tight text-gradient sm:text-4xl"> 4K </span> <span class="text-sm font-medium text-zinc-400">Max output</span> </div><div class="card flex flex-col gap-1.5"> <span class="font-display text-3xl font-semibold tracking-tight text-gradient sm:text-4xl"> 16:9 · 9:16 · 1:1 </span> <span class="text-sm font-medium text-zinc-400">Aspect ratios</span> </div><div class="card flex flex-col gap-1.5"> <span class="font-display text-3xl font-semibold tracking-tight text-gradient sm:text-4xl"> Aug 2026 </span> <span class="text-sm font-medium text-zinc-400">Latest release</span> </div> </div> </div> </section> <section id="showcase" class="py-20 sm:py-28" aria-labelledby="showcase-title"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Official demos</span> <h2 id="showcase-title" class="section-title">See what Gemini Omni actually outputs</h2> <p class="section-desc">Every clip below is embedded straight from Google&#39;s official Gemini Omni product page: text-to-video, image-to-video, style transfer, chat editing, video-to-video and the AI avatar — the full capability surface.</p> <p class="mt-3 text-xs text-zinc-500">All demo videos are © Google, used here for informational aggregation; streamed directly from storage.googleapis.com/gweb-gemini-cdn.</p> </div> <figure class="reveal mt-12 overflow-hidden rounded-3xl border border-white/10 bg-white/[0.03] shadow-glow"> <div class="aspect-video w-full bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/1f9fd2cb30c7d122190623587be5b7a3e3ce57c1.mp4" autoplay loop muted playsinline preload="metadata" controls aria-label="Speak it. See it. Share it."></video> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-5 py-4 sm:flex-row sm:items-center sm:justify-between"> <div> <h3 class="font-display text-base font-semibold text-zinc-50">Speak it. See it. Share it.</h3> <p class="text-sm text-zinc-400">Gemini Omni&#39;s main hero reel: create, remix and edit videos through conversation.</p> </div> <a href="https://gemini.google/overview/video-generation/" target="_blank" rel="noopener" class="chip border-violet-400/30 text-violet-200 transition-colors hover:border-violet-300/60"> View the official page <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </a> </figcaption> </figure> <div class="reveal mt-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-3"> <figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/bf4a94fc524fb19019b69904a039d3f41da54d50.mp4" loop muted playsinline preload="none" controls aria-label="Step into the story"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> Text → video </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Step into the story</h3> <p class="text-xs leading-relaxed text-zinc-400">A single text prompt produces a multi-shot clip with cohesive environment and camera language.</p> </figcaption> </figure><figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/93742adbdb2db0609cecdc306526c1bb0de2c712.mp4" loop muted playsinline preload="none" controls aria-label="Bring photos to life"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> Image → video </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Bring photos to life</h3> <p class="text-xs leading-relaxed text-zinc-400">Upload reference images and Omni drives the motion, filling in the timeline automatically.</p> </figcaption> </figure><figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/35e529bc0795a3e8a08eabd3aca7b69c116526b4.mp4" loop muted playsinline preload="none" controls aria-label="Keep the soul of the shot"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> Style · template </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Keep the soul of the shot</h3> <p class="text-xs leading-relaxed text-zinc-400">Swap backgrounds, change the wardrobe or transfer styles — your subject keeps its details.</p> </figcaption> </figure><figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/c474731c2a15d74ac9ed3c3ee3702e0cd3d849ad.mp4" loop muted playsinline preload="none" controls aria-label="Remix an existing clip"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> Video → video </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Remix an existing clip</h3> <p class="text-xs leading-relaxed text-zinc-400">Re-cast an existing piece of footage in a new style — lighting, lens or even material rewritten by prompt.</p> </figcaption> </figure><figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/2a4a531c10b8aa4c5bf7ed5dc5503b6b64047775.mp4" loop muted playsinline preload="none" controls aria-label="Easy editing"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> Chat editing </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Easy editing</h3> <p class="text-xs leading-relaxed text-zinc-400">Re-cast characters, adjust lighting, stabilise shots — all by chatting, no regeneration needed.</p> </figcaption> </figure><figure class="group overflow-hidden rounded-2xl border border-white/10 bg-white/[0.03] transition-all duration-300 hover:border-violet-400/40 hover:shadow-glow"> <div class="relative aspect-video w-full overflow-hidden bg-black"> <video class="h-full w-full object-cover" src="https://storage.googleapis.com/gweb-gemini-cdn/gemini/uploads/a9a1bbc770e3617245ca5feb3cc3328ce2e81760.mp4" loop muted playsinline preload="none" controls aria-label="Be the star of your own show"></video> <span class="pointer-events-none absolute left-3 top-3 chip border-white/20 bg-black/55 text-[10px] uppercase tracking-[0.16em] text-zinc-100 backdrop-blur"> AI avatar </span> </div> <figcaption class="flex flex-col gap-1 border-t border-white/10 px-4 py-3"> <h3 class="font-display text-sm font-semibold text-zinc-50">Be the star of your own show</h3> <p class="text-xs leading-relaxed text-zinc-400">Set up an AI avatar once, then star in every future video without re-uploading photos.</p> </figcaption> </figure> </div> </div> </section> 
381<script type="module">if(typeof window<"u"&&"IntersectionObserver"in window){const i=document.querySelectorAll('#showcase video[preload="none"]'),n=new IntersectionObserver(o=>{o.forEach(t=>{const e=t.target;t.isIntersecting?(e.preload="metadata",e.paused&&e.play().catch(()=>{})):e.paused||e.pause()})},{rootMargin:"0px",threshold:.35});i.forEach(o=>n.observe(o))}</script>
381 <section id="features" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Capabilities</span> <h2 class="section-title">The whole pipeline collapses into one model</h2> <p class="section-desc">Unlike specialised video models such as Veo, Sora 2, Seedance 2.0 or Kling, Gemini Omni keeps language reasoning, image generation, video generation and audio synthesis under one architecture.</p> </div> <div class="mt-12 grid gap-4 sm:grid-cols-2 lg:grid-cols-3"> <article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M3 12a9 9 0 1 1 18 0a9 9 0 0 1-18 0Zm9-6v12M6 12h12"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">Native multimodal output</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">A single prompt produces matching text, keyframes and video, with consistent characters, style and lighting carrying across formats.</p> </div> </article><article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 7h16v10H4zM8 7V4h8v3M8 17v3h8v-3"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">One unified Gemini stack</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">No more chaining of specialised models. Text, image, video and audio share the same weights and the same long context.</p> </div> </article><article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 9h3l5-4v14l-5-4H4zM16 8a5 5 0 0 1 0 8M19 5a9 9 0 0 1 0 14"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">Synced native audio</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Ambient sound, score and dialogue are aligned with the picture in the same forward pass — footsteps land on the beat, lips match speech on first export.</p> </div> </article><article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 5h13l3 3v11H4zM9 13l2 2 5-5"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">Direct in-chat editing</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Swap an object, change the lighting, adjust a camera move in natural language — no full regeneration, echoing the Nano Banana editing playbook.</p> </div> </article><article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 12a8 8 0 0 1 14-5l2-2M20 12a8 8 0 0 1-14 5l-2 2M16 5h4v4M8 19H4v-4"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">Remix and steer</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Upload an existing clip and redirect it with prompts. Reference images, videos and audio can be combined in a single instruction.</p> </div> </article><article class="reveal card group flex flex-col gap-4"> <span class="grid h-10 w-10 place-items-center rounded-xl border border-white/10 bg-white/[0.04] text-violet-300 transition-colors group-hover:border-violet-400/40 group-hover:text-violet-200"> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 5h7v7H4zM13 5h7v4h-7zM13 11h7v9h-7zM4 14h7v6H4z"></path> </svg> </span> <div> <h3 class="font-display text-lg font-semibold text-zinc-50">Templates &amp; styles</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Built-in templates for product ads, Reels, music videos and cinematic shorts lower the floor for first-time users while keeping camera language consistent.</p> </div> </article> </div> </div> </section> <section id="specs" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Specs</span> <h2 class="section-title">Official Omni 1.1 Flash specs</h2> <p class="section-desc">Figures below follow Google&#39;s August 27, 2026 production launch of gemini-omni-1.1-flash. Available via Google AI Studio and Gemini Enterprise Agent Platform.</p> </div> <div class="reveal mt-12 overflow-hidden rounded-2xl border border-white/10 bg-white/[0.02] backdrop-blur-sm"> <table class="w-full text-left text-sm"> <thead class="bg-white/[0.04] text-xs uppercase tracking-[0.16em] text-zinc-400"> <tr> <th class="w-1/3 px-5 py-4 font-semibold">Dimension</th> <th class="px-5 py-4 font-semibold">Known signal</th> </tr> </thead> <tbody class="divide-y divide-white/5"> <tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Model family</td> <td class="px-5 py-4 text-zinc-300 align-top "> Google Gemini Omni — 1.1 Flash is the production-ready release </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Model ID</td> <td class="px-5 py-4 text-zinc-300 align-top font-mono text-[13px]"> gemini-omni-1.1-flash </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Clip length</td> <td class="px-5 py-4 text-zinc-300 align-top "> Up to 10 seconds per generation · up to 40 seconds with scene extensions (10-second increments) </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Resolution</td> <td class="px-5 py-4 text-zinc-300 align-top "> 360p draft · 720p standard · 1080p · 4K upscale </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Aspect ratios</td> <td class="px-5 py-4 text-zinc-300 align-top "> 16:9, 9:16, 1:1 </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Audio</td> <td class="px-5 py-4 text-zinc-300 align-top "> Native synced audio on output · API audio references not supported yet </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Inputs</td> <td class="px-5 py-4 text-zinc-300 align-top "> Text / image / video (API audio reference not yet supported) </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">Access</td> <td class="px-5 py-4 text-zinc-300 align-top "> Gemini app, Google Flow, YouTube Shorts/Create, Google Vids · developers via Gemini API, Google AI Studio and Gemini Enterprise Agent Platform </td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 font-medium text-zinc-200 align-top">API pricing</td> <td class="px-5 py-4 text-zinc-300 align-top "> $0.10 per second of video output (same as Veo 3.1 Fast) </td> </tr> </tbody> </table> </div> </div> </section> <section id="architecture" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Architecture</span> <h2 class="section-title">Three product lines collapse into one Omni</h2> <p class="section-desc">Google&#39;s generative stack used to be split across Veo for video, Nano Banana / Imagen for image and Gemini for text. Omni rolls those into a single architecture.</p> </div> <div class="reveal mt-12 grid items-center gap-8 lg:grid-cols-[1fr_auto_1fr]"> <div> <p class="mb-4 text-xs font-semibold uppercase tracking-[0.18em] text-zinc-500">Before</p> <div class="space-y-3"> <div class="rounded-2xl border bg-gradient-to-br from-indigo-500/15 to-indigo-500/5 text-indigo-200 border-indigo-400/30 px-5 py-4 backdrop-blur"> <p class="font-display text-base font-semibold">Veo 3.1</p> <p class="mt-1 text-sm opacity-80">Video + native audio</p> </div><div class="rounded-2xl border bg-gradient-to-br from-fuchsia-500/15 to-fuchsia-500/5 text-fuchsia-200 border-fuchsia-400/30 px-5 py-4 backdrop-blur"> <p class="font-display text-base font-semibold">Nano Banana / Imagen</p> <p class="mt-1 text-sm opacity-80">Image generation &amp; editing</p> </div><div class="rounded-2xl border bg-gradient-to-br from-cyan-500/15 to-cyan-500/5 text-cyan-200 border-cyan-400/30 px-5 py-4 backdrop-blur"> <p class="font-display text-base font-semibold">Gemini 2.5 / 3.x</p> <p class="mt-1 text-sm opacity-80">Reasoning · long context</p> </div> </div> </div> <div class="flex justify-center lg:flex-col lg:gap-2"> <div class="hidden lg:flex flex-col items-center gap-1 text-zinc-500"> <span class="h-12 w-px bg-gradient-to-b from-transparent via-white/30 to-transparent"></span> <svg viewBox="0 0 24 24" class="h-5 w-5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" d="M12 5v14M6 13l6 6 6-6"></path> </svg> <span class="h-12 w-px bg-gradient-to-b from-transparent via-white/30 to-transparent"></span> </div> <div class="flex lg:hidden items-center gap-1 text-zinc-500"> <span class="h-px w-12 bg-gradient-to-r from-transparent via-white/30 to-transparent"></span> <svg viewBox="0 0 24 24" class="h-5 w-5 rotate-90" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" d="M12 5v14M6 13l6 6 6-6"></path> </svg> <span class="h-px w-12 bg-gradient-to-r from-transparent via-white/30 to-transparent"></span> </div> </div> <div> <p class="mb-4 text-xs font-semibold uppercase tracking-[0.18em] text-violet-300">Now · Omni</p> <div class="relative overflow-hidden rounded-2xl border border-violet-400/30 bg-gradient-to-br from-violet-500/20 via-indigo-500/10 to-cyan-400/10 p-6 backdrop-blur"> <div class="absolute -right-12 -top-12 h-48 w-48 rounded-full bg-violet-500/30 blur-3xl"></div> <div class="relative"> <p class="font-display text-2xl font-semibold text-white">Gemini Omni</p> <p class="mt-2 text-sm leading-relaxed text-zinc-200/90">Text · image · video · audio, one model, one prompt</p> <div class="mt-5 flex flex-wrap gap-2"> <span class="chip border-violet-400/30 text-violet-100">Text</span> <span class="chip border-cyan-400/30 text-cyan-100">Image</span> <span class="chip border-indigo-400/30 text-indigo-100">Video</span> <span class="chip border-fuchsia-400/30 text-fuchsia-100">Audio</span> </div> </div> </div> </div> </div> </div> </section> <section id="cases" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Use cases</span> <h2 class="section-title">From a single brief to publishable content</h2> <p class="section-desc">A unified model with long context and synced audio means teams can write one coherent brief and walk away with a finished cut.</p> </div> <div class="mt-12 grid gap-4 sm:grid-cols-2 lg:grid-cols-3"> <article class="reveal card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M3 7h18M3 12h12M3 17h18"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">01</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Product ads</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Hero shots, packaging reveals and lifestyle cuts shipped with ambient audio already locked.</p> </div> </div> </article><article class="reveal card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M7 3h10v18H7zM10 7h4"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">02</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Reels &amp; Shorts</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Vertical 9:16 clips with on-mic dialogue and beat-synced motion, built for scroll-stopping social.</p> </div> </div> </article><article class="reveal card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M9 19V6l11-2v13M9 14a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm11 0a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">03</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Music videos</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Reference a track and Omni cuts visuals to the beat, keeping a consistent character across shots.</p> </div> </div> </article><article class="reveal card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M3 6h18v12H3zM7 3v3M17 3v3M7 21v-3M17 21v-3"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">04</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Cinematic shorts</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Chain multiple 10-second omni-clips into multi-shot sequences with continuous lighting and audio bed.</p> </div> </div> </article><article class="revea
381l card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 6h16v12H4zM9 12l4 3-4 3z"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">05</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Landing-page hero loops</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Loopable 16:9 atmospheric clips for SaaS, fashion and DTC sites — branded and silent-friendly.</p> </div> </div> </article><article class="reveal card group relative overflow-hidden"> <div class="absolute right-0 top-0 h-24 w-24 -translate-y-8 translate-x-8 rounded-full bg-violet-500/10 blur-2xl transition-opacity group-hover:opacity-100"></div> <div class="relative flex items-start gap-4"> <span class="grid h-9 w-9 shrink-0 place-items-center rounded-lg border border-white/10 bg-white/[0.04] text-cyan-300"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M4 5h16v10H4zM8 19h8M12 15v4"></path> </svg> </span> <div> <div class="flex items-center gap-2"> <span class="font-mono text-xs text-zinc-500">06</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Explainers &amp; tutorials</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Turn a script into a narrated sequence with lip-synced dialogue and matching ambient sound.</p> </div> </div> </article> </div> </div> </section> <section id="comparison" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Compare</span> <h2 class="section-title">Where Omni sits in the 2026 video stack</h2> <p class="section-desc">Aggregated from Artificial Analysis, Looksy AI, Oimi AI and the official keynotes — for orientation, not benchmark scores.</p> </div> <div class="reveal mt-12 overflow-x-auto rounded-2xl border border-white/10 bg-white/[0.02] backdrop-blur-sm"> <table class="w-full min-w-[720px] text-left text-sm"> <thead class="bg-white/[0.04] text-xs uppercase tracking-[0.16em] text-zinc-400"> <tr> <th class="px-5 py-4 font-semibold">Model</th> <th class="px-5 py-4 font-semibold">Maker</th> <th class="px-5 py-4 font-semibold">Architecture</th> <th class="px-5 py-4 font-semibold">Native audio</th> <th class="px-5 py-4 font-semibold">Clip length</th> </tr> </thead> <tbody class="divide-y divide-white/5"> <tr class="transition-colors bg-gradient-to-r from-violet-500/10 to-cyan-400/5 hover:from-violet-500/15"> <td class="px-5 py-4 align-top"> <div class="flex items-center gap-2"> <span class="font-display font-semibold text-white">Gemini Omni</span> <span class="rounded-full border border-violet-400/40 bg-violet-500/20 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wider text-violet-100">
382Omni
383</span> </div> </td> <td class="px-5 py-4 align-top text-zinc-400">Google</td> <td class="px-5 py-4 align-top text-zinc-300">Unified omni (video + image + audio)</td> <td class="px-5 py-4 align-top text-zinc-300">Synced in one pass</td> <td class="px-5 py-4 align-top text-zinc-300">10s · up to 40s</td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 align-top"> <div class="flex items-center gap-2"> <span class="font-display font-semibold text-zinc-100">Veo 3.1</span>  </div> </td> <td class="px-5 py-4 align-top text-zinc-400">Google</td> <td class="px-5 py-4 align-top text-zinc-300">Specialised video model</td> <td class="px-5 py-4 align-top text-zinc-300">Yes</td> <td class="px-5 py-4 align-top text-zinc-300">~8s</td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 align-top"> <div class="flex items-center gap-2"> <span class="font-display font-semibold text-zinc-100">Seedance 2.0</span>  </div> </td> <td class="px-5 py-4 align-top text-zinc-400">ByteDance</td> <td class="px-5 py-4 align-top text-zinc-300">Specialised multi-modal video</td> <td class="px-5 py-4 align-top text-zinc-300">Yes</td> <td class="px-5 py-4 align-top text-zinc-300">up to 15s / shot</td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 align-top"> <div class="flex items-center gap-2"> <span class="font-display font-semibold text-zinc-100">Sora 2</span>  </div> </td> <td class="px-5 py-4 align-top text-zinc-400">OpenAI</td> <td class="px-5 py-4 align-top text-zinc-300">Specialised video model</td> <td class="px-5 py-4 align-top text-zinc-300">Yes</td> <td class="px-5 py-4 align-top text-zinc-300">~20s</td> </tr><tr class="transition-colors hover:bg-white/[0.03]"> <td class="px-5 py-4 align-top"> <div class="flex items-center gap-2"> <span class="font-display font-semibold text-zinc-100">Kling V3.0</span>  </div> </td> <td class="px-5 py-4 align-top text-zinc-400">Kuaishou</td> <td class="px-5 py-4 align-top text-zinc-300">Specialised video model</td> <td class="px-5 py-4 align-top text-zinc-300">Limited</td> <td class="px-5 py-4 align-top text-zinc-300">~10s</td> </tr> </tbody> </table> </div> </div> </section> <section id="free" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Free access</span> <h2 class="section-title">Is Gemini Omni free? How to use it for free in 2026</h2> <p class="section-desc">Gemini Omni Flash is free on Google Flow&#39;s free tier, YouTube Shorts and the YouTube Create app. The standalone Gemini app needs Google AI Plus, Pro or Ultra. Open the official surfaces below.</p> </div> <div class="reveal mt-12 grid gap-4 sm:grid-cols-2"> <a href="https://labs.google/fx/tools/flow" target="_blank" rel="noopener" class="card group flex flex-col gap-3 border-emerald-400/30 hover:border-emerald-400/50"> <div class="flex items-center justify-between gap-3"> <span class="font-mono text-xs uppercase tracking-[0.16em] text-zinc-500">labs.google</span> <span class="chip text-[10px] uppercase tracking-wider border-emerald-400/40 bg-emerald-500/10 text-emerald-200"> Free </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Google Flow · Free tier + plans</h3> <p class="text-sm leading-relaxed text-zinc-400">Google&#39;s AI filmmaking studio. The free tier includes Gemini Omni Flash with usage limits; upgrade to Plus / Pro / Ultra for higher limits and pro tools.</p> <span class="mt-auto inline-flex items-center gap-1 text-xs font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Open <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </a><a href="https://www.youtube.com/shorts" target="_blank" rel="noopener" class="card group flex flex-col gap-3 border-emerald-400/30 hover:border-emerald-400/50"> <div class="flex items-center justify-between gap-3"> <span class="font-mono text-xs uppercase tracking-[0.16em] text-zinc-500">youtube.com</span> <span class="chip text-[10px] uppercase tracking-wider border-emerald-400/40 bg-emerald-500/10 text-emerald-200"> Free </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">YouTube Shorts · Free Gemini Omni</h3> <p class="text-sm leading-relaxed text-zinc-400">Generate Gemini Omni Flash clips inside Shorts at no cost. The cheapest official way to try Omni for free.</p> <span class="mt-auto inline-flex items-center gap-1 text-xs font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Open <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </a><a href="https://www.youtube.com/create" target="_blank" rel="noopener" class="card group flex flex-col gap-3 border-emerald-400/30 hover:border-emerald-400/50"> <div class="flex items-center justify-between gap-3"> <span class="font-mono text-xs uppercase tracking-[0.16em] text-zinc-500">youtube.com</span> <span class="chip text-[10px] uppercase tracking-wider border-emerald-400/40 bg-emerald-500/10 text-emerald-200"> Free </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">YouTube Create App · Free mobile editor</h3> <p class="text-sm leading-relaxed text-zinc-400">Mobile-first editor with Gemini Omni Flash built in. No AI subscription required.</p> <span class="mt-auto inline-flex items-center gap-1 text-xs font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Open <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </a><a href="https://gemini.google.com/" target="_blank" rel="noopener" class="card group flex flex-col gap-3 "> <div class="flex items-center justify-between gap-3"> <span class="font-mono text-xs uppercase tracking-[0.16em] text-zinc-500">gemini.google.com</span> <span class="chip text-[10px] uppercase tracking-wider border-amber-400/30 bg-amber-500/10 text-amber-200"> Paid plan </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Gemini app · Plus / Pro / Ultra</h3> <p class="text-sm leading-relaxed text-zinc-400">Use Omni inside the official Gemini app. Requires a Google AI Plus, Pro or Ultra plan.</p> <span class="mt-auto inline-flex items-center gap-1 text-xs font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Open <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </a> </div>
383 <div class="reveal mt-10 grid gap-4 rounded-3xl border border-white/10 bg-white/[0.03] p-7 backdrop-blur-sm sm:grid-cols-[1.4fr_1fr] sm:items-center"> <div> <h3 class="font-display text-lg font-semibold text-white">How to generate Gemini Omni videos for free</h3> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Fastest free path: sign in to YouTube Shorts or the YouTube Create app, pick a template and prompt with the same multi-shot hooks the Gemini app uses.</p> <ul class="mt-4 grid gap-2 text-sm text-zinc-300"> <li class="flex items-start gap-2"> <svg viewBox="0 0 24 24" class="mt-0.5 h-4 w-4 shrink-0 text-emerald-300" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l4.5 4.5L19 7"></path> </svg> <span>Draft for free in YouTube Shorts to lock camera language and pacing.</span> </li> <li class="flex items-start gap-2"> <svg viewBox="0 0 24 24" class="mt-0.5 h-4 w-4 shrink-0 text-emerald-300" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l4.5 4.5L19 7"></path> </svg> <span>Move to a Google AI Plus or Pro plan only when you need brand-grade output.</span> </li> <li class="flex items-start gap-2"> <svg viewBox="0 0 24 24" class="mt-0.5 h-4 w-4 shrink-0 text-emerald-300" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l4.5 4.5L19 7"></path> </svg> <span>Use in-chat editing instead of re-running to stretch every paid credit further.</span> </li> </ul> </div> <div class="flex flex-col gap-3"> <a href="/blog/is-gemini-omni-free/" class="btn-primary justify-center"> Read the free-access guide <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6"></path> </svg> </a> <a href="/pricing/" class="btn-ghost justify-center">Compare paid plans</a> <a href="/blog/gemini-omni-pricing-plans-cost/" class="text-center text-xs text-zinc-500 underline-offset-4 hover:text-zinc-300 hover:underline"> Read the full pricing breakdown </a> <a href="/prompt-generator/" class="text-center text-xs text-zinc-500 underline-offset-4 hover:text-zinc-300 hover:underline"> Open the free prompt builder </a> </div> </div> <p class="reveal mt-6 text-center text-xs text-zinc-500">Free quotas and prices change by region and account. Always confirm on the official surfaces linked above.</p> </div> </section> <section id="timeline" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Timeline</span> <h2 class="section-title">From the first leak to launch — and what ships next</h2> <p class="section-desc">Ordered by public report date. Updated through the August 27, 2026 Omni 1.1 Flash production launch.</p> </div> <ol class="reveal relative mt-12 space-y-6 border-l border-white/10 pl-6 sm:pl-8"> <li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 05 · 02</span> <h3 class="font-display text-lg font-semibold text-zinc-50">First &quot;Powered by Omni&quot; string</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">X user @Thomas16937378 spotted &quot;Start with an idea or try a template. Powered by Omni.&quot; inside the Gemini video tab.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 05 · 11</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Full preview card inside Gemini mobile</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">TestingCatalog and Chetaslua surfaced the &quot;Meet our new video model&quot; card, the full model ID and the 10-second clip cap.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 05 · 12 – 18</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Demos circulate in the wild</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">A &quot;professor solving trig on a chalkboard&quot; clip showcased text coherence and physical fidelity, sparking heavy comparison with Veo 3.1.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 05 · 19</span> <h3 class="font-display text-lg font-semibold text-zinc-50">
383Official launch at Google I/O 2026</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Gemini Omni Flash goes live globally inside the Gemini app, Google Flow, YouTube Shorts Remix and YouTube Create — 10‑second clips, paid surfaces from $7.99/mo AI Plus and free on YouTube.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 05 · 19 onward</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Avatars, character consistency and conversational editing</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Launch ships with a personal AI Avatar, persistent character identity across scenes, physics‑aware rendering and chat‑style multi‑turn editing — every clip carries an imperceptible SynthID watermark.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-white/20"></span> <div class="card "> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 06 · 30</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Omni Flash API public preview for developers</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Model ID gemini-omni-flash-preview lands in Google AI Studio, the Gemini API and Gemini Enterprise Agent Platform at $0.10 per second of video output — same rate as Veo 3.1 Fast. Conversational editing and multimodal references (text, image, video) are supported; API audio references are not yet.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-gradient-to-br from-violet-400 to-cyan-400 shadow-glow"></span> <div class="card border-violet-400/30"> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">2026 · 08 · 27</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Gemini Omni 1.1 Flash production launch</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Model ID gemini-omni-1.1-flash goes production-ready via Google AI Studio and Gemini Enterprise Agent Platform. New capabilities: scene extensions up to 40 seconds, first and last frame specification, 360p draft mode (60% faster, 1/3 cost), 4K upscaling, and video references. Integrated by Adobe Firefly, Figma Weave, Runway and more.</p> </div> </li><li class="relative"> <span class="absolute -left-[33px] sm:-left-[37px] grid h-4 w-4 place-items-center rounded-full ring-4 ring-ink-950 bg-gradient-to-br from-violet-400 to-cyan-400 shadow-glow"></span> <div class="card border-violet-400/30"> <div class="flex flex-wrap items-baseline gap-3"> <span class="font-mono text-xs uppercase tracking-[0.18em] text-violet-300">On the roadmap</span> <h3 class="font-display text-lg font-semibold text-zinc-50">Gemini Omni Pro wider rollout + image &amp; audio outputs</h3> </div> <p class="mt-2 text-sm leading-relaxed text-zinc-400">Google has announced a broader rollout of Gemini Omni Pro beyond the Ultra preview, along with image and audio output modalities beyond the current video-first launch — the full &#39;any input → any output&#39; promise.</p> </div> </li> </ol> </div> </section> <section id="faq" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">FAQ</span> <h2 class="section-title">The questions people ask most about Gemini Omni</h2> </div> <div class="reveal mt-12 grid gap-3 lg:grid-cols-2"> <details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">What exactly is Gemini Omni?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Gemini Omni is Google&#39;s unified multimodal family. The production model is Gemini Omni 1.1 Flash (gemini-omni-1.1-flash), which generates video with 
383native synced audio from text, image and video inputs inside one architecture. It supports scene extensions up to 40 seconds, first/last frame control, 360p drafts, and 4K upscaling.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">Is Gemini Omni free?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Partly. Gemini Omni Flash is free on Google Flow&#39;s free tier, YouTube Shorts and the YouTube Create app. Using Omni inside the standalone Gemini app requires a paid Google AI Plus, Pro or Ultra plan.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">How much does Gemini Omni cost?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Google AI Plus starts around US$7.99 per month, AI Pro is the most common creator tier, and AI Ultra is roughly US$100 per month. Two Omni Flash generations consume about 86% of the AI Pro daily quota, so budget retries carefully. The developer API will arrive with its own pricing.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">When will it ship?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">It already shipped. Google announced Gemini Omni on the Google I/O 2026 main stage on May 19, 2026, simultaneously publishing the official product page and demo videos.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">How does it relate to Veo 3.1?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Gemini Omni is the successor to Veo inside the Gemini app — Google explicitly says Omni &quot;will replace Veo in the Gemini app&quot;. The video stack is now folded into the same architecture as Gemini text and image.</p> </details>
383<details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">Does it really generate sound?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Yes. Ambient sound, score and dialogue are produced in the same pass as the video — that&#39;s the whole reason for the &#39;omni&#39; name.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">What is the current clip-length limit?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Single clips are up to 10 seconds, with scene extensions allowing up to 40 seconds total (10-second increments). Supports native audio, up to 5 photo references, video references up to 3 seconds, and multi-turn editing. Draft in 360p or upscale to 4K.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">How will pricing work?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">Gemini Omni requires a Google AI Plus, Pro or Ultra plan and you must be 18+. Some features (avatars, video-to-video editing) may be restricted in certain countries.</p> </details><details class="group rounded-2xl border border-white/10 bg-white/[0.03] p-5 backdrop-blur-sm transition-colors hover:border-violet-400/30 open:border-violet-400/40 open:bg-white/[0.05]"> <summary class="flex cursor-pointer list-none items-start justify-between gap-4 text-left"> <span class="font-display text-base font-semibold text-zinc-50">What is the Gemini Omni AI avatar?</span> <span class="mt-1 grid h-6 w-6 shrink-0 place-items-center rounded-full border border-white/15 text-zinc-300 transition-transform group-open:rotate-45"> <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 5v14M5 12h14"></path> </svg> </span> </summary> <p class="mt-3 text-sm leading-relaxed text-zinc-400">An optional digital version of you that lets Gemini generate videos which look and sound like you, with no need to re-upload photos each time — and only you can use your own avatar.</p> </details> </div> </div> </section> <section id="sources" class="py-20 sm:py-28"> <div class="container-x"> <div class="reveal max-w-3xl"> <span class="section-eyebrow">Sources</span> <h2 class="section-title">Primary reports and public links</h2> <p class="section-desc">Everything on this page is aggregated from the public sources below. Cross-reading is recommended.</p> </div> <div class="mt-12 grid gap-4 sm:grid-cols-2"> <a href="https://blog.google/intl/en-africa/products/explore-get-answers/gemini-omni/" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">blog.google</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Google Blog · Introducing Gemini Omni</h3> <p class="text-sm leading-relaxed text-zinc-400">The official announcement post detailing the Omni Flash launch, capabilities, surfaces and rollout plan.</p> </a><a href="https://blog.google/innovation-and-ai/technology/ai/google-io-2026-all-our-announcements/" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">blog.google</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Google Blog · 100 things from Google I/O 2026</h3> <p class="text-sm leading-relaxed text-zinc-400">Full I/O 2026 recap covering Gemini Omni, the new $100 AI Ultra tier and surrounding launches.</p> </a><a href="https://gemini.google/overview/video-generation/" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">gemini.google</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Google · Official Gemini Omni page</h3> <p class="text-sm leading-relaxed text-zinc-400">
383The official launch page with demo videos, capability tour, supported plans and rollout details.</p> </a><a href="https://www.datacamp.com/blog/google-i-o-2026" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">datacamp.com</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">DataCamp · Google I/O 2026 deep dive</h3> <p class="text-sm leading-relaxed text-zinc-400">Independent analyst overview of how Omni collapses the Veo + Imagen stack into a single model and what is shipping now vs. next.</p> </a><a href="https://programminginsider.com/googles-gemini-omni-just-surfaced-heres-what-the-new-video-model-can-do/" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">programminginsider.com</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">TestingCatalog · Programming Insider report</h3> <p class="text-sm leading-relaxed text-zinc-400">Leak details, UI strings and early demo analysis.</p> </a><a href="https://officechai.com/ai/gemini-omni/" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">officechai.com</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">OfficeChai · Gemini Omni Spotted</h3> <p class="text-sm leading-relaxed text-zinc-400">Full model ID, in-app prompts and community reactions.</p> </a><a href="https://looksyai.in/features/gemini-omni" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">looksyai.in</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Looksy AI · Gemini Omni product page</h3> <p class="text-sm leading-relaxed text-zinc-400">Tidy summary of specs, use cases and comparisons.</p> </a><a href="https://storage.googleapis.com/deepmind-media/gemini/gemini_v2_5_report.pdf" target="_blank" rel="noopener" class="reveal card group flex flex-col gap-3"> <div class="flex items-center justify-between text-xs"> <span class="font-mono uppercase tracking-[0.16em] text-zinc-500">storage.googleapis.com</span> <span class="inline-flex items-center gap-1 font-semibold text-violet-300 opacity-0 transition-opacity group-hover:opacity-100"> Read source <svg viewBox="0 0 24 24" class="h-3.5 w-3.5" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M7 17 17 7M9 7h8v8"></path> </svg> </span> </div> <h3 class="font-display text-base font-semibold text-zinc-50 transition-colors group-hover:text-white">Gemini 2.5 technical report</h3> <p class="text-sm leading-relaxed text-zinc-400">Family-level multimodality, long context and the agentic direction.</p> </a> </div> </div> </section>  </main> <footer class="mt-32 border-t border-white/5"> <div class="container-x grid gap-10 py-12 lg:grid-cols-[1.6fr_1fr_1fr]"> <div> <a href="/" class="inline-flex items-center gap-2.5 font-display text-base font-semibold text-white"> <span class="grid h-7 w-7 place-items-center rounded-lg bg-brand-gradient text-ink-950 shadow-glow"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true">
383 <path fill="currentColor" d="M12 2l1.7 7.3L21 11l-7.3 1.7L12 20l-1.7-7.3L3 11l7.3-1.7L12 2z"></path> </svg> </span> <span>Gemini Omni</span> </a> <p class="mt-4 max-w-md text-sm leading-relaxed text-zinc-500">Unofficial info hub. Content is aggregated from public reporting and community leaks. Gemini, Omni and related marks belong to Google.</p> <p class="mt-4 text-sm text-zinc-400"> <span class="text-zinc-500">Contact:</span> <a class="ml-1 text-white hover:underline" href="mailto:[email protected]">[email protected]</a> </p> </div> <div> <h2 class="text-xs font-semibold uppercase tracking-[0.18em] text-zinc-400">Quick links</h2> <ul class="mt-4 grid grid-cols-2 gap-y-2 text-sm text-zinc-400"> <li><a class="hover:text-white" href="/#showcase">Demos</a></li> <li><a class="hover:text-white" href="/#features">Features</a></li> <li><a class="hover:text-white" href="/#specs">Specs</a></li> <li><a class="hover:text-white" href="/#architecture">Architecture</a></li> <li><a class="hover:text-white" href="/#cases">Use cases</a></li> <li><a class="hover:text-white" href="/#comparison">Compare</a></li> <li><a class="hover:text-white" href="/#free">Free vs paid</a></li> <li><a class="hover:text-white" href="/#timeline">Timeline</a></li> <li><a class="hover:text-white" href="/prompt-generator/">Prompt builder</a></li> <li><a class="hover:text-white" href="/video-studio/">Video Studio</a></li> <li><a class="hover:text-white" href="/pricing/">Pricing</a></li> <li><a class="hover:text-white" href="/blog/">Articles</a></li> <li><a class="hover:text-white" href="/#faq">FAQ</a></li> <li><a class="hover:text-white" href="/#sources">Sources</a></li> </ul> </div> <div> <h2 class="text-xs font-semibold uppercase tracking-[0.18em] text-zinc-400">Language</h2> <ul class="mt-4 grid max-h-72 grid-cols-2 gap-y-2 overflow-y-auto overscroll-contain pr-2 text-sm text-zinc-400 sm:grid-cols-3 sm:max-h-64"> <li> <a class="hover:text-white text-white font-medium" href="/" hreflang="en"> English </a> </li><li> <a class="hover:text-white " href="/es/" hreflang="es"> Español </a> </li><li> <a class="hover:text-white " href="/it/" hreflang="it"> Italiano </a> </li><li> <a class="hover:text-white " href="/hi/" hreflang="hi"> हिन्दी </a> </li><li> <a class="hover:text-white " href="/ar/" hreflang="ar"> العربية </a> </li><li> <a class="hover:text-white " href="/zh/" hreflang="zh"> 中文 </a> </li><li> <a class="hover:text-white " href="/ja/" hreflang="ja"> 日本語 </a> </li><li> <a class="hover:text-white " href="/ko/" hreflang="ko"> 한국어 </a> </li><li> <a class="hover:text-white " href="/fr/" hreflang="fr"> Français </a> </li><li> <a class="hover:text-white " href="/de/" hreflang="de"> Deutsch </a> </li><li> <a class="hover:text-white " href="/nl/" hreflang="nl"> Nederlands </a> </li><li> <a class="hover:text-white " href="/pl/" hreflang="pl"> Polski </a> </li><li> <a class="hover:text-white " href="/pt-BR/" hreflang="pt-BR"> Português </a> </li><li> <a class="hover:text-white " href="/ru/" hreflang="ru"> Русский </a> </li><li> <a class="hover:text-white " href="/tr/" hreflang="tr"> Türkçe </a> </li><li> <a class="hover:text-white " href="/id/" hreflang="id"> Bahasa Indonesia </a> </li><li> <a class="hover:text-white " href="/vi/" hreflang="vi"> Tiếng Việt </a> </li><li> <a class="hover:text-white " href="/th/" hreflang="th"> ไทย </a> </li><li> <a class="hover:text-white " href="/ms/" hreflang="ms"> Bahasa Melayu </a> </li><li> <a class="hover:text-white " href="/tl/" hreflang="tl"> Filipino </a> </li><li> <a class="hover:text-white " href="/bn/" hreflang="bn"> বাংলা </a> </li><li> <a class="hover:text-white " href="/ta/" hreflang="ta"> தமிழ் </a> </li><li> <a class="hover:text-white " href="/te/" hreflang="te"> తెలుగు </a> </li><li> <a class="hover:text-white " href="/mr/" hreflang="mr"> मराठी </a> </li><li> <a class="hover:text-white " href="/he/" hreflang="he"> עברית </a> </li><li> <a class="hover:text-white " href="/fa/" hreflang="fa"> فارسی </a> </li><li> <a class="hover:text-white " href="/ur/" hreflang="ur"> اردو </a> </li> </ul> </div> </div> <div class="border-t border-white/5"> <div class="container-x flex flex-col gap-3 py-5 text-xs text-zinc-500 sm:flex-row sm:items-center sm:justify-between"> <div class="flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-4"> <p>© 2026 Gemini Omni Info Hub</p> <nav class="flex flex-wrap gap-x-4 gap-y-1" aria-label="Legal"> <a class="hover:text-white" href="/terms/">Terms of Service</a> <a class="hover:text-white" href="/privacy/">Privacy Policy</a> </nav> </div> <p>Built with Astro · Tailwind</p> </div> </div> </footer> <dialog id="login-modal" class="hidden w-[min(440px,calc(100vw-24px))] rounded-3xl border border-white/10 bg-ink-900/95 p-0 text-zinc-100 shadow-glow backdrop:bg-ink-950/70 backdrop:backdrop-blur-md open:flex open:flex-col" aria-labelledby="login-modal-title"> <div class="relative max-h-[min(720px,90vh)] overflow-y-auto px-7 pb-8 pt-9 sm:px-9"> <button type="button" data-close aria-label="Close" class="absolute right-3 top-3 grid h-9 w-9 place-items-center rounded-full border border-white/10 bg-white/[0.04] text-zinc-300 transition-colors hover:border-violet-400/40 hover:text-white"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M6 6l12 12M18 6L6 18"></path> </svg> </button> <div data-state="form" class="flex flex-col gap-6"> <header class="flex flex-col items-center text-center"> <span class="mb-4 grid h-14 w-14 place-items-center rounded-2xl bg-brand-gradient shadow-glow"> <img src="/favicon.svg" alt="Gemini Omni" class="h-9 w-9" width="36" height="36"> </span> <h2 id="login-modal-title" class="font-display text-2xl font-semibold tracking-tight text-white"> Be first when Gemini Omni opens up </h2> <p class="mt-2 max-w-xs text-sm leading-relaxed text-zinc-400"> Sign in to unlock the prompt builder and credits. Omni 1.1 Flash is production-ready for developers (gemini-omni-1.1-flash). </p> </header> <div class="flex flex-col gap-3"> <div id="gsi-button-container" data-locale="en" data-google-failed="Google sign-in failed. Please try again." class="flex min-h-[44px] items-center justify-center"></div> </div> <div class="relative"> <div class="absolute inset-0 flex items-center" aria-hidden="true"> <div class="w-full border-t border-white/10"></div> </div> <div class="relative flex justify-center"> <span class="bg-ink-900/95 px-3 text-xs uppercase tracking-[0.25em] text-zinc-500"> or </span> </div> </div> <div data-step="email" class="flex flex-col gap-3"> <label class="text-xs font-semibold uppercase tracking-[0.18em] text-zinc-400" for="login-email"> Email </label> <input id="login-email" type="email" autocomplete="email" inputmode="email" placeholder="[email protected]" class="w-full rounded-xl border border-white/10 bg-white/[0.04] px-4 py-3 text-sm text-white outline-none ring-2 ring-transparent transition-all placeholder:text-zinc-500 focus:border-violet-400/40 focu
383s:ring-violet-400/20"> <button type="button" data-action="send-code" data-invalid-email="Please enter a valid email address." data-send-failed="Failed to send code. Please try again." class="btn-primary w-full justify-center"> <span data-label-idle>Send code</span> <span data-label-loading hidden class="flex items-center gap-2"> <span class="inline-block h-3.5 w-3.5 animate-spin rounded-full border-2 border-white/70 border-t-transparent"></span> Sending… </span> </button> </div> <div data-step="code" hidden class="flex flex-col gap-3"> <div class="flex items-center justify-between"> <label class="text-xs font-semibold uppercase tracking-[0.18em] text-zinc-400" for="login-code"> Verification code </label> <button type="button" data-action="change-email" class="text-xs font-semibold text-violet-300 transition-colors hover:text-violet-200"> Change email </button> </div> <p class="rounded-xl border border-white/5 bg-white/[0.03] px-3 py-2 text-xs text-zinc-400"> <span>We sent a 6-digit code to</span> <span data-code-email class="ml-1 font-semibold text-zinc-100"></span> </p> <input id="login-code" type="text" inputmode="numeric" autocomplete="one-time-code" maxlength="6" placeholder="000000" class="w-full rounded-xl border border-white/10 bg-white/[0.04] px-4 py-4 text-center text-2xl font-semibold tracking-[0.6em] text-white outline-none ring-2 ring-transparent transition-all placeholder:text-zinc-600 focus:border-violet-400/40 focus:ring-violet-400/20"> <button type="button" data-action="verify" data-verify-failed="Invalid or expired code." class="btn-primary w-full justify-center"> <span data-label-idle>Verify &amp; sign in</span> <span data-label-loading hidden class="flex items-center gap-2"> <span class="inline-block h-3.5 w-3.5 animate-spin rounded-full border-2 border-white/70 border-t-transparent"></span> Verifying… </span> </button> <div class="text-center text-xs text-zinc-400"> <button type="button" data-action="resend" data-template="Resend in {n}s" class="font-semibold text-violet-300 transition-colors hover:text-violet-200 disabled:cursor-not-allowed disabled:text-zinc-500 disabled:hover:text-zinc-500"> <span data-resend-idle>Resend code</span> <span data-resend-countdown hidden></span> </button> </div> </div> <p data-error hidden class="rounded-xl border border-rose-500/30 bg-rose-500/10 px-3 py-2 text-sm text-rose-200"></p> <p class="text-center text-xs leading-relaxed text-zinc-500"> By signing in, you agree to our <a href="/terms/" class="text-zinc-300 underline decoration-zinc-600 underline-offset-2 hover:text-white">Terms of Service</a> and <a href="/privacy/" class="text-zinc-300 underline decoration-zinc-600 underline-offset-2 hover:text-white">Privacy Policy</a> </p> </div> <div data-state="success" hidden class="flex flex-col items-center gap-5 py-4 text-center"> <span class="grid h-16 w-16 place-items-center rounded-full bg-emerald-500/15 text-emerald-300 ring-1 ring-emerald-400/40"> <svg viewBox="0 0 24 24" class="h-8 w-8" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" d="M5 12l4.5 4.5L19 7"></path> </svg> </span> <h2 class="font-display text-2xl font-semibold tracking-tight text-white"> You&#39;re signed in </h2> <p class="max-w-xs text-sm leading-relaxed text-zinc-400"> You can close this and keep exploring. Try the prompt builder when you are ready. </p> <p data-success-user class="text-sm font-semibold text-zinc-200"></p> <div class="flex w-full flex-col items-stretch gap-2 sm:flex-row sm:justify-center sm:gap-3"> <a href="/prompt-generator/" class="btn-primary justify-center"> Open the prompt builder <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6"></path> </svg> </a> <button type="button" data-close class="btn-ghost justify-center"> Close </button> </div> </div> </div> </dialog> 
383<script>(function(){const API_BASE = "https://www.gushanai.com/api";
384const APP_KEY = "gemini_omni_4561";
385const GOOGLE_CLIENT_ID = "463343176094-ptfq906flrtlronsfq8c4omvui6dtck2.apps.googleusercontent.com";
386const HTML_LANG = "en";
387
388  (() => {
389    if (typeof window === 'undefined') return;
390    const dialog = document.getElementById('login-modal');
391    if (!(dialog instanceof HTMLDialogElement)) return;
392
393    const AUTH_TOKEN_KEY = 'auth_token';
394    const USER_INFO_KEY = 'user_info';
395    const AUTH_CHANGED_EVENT = 'gemini-omni:auth-changed';
396
397    const formRoot = dialog.querySelector('[data-state="form"]');
398    const successRoot = dialog.querySelector('[data-state="success"]');
399    const errorEl = dialog.querySelector('[data-error]');
400    const stepEmail = dialog.querySelector('[data-step="email"]');
401    const stepCode = dialog.querySelector('[data-step="code"]');
402    const emailInput = dialog.querySelector('#login-email');
403    const codeInput = dialog.querySelector('#login-code');
404    const codeEmailLabel = dialog.querySelector('[data-code-email]');
405    const successUserEl = dialog.querySelector('[data-success-user]');
406    const gsiContainer = dialog.querySelector('#gsi-button-container');
407
408    const sendBtn = dialog.querySelector('[data-action="send-code"]');
409    const verifyBtn = dialog.querySelector('[data-action="verify"]');
410    const resendBtn = dialog.querySelector('[data-action="resend"]');
411    const changeEmailBtn = dialog.querySelector('[data-action="change-email"]');
412
413    let currentEmail = '';
414    let countdown = 0;
415    let countdownTimer = null;
416    let gsiLoaded = false;
417    let gsiInitialized = false;
418
419    const isAuthed = () => !!window.localStorage.getItem(AUTH_TOKEN_KEY);
420
421    const showError = (msg) => {
422      if (!errorEl) return;
423      if (!msg) {
424        errorEl.textContent = '';
425        errorEl.setAttribute('hidden', '');
426        return;
427      }
428      errorEl.textContent = msg;
429      errorEl.removeAttribute('hidden');
430    };
431
432    const setBtnLoading = (btn, loading) => {
433      if (!btn) return;
434      btn.toggleAttribute('disabled', loading);
435      const idle = btn.querySelector('[data-label-idle]');
436      const busy = btn.querySelector('[data-label-loading]');
437      if (idle) idle.toggleAttribute('hidden', loading);
438      if (busy) busy.toggleAttribute('hidden', !loading);
439    };
440
441    const switchStep = (step) => {
442      if (step === 'code') {
443        stepEmail?.setAttribute('hidden', '');
444        stepCode?.removeAttribute('hidden');
445        setTimeout(() => codeInput?.focus(), 30);
446      } else {
447        stepCode?.setAttribute('hidden', '');
448        stepEmail?.removeAttribute('hidden');
449        setTimeout(() => emailInput?.focus(), 30);
450      }
451    };
452
453    const stopCountdown = () => {
454      if (countdownTimer) {
455        clearInterval(countdownTimer);
456        countdownTimer = null;
457      }
458    };
459
460    const updateResendUI = () => {
461      if (!resendBtn) return;
462      const idle = resendBtn.querySelector('[data-resend-idle]');
463      const cd = resendBtn.querySelector('[data-resend-countdown]');
464      if (countdown > 0) {
465        resendBtn.setAttribute('disabled', '');
466        idle?.setAttribute('hidden', '');
467        if (cd) {
468          cd.removeAttribute('hidden');
469          cd.textContent = (resendBtn.dataset.template || '{n}s').replace('{n}', String(countdown));
470        }
471      } else {
472        resendBtn.removeAttribute('disabled');
473        idle?.removeAttribute('hidden');
474        cd?.setAttribute('hidden', '');
475      }
476    };
477
478    const startCountdown = (seconds) => {
479      stopCountdown();
480      countdown = seconds;
481      updateResendUI();
482      countdownTimer = window.setInterval(() => {
483        countdown -= 1;
484        if (countdown <= 0) {
485          countdown = 0;
486          stopCountdown();
487        }
488        updateResendUI();
489      }, 1000);
490    };
491
492    const showSuccess = (user) => {
493      formRoot?.setAttribute('hidden', '');
494      successRoot?.removeAttribute('hidden');
495      if (successUserEl) {
496        const name = user?.nickName || user?.email || '';
497        successUserEl.textContent = name;
498        successUserEl.toggleAttribute('hidden', !name);
499      }
500    };
501
502    const resetForm = () => {
503      currentEmail = '';
504      stopCountdown();
505      countdown = 0;
506      updateResendUI();
507      if (emailInput) emailInput.value = '';
508      if (codeInput) codeInput.value = '';
509      showError('');
510      switchStep('email');
511      formRoot?.removeAttribute('hidden');
512      successRoot?.setAttribute('hidden', '');
513    };
514
515    const openDialog = () => {
516      showError('');
517      if (isAuthed()) {
518        const raw = window.localStorage.getItem(USER_INFO_KEY);
519        let user = null;
520        try { user = raw ? JSON.parse(raw) : null; } catch {}
521        formRoot?.setAttribute('hidden', '');
522        successRoot?.removeAttribute('hidden');
523        if (successUserEl) {
524          const name = user?.nickName || user?.email || '';
525          successUserEl.textContent = name;
526          successUserEl.toggleAttribute('hidden', !name);
527        }
528      } else {
529        resetForm();
530      }
531      if (!dialog.open) {
532        try { dialog.showModal(); } catch { dialog.setAttribute('open', ''); }
533      }
534      ensureGoogleButton();
535    };
536
537    const closeDialog = () => {
538      if (dialog.open) {
539        try { dialog.close(); } catch { dialog.removeAttribute('open'); }
540      }
541    };
542
543    const apiRequest = async (path, body) => {
544      const headers = { 'Content-Type': 'application/json', 'x-app-key': APP_KEY };
545      const token = window.localStorage.getItem(AUTH_TOKEN_KEY);
546      if (token) headers.Authorization = token;
547      const res = await fetch(`${API_BASE}${path}`, {
548        method: 'POST',
549        headers,
550        body: JSON.stringify(body || {}),
551      });
552      let env;
553      try { env = await res.json(); } catch { env = { code: res.status, message: `HTTP ${res.status}` }; }
554      if (!env || (env.code !== 200 && env.code !== 0)) {
555        const err = new Error(env?.message || `HTTP ${res.status}`);
556        err.code = env?.code ?? res.status;
557        throw err;
558      }
559      return env.data;
560    };
561
562    const finishLogin = (token, user) => {
563      window.localStorage.setItem(AUTH_TOKEN_KEY, token);
564      if (user) window.localStorage.setItem(USER_INFO_KEY, JSON.stringify(user));
565      window.dispatchEvent(new CustomEvent(AUTH_CHANGED_EVENT, { detail: { token, user } }));
566      showSuccess(user);
567    };
568
569    const handleGoogleCredential = async (response) => {
570      const idToken = response?.credential;
571      if (!idToken) return;
572      showError('');
573      try {
574        const data = await apiRequest('/auth/google/web', { idToken });
575        finishLogin(data.token, data.user || null);
576        try {
577          const fresh = await apiRequest('/mine/info', {});
578          window.localStorage.setItem(USER_INFO_KEY, JSON.stringify(fresh));
579          if (successUserEl) {
580            const name = fresh?.nickName || fresh?.email || '';
581            successUserEl.textContent = name;
582            successUserEl.toggleAttribute('hidden', !name);
583          }
584        } catch {}
585      } catch (err) {
586        showError(err?.message || gsiContainer?.dataset.googleFailed || 'Google sign-in failed');
587      }
588    };
589
590    const initGoogle = () => {
591      if (gsiInitialized || !gsiContainer) return;
592      const g = window.google;
593      if (!g?.accounts?.id) return;
594      g.accounts.id.initialize({
595        client_id: GOOGLE_CLIENT_ID,
596        callback: handleGoogleCredential,
597        ux_mode: 'popup',
598        auto_select: false,
599      });
600      gsiContainer.innerHTML = '';
601      g.accounts.id.renderButton(gsiContainer, {
602        theme: 'filled_black',
603        size: 'large',
604        shape: 'pill',
605        text: 'signin_with',
606        logo_alignment: 'left',
607        width: gsiContainer.clientWidth || 320,
608        locale: HTML_LANG,
609      });
610      gsiInitialized = true;
611    };
612
613    const ensureGoogleButton = () => {
614      if (!gsiContainer || gsiInitialized) return;
615      if (gsiLoaded) {
616        initGoogle();
617        return;
618      }
619      const existing = document.querySelector('script[data-gsi-loader]');
620      if (existing) {
621        existing.addEventListener('load', initGoogle, { once: true });
622        gsiLoaded = true;
623        return;
624      }
625      const s = document.createElement('script');
626      s.src = 'https://accounts.google.com/gsi/client';
627      s.async = true;
628      s.defer = true;
629      s.dataset.gsiLoader = '1';
630      s.onload = () => { gsiLoaded = true; initGoogle(); };
631      document.head.appendChild(s);
632    };
633
634    const isValidEmail = (v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v);
635
636    sendBtn?.addEventListener('click', async () => {
637      const email = (emailInput?.value || '').trim();
638      showError('');
639      if (!email || !isValidEmail(email)) {
640        showError(sendBtn.dataset.invalidEmail || 'Invalid email');
641        return;
642      }
643      setBtnLoading(sendBtn, true);
644      try {
645        await apiRequest('/auth/email/send-code', { email });
646        currentEmail = email;
647        if (codeEmailLabel) codeEmailLabel.textContent = email;
648        switchStep('code');
649        startCountdown(60);
650      } catch (err) {
651        showError(err?.message || sendBtn.dataset.sendFailed || 'Failed to send code');
652      } finally {
653        setBtnLoading(sendBtn, false);
654      }
655    });
656
657    verifyBtn?.addEventListener('click', async () => {
658      const code = (codeInput?.value || '').replace(/\D/g, '');
659      showError('');
660      if (code.length !== 6) {
661        showError(verifyBtn.dataset.verifyFailed || 'Invalid code');
662        return;
663      }
664      setBtnLoading(verifyBtn, true);
665      try {
666        const data = await apiRequest('/auth/email/verify', { email: currentEmail, code });
667        finishLogin(data.token, data.user || null);
668        try {
669          const fresh = await apiRequest('/mine/info', {});
670          window.localStorage.setItem(USER_INFO_KEY, JSON.stringify(fresh));
671          if (successUserEl) {
672            const name = fresh?.nickName || fresh?.email || '';
673            successUserEl.textContent = name;
674            successUserEl.toggleAttribute('hidden', !name);
675          }
676        } catch {}
677      } catch (err) {
678        showError(err?.message || verifyBtn.dataset.verifyFailed || 'Verification failed');
679      } finally {
680        setBtnLoading(verifyBtn, false);
681      }
682    });
683
684    resendBtn?.addEventListener('click', async () => {
685      if (countdown > 0 || !currentEmail) return;
686      showError('');
687      try {
688        await apiRequest('/auth/email/send-code', { email: currentEmail });
689        startCountdown(60);
690      } catch (err) {
691        showError(err?.message || sendBtn?.dataset.sendFailed || 'Failed to send code');
692      }
693    });
694
695    changeEmailBtn?.addEventListener('click', () => {
696      showError('');
697      stopCountdown();
698      countdown = 0;
699      updateResendUI();
700      if (codeInput) codeInput.value = '';
701      switchStep('email');
702    });
703
704    codeInput?.addEventListener('input', (e) => {
705      const target = e.target;
706      if (target instanceof HTMLInputElement) {
707        target.value = target.value.replace(/\D/g, '').slice(0, 6);
708      }
709    });
710
711    emailInput?.addEventListener('keydown', (e) => {
712      if (e.key === 'Enter') {
713        e.preventDefault();
714        sendBtn?.click();
715      }
716    });
717
718    codeInput?.addEventListener('keydown', (e) => {
719      if (e.key === 'Enter') {
720        e.preventDefault();
721        verifyBtn?.click();
722      }
723    });
724
725    dialog.addEventListener('click', (e) => {
726      const target = e.target;
727      if (target instanceof Element && target.closest('[data-close]')) {
728        e.preventDefault();
729        closeDialog();
730        return;
731      }
732      if (target === dialog) {
733        closeDialog();
734      }
735    });
736
737    dialog.addEventListener('cancel', (e) => {
738      e.preventDefault();
739      closeDialog();
740    });
741
742    window.addEventListener('open-login', openDialog);
743
744    document.addEventListener('click', (e) => {
745      const target = e.target;
746      if (!(target instanceof Element)) return;
747      const trigger = target.closest('[data-open-login]');
748      if (trigger) {
749        e.preventDefault();
750        openDialog();
751      }
752    });
753  })();
754})();</script>
754 <dialog id="recharge-modal" class="hidden w-[min(440px,calc(100vw-24px))] rounded-3xl border border-white/10 bg-ink-900/95 p-0 text-zinc-100 shadow-glow backdrop:bg-ink-950/70 backdrop:backdrop-blur-md open:flex open:flex-col" aria-labelledby="recharge-modal-title"> <div class="relative px-7 pb-8 pt-9 sm:px-9"> <button type="button" data-close aria-label="Not now" class="absolute right-3 top-3 grid h-9 w-9 place-items-center rounded-full border border-white/10 bg-white/[0.04] text-zinc-300 transition-colors hover:border-violet-400/40 hover:text-white"> <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M6 6l12 12M18 6L6 18"></path> </svg> </button> <header class="flex flex-col items-center text-center"> <span class="mb-4 grid h-14 w-14 place-items-center rounded-2xl bg-gradient-to-br from-amber-400/30 via-rose-400/20 to-violet-500/30 ring-1 ring-amber-400/40"> <svg viewBox="0 0 24 24" class="h-7 w-7 text-amber-300" aria-hidden="true"> <path fill="currentColor" d="M13 2L3 14h7l-1 8 10-12h-7l1-8z"></path> </svg> </span> <h2 id="recharge-modal-title" class="font-display text-2xl font-semibold tracking-tight text-white"> You are out of credits </h2> <p class="mt-2 max-w-xs text-sm leading-relaxed text-zinc-400"> Top up your Gemini Omni balance to keep generating prompts and adaptations. </p> </header> <div class="mt-6 flex flex-col gap-3 sm:flex-row"> <button type="button" data-close class="btn-ghost w-full justify-center"> Not now </button> <a href="/pricing/" class="btn-primary w-full justify-center" data-recharge-cta> Go to pricing <svg viewBox="0 0 24 24" class="h-4 w-4" aria-hidden="true"> <path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M5 12h14M13 6l6 6-6 6"></path> </svg> </a> </div> </div> </dialog> 
754<script>
755  (() => {
756    if (typeof window === 'undefined') return;
757    const dialog = document.getElementById('recharge-modal');
758    if (!(dialog instanceof HTMLDialogElement)) return;
759
760    const openDialog = () => {
761      if (!dialog.open) {
762        try {
763          dialog.showModal();
764        } catch {
765          dialog.setAttribute('open', '');
766        }
767      }
768    };
769
770    const closeDialog = () => {
771      if (dialog.open) {
772        try {
773          dialog.close();
774        } catch {
775          dialog.removeAttribute('open');
776        }
777      }
778    };
779
780    dialog.addEventListener('click', (e) => {
781      const target = e.target;
782      if (target instanceof Element && target.closest('[data-close]')) {
783        e.preventDefault();
784        closeDialog();
785        return;
786      }
787      if (target === dialog) closeDialog();
788    });
789
790    dialog.addEventListener('cancel', (e) => {
791      e.preventDefault();
792      closeDialog();
793    });
794
795    window.addEventListener('gemini-omni:open-recharge', openDialog);
796  })();
797</script>
797 
797<script>
798      (() => {
799        if (typeof window === 'undefined') return;
800        const observer = new IntersectionObserver(
801          (entries) => {
802            for (const entry of entries) {
803              if (entry.isIntersecting) {
804                entry.target.classList.add('is-visible');
805                observer.unobserve(entry.target);
806              }
807            }
808          },
809          { threshold: 0.12, rootMargin: '0px 0px -40px 0px' }
810        );
811        const onReady = () => {
812          document.querySelectorAll('.reveal').forEach((el) => observer.observe(el));
813        };
814        if (document.readyState === 'loading') {
815          document.addEventListener('DOMContentLoaded', onReady);
816        } else {
817          onReady();
818        }
819      })();
820    </script>
820 </body> </html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.