1. Pengantar
Yang Akan Anda Buat
Gemini Motion Lab adalah pengalaman interaksi langsung dengan kios yang didukung AI. Pengguna merekam klip pendek gerakan atau tarian, dan sistem:
- Menganalisis gerakan menggunakan Gemini (bagian tubuh, fase, tempo, energi)
- Membuat gambar avatar bergaya menggunakan Nano Banana (Gemini Flash Image)
- Membuat video AI menggunakan Veo yang menciptakan kembali gerakan dengan avatar
- Menyusun video berdampingan (asli + buatan AI)
- Membagikan hasil melalui kode QR di halaman yang dioptimalkan untuk seluler
Di akhir codelab ini, Anda akan memiliki demo lengkap yang di-deploy ke Google Cloud Run dan memahami pipeline AI yang mendukungnya.
Ringkasan Arsitektur

Demo Akhir:

Teknologi Inti
Komponen | Teknologi | Tujuan |
Analisis Gerakan | Gemini Flash | Menganalisis video untuk gerakan tubuh, fase, dan gaya |
Pembuatan Avatar | Gemini Flash Image (Nano Banana) | Membuat avatar bergaya 1024×1024 dari frame utama |
Pembuatan Video | Veo 3.1 | Membuat video AI dari avatar + perintah gerakan |
Backend | FastAPI + Python 3.11 | Server API dengan orkestrasi pipeline asinkron |
Frontend | React + Vite + TypeScript | UI Kios dengan perekaman kamera dan status aktif |
Hosting | Cloud Run | Deployment dalam container serverless |
Penyimpanan | Google Cloud Storage | Upload video, frame, output yang dipangkas & disusun |
2. 📦 Meng-clone Repositori
1. Buka Cloud Shell Editor
👉 Buka Cloud Shell Editor di browser Anda.
Jika terminal tidak muncul di bagian bawah layar:
- Klik Lihat
- Klik Terminal
2. Meng-clone Kode
👉💻 Di terminal, clone repositori:
cd ~
git clone https://github.com/cuppibla/gemini-motion-lab-starter.git
cd gemini-motion-lab-starter
3. Mempelajari Struktur Project
Lihat sekilas tata letak repositori:
gemini-motion-lab-starter/
├── backend/ # FastAPI backend (Python 3.11)
│ ├── app/
│ │ ├── main.py # FastAPI app entry point
│ │ ├── config.py # Environment-based settings
│ │ ├── routers/ # API endpoints (upload, analyze, generate, share...)
│ │ ├── services/ # Business logic (Gemini, Veo, storage, pipeline...)
│ │ └── prompts/ # AI prompt templates
│ ├── Dockerfile
│ └── pyproject.toml
├── frontend/ # React + Vite + TypeScript
│ ├── src/ # React components
│ ├── public/ # Static assets
│ ├── Dockerfile
│ └── nginx.conf
├── init.sh # Create GCP project & link billing
├── billing-enablement.py # Auto-link billing account
├── setup.sh # Create GCS bucket, service account, .env
└── scripts/ # Utility scripts
3. 🛠️ Klaim Kredit & Buat Project GCP
Bagian 1: Mengklaim Kredit Penagihan Anda
👉 Klaim kredit akun penagihan Anda menggunakan akun Gmail Anda.
Bagian 2: Buat Project Baru
👉💻 Di terminal, jadikan skrip init dapat dieksekusi dan jalankan:
cd ~/gemini-motion-lab-starter
chmod +x init.sh
./init.sh
Skrip init.sh akan:
- Buat project GCP baru dengan awalan
gemini-motion-lab - Simpan project ID ke
~/project_id.txt - Menginstal dependensi penagihan dan menautkan akun penagihan Anda secara otomatis
Bagian 3: Mengonfigurasi Project & Mengaktifkan API
👉💻 Tetapkan project ID Anda di terminal:
gcloud config set project $(cat ~/project_id.txt) --quiet
👉💻 Aktifkan Google Cloud API yang diperlukan untuk project ini (membutuhkan waktu ~1-2 menit):
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
aiplatform.googleapis.com \
storage.googleapis.com \
artifactregistry.googleapis.com
4. 🧠 [HANYA BACA] Memahami Arsitektur
Bagian ini menjelaskan cara kerja pipeline AI secara menyeluruh. Tidak ada tindakan yang diperlukan — cukup baca untuk memahami sistem sebelum men-deploy.
Pipeline AI
Saat pengguna merekam klip gerakan di kios, lima tahap akan berjalan secara berurutan:

Tahap 1: Upload Video
Frontend merekam klip WebM 5 detik dari kamera pengguna dan menguploadnya ke Google Cloud Storage melalui endpoint /api/upload backend.
POST /api/upload/{video_id} → gs://BUCKET/uploads/{video_id}.webm
Tahap 2: Analisis Gerakan Gemini
Backend mengirimkan video yang diupload ke Gemini Flash (gemini-3-flash-preview) untuk analisis terstruktur.
Cara kerjanya (backend/app/services/gemini_service.py):
Layanan ini menggunakan client.models.generate_content() Vertex AI SDK dengan video sebagai input Part.from_uri dan perintah terstruktur. response_mime_type="application/json" memastikan Gemini menampilkan JSON yang dapat diuraikan. Model ini juga menggunakan ThinkingConfig(thinking_budget=1024) untuk penalaran yang lebih baik tentang fase gerakan.
# Simplified from gemini_service.py
response = client.models.generate_content(
model="gemini-3-flash-preview",
contents=[
types.Part.from_uri(file_uri=gcs_uri, mime_type="video/webm"),
MOTION_ANALYSIS_PROMPT, # detailed prompt template
],
config=types.GenerateContentConfig(
response_mime_type="application/json",
thinking_config=types.ThinkingConfig(thinking_budget=1024),
),
)
analysis = json.loads(response.text)
Tahap 3: Pembuatan Avatar Nano Banana
Dengan menggunakan frame terbaik yang diekstrak dari video, Gemini Flash Image (gemini-3.1-flash-image-preview) membuat avatar bergaya 1024×1024.
Cara kerjanya (backend/app/services/nano_banana_service.py):
# Simplified from nano_banana_service.py
response = client.models.generate_content(
model="gemini-3.1-flash-image-preview",
contents=[
types.Content(role="user", parts=[
types.Part.from_bytes(data=frame_bytes, mime_type="image/png"),
types.Part.from_text(text=avatar_prompt),
])
],
config=types.GenerateContentConfig(
response_modalities=["IMAGE"],
image_config=types.ImageConfig(
aspect_ratio="1:1",
output_mime_type="image/png",
),
),
)
PNG avatar yang dibuat diupload ke GCS dan diteruskan ke tahap berikutnya.
Tahap 4: Pembuatan Video Veo
Gambar avatar digunakan sebagai aset referensi untuk Veo 3.1 (veo-3.1-fast-generate-001) guna membuat video AI berdurasi 8 detik.
Cara kerjanya (backend/app/services/veo_service.py):
# Simplified from veo_service.py
config = GenerateVideosConfig(
reference_images=[
VideoGenerationReferenceImage(
image=Image(gcs_uri=avatar_gcs_uri, mime_type="image/png"),
reference_type="ASSET",
)
],
aspect_ratio="16:9",
duration_seconds=8,
output_gcs_uri=f"gs://{BUCKET}/output/{video_id}/",
)
operation = client.models.generate_videos(
model="veo-3.1-fast-generate-001",
prompt=veo_prompt,
config=config,
)
Pembuatan video Veo bersifat asinkron — ID operasi akan segera ditampilkan. Backend melakukan polling operasi hingga selesai (hingga 10 menit).
Tahap 5: Pipeline Pasca-Pemrosesan
Setelah Veo selesai, pipeline latar belakang (backend/app/services/pipeline.py) akan berjalan secara otomatis:
- Pangkas output Veo 8 detik menjadi 3 detik
- Susun video berdampingan (rekaman asli di sebelah kiri, video AI di sebelah kanan)
- Upload video gabungan ke GCS
- Lepaskan slot antrean
Pipeline ini berjalan sebagai latar belakang asyncio.Task — frontend kios tidak perlu menunggu.
Sistem Antrean
Karena pembuatan video Veo memerlukan banyak resource, sistem menerapkan maksimum 3 tugas serentak:
# backend/app/routers/queue.py
MAX_CONCURRENT_JOBS = 3
@router.get("/queue/status")
async def queue_status():
return {
"active_jobs": len(_active_jobs),
"max_jobs": MAX_CONCURRENT_JOBS,
"available": len(_active_jobs) < MAX_CONCURRENT_JOBS,
}
Frontend memeriksa GET /api/queue/status sebelum mengizinkan pengguna baru memulai sesi. Saat pipeline selesai dan memanggil complete(video_id), slot akan terbuka untuk pengguna berikutnya.
Cloud Run — Container Serverless
Backend dan frontend di-deploy sebagai layanan Cloud Run:
Layanan | Tujuan | Konfigurasi Kunci |
Backend | Server API FastAPI | Memori 2 GiB (untuk pemrosesan video melalui ffmpeg) |
Frontend | Aplikasi React statis yang ditayangkan oleh Nginx | Memori default |
5. ⚙️ Jalankan Skrip Penyiapan
1. Menjalankan Penyiapan Otomatis
Skrip setup.sh akan membuat resource cloud yang diperlukan dan menghasilkan file .env Anda.
👉💻 Jadikan skrip sebagai file yang dapat dieksekusi dan jalankan:
cd ~/gemini-motion-lab-starter
chmod +x setup.sh
./setup.sh
2. Memberikan Peran IAM
Sekarang, berikan izin yang diperlukan ke akun layanan.
👉💻 Jalankan perintah berikut untuk menetapkan project ID Anda dan memberikan ketiga peran:
export PROJECT_ID=$(cat ~/project_id.txt)
# 1. Storage Admin — upload/download videos and frames
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:gemini-motion-lab-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/storage.admin"
# 2. Vertex AI User — call Gemini and Veo models
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:gemini-motion-lab-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
# 3. Service Account Token Creator — generate signed URLs for GCS
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
COMPUTE_SA="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"
gcloud iam service-accounts add-iam-policy-binding \
gemini-motion-lab-sa@${PROJECT_ID}.iam.gserviceaccount.com \
--project=$PROJECT_ID \
--member="serviceAccount:${COMPUTE_SA}" \
--role="roles/iam.serviceAccountTokenCreator"
3. Memverifikasi File .env Anda
👉💻 Periksa file .env yang dihasilkan:
cat .env
Anda akan melihat:
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=us-central1
GCS_BUCKET=gemini-motion-lab-your-project-id
GCS_SIGNING_SA=gemini-motion-lab-sa@your-project-id.iam.gserviceaccount.com
GOOGLE_GENAI_USE_VERTEXAI=true
MOCK_AI=false
6. 🚀 Deploy Backend
1. Memahami Backend Dockerfile
Sebelum men-deploy, mari kita pahami tampilan container:
# backend/Dockerfile
FROM python:3.11-slim # Python base image
RUN apt-get update && apt-get install -y \
ffmpeg libgl1 libglib2.0-0 \ # ffmpeg for video processing
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY pyproject.toml .
RUN pip install --no-cache-dir . # Install Python dependencies
COPY app/ ./app/ # Copy application code
EXPOSE 8080
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]
2. Men-deploy ke Cloud Run
👉💻 Muat variabel lingkungan dan deploy:
source .env
cd ~/gemini-motion-lab-starter/backend
gcloud run deploy gemini-motion-lab-backend \
--source . \
--region us-central1 \
--allow-unauthenticated \
--min-instances 1 \
--max-instances 3 \
--memory 2Gi \
--port 8080 \
--project $GOOGLE_CLOUD_PROJECT \
--set-env-vars "GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT,GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION,GCS_BUCKET=$GCS_BUCKET,GCS_SIGNING_SA=$GCS_SIGNING_SA,GOOGLE_GENAI_USE_VERTEXAI=$GOOGLE_GENAI_USE_VERTEXAI,MOCK_AI=$MOCK_AI"
Proses ini memerlukan waktu sekitar 3-5 menit. Cloud Build akan:
- Upload kode sumber Anda
- Membangun gambar Docker
- Kirim ke Artifact Registry
- Deploy ke Cloud Run
3. Simpan URL Backend
👉💻 Setelah di-deploy, simpan URL backend:
BACKEND_URL=$(gcloud run services describe gemini-motion-lab-backend \
--region us-central1 \
--format="value(status.url)" \
--project $GOOGLE_CLOUD_PROJECT)
echo "Backend URL: $BACKEND_URL"
4. Memperbarui URL Berbagi Backend
Backend membuat kode QR sehingga pengguna dapat mendownload video mereka. Aplikasi ini perlu mengetahui URL publiknya sendiri untuk melakukannya.
👉💻 Perbarui konfigurasi backend dengan URL-nya sendiri:
gcloud run services update gemini-motion-lab-backend \
--region us-central1 \
--update-env-vars PUBLIC_BASE_URL=$BACKEND_URL \
--project $GOOGLE_CLOUD_PROJECT
5. Memverifikasi Backend
👉💻 Uji endpoint health:
curl $BACKEND_URL/api/health
Output yang diharapkan:
{"status":"ok"}
👉💻 Periksa status antrean:
curl $BACKEND_URL/api/queue/status
Output yang diharapkan:
{"active_jobs":0,"max_jobs":3,"available":true}
7. 🎨 Men-deploy Frontend
1. Memahami Dockerfile Frontend
Frontend menggunakan multi-stage build — pertama-tama membangun aplikasi React, lalu menayangkannya dengan Nginx:
# frontend/Dockerfile
FROM node:20-alpine AS builder # Stage 1: Build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
ARG VITE_API_BASE=https://... # Backend URL baked at build time
ENV VITE_API_BASE=$VITE_API_BASE
RUN npm run build # Produces static files in /app/dist
FROM nginx:alpine # Stage 2: Serve
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 8080
2. Men-deploy ke Cloud Run
👉💻 Pertama, tulis URL backend ke dalam file .env agar Vite dapat menyajikannya pada waktu build:
cd ~/gemini-motion-lab-starter/frontend
echo "VITE_API_BASE=$BACKEND_URL" > .env
👉💻 Sekarang deploy frontend:
gcloud run deploy gemini-motion-lab-frontend \
--source . \
--region us-central1 \
--allow-unauthenticated \
--min-instances 1 \
--max-instances 3 \
--port 8080 \
--project $GOOGLE_CLOUD_PROJECT
Proses ini memerlukan waktu sekitar 2-3 menit.
3. Mendapatkan URL Frontend
👉💻 Ambil dan buka URL frontend:
FRONTEND_URL=$(gcloud run services describe gemini-motion-lab-frontend \
--region us-central1 \
--format="value(status.url)" \
--project $GOOGLE_CLOUD_PROJECT)
echo "🎬 Your Gemini Motion Lab is live at: $FRONTEND_URL"
👉 Buka URL di browser Anda — Anda akan melihat antarmuka kios Gemini Motion Lab.
8. 🎮 [OPSIONAL] Bermain dengan Demo
1. Merekam Gerakan
- Buka URL Frontend di browser Anda (sebaiknya Chrome untuk dukungan kamera terbaik)
- Klik Mulai untuk mulai merekam
- Menari atau bergerak selama sekitar 5 detik — gerakan lengan yang besar dan pose dinamis akan lebih efektif
- Perekaman akan otomatis berhenti dan diupload
2. Tonton Pipeline AI
Setelah mengupload, Anda akan melihat pipeline berjalan secara real time:
Fase | Yang Terjadi | Durasi |
Menganalisis... | Gemini Flash menganalisis video Anda untuk mengetahui pola gerakan | ~5-10 d |
Membuat Avatar... | Nano Banana membuat avatar bergaya dari frame terbaik Anda | ~8-12 d |
Membuat Video... | Veo 3.1 membuat video AI dari avatar + perintah gerakan | ~60-120 dtk |
Menyusun... | ffmpeg memangkas dan membuat perbandingan berdampingan | ~5-10 d |
3. Membagikan Kreasi Anda
Setelah pipeline selesai:
- Kode QR akan muncul di layar kios
- Pindai kode QR dengan ponsel Anda
- Anda akan melihat halaman berbagi yang dioptimalkan untuk seluler dengan video yang Anda buat
4. Memeriksa Log Backend
👉💻 Lihat apa yang terjadi di balik layar:
gcloud logging read \
"resource.type=cloud_run_revision AND resource.labels.service_name=gemini-motion-lab-backend" \
--limit=30 \
--project $GOOGLE_CLOUD_PROJECT \
--format="value(timestamp,textPayload)" \
--freshness=10m
Anda akan melihat baris log yang melacak pipeline:
Pipeline started for video_id=abc123
Gemini model used: gemini-3-flash-preview
Avatar generated: style=pixel-hero size=450KB time=8.2s
Veo model used: veo-3.1-fast-generate-001
Pipeline: Veo complete for video_id=abc123
Pipeline: trimmed video uploaded
Pipeline: composed video uploaded
Pipeline complete for video_id=abc123
5. Memantau Antrean
👉💻 Periksa jumlah tugas yang sedang berjalan:
curl $BACKEND_URL/api/queue/status
Jika 3 sesi aktif secara bersamaan, responsnya akan menampilkan:
{"active_jobs":3,"max_jobs":3,"available":false}
Pengguna baru akan diminta untuk menunggu hingga slot tersedia.
9. 🎉 Kesimpulan
Yang Telah Anda Buat
✅ Analisis Gerakan AI — Gemini Flash menganalisis video untuk mengetahui gerakan, tempo, dan gaya
✅ Pembuatan Avatar — Nano Banana membuat avatar bergaya dari frame video
✅ Pembuatan Video AI — Veo 3.1 membuat video baru yang sesuai dengan gerakan pengguna
✅ Pipeline Asinkron — Pemrosesan latar belakang dengan pengelolaan antrean (maks. 3 serentak)
✅ Komposisi Berdampingan — penggabungan video yang didukung ffmpeg
✅ Deployment Cloud Run — Serverless, penskalaan otomatis, tanpa pengelolaan server
Konsep Utama yang Anda Pelajari
- Multimodal Gemini — Mengirim video sebagai input dan menerima analisis JSON terstruktur
- Nano Banana (Pembuatan Gambar Gemini) — Menggunakan gambar referensi + perintah gaya untuk membuat avatar
- Veo 3.1 — Pembuatan video asinkron dengan aset referensi dan perintah teks
- Cloud Run — Men-deploy container dengan variabel lingkungan dan penskalaan otomatis
- Pola Pipeline Asinkron — Tugas latar belakang fire-and-forget dengan
asyncio.Taskuntuk operasi AI yang berjalan lama - Pengelolaan Antrean — Membatasi kecepatan tugas AI serentak untuk mengontrol biaya dan kuota API
Ringkasan Arsitektur

Apa Langkah Selanjutnya?
- Menambahkan gaya avatar lainnya — Mengedit
backend/app/prompts/avatar_generation.py - Menyesuaikan perintah Veo — Edit
backend/app/prompts/video_generation.py - Jalankan secara lokal dalam mode tiruan — Tetapkan
MOCK_AI=truedi.envuntuk pengembangan tanpa panggilan API - Skala untuk acara — Meningkatkan
--max-instancesdanMAX_CONCURRENT_JOBS