GitHub ActionsとClaude APIで構築する自動化ドイツ語学習システム

🎯 プロジェクト概要

A2レベルのドイツ語学習者向けに、毎日300語の記事生成多言語解説音声合成を完全自動化するシステムを構築しました。120日間で1,500語のA2語彙を確実にカバーする設計になっています。

技術スタック

  • CI/CD: GitHub Actions
  • LLM: Anthropic Claude 3.5 Sonnet
  • TTS: Google Cloud Text-to-Speech
  • データ管理: JSON + Git
  • デプロイ: GitHub Pages

🏗️ システムアーキテクチャ

ワークフロー設計

# 文章生成ワークフロー (generate-content.yml)
on:
  schedule:
    - cron: '0 9 * * *'  # 毎日UTC 9時実行
  workflow_dispatch:     # 手動実行可能

# 音声生成ワークフロー (generate-audio.yml)
on:
  push:
    paths: ['blog/**']   # ブログ記事更新時にトリガー

データフロー

graph LR
    A[GitHub Actions Scheduler] --> B[Claude API]
    B --> C[語彙管理システム]
    C --> D[ドイツ語記事生成]
    D --> E[多言語解説生成]
    E --> F[Google Cloud TTS]
    F --> G[GitHub Pages Deploy]

💾 語彙管理アルゴリズム

重複回避システム

3段階フィルタリングで語彙の多様性を確保:

def generate_avoid_list(self):
    total_days = len(self.used_words)
    target_pace = 1500 / 120  # 12.5語/日
    current_pace = words_learned / total_days

    # 動的閾値調整
    if current_pace < target_pace * 0.8:
        frequency_threshold = 4  # 新語彙優先
        recent_days = 3
    elif current_pace > target_pace * 1.2:
        frequency_threshold = 2  # 復習重視
        recent_days = 14
    else:
        frequency_threshold = 3  # バランス
        recent_days = 7

    # 3段階フィルタ
    overused = self.get_overused_words(threshold=frequency_threshold)
    recent = self.get_recent_words(days=recent_days)
    unlearned_a2 = set(target_words) - set(learned_words)

    return list((overused | recent) - unlearned_a2)

A2語彙カバレッジ追跡

# 1,500語のA2語彙データベース
a2_words = {
    "family": ["familie", "mutter", "vater", ...],
    "food": ["essen", "trinken", "brot", ...],
    "work": ["arbeit", "beruf", "büro", ...],
    # 11カテゴリ × 平均136語
}

# リアルタイム進捗計算
progress = len(learned_words) / 1500 * 100
estimated_days = remaining_words / daily_pace

🤖 LLM プロンプトエンジニアリング

コンテキスト最適化

prompt = f"""Schreibe einen interessanten deutschen Text zum Thema "{topic}".

Anforderungen:
- Genau 300 Wörter
- Niveau: A2 (Grundlegendes Deutsch)
- ZIEL: Neue A2-Vokabeln (Fortschritt: {words_learned}/{target_words})

Vermeide diese bereits verwendeten Wörter:
{', '.join(avoid_words[:60])}

STRATEGISCHES ZIEL: 1.500 A2-Wörter in 120 Tagen."""

ポイント:

  • 明確な制約設定(語数、レベル、回避語彙)
  • 進捗状況の文脈提供
  • 戦略的目標の明示

🔄 多言語コンテンツ生成

連鎖的API呼び出し

# 1. ドイツ語記事生成
german_content = claude_api.generate(german_prompt)

# 2. 日本語解説生成
japanese_explanation = claude_api.generate(
    f"Create Japanese explanation for: {german_content}"
)

# 3. 英語解説生成
english_explanation = claude_api.generate(
    f"Create English explanation for: {german_content}"
)

ファイル命名規則

blog/
├── 2025-06-15.md       # ドイツ語記事
├── 2025-06-15-jp.md    # 日本語解説
└── 2025-06-15.mp3      # 音声(assets/audio/)

🎵 音声合成パイプライン

コンテンツフィルタリング

# メインドイツ語記事のみを音声化
if (filename.endswith('-jp.md') or
    'weekly' in filename.lower()):
    continue

# YYYY-MM-DD.mdパターンのみ処理
if re.match(r'^\d{4}-\d{2}-\d{2}\.md$', filename):
    process_for_audio(file_path)

音声品質最適化

GERMAN_VOICES = [
    {"name": "de-DE-Standard-A", "gender": FEMALE},
    {"name": "de-DE-Wavenet-B", "gender": MALE},
    # ランダム選択で音声の多様性確保
]

📊 パフォーマンス指標

API コスト効率

月間運用コスト: 約$1.20

API 使用量/日 月間コスト
Claude (入力) 600トークン $0.054
Claude (出力) 2,400トークン $1.08
Google TTS 1,800文字 $0 (無料枠)

システム効率

  • 語彙カバレッジ: 1,500語/120日 = 12.5語/日
  • 実行時間: 約3-4分/日
  • 成功率: 99%+ (エラーハンドリング実装済み)

🔧 技術的課題と解決策

1. YAML構文エラー

問題: 複雑なPythonスクリプト埋め込み時の構文エラー 解決: HERE文書とエスケープ処理の統一

2. API レート制限

問題: Claude API の同時リクエスト制限 解決: 順次実行とexponential backoff実装

3. 語彙重複の課題

問題: 自然言語生成での語彙制御の困難 解決: 動的閾値調整と戦略的プロンプト設計

🚀 スケーラビリティ

水平拡張の可能性

# 多言語対応拡張
SUPPORTED_LANGUAGES = {
    'french': {'level': 'A2', 'target_words': 1500},
    'spanish': {'level': 'A2', 'target_words': 1500},
    'italian': {'level': 'A2', 'target_words': 1500}
}

# 難易度レベル拡張
DIFFICULTY_PROGRESSION = ['A1', 'A2', 'B1', 'B2', 'C1']

インフラ最適化

  • セルフホストランナー: 大規模運用時のコスト削減
  • キャッシュ戦略: API呼び出し結果のキャッシュ
  • バッチ処理: 複数日分の一括生成

🔍 監視とログ

GitHub Actions メトリクス

print(f"📊 A2 Progress: {words_learned}/{total_target} ({progress}%)")
print(f"⏱️ Estimated completion: {estimated_days} days")
print(f"🎯 Daily pace: {daily_pace:.1f} words/day")

エラートラッキング

try:
    content = claude_api.generate(prompt)
except Exception as e:
    print(f"❌ Claude API Error: {e}")
    # フォールバック処理

💡 応用可能性

教育技術への展開

  • 適応学習: 個人の学習進度に応じた難易度調整
  • マイクロラーニング: 短時間集中学習コンテンツ
  • 多感覚学習: テキスト + 音声 + 画像の統合

企業研修システム

  • 専門用語学習: 業界特化語彙の体系的習得
  • プログレッシブ学習: 段階的スキルアップ
  • 自動評価: 理解度テストの自動生成

🔗 技術リソース


このシステムは “教育 × AI × 自動化” の実践例として、他の学習領域にも応用可能なスケーラブルなアーキテクチャを提案しています。