概要
NHK・Yahoo! Japanのニュースを自動収集し、Gemini AIがふりがな・中国語翻訳・キーワード抽出を行うAIニュース学習支援サービス。
対象ユーザー
- 日本語学習者
- 中国語話者
- 毎日ニュースを効率よく読みたい人
Demo / GitHub
🔗 Demo を試す | GitHub
スクリーンショット
トップ画面 — ニュース一覧・ふりがな・中国語翻訳
カテゴリフィルタ・キーワード絞り込み
過去記事閲覧・日付指定
開発背景
日本語学習を続ける中で、自分自身が毎日使いたいサービスとして企画・設計・開発した。
毎日ニュースを読む習慣をつけたかったが、複数のニュースサイトを巡回するのは手間がかかる。さらに、難しい漢字のふりがなや中国語での確認もしたい。これらの課題を一つのサービスで解決するために開発した。
解決した課題
- 日本語ニュースを中国語で素早く理解できる
- 難読漢字にふりがなを自動付与
- 複数ニュースサイトを一画面で閲覧
- トレンドキーワードで今日の話題を把握
- 重複ニュースを自動排除
主な機能
- ニュース自動収集(NHK 5カテゴリ + Yahoo! Japan)
- AIふりがな生成
- 中国語翻訳
- トレンドキーワード抽出
- カテゴリ検索・キーワード絞り込み
- 既読管理
- 過去記事閲覧
- OGPシェア画像生成
- RSS配信
- ダーク/ライトモード
使用技術
- フロントエンド: Next.js 15 / React 19 / TypeScript / Tailwind CSS 4
- バックエンド: Next.js API Routes / Server Components / ISR
- AI: Gemini 2.5 Flash(@google/genai SDK)
- DB: Supabase(PostgreSQL + RLS)
- デプロイ: Vercel(自動デプロイ + Cron Jobs)
設計上の工夫
- 並列取得: 6フィードをPromise.allSettledで同時取得。1つのフィードが失敗しても他に影響しない耐障害設計
- 2層重複排除: URL完全一致 + タイトルのBigram Jaccard類似度判定(閾値0.4)で、同じニュースの異なるソース記事を自動統合
- AIバッチ処理: 10記事を1回のAPI呼び出しでまとめて処理。構造化JSON出力を利用し、安定したAIレスポンスを実現
- 自動更新: Vercel Cron(1日1回)+ ISR(約1時間ごと)の組み合わせで、サーバーレスながら継続的にコンテンツを更新
- グレースフルデグラデーション: Supabase・Gemini AIそれぞれ未設定でもアプリが動作する独立設計
アーキテクチャ
[NHK RSS x5] + [Yahoo RSS x1] ↓ rss-parser(6フィード並列取得) ↓ 重複排除(URL → タイトルBigram Jaccard) ↓ Top 10記事を選定 Gemini AI(1回のバッチ呼び出し) ├─ ふりがな付与 ├─ 中国語翻訳 └─ キーワード抽出 x5 ↓ Supabase PostgreSQL(upsert保存) ↓ Next.js Server Component(ISR: 1時間キャッシュ) ↓ Vercel CDN → ユーザーに配信
開発周期
2週間
担当範囲
要件定義 → 設計 → フロントエンド → バックエンド → DB設計 → デプロイ(全工程を一人で担当)
成果・実現したこと
- 複数ニュースサイト巡回の手間を削減し、一画面で日本語ニュースを学習できる環境を実現
- 中国語翻訳・ふりがな付与により、日本語学習者の情報収集効率を向上
- AIによるキーワード抽出で、今日の重要トピックを即座に把握可能に
- 6フィードを平均2秒以内で並列取得
- Gemini AI 1回のAPI呼び出しで10記事分を同時処理
- Vercel Hobby(無料プラン)でゼロコスト運用を実現
開発で直面した課題と解決方法
- 重複記事問題: 同じニュースがNHKとYahoo!の両方に配信される → URL一致だけでなく、タイトルのBigram Jaccard類似度判定を実装し解決
- AI処理コスト: 記事ごとにAPI呼び出しすると遅くコストが嵩む → 10記事を1回のバッチリクエストにまとめる設計に変更
- 外部サービス障害対応: 環境変数なしでもアプリが動くよう、DB・AIそれぞれ独立してオプショナルな設計に
このプロジェクトで学んだこと
- AI機能を組み込む際は、個別処理よりバッチ処理の方がコスト・速度ともに有利であること
- 外部サービス(RSS・AI・DB)は独立して設計することで、一部障害時も全体停止を防げること
- サーバーレス環境でも、運用を前提にした更新設計が重要であること