GEMINI LABEN
MODEL — Gemini 3.5 Flashが一般提供。3.1 Proをほぼ全ベンチで上回りつつ高速に動きますAPI — Interactions APIがGAに到達。Geminiモデルとエージェントを扱う主要APIになりましたAGENTS — Managed Agentsが公開プレビュー。Googleホストの隔離Linuxサンドボックスで自律エージェントを動かせますCOST — Project Spend Capsでプロジェクト単位のGemini API月額上限を設定できますSHEETS — Gemini in Sheetsが周辺データを解析し、数式エラーをワンクリックで診断・修正しますSTUDIO — Google AI Studioが刷新され、スターターアプリのギャラリーが拡充されましたMODEL — Gemini 3.5 Flashが一般提供。3.1 Proをほぼ全ベンチで上回りつつ高速に動きますAPI — Interactions APIがGAに到達。Geminiモデルとエージェントを扱う主要APIになりましたAGENTS — Managed Agentsが公開プレビュー。Googleホストの隔離Linuxサンドボックスで自律エージェントを動かせますCOST — Project Spend Capsでプロジェクト単位のGemini API月額上限を設定できますSHEETS — Gemini in Sheetsが周辺データを解析し、数式エラーをワンクリックで診断・修正しますSTUDIO — Google AI Studioが刷新され、スターターアプリのギャラリーが拡充されました
記事一覧/API / SDK
API / SDK/2026-06-26上級

Gemini 3.1 Flash Image で日本語テキスト入り画像を安定生成する ― OCR検証ゲート付きパイプライン

プレビュー停止後の GA 版 gemini-3.1-flash-image で、画像内の日本語テキストが崩れる問題に向き合います。生成→OCR検証→再生成/合成フォールバックの二段構えを、動くコードと無人運用のリトライ設計まで含めて記録しました。

gemini89gemini-api251画像生成2nano-banana3ocr個人開発67

プレミアム記事

個人開発で壁紙アプリやブログのサムネイルを自動生成していると、ある日とても地味な壁にぶつかります。背景や構図はきれいなのに、画像の中に入れたかった「今週の更新」「無料配布中」といった日本語の文字が、微妙に崩れているのです。一文字だけ別の漢字になっていたり、濁点が消えていたり、二行目が判読できなかったり。遠目には気づかず、拡大して初めて気づく類のずれです。

2026年6月25日にプレビュー版の gemini-3.1-flash-image-previewgemini-3-pro-image-preview が停止し、入れ替わりで GA 版の gemini-3.1-flash-image(Flash Image)と gemini-3-pro-image(Pro Image)が正式提供になりました。テキスト描画は世代を追うごとに着実に良くなっています。それでも「無人で回して、出てきた画像をそのまま公開する」という運用では、たまの文字化けが必ず事故になります。私自身、この一枚の崩れを人手で目視していた時期があり、自動化の意味が半分なくなっていました。

そこでたどり着いたのが、生成しただけで信用せず、出てきた画像を一度モデルに読み戻させて文字の一致を確認し、ダメなら作り直すか合成に切り替える、という二段構えでした。以下では、その検証ゲート付きパイプラインを、判定しきい値とリトライ設計まで含めて記録します。

プレビュー停止後の前提:どのモデルで文字を描くか

まず描画を担当するモデルを決めます。GA 版の二つは、文字の正確さと速度・コストのバランスが異なります。私の用途(壁紙アプリの告知バナーやブログ OGP のように、短い日本語を数行入れる)での体感を、目安として整理します。

観点gemini-3.1-flash-image(Flash Image)gemini-3-pro-image(Pro Image)
短い日本語テキストの正確さ実用域。数行までは安定より高い。多行・小さめの文字でも崩れにくい
1枚あたりの速度速い(数秒オーダー)やや遅い
1枚あたりの概算コスト低いFlash の数倍
動画→画像生成対応(gemini-3.1-flash-image 限定)非対応
無人・大量生成の主力こちらを既定に失敗時の作り直し用に温存

個人的には、主力を Flash Image に置き、後述する検証で2回続けて落ちた画像だけ Pro Image に格上げして作り直す、という使い分けが費用対効果の面で一番しっくりきました。最初から Pro Image で全枚数を回すと、崩れにくくはなりますがコストが Flash の数倍に膨らみ、無人運用の意味が薄れます。文字の正確さは「全部を高級モデルで」ではなく「怪しいものだけ格上げ」で取りにいくのが現実的だと考えています。

文字を「描かせる」プロンプトの組み立て方

テキスト入り画像で最初に効くのは、プロンプトの書き方です。私が安定させるために守っているのは三点です。

入れたい文字列を「コピーすべき文字列」として明示する

説明文の中に紛れ込ませるのではなく、描いてほしい文字をそのまま、変更不可の引用として渡します。「タイトルとして〜という雰囲気の文字を」という曖昧な指示は、モデルに言い換えや誤変換の余地を与えます。

文字数・行数・配置を数値で固定する

「中央に大きく」ではなく「上から25%の位置に1行、最大8文字」のように、レイアウトを数値で縛ると崩れが減ります。長い文・多行はそれだけで失敗率が上がるため、文字情報はできるだけ短く保ちます。

from google import genai
from google.genai import types
 
client = genai.Client(api_key="YOUR_GEMINI_API_KEY")
 
MODEL_FAST = "gemini-3.1-flash-image"
MODEL_STRONG = "gemini-3-pro-image"
 
def build_prompt(headline: str) -> str:
    # 描いてほしい文字を「一字一句そのまま」という制約として渡す
    return (
        "縦長(9:16)のシンプルな告知バナー画像を生成してください。\n"
        "落ち着いた藍色の背景に、やわらかな和紙のテクスチャ。\n"
        f"画像の上から25%の位置に、次の文字を一字一句そのまま、横書き1行で大きく描く: 「{headline}\n"
        "・文字は最大10文字。装飾フォントは避け、可読性の高いゴシック体。\n"
        "・指定した文字以外の文字、英数字、ロゴ、署名は一切描かない。\n"
        "・濁点・半濁点・小書き文字を省略しない。"
    )
 
def generate_image(model: str, headline: str) -> bytes:
    resp = client.models.generate_content(
        model=model,
        contents=build_prompt(headline),
        config=types.GenerateContentConfig(response_modalities=["Image"]),
    )
    for part in resp.candidates[0].content.parts:
        if part.inline_data and part.inline_data.mime_type.startswith("image/"):
            return part.inline_data.data  # PNG バイト列
    raise RuntimeError("画像パートが返りませんでした")

「指定した文字以外は描かない」という否定の指示は、英字の署名や謎のロゴが勝手に入り込むのを抑えるのに効きます。和文では特に、頼んでもいないアルファベットが装飾として混入しやすいので、私はこの一行をほぼ毎回入れています。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
生成画像の日本語が文字化けして困っていた人が、OCR一致率でゲートする検証コードを今日コピペで動かせる
gemini-3.1-flash-image での生成→読み戻し検証→Pillow合成フォールバックの二段構えを、判定しきい値ごと実装で入手できる
無人運用でリトライが暴走しないよう、1枚あたりの概算コストと再試行上限から月額の上限を逆算して設計できる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API / SDK2026-06-23
Nano Banana 2 に動画を渡してサムネイルを1枚生成する — gemini-3.1-flash-image の動画→画像を実装したメモ
GA になった gemini-3.1-flash-image(Nano Banana 2)に動画ファイルを文脈として渡し、サムネイルを1枚生成する実装手順です。フレーム抽出との違い、preview からの移行差分、1枚あたりのコストと所要時間の実測までまとめました。
API / SDK2026-05-18
Gemini Vision で壁紙アプリの自動カテゴリ分類を実装した話
個人開発の壁紙アプリで Gemini Vision API を使い、画像の自動カテゴリ分類を実装した実体験です。精度改善のプロセスと、公式ドキュメントには載っていない落とし穴、GPT-4o Vision とのコスト比較までまとめました。
API / SDK2026-06-24
File Searchの回答に「何ページの、どの図か」まで添える ― 視覚引用メタデータで出典を検証可能にする
File Search の grounding metadata に media_id と page_numbers が加わり、回答のどの一文がどのページ・どの図に基づくのかを辿れるようになりました。PDFと画像を混ぜた参照データで、検証可能な引用UIを組み立てるまでを実装で整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →