# AIニュース自動収集・ビデオ自動生成システムの開発記録 進化
まずは生成されたビデオをご覧ください
日本語版
英語版
TL;DR
- 3言語対応(日英中)のAIニュース収集・分析・動画生成システムを開発
- E2Eテスト100%成功、安定稼働中
- Flask + Edge-TTS + D3.jsで構築、軽量アーキテクチャを採用
- 48kHz高音質の多言語ナレーション動画を自動生成
- CJK文字完全対応で日本語の文字切り捨て問題を解決
![AIFeedメイン画面]
はじめに
こんにちは!最近、AI技術の動向を多言語で追跡したくて、AIFeedという統合プラットフォームを開発しました。
開発のきっかけは、日本語のAI技術記事と海外の最新情報を一元的に管理したいと思ったことでした。結果として、ニュース収集から知識グラフ分析、動画生成まで行う本格的なシステムになりました。
開発期間: 約1ヶ月(2025年8月〜9月)
開発人数: 1人
GitHub: https://github.com/zixuniaowu/AIFeed これから公開予定
システム概要
AIFeedは4つの主要機能を持ちます:
| 機能 | 説明 | 技術スタック |
|---|---|---|
| 🌍 多言語ニュース収集 | 日英中3言語のAI技術ニュース自動収集 | RSS/API パーシング |
| 🧠 知識グラフ分析 | エンティティ抽出と関係性可視化 | D3.js力学シミュレーション |
| 🎬 動画生成 | 48kHz高音質の多言語ナレーション動画 | Microsoft Edge-TTS |
| 📊 プレゼン生成 | ワンクリックでPowerPointスライド生成 | python-pptx |
![知識グラフ画面]
技術選択の理由
なぜFlaskを選んだか
軽量性を重視してFlaskを選択しました。AIアプリケーションでよくあるDjangoやFastAPIではなく、Flaskにした理由:
- 最小限の依存関係
- 機能を段階的に追加可能
- デバッグとテストが容易
なぜEdge-TTSを選んだか
音声品質が決定的でした:
# 従来のgTTS vs Edge-TTS
# gTTS: 22kHz, 機械的な音声
# Edge-TTS: 48kHz, 自然な男性ナレーター
voice_config = {
'zh': 'zh-CN-YunyangNeural', # 中国語男性
'ja': 'ja-JP-KeitaNeural', # 日本語男性
'en': 'en-US-DavisNeural' # 英語男性
}
48kHzの音質差は明らかで、プロダクトの品質を大きく左上しました。
技術的な挑戦
1. CJK文字の完全表示問題
最大の技術的課題がこれでした。
問題: 日本語「バイブコーディング」→「ブコーディング」表示
原因: 文字境界の誤判定とフォント測定の不正確さ
解決アプローチ:
def smart_cjk_wrap(text, max_pixel_width):
"""CJK文字対応の智能改行処理"""
lines = []
current_line = ""
current_width = 0
for char in text:
if is_cjk_character(char):
# CJK文字は1文字ずつ測定
char_width = measure_cjk_char_width(char, font)
else:
# 英数字は単語単位で測定
char_width = measure_ascii_char_width(char, font)
if current_width + char_width > max_pixel_width:
lines.append(current_line.strip())
current_line = char
current_width = char_width
else:
current_line += char
current_width += char_width
if current_line:
lines.append(current_line.strip())
return lines
結果: 日本語の文字切り捨て完全解決
2. 軽量アーキテクチャの実現
SpaCy/PyTorch不要の設計で実用性を追求しました。
従来アプローチ:
# 重いML依存の例
import spacy
import torch
nlp = spacy.load("ja_core_news_sm") # 100MB+のモデル
軽量アプローチ:
# キーワードベースの効率的処理
keywords = ['AI', 'OpenAI', 'Google', 'GPT', 'LLM', '機械学習']
def extract_entities(text):
found_entities = []
for keyword in keywords:
if keyword.lower() in text.lower():
found_entities.append(keyword)
return found_entities
メリット:
- 起動時間: 30秒 → 3秒
- メモリ使用量: 2GB → 200MB
- デプロイサイズ: 500MB → 50MB
3. 多言語動画生成パイプライン
最も複雑な処理フローでした:
async def generate_multilang_videos(news_data):
"""多言語動画の並列生成"""
tasks = []
for lang in ['en', 'ja', 'zh']:
# 言語別ニュースフィルタリング
lang_news = filter_news_by_language(news_data, lang)
# TTS音声生成
audio_task = generate_tts_audio(lang_news, lang)
# 画像・テキスト生成
visual_task = generate_visual_content(lang_news, lang)
tasks.append(asyncio.create_task(
combine_audio_visual(audio_task, visual_task, lang)
))
# 並列実行で効率化
results = await asyncio.gather(*tasks)
return results
パフォーマンス実績
E2Eテストで100%成功を達成しました:
テスト結果詳細
🎬 AIFeed E2E デモンストレーション
📊 総合結果: 6/6 テスト成功 ✅
成功率: 100.0%
実測パフォーマンス:
├── API応答時間: 1-2秒 (全エンドポイント)
├── 動画生成時間: 2-3分 (3言語並列)
├── 知識グラフ構築: 瞬時 (57ノード + 42エッジ)
└── PPT生成時間: 1-2秒 (言語別最適化)
処理能力
| 項目 | 実績 | 技術的詳細 |
|---|---|---|
| ニュース処理 | 156件/日 | 英100・日14・中42件 |
| エンティティ抽出 | 7件/50記事 | キーワードマッチング |
| 関係性検出 | 9-10件/50記事 | グラフアルゴリズム |
| 動画ファイルサイズ | 6-9MB | 1080p高品質 |
アーキテクチャ設計
データフロー
技術スタック詳細
フロントエンド:
// D3.js知識グラフ可視化の核心部分
const simulation = d3.forceSimulation(nodes)
.force("link", d3.forceLink(links).id(d => d.id))
.force("charge", d3.forceManyBody().strength(-300))
.force("center", d3.forceCenter(width/2, height/2));
バックエンド:
# Flask API設計例
@app.route('/api/collect_and_analyze', methods=['POST'])
def collect_and_analyze():
try:
# 1. ニュース収集
news_data = collect_multilang_news()
# 2. エンティティ分析
entities = extract_entities(news_data)
# 3. 関係性構築
relations = build_knowledge_graph(entities)
return jsonify({
'status': 'success',
'collection': {'total_news': len(news_data)},
'analysis': {'entities_found': len(entities)}
})
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)})
開発で得られた知見
1. 多言語対応の価値
3言語対応により、情報の多様性が大幅に向上しました:
- 日本: 独自の技術アプローチ(例:日本のAI倫理研究)
- 中国: 最新の研究動向(例:大規模言語モデル開発)
- 英語圏: グローバルトレンド(例:OpenAI、Google等の発表)
2. パフォーマンス vs 機能のトレードオフ
軽量設計を選択した結果:
👍 メリット:
- 高速起動(3秒)
- 低メモリ使用量(200MB)
- 簡単デプロイ
👎 デメリット:
- ML機能の制限
- 分析精度の妥協
- 拡張性の課題
3. E2Eテストの重要性
テスト駆動開発で品質を担保:
class AIFeedE2ETest:
def test_full_pipeline(self):
# 1. ニュース収集テスト
assert self.test_news_collection()
# 2. 分析APIテスト
assert self.test_analysis_api()
# 3. 動画生成テスト
assert self.test_video_generation()
# 4. 統合テスト
assert self.test_end_to_end_flow()
結果: 100%成功率で本番デプロイに成功
今後の技術課題
短期的改善(1-2ヶ月)
- WebSocket対応: リアルタイム更新
- 感情分析: ニュースの感情スコア算出
- キャッシュ最適化: Redis導入でパフォーマンス向上
中長期的拡張(3-6ヶ月)
- 機械学習強化: TransformerベースのNLP導入
- クラウドネイティブ: Kubernetes対応
- API公開: 外部開発者向けAPI提供
まとめ
AIFeed開発を通じて、以下の技術的価値を創出できました:
技術的成果
- 🎯 高品質TTS統合: 48kHz自然音声の実現
- 🌐 完全多言語対応: CJK文字問題の根本解決
- ⚡ 軽量アーキテクチャ: 実用性重視の設計
- 📊 100%品質保証: E2Eテストによる信頼性確保
学んだこと
- 軽量 vs 高機能のバランス設計
- 多言語処理の複雑さと解決策
- E2Eテストの開発効率への影響
- ユーザビリティの技術選択への影響
現在、本システムは本番環境で安定稼働中で、日々のAI技術動向分析に活用しています。
特に印象的だったのは、技術的制約から生まれた創造性です。重いML依存を避けることで、かえってシンプルで実用的なソリューションを見つけることができました。
読者への質問: みなさんは多言語技術情報をどのように管理していますか?コメントで教えてください!
また、AIFeedに興味がある方は、王にご連携をお願いいたします。技術的な質問も歓迎です!
[AI学習リソースナビゲーション]
Discussion