🍌 Nano Banana Pro

作成日時2025-11-21 12:14

2025年11月21日付近に発表された最新画像生成モデル「Nano Banana Pro(正式名:Gemini 3 Pro Image)」は、以前の Nano Banana(Gemini 2.5 Flash Image)から大幅に性能向上し、特に日本語テキスト再現性/推論(reasoning)能力/複数画像統合の面で注目されています。(note(ノート))


主要な進化ポイント

1) 日本語テキストの高精度レンダリング

2) 高度な「考えてから描く」推論能力(Gemini 3 の能力を取り込み)

3) 複数(最大14枚)の参照画像統合

4) リアルタイム情報の視覚化連携

5) 解像度・編集機能・出力品質

6) 利用コストと提供形態(概算)

7) 合成画像の識別(安全措置)


クリエイティブ領域(漫画・アニメ)への影響(要点)


記事別 — 出典一覧

記事No.著者タイトル(概要)URL
記事 1npakaNano Banana Pro の概要 — Gemini 3 ベースの推論、リアルタイム連携、14枚統合、テキストレンダリング、2K/4K 対応を解説。(note(ノート))
記事 2イケハヤ(ihayato)【速報】革命AI「Nano Banana Pro」 — 日本語文字入れの精度向上、漫画・チラシ制作の革新、空間認識能力改善を強調。(note(ノート))
記事 3やすだ.dev(yasuda_forceai)14枚の画像を統合できる! — 5つの革新機能(日本語、画像統合、高解像度、リアルタイム、推論)とビジネス活用例を詳説。(note(ノート))
記事 4けいすけ(けいすけ / konho)AIマンガ家目線で解説 — 漫画制作での実用性(日本語フォント保持、アスペクト比安定、キャラ分離)とコスト対効果。(note(ノート))

【Claude Code Router】Raspberry PiでClaude CodeをOpenRouterのAPIで使う

作成日時2025-07-16 18:20 TagAI, Raspberry Pi

今回はClaude CodeでOpenRouter APIを使い、自分の好きなAIモデルを利用する方法。
ClaudeのMaxプランに入らず、かと言ってClaudeのAPIを使うわけでもなく、Claude Codeを使ったVibe Codingを格安で楽しめるかも。
そのために、オープンソース(MITライセンス)のClaude Code Routerを使います。

Claude Code Routerって何?

Claude Code Routerは、Anthropicが開発したエージェントコーディング用のコマンドラインツールであるClaude Codeの拡張機能です。
ユーザーは様々なAIモデルにリクエストを送信できるため、選択の柔軟性が向上します。

インストール

大前提としてNode.jsとnpmがインストールされていること

まずClaude Code自体をインストールする

bash
sudo npm install -g @anthropic-ai/claude-code

次にClaude Code Routerをインストール

bash
sudo npm install -g @musistudio/claude-code-router

設定

以下のように設定する(例: OpenRouter/Google/Gemini 2.5 Flashの場合)

bash
sudo nano /root/.claude-code-router/config.json
json
{
  "Providers": [
    {
      "name": "openrouter",
      "api_base_url": "https://openrouter.ai/api/v1/chat/completions",
      "api_key": "ここにOpenRouter APIキー",
      "models": [
        "google/gemini-2.5-flash"
      ]
    }
  ],
  "Router": {
    "default": "openrouter,google/gemini-2.5-flash",
    "background": "openrouter,google/gemini-2.5-flash",
    "think": "openrouter,google/gemini-2.5-flash",
    "longContext": "openrouter,google/gemini-2.5-flash"
  }
}

起動

bash
sudo ccr code

アップデート

bash
sudo npm update -g @anthropic-ai/claude-code
sudo npm update -g @musistudio/claude-code-router

アンインストール

bash
sudo rm /root/.claude-code-router/config.json
sudo npm uninstall -g @anthropic-ai/claude-code
sudo npm uninstall -g @musistudio/claude-code-router

参考

YouTubeの字幕を取得してAIで処理する

作成日時2025-07-03 22:33 TagAI

実行テスト。

YouTube動画の字幕を取得して、AIにまとめさせるコードの例。
Pythonです。必要なライブラリは事前にインストールしてください。
OpenAIのAPIを使います。APIキーを取得してください。

bash
pip install -U openai youtube-transcript-api
python
import re
from openai import OpenAI
from youtube_transcript_api import YouTubeTranscriptApi

OPENAI_API_KEY = "Your OpenAI API Key Here"
OPENAI_MODEL = "gpt-4.1-mini"

def extract_video_id(url):
    import re
    match = re.search(r'(?:v=|\/)([0-9A-Za-z_-]{11}).*', url)
    if match:
        return match.group(1)
    return None

def get_transcript(video_id):
    try:
        transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)
        auto_transcript = None
        for transcript in transcript_list:
            if transcript.is_generated:
                auto_transcript = transcript
                break
        if auto_transcript:
            lang_code = auto_transcript.language_code
            print(f"自動生成字幕の言語コード: {lang_code}")
            return YouTubeTranscriptApi.get_transcript(video_id, languages=[lang_code])
        else:
            print("自動生成字幕が見つかりませんでした")
            return None
    except Exception as e:
        print(f"エラーが発生しました: {str(e)}")
        return None

def fetch_YT(youtube_url):
    try:
        pattern = r"(?:https?://)?(?:www\.|m\.)?(?:youtube\.com|youtu\.be)/.*"
        if re.match(pattern, youtube_url):
            video_id = extract_video_id(youtube_url)
            print(f"Video ID: {video_id}")
            content = get_transcript(video_id)
            if content:
                print("字幕を取得しました")
                return content
            else:
                return None
        else:
            return None
    except Exception as e:
        print(f"エラーが発生しました: {str(e)}")
        return None

def post_AI(transcript):
    client = OpenAI(api_key=OPENAI_API_KEY)
    try:
        response = client.chat.completions.create(
            model=OPENAI_MODEL,
            messages=[
                {
                    "role": "user",
                    "content": f"以下はYouTube動画の音声の文字起こし文です。言葉としておかしい箇所は前後で判断してください。この内容をまとめて、日本語で、markdown形式で出力してください。\n\n---\n{transcript}\n---"
                }
            ],
            temperature=0.3
        )
        summary = response.choices[0].message.content
        print(summary)
    except Exception as e:
        print(f"エラーが発生しました: {str(e)}")

def main():
    while True:
        try:
            print("\nYouTubeのURLを入力してください:")
            input_url = input("URL >> ").strip()
            if not input_url:
                continue
            transcript = fetch_YT(input_url)
            if transcript:
                print("AI処理中..\n")
                post_AI(transcript)
            else:
                print("失敗しました")
        except Exception as e:
            print(f"エラーが発生しました: {str(e)}")

if __name__ == "__main__":
    main()

OpenAI Responses APIの履歴を削除する

作成日時2025-07-02 19:49 TagAI

Responses API

2025年になって、OpenAIが突如として推して来た「Responses API」。
最近では新しいツールやMCPなどの利用はResponses APIに限られるため、OpenAIのAPIを使う場合には半強制な状況。
これまでの「Chat Completions API」と違う流儀で、他社APIとも互換性が失われ、非常に使いにくくなった。

Responses APIは、これまでと異なり、会話の履歴を入れずとも、「会話のid」を与えれば、過去の会話履歴が参照される。
かと言って、トークンが節約されるわけではない

そして、Responses APIにおいてこのidの発行と履歴の保存はデフォルトでオンになっている。
つまり、最初の会話で必ずidが発行され、履歴が保存される。
以下に例を示す。

bash
curl https://api.openai.com/v1/responses \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "o4-mini",
    "input": [{"role": "user", "content": "日本一の山は?"}],
  }'
json
{
  "id": "resp_xxxxx",
  "object": "response",
  "created_at": 1751000000,
  "status": "completed",
  "background": false,
  "error": null,
  "incomplete_details": null,
  "instructions": null,
  "max_output_tokens": null,
  "max_tool_calls": null,
  "model": "o4-mini-2025-04-16",
  "output": [
    {
      "id": "rs_xxxxx",
      "type": "reasoning",
      "summary": []
    },
    {
      "id": "msg_xxxxx",
      "type": "message",
      "status": "completed",
      "content": [
        {
          "type": "output_text",
          "annotations": [],
          "logprobs": [],
          "text": "\u65e5\u672c\u4e00\u306e\u5c71\u306f\u5bcc\u58eb\u5c71\u3067\u3059\u3002  \n\u6a19\u9ad8\u306f3,776\u30e1\u30fc\u30c8\u30eb\u3067\u3001\u5c71\u68a8\u770c\u3068\u9759\u5ca1\u770c\u306e\u5883\u306b\u4f4d\u7f6e\u3057\u3066\u3044\u307e\u3059\u3002\u65e5\u672c\u306e\u8c61\u5fb4\u3068\u3055\u308c\u3001\u53e4\u304f\u304b\u3089\u4fe1\u4ef0\u3084\u82b8\u8853\u306e\u984c\u6750\u306b\u3082\u306a\u3063\u3066\u304d\u307e\u3057\u305f\u3002"
        }
      ],
      "role": "assistant"
    }
  ],
  "parallel_tool_calls": true,
  "previous_response_id": null,
  "reasoning": {
    "effort": "medium",
    "summary": null
  },
  "service_tier": "default",
  "store": true,
  "temperature": 1.0,
  "text": {
    "format": {
      "type": "text"
    }
  },
  "tool_choice": "auto",
  "tools": [],
  "top_logprobs": 0,
  "top_p": 1.0,
  "truncation": "disabled",
  "usage": {
    "input_tokens": 12,
    "input_tokens_details": {
      "cached_tokens": 0
    },
    "output_tokens": 322,
    "output_tokens_details": {
      "reasoning_tokens": 256
    },
    "total_tokens": 334
  },
  "user": null,
  "metadata": {}
}

このレスポンスの「resp_xxxxx」が会話のidである。
APIとしての利便性が向上したと思いきや、実はOpenAIのサーバーにこの履歴が半永久的に残るのだ。
これまでの履歴が残っていないか、以下からぜひ確認してみてほしい。

履歴は「30日で消える」と解釈できるような説明書きがあるが、実際には消えない(少なくともすでに数ヶ月経つが消えていない)。
これは人によっては気分が悪いだろう。

履歴を保存しない

もし履歴を残したくなければ、APIを呼び出す際に「store」のオプションを「false」にする必要がある。
このように明示的にオフにすれば履歴は保存されない(idは発行されるようだ)。
以下に例を示す。

bash
curl https://api.openai.com/v1/responses \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "o4-mini",
    "input": [{"role": "user", "content": "日本一の山は?"}],
    "store": false
  }'

そうすると過去の履歴が参照できないため、そのままでは連続する会話が出来ないが、それはこれまで通りの流儀で、過去の会話履歴を毎回全て入力すればいい。
上述のように入力のトークン数も変わらない。

履歴を消す

次に、履歴を消したい場合だが、これが非常に面倒くさい。
OpenAIのコンソール画面では、履歴(Logs)の閲覧はできるが、削除はできないため非常にもどかしい。
それでも消す方法は一応あり、まず履歴からidを確認し、そのidを指定してAPIを叩いて消す。
以下にコード例を示す。

python
import os
import httpx

# OPENAI APIキー
API_KEY = "sk-abc"

# 削除したいIDを配列で指定
ids_to_delete = [
    "resp_xxx",
    "resp_yyy",
    "resp_zzz"
]

def delete_openai_response(response_id: str) -> dict:
    url = f"https://api.openai.com/v1/responses/{response_id}"
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    }

    with httpx.Client(timeout=30) as client:
        response = client.delete(url, headers=headers)
        response.raise_for_status()

    return response.json()

print("削除処理を開始します。\n")

for an_id in ids_to_delete:
    try:
        print(f"id: {an_id} の削除を試みます。")
        response = delete_openai_response(an_id)
        print(f" > 応答: {response}")
        if response.get("deleted"):
            print(f" > 結果: ✅ 正常に削除されました。")
        else:
            print(f" > 結果: ❓ 削除されませんでした。")
    except Exception as e:
        print(f" > エラー: {an_id} の処理中に予期せぬエラーが発生しました。\n{e}")
        print(" > 次のIDの処理へ進みます。")
    finally:
        print("-" * 20)

print("\nすべての処理が完了しました。")
input("Enterキーを押して終了します。")
参考

ただしこの方法は、会話idを1つ1つ確認する必要があり、手間がかかる(全idを取得するような方法はどうやらなさそう)。

結論

履歴の保存はオフにすることが推奨される。
そしてなるべくならResponses APIは使わない。

Raspberry PiにSSHで接続する

作成日時2025-06-27 20:11 TagRaspberry Pi

はじめに

ここではRaspberry Piの初期設定を行い、SSHで外部端末から接続するまでの手順を書きます。
前提は、ディスプレイ、キーボード、マウスがない場合です。
つまり、Raspberry Piの本体を買って、USBケーブルと電源、SDカードと、設定するPCがあるだけの状態を想定しています。

💡
【警告】この情報を利用したことによって生じた損害について、私は一切の責任を負いません。全て自己責任で行ってください。

OSインストール

まず、Raspberry PiのOSを用意します。色んなOSが使えるのですが、基本的には「Raspberry Pi OS」というのを使います。
以前に比べて簡単になり、WindowsやMacなどで最新のOSをダウンロードしてそのままSDカードにインストールできるようになりました。
以下からお使いのOS用のソフト「Raspberry Pi Imager」をダウンロードします。

PCでダウンロードしたソフトを立ち上げ、「デバイス」「OS」「ストレージ」を選択し、OSをSDカードにインストールします。
デバイスは手元のRaspberry Piを選びます。OSはRaspberry Pi OS (64-bit)を選べばいいでしょう。ストレージはインストールするSDカードを選びます。

「次へ」を押すと以下のような画面が出ます。

ここで「設定を編集する」を選びます。
そうしたら以下のような設定が行えます。これは本来、Raspberry Piを立ち上げて初期設定を行う内容ですが、予めSDカードにこれら情報も書き込むことで、ディスプレイなどがなくても初期設定が完了できる裏技です。この設定をしないと、ディスプレイなどが必要になります。

ホスト名は内部ネットワークで接続するためのものです。
ユーザー名とパスワードは今後も使うので控えておいてください。
Wi-Fiは後から変更するのが難しくなったようです。今現在設定をしている場所(自宅など)で普段使う、インターネットに繋がるWi-Fiルーターの設定をしてください。国は必ずJPにしてください。電波法関連のようです。
ロケール設定は日本のにしてください。

次に、サービスのタブでSSHを有効にしてください。
公開鍵認証がよりセキュアですが、ここではパスワード認証とします。

その後、設定を「保存」し、「はい」で進め、警告も最終確認して「はい」で進めます。

書き込みが始まりますので、終わるまで待ちます。それなりに時間がかかります。

書き込みが終了したらPCからSDカードを取り出します。

SSHで接続

OSを書き込んだSDカードをRaspberry PiのSDカードスロットに入れます。
USBケーブルをRaspberry Piに繋ぎ、USB ACアダプタに繋いで電源を入れます。

💡
Raspberry Pi 4以上は電源の推奨要求が高いです。電流が3A、5だと5Aです。確実に電圧降下するので、電圧も5.1Vなど高めに出る物が望ましいと思います。純正品がベターでしょう。

電源を入れて、少し時間が経ったら(立ち上がるのに時間がかかる)、PCなどの外部端末からSSHで繋ぎましょう(外部端末はRaspberry Piと同じネットワークに繋いでください)。
もしRaspberry PiのIPアドレスが分かるならそのIPアドレスで、分からないなら先に設定したホスト名で繋ぎます。

bash
# コマンドの例(ユーザー名が「pi」でホスト名が「raspberrypi.local」の場合)
ssh pi@raspberrypi.local

# 初回はこんな感じで尋ねられると思うので「yes」
Are you sure you want to continue connecting (yes/no/[fingerprint])?

# 設定したパスワードを入力
pi@raspberrypi.local's password:

このような表示なったら成功です!
外部端末からRaspberry Piに接続できています。
あとは好きなようにソフトを入れたりして楽しんでください。

家の外から繋ぐ

SSHで家の外からでもアクセスできるようにします。
まず、自分の家のIPアドレスを確認します。

あなたのIPアドレス(IPv4)で表示されるIPv4のIPアドレスが自分のグローバルなIPアドレスです。

bash
ssh pi@ここにグローバルIPアドレス

つまり、このようなコマンドで接続します。
しかし、ほとんどの場合、接続が失敗すると思います。
それは、外(インターネット側)と自宅のRaspberry Piの間にルーターがあるためです。
そこで、ルーターに接続を通すための穴(ポート)を開ける必要があります。

通常SSHは22番ポートを使いますが(上記のコマンドでも22番ポート)、ルーターの22番ポートを開放するとセキュリティ的に良くないです。
そこで、インターネット側は別のポートを開放し、ルーター内部で22番ポートにフォワーディングするのが望ましいです。
いずれにしろ、ルーターの設定で、ポートを開放してSSHが通るようにしてください。

上記は一例です。この例では、外部に対しては8022番ポートを開放し、ルーター内部で22番ポートに繋いでいます。
LAN側の向け先IPアドレスをRaspberry PiのローカルIPアドレスにしてください。
お使いのルーターのマニュアルをご確認の上、セキュリティに十分配慮して設定してください。

bash
ssh -p 8022 pi@ここにグローバルIPアドレス

正しく設定できれば、上のようなコマンドで、出先から自宅のRaspberry Piに接続できるはずです。

終わりに

これで家の外からもRaspberry Piに接続できるようになりました。
iPhoneなどスマートフォンからでも接続できるので、Raspberry PiにGemini CLIなどをインストールすれば、出先でもVibe Codingできるでしょう。

Enjoy!

MATさんのAIボランティア活動継続のため、ご寄付をお願いします。Squareによる安全な決済で、アカウント登録は不要です。お支払いの情報も保存されません。