1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

📸 カメラで撮った画像をAIが解説してくれるWebアプリを、HTML+JSだけで作ってGitHub Pagesに公開する方法【API前提・超シンプル構成】

Posted at

🎯 できること

この投稿では、以下のようなWebアプリを、フロントエンドだけ(HTML/CSS/JavaScript)で簡単に作成&公開する方法を紹介します。

  • ✅ カメラで展示物を撮影
  • ✅ 画像をAIに送信し、解説を取得
  • ✅ ブラウザ上に解説を表示
  • ✅ GitHub Pages で無料・簡単に公開
  • ✅ 開発ツール・フレームワーク不要!

🧠 対象読者

  • React や Vue を使わず、できるだけシンプルに作りたい方
  • 小さなプロトタイプをすばやく作りたい方
  • APIはすでに用意できていて、フロントに特化した構成を探している方

🧱 フォルダ構成

ai-guide-app/
├── index.html
├── style.css
└── script.js

📝 index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>AI展示物ガイド</title>
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <h1>📷 AI展示物ガイド</h1>
  <video id="video" autoplay></video>
  <button id="captureBtn">撮影してAIに送信</button>
  <canvas id="canvas" style="display: none;"></canvas>
  <div id="result"></div>

  <script src="script.js"></script>
</body>
</html>

🎨 style.css

body {
  font-family: sans-serif;
  text-align: center;
  padding: 1rem;
}
video {
  width: 100%;
  max-width: 400px;
  border: 1px solid #ccc;
}
button {
  margin-top: 1rem;
  padding: 0.5rem 1rem;
  font-size: 1rem;
  cursor: pointer;
}
#result {
  margin-top: 1rem;
  white-space: pre-wrap;
}

📜 script.js

const video = document.getElementById("video");
const canvas = document.getElementById("canvas");
const captureBtn = document.getElementById("captureBtn");
const resultDiv = document.getElementById("result");

// カメラを起動する処理
navigator.mediaDevices.getUserMedia({ video: true })
  .then(stream => video.srcObject = stream)
  .catch(err => alert("カメラの起動に失敗しました:" + err));

// 撮影してAPIに送る処理
captureBtn.addEventListener("click", async () => {
  // canvas に映像を描画
  const ctx = canvas.getContext("2d");
  canvas.width = video.videoWidth;
  canvas.height = video.videoHeight;
  ctx.drawImage(video, 0, 0);

  // 画像データをBase64に変換
  const blob = await new Promise(resolve => canvas.toBlob(resolve, "image/jpeg"));
  const base64Image = await toBase64(blob);

  // AI APIに送信(※APIエンドポイントとKEYは自分で設定)
  resultDiv.textContent = "AIが解説中...";
  try {
    const res = await fetch("https://your-api-endpoint.com/analyze", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "Authorization": "Bearer YOUR_API_KEY"
      },
      body: JSON.stringify({ image: base64Image })
    });

    const data = await res.json();
    resultDiv.textContent = data.explanation || "説明が取得できませんでした";
  } catch (err) {
    resultDiv.textContent = "エラーが発生しました: " + err.message;
  }
});

// Base64変換関数
function toBase64(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onloadend = () => resolve(reader.result.split(',')[1]); // base64部分のみ抽出
    reader.onerror = reject;
    reader.readAsDataURL(blob);
  });
}

🚀 GitHub Pagesで公開する手順

  1. GitHubにログインし、新しいリポジトリを作成(例: ai-guide-app
  2. 上記3ファイルをアップロード(またはGitでpush)
  3. GitHubリポジトリ → SettingsPages を開く
  4. 「Branch: main / root (/)」 を選択して「Save」
  5. 数秒〜1分ほど待つと、以下のようなURLで公開されます
https://your-username.github.io/ai-guide-app/

🛡 注意点

  • カメラを使うにはHTTPS環境が必須(GitHub Pages は OK)
  • OpenAIなどのAPIキーをフロントに埋め込むのはセキュリティ的に推奨されません
    → サーバ側でリクエストを中継する「プロキシAPI」の設置を検討してください

🧩 応用アイデア

  • 質問候補(例:「これは何時代?」「作者は?」)をAPI側で返す
  • チャットUIにして会話形式で解説を続けられるようにする
  • 解説履歴を画面に残す/ログとして保存する
  • PWA対応してホーム画面に追加可能にする

✅ まとめ

項目 内容
使用技術 HTML / CSS / JavaScriptのみ
フレームワーク 不使用(Vanilla構成)
ビルドツール 不要
公開方法 GitHub Pages(無料・HTTPS対応)
学習コスト 最小

💬 デモ(任意で追加)

https://your-username.github.io/ai-guide-app/
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?