1. ã¯ããã«
äœæããæ©èœ
Gemini Motion Lab ã¯ãAI ãæŽ»çšããã©ã€ã ããªã¹ã¯äœéšã§ãããŠãŒã¶ãŒãçããã³ã¹ãåãã®ã¯ãªãããé²ç»ãããšãã·ã¹ãã ã¯æ¬¡ã®åŠçãè¡ããŸãã
- Gemini ã䜿çšããŠåããåæïŒäœã®éšäœããã§ãŒãºããã³ãããšãã«ã®ãŒïŒ
- Nano BananaïŒGemini Flash ImageïŒã䜿çšããŠãã¹ã¿ã€ã©ã€ãºãããã¢ãã¿ãŒç»åãçæããŸãã
- Veo ã䜿çšããŠãã¢ãã¿ãŒã§ã¢ãŒã·ã§ã³ãåçŸãã AI åç»ãäœæããŸãã
- 䞊ã¹ãŠè¡šç€ºããåç»ïŒãªãªãžãã« + AI çæïŒãäœæããŸã
- ã¢ãã€ã« ããã€ã¹åãããŒãžã® QR ã³ãŒãã§çµæãå ±æããŸãã
ãã® Codelab ãçµäºãããšãGoogle Cloud Run ã«ãããã€ãããå®å šãªãã¢ã宿ãããã®ãã¢ãæ¯ãã AI ãã€ãã©ã€ã³ãçè§£ã§ããããã«ãªããŸãã
ã¢ãŒããã¯ãã£ã®æŠèŠ

æçµãã¢:

æ žãšãªããã¯ãããžãŒ
ã³ã³ããŒãã³ã | ãã¯ãããžãŒ | ç®ç |
ã¢ãŒã·ã§ã³åæ | Gemini Flash | åç»ã®äœã®åãããã§ãŒãºãã¹ã¿ã€ã«ãåæãã |
ã¢ãã¿ãŒçæ | Gemini Flash ImageïŒNano BananaïŒ | ããŒãã¬ãŒã ãã 1024Ã1024 ã®ã¹ã¿ã€ã«èšå®ãããã¢ãã¿ãŒãçæãã |
åç»çæ | Veo 3.1 | ã¢ãã¿ãŒãšã¢ãŒã·ã§ã³ ããã³ãããã AI åç»ãäœæãã |
ããã¯ãšã³ã | FastAPI + Python 3.11 | éåæãã€ãã©ã€ã³ ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãåãã API ãµãŒã㌠|
ããã³ããšã³ã | React + Vite + TypeScript | ã«ã¡ã©ã®é²ç»ãšã©ã€ã ã¹ããŒã¿ã¹ã衚瀺ããããªã¹ã¯ UI |
ãã¹ãæ¹æ³ | Cloud Run | ãµãŒããŒã¬ã¹ ã³ã³ããåããã〠|
ã¹ãã¬ãŒãž | Google Cloud Storage | åç»ã®ã¢ããããŒãããã¬ãŒã ãã«ãããšåæãããåºå |
2. ðŠ ãªããžããªã®ã¯ããŒã³ãäœæãã
1. Cloud Shell ãšãã£ã¿ãéã
ð ãã©ãŠã¶ã§ Cloud Shell ãšãã£ã¿ãéããŸãã
ã¿ãŒããã«ãç»é¢ã®äžéšã«è¡šç€ºãããªãå Žå:
- [衚瀺] ãã¯ãªãã¯ããŸãã
- [Terminal] ãã¯ãªãã¯ããŸãã
2. ã³ãŒãã®ã¯ããŒã³ãäœæãã
ðð» ã¿ãŒããã«ã§ããªããžããªã®ã¯ããŒã³ãäœæããŸãã
cd ~
git clone https://github.com/cuppibla/gemini-motion-lab-starter.git
cd gemini-motion-lab-starter
3. ãããžã§ã¯ãã®æ§é ã確èªãã
ãªããžããªã®ã¬ã€ã¢ãŠããç°¡åã«èŠãŠã¿ãŸãããã
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. ð ïž ã¯ã¬ãžãããè«æ±ã㊠GCP ãããžã§ã¯ããäœæãã
ããŒã 1: è«æ±å ã¯ã¬ãžãããå©çšãã
Gmail ã¢ã«ãŠã³ãã䜿çšããŠãè«æ±å ã¢ã«ãŠã³ãã®ã¯ã¬ãžãããè«æ±ããŸãã
ããŒã 2: æ°ãããããžã§ã¯ããäœæãã
ðð» ã¿ãŒããã«ã§ãinit ã¹ã¯ãªãããå®è¡å¯èœã«ããŠå®è¡ããŸãã
cd ~/gemini-motion-lab-starter
chmod +x init.sh
./init.sh
init.sh ã¹ã¯ãªããã¯æ¬¡ã®åŠçãè¡ããŸãã
- æ¥é èŸ
gemini-motion-labã䜿çšããŠæ°ãã GCP ãããžã§ã¯ããäœæãã - ãããžã§ã¯ã ID ã
~/project_id.txtã«ä¿åãã - 課éäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŠãè«æ±å ã¢ã«ãŠã³ããèªåçã«ãªã³ã¯ãã
ããŒã 3: ãããžã§ã¯ããæ§æã㊠API ãæå¹ã«ãã
ðð» ã¿ãŒããã«ã§ãããžã§ã¯ã ID ãèšå®ããŸãã
gcloud config set project $(cat ~/project_id.txt) --quiet
ðð» ãã®ãããžã§ã¯ãã«å¿ èŠãª Google Cloud APIs ãæå¹ã«ããŸãïŒ1 ïœ 2 åããããŸãïŒã
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
aiplatform.googleapis.com \
storage.googleapis.com \
artifactregistry.googleapis.com
4. ð§ [èªã¿åãå°çš] ã¢ãŒããã¯ãã£ã«ã€ããŠ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãAI ãã€ãã©ã€ã³ããšã³ãããŒãšã³ãã§ã©ã®ããã«æ©èœãããã«ã€ããŠèª¬æããŸãã察å¿äžèŠ - ãããã€ããåã«ãã·ã¹ãã ãçè§£ããããã«èªãã ãã§ãã
AI ãã€ãã©ã€ã³
ãŠãŒã¶ãŒãããªã¹ã¯ã§ã¢ãŒã·ã§ã³ ã¯ãªãããé²ç»ãããšã次㮠5 ã€ã®ã¹ããŒãžãé çªã«å®è¡ãããŸãã

ã¹ããŒãž 1: åç»ã®ã¢ããããŒã
ããã³ããšã³ãã¯ããŠãŒã¶ãŒã®ã«ã¡ã©ãã 5 ç§ã® WebM ã¯ãªãããé²ç»ããããã¯ãšã³ãã® /api/upload ãšã³ããã€ã³ããä»ã㊠Google Cloud Storage ã«ã¢ããããŒãããŸãã
POST /api/upload/{video_id} â gs://BUCKET/uploads/{video_id}.webm
ã¹ããŒãž 2: Gemini ã¢ãŒã·ã§ã³åæ
ããã¯ãšã³ãã¯ãã¢ããããŒããããåç»ãæ§é ååæã®ããã« Gemini FlashïŒgemini-3-flash-previewïŒã«éä¿¡ããŸãã
ä»çµã¿ïŒbackend/app/services/gemini_service.pyïŒ:
ãã®ãµãŒãã¹ã¯ãVertex AI SDK ã® client.models.generate_content() ã䜿çšããåç»ã Part.from_uri å
¥åãšããŠãæ§é åãããããã³ããã䜿çšããŸããresponse_mime_type="application/json" ã«ãããGemini ã¯è§£æå¯èœãª JSON ãè¿ããŸãããã®ã¢ãã«ã§ã¯ãã¢ãŒã·ã§ã³ ãã§ãŒãºã®æšè«ãæ¹åããããã« ThinkingConfig(thinking_budget=1024) ã䜿çšããŠããŸãã
# 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)
ã¹ããŒãž 3: Nano Banana ã¢ãã¿ãŒã®çæ
åç»ããæœåºããããã¹ã ãã¬ãŒã ã䜿çšããŠãGemini Flash ImageïŒgemini-3.1-flash-image-previewïŒã 1024Ã1024 ã®ã¹ã¿ã€ã«åãããã¢ãã¿ãŒãçæããŸãã
ä»çµã¿ïŒ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 ã GCS ã«ã¢ããããŒããããæ¬¡ã®ã¹ããŒãžã«æž¡ãããŸãã
ã¹ããŒãž 4: Veo ã®åç»çæ
ã¢ãã¿ãŒç»åã¯ãVeo 3.1ïŒveo-3.1-fast-generate-001ïŒã®åç
§ã¢ã»ãããšããŠäœ¿çšããã8 ç§éã® AI åç»ãçæãããŸãã
ä»çµã¿ïŒ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,
)
Veo ã®çæã¯éåæã§ãããªãã¬ãŒã·ã§ã³ ID ãããã«è¿ãããŸããããã¯ãšã³ãã¯ãå®äºãããŸã§ïŒæå€§ 10 åïŒãªãã¬ãŒã·ã§ã³ãããŒãªã³ã°ããŸãã
ã¹ããŒãž 5: åŸåŠçãã€ãã©ã€ã³
Veo ãå®äºãããšãããã¯ã°ã©ãŠã³ã ãã€ãã©ã€ã³ïŒbackend/app/services/pipeline.pyïŒãèªåçã«å®è¡ãããŸãã
- 8 ç§ã® Veo åºåã 3 ç§ã«ããªãã³ã°ãã
- æ§æ: 䞊ã¹ãŠè¡šç€ºããåç»ïŒå·ŠåŽã«å ã®é²ç»ãå³åŽã« AI åç»ïŒ
- æ§æãããåç»ã GCS ã«ã¢ããããŒããã
- ãã¥ãŒ ã¹ããããè§£æŸãã
ãã®ãã€ãã©ã€ã³ã¯ããã¯ã°ã©ãŠã³ã asyncio.Task ãšããŠå®è¡ããããããããªã¹ã¯ã®ããã³ããšã³ãã¯åŸ
æ©ããå¿
èŠããããŸããã
ãã¥ãŒã·ã¹ãã
Veo ã®çæã¯ãªãœãŒã¹ã倧éã«æ¶è²»ãããããã·ã¹ãã ã§ã¯æå€§ 3 ã€ã®åæå®è¡ãžã§ããé©çšãããŸãã
# 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,
}
ããã³ããšã³ãã¯ãæ°èŠãŠãŒã¶ãŒãã»ãã·ã§ã³ãéå§ããåã« GET /api/queue/status ã確èªããŸãããã€ãã©ã€ã³ãå®äºã㊠complete(video_id) ãåŒã³åºããšã次ã®ãŠãŒã¶ãŒã®ããã«ã¹ããããéããŸãã
Cloud Run - ãµãŒããŒã¬ã¹ ã³ã³ãã
ããã¯ãšã³ããšããã³ããšã³ãã®äž¡æ¹ã Cloud Run ãµãŒãã¹ãšããŠãããã€ãããŸãã
ãµãŒãã¹ | ç®ç | ããŒã®æ§æ |
ããã¯ãšã³ã | FastAPI API ãµãŒã㌠| 2 GiB ã®ã¡ã¢ãªïŒffmpeg ã«ããåç»åŠççšïŒ |
ããã³ããšã³ã | Nginx ã§æäŸãããéç React ã¢ã㪠| ããã©ã«ãã®ã¡ã¢ãª |
5. âïž èšå®ã¹ã¯ãªãããå®è¡
1. èªåèšå®ãå®è¡ãã
setup.sh ã¹ã¯ãªããã¯ãå¿
èŠãªã¯ã©ãŠã ãªãœãŒã¹ãäœæãã.env ãã¡ã€ã«ãçæããŸãã
ðð» ã¹ã¯ãªãããå®è¡å¯èœã«ããŠå®è¡ããŸãã
cd ~/gemini-motion-lab-starter
chmod +x setup.sh
./setup.sh
2. IAM ããŒã«ãä»äžãã
次ã«ããµãŒãã¹ ã¢ã«ãŠã³ãã«å¿ èŠãªæš©éãä»äžããŸãã
ðð» æ¬¡ã®ã³ãã³ããå®è¡ããŠããããžã§ã¯ã ID ãèšå®ãã3 ã€ã®ããŒã«ãã¹ãŠãä»äžããŸãã
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. .env ãã¡ã€ã«ã確èªãã
ðð» çæããã .env ãã¡ã€ã«ã確èªããŸãã
cat .env
以äžã®ããã«è¡šç€ºãããŸãã
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. ð ããã¯ãšã³ãããããã€ãã
1. ããã¯ãšã³ãã® Dockerfile ã«ã€ããŠ
ãããã€ããåã«ãã³ã³ããã®æ§é ã確èªããŸãããã
# 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. Cloud Run ãžã®ãããã€
ðð» ç°å¢å€æ°ãèªã¿èŸŒãã§ãããã€ããŸãã
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"
ããã«ã¯ 3 ïœ 5 åã»ã©ããããŸããCloud Build ã¯æ¬¡ã®åŠçãè¡ããŸãã
- ãœãŒã¹ã³ãŒããã¢ããããŒããã
- Docker ã€ã¡ãŒãžããã«ããã
- Artifact Registry ã« push ãã
- Cloud Run ã«ãããã€ãã
3. ããã¯ãšã³ã URL ãä¿åãã
ðð» ãããã€ããããããã¯ãšã³ã URL ãä¿åããŸãã
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. ããã¯ãšã³ãã®å ±æ URL ãæŽæ°ãã
ããã¯ãšã³ãã§ QR ã³ãŒããçæããããŠãŒã¶ãŒãåç»ãããŠã³ããŒãã§ããããã«ãªããŸãããã®ããã«ã¯ãç¬èªã®å ¬é URL ãç¥ãå¿ èŠããããŸãã
ðð» ç¬èªã® URL ã䜿çšããŠããã¯ãšã³ãæ§æãæŽæ°ããŸãã
gcloud run services update gemini-motion-lab-backend \
--region us-central1 \
--update-env-vars PUBLIC_BASE_URL=$BACKEND_URL \
--project $GOOGLE_CLOUD_PROJECT
5. ããã¯ãšã³ãã確èªãã
ðð» ãã«ã¹ ãšã³ããã€ã³ãããã¹ãããŸãã
curl $BACKEND_URL/api/health
æ³å®ãããåºå:
{"status":"ok"}
ðð» ãã¥ãŒã®ã¹ããŒã¿ã¹ã確èªããŸãã
curl $BACKEND_URL/api/queue/status
æ³å®ãããåºå:
{"active_jobs":0,"max_jobs":3,"available":true}
7. ðš ããã³ããšã³ãããããã€ãã
1. ããã³ããšã³ãã® Dockerfile ã«ã€ããŠ
ããã³ããšã³ãã¯ãã«ãã¹ããŒãž ãã«ãã䜿çšããŸãããŸã React ã¢ããªããã«ãããæ¬¡ã« 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. Cloud Run ãžã®ãããã€
ðð» ãŸããããã¯ãšã³ã URL ã .env ãã¡ã€ã«ã«æžã蟌ã¿ãVite ããã«ãæã«ãããçµã¿èŸŒããããã«ããŸãã
cd ~/gemini-motion-lab-starter/frontend
echo "VITE_API_BASE=$BACKEND_URL" > .env
ðð» ããã³ããšã³ãããããã€ããŸãã
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
ããã«ã¯ 2 ïœ 3 åã»ã©ããããŸãã
3. ããã³ããšã³ãã® URL ãååŸãã
ðð» ããã³ããšã³ã URL ãååŸããŠéããŸãã
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"
ð ãã©ãŠã¶ã§ URL ãéããŸããGemini Motion Lab ããªã¹ã¯ ã€ã³ã¿ãŒãã§ãŒã¹ã衚瀺ãããŸãã
8. ð® [çç¥å¯] ãã¢ã詊ã
1. ã¢ãŒã·ã§ã³ãèšé²ãã
- ãã©ãŠã¶ïŒã«ã¡ã©ã®ãµããŒããæé©ãª Chrome ãæšå¥šïŒã§ããã³ããšã³ã URL ãéããŸãã
- [éå§] ãã¯ãªãã¯ããŠé²ç»ãéå§ããŸã
- çŽ 5 ç§éèžããåã - è ã倧ããåããããããã€ãããã¯ãªããŒãºããšã£ãããããšå¹æçã§ãã
- é²ç»ã¯èªåçã«åæ¢ããŠã¢ããããŒããããŸã
2. AI ãã€ãã©ã€ã³ãç£èŠãã
ã¢ããããŒããããšããã€ãã©ã€ã³ã®å®è¡ããªã¢ã«ã¿ã€ã ã§è¡šç€ºãããŸãã
ãã§ãŒãº | 倿Žã®å 容 | æèŠæé |
åæäž... | Gemini Flash ãåç»ã®åãã®ãã¿ãŒã³ãåæãã | ïœ 5 ïœ 10 ç§ |
ã¢ãã¿ãŒãçæããŠããŸã... | Nano Banana ããã¹ã ãã¬ãŒã ããã¹ã¿ã€ã©ã€ãºãããã¢ãã¿ãŒãäœæ | ïœ 8 ïœ 12 ç§ |
åç»ãäœæããŠããŸã... | Veo 3.1 ã¯ãã¢ãã¿ãŒãšã¢ãŒã·ã§ã³ ããã³ãããã AI åç»ãçæããŸã | çŽ 60 ïœ 120 ç§ |
äœæäž... | ffmpeg ãããªãã³ã°ããŠäžŠã¹ãŠæ¯èŒãäœæãã | ïœ 5 ïœ 10 ç§ |
3. äœåãå ±æãã
ãã€ãã©ã€ã³ãå®äºããããæ¬¡ã®æäœãè¡ããŸãã
- ããªã¹ã¯ã®ç»é¢ã« QR ã³ãŒãã衚瀺ãããŸã
- ã¹ããŒããã©ã³ã§ QR ã³ãŒããã¹ãã£ã³ããŸã
- äœæããåç»ãå«ãã¢ãã€ã« ããã€ã¹åãå ±æããŒãžã衚瀺ãããŸãã
4. ããã¯ãšã³ã ãã°ã確èªãã
ðð» èå°è£ã§äœãèµ·ãããã確èªãã:
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
ãã€ãã©ã€ã³ããã¬ãŒã¹ãããã°è¡ã衚瀺ãããŸãã
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. ãã¥ãŒãã¢ãã¿ãªã³ã°ãã
ðð» å®è¡äžã®ãžã§ãæ°ã確èªããŸãã
curl $BACKEND_URL/api/queue/status
3 ã€ã®ã»ãã·ã§ã³ãåæã«ã¢ã¯ãã£ãã«ãªã£ãŠããå Žåãã¬ã¹ãã³ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
{"active_jobs":3,"max_jobs":3,"available":false}
æ°èŠãŠãŒã¶ãŒã¯ãã¹ãããã空ããŸã§åŸ ã€ããæ±ããããŸãã
9. ð ãŸãšã
äœæããå 容
â AI ã¢ãŒã·ã§ã³åæ - Gemini Flash ãåç»ã®åãããã³ããã¹ã¿ã€ã«ãåæ
â ã¢ãã¿ãŒã®çæ - Nano Banana ãåç»ãã¬ãŒã ããã¹ã¿ã€ãªãã·ã¥ãªã¢ãã¿ãŒãäœæ
â AI åç»å¶äœããŒã« - Veo 3.1 ããŠãŒã¶ãŒã®åãã«åãããŠæ°ããåç»ãçæ
â éåæãã€ãã©ã€ã³ - ãã¥ãŒç®¡çã«ããããã¯ã°ã©ãŠã³ãåŠçïŒæå€§ 3 ã€ã®åæåŠçïŒ
â 䞊ã¹ãŠåæ - ffmpeg ãå©çšããåç»åæ
â Cloud Run Deployment - ãµãŒããŒã¬ã¹ãèªåã¹ã±ãŒãªã³ã°ããµãŒããŒç®¡çäžèŠ
åŠç¿ããäž»ãªã³ã³ã»ãã
- Gemini Multimodal - åç»ãå ¥åãšããŠéä¿¡ããæ§é åããã JSON åæãåä¿¡ãã
- Nano BananaïŒGemini ç»åçæïŒ - ãªãã¡ã¬ã³ã¹ç»åãšã¹ã¿ã€ã« ããã³ããã䜿çšããŠã¢ãã¿ãŒãçæ
- Veo 3.1 - åç §ã¢ã»ãããšããã¹ã ããã³ããã䜿çšããéåæåç»çæ
- Cloud Run - ç°å¢å€æ°ãšèªåã¹ã±ãŒãªã³ã°ã䜿çšããŠã³ã³ããããããã€ãã
- éåæãã€ãã©ã€ã³ ãã¿ãŒã³ - é·æéå®è¡ã® AI ãªãã¬ãŒã·ã§ã³ã«
asyncio.Taskã䜿çšãã Fire-and-forget ããã¯ã°ã©ãŠã³ã ã¿ã¹ã¯ - ãã¥ãŒç®¡ç - åæå®è¡ AI ãžã§ãã®ã¬ãŒãå¶éã«ãããè²»çšãš API å²ãåœãŠãå¶åŸ¡ããŸãã
ã¢ãŒããã¯ãã£ã®èŠçŽ

次ã®ã¹ããã
- ã¢ãã¿ãŒã®ã¹ã¿ã€ã«ã远å -
backend/app/prompts/avatar_generation.pyãç·šé - Veo ã®ããã³ãããã«ã¹ã¿ãã€ãºãã - ç·šéã¢ã€ã³ã³
backend/app/prompts/video_generation.py - ã¢ãã¯ã¢ãŒãã§ããŒã«ã«ã§å®è¡ãã - API åŒã³åºããªãã§éçºãè¡ãããã«ã
.envã§MOCK_AI=trueãèšå®ããŸãã - ã€ãã³ãã«åãããŠã¹ã±ãŒãªã³ã°ãã -
--max-instancesãšMAX_CONCURRENT_JOBSãå¢ãã