中華圏特化AIポッドキャスト「華流テック通信 — HAL Daily Briefing」のリポジトリ。
中国語ネイティブの一次情報・準一次情報・コミュニティ情報を収集し、日本語リスナー向けに平日朝5〜10分で届けることを目的とする。
詳細な背景・意思決定の経緯は
docs/meeting.mdおよびdocs/meeting2.mdを参照。
human-decision ラベル #34〜#41 + バグ #42)。筆頭は #35 YouTube OAuth セットアップ と #34 T32 人間試聴 (docs/PROJECT_STATE.md)| パス | 役割 |
|---|---|
| config/sources.yaml | RSS/RSSHub ソース定義 (初期11本) |
| config/llm_profiles.yaml | MiMo/DeepSeek/Ollama プロファイル (Sprint 1B) |
| config/hal_persona.yaml | HAL 人格 (機械可読、TTS非依存) |
| config/show_format.yaml | 番組構成テンプレ (機械可読) |
| docker-compose.yml | RSSHub セルフホスト |
| .env.example | 環境変数サンプル (cp .env.example .env) |
| scripts/ | Spike 検証スクリプト (curl / feedparser) |
「収集 → LLM 編集判定 → 3-5 本選定 → Markdown 台本生成 → Irodori 600M VoiceDesign + caption による mp3 完パケ → Discord 投稿 → 波形動画 mp4 → YouTube 限定公開 → 朝確認 → approve 公開」 までコード実装済み (v0.5 経路)。variant A で運用中、音声品質の最終判断は T32 の人間試聴、実 YouTube アップロード smoke は OAuth セットアップ (人間) が残る。
uv sync # 基本依存 + Python 3.11+ を用意
uv sync --extra tts # produce / 実TTS を使う場合のみ
cp .env.example .env # DISCORD_WEBHOOK_URL を埋める
docker compose up -d rsshub # 掘金など RSSHub 経由ソース用
uv run python -m karyu_tech_news --help
uv run python -m karyu_tech_news validate-sources # ソース定義をスキーマ検証
uv run python -m karyu_tech_news init-db # SQLite 初期化
uv run python scripts/generate_bgm.py # 暫定BGM (コード生成, algorave風) を assets/bgm/ へ生成 (Issue #36)
uv run python -m karyu_tech_news collect --post # 収集 → SQLite → Discord 投稿
uv run python -m karyu_tech_news draft --dry-run # 台本候補の確認 (LLM 不使用)
uv run python -m karyu_tech_news draft --post # LLM 台本生成 → Discord (要 API キー)
uv run python -m karyu_tech_news produce --dry-run # 保存済み台本 → 音声完パケ (要 --extra tts + TTS 設定)
uv run python -m karyu_tech_news publish --dry-run # 完パケ mp3 → 波形動画 mp4 (要 ffmpeg)
uv run python -m karyu_tech_news publish --post # mp4 → YouTube 限定公開 + Discord 朝確認 (要 OAuth)
uv run python -m karyu_tech_news approve # 朝確認 ✅ → 公開へ切り替え (人間のみ)
uv run python -m karyu_tech_news evaluate # A/B/C 検証の定量サマリー
uv run pytest # テスト
.gitattributes で LF 固定 (bash スクリプトが CRLF だと実行不能)。core.autocrlf=true の既存チェックアウトで CRLF になっている場合は git rm -q --cached -r . && git reset --hard で再チェックアウトする。scripts/daily_pipeline.sh の契約テスト (smoke) は Windows ネイティブでは skip される (System32 の WSL bash が優先解決されるため)。実行したい場合は WSL / macOS / CI 上で走らせる。| コマンド | 状態 |
|---|---|
version / info / validate-sources | ✅ T1-T2 |
init-db | ✅ T4 (SQLite 初期化・冪等) |
collect (--source / --post / --dry-run) | ✅ T3-T10 (収集→保存→dedupe→source_health→Discord) |
draft (--variant / --post / --dry-run) | ✅ T12-T19, T21 (候補→判定→選定→台本→投稿)。実 API 接続済み (T13) |
produce (--engine / --post / --dry-run) | ✅ T31-T36 (構造化→TTS→BGM optional→-16 LUFS mp3→Discord、fail-fast品質ゲート) |
evaluate | ✅ T20 (採用率/修正回数/コスト/JSON安定性) |
publish (--audio-id / --post / --dry-run) | ✅ T38-T40 (mp3→波形動画→YouTube unlisted→video_versions→Discord 朝確認) |
approve (--video-id / --post) | ✅ T40 (朝確認 ✅ → public 切り替え。人間のみ実行) |
youtube-auth | ✅ T39 (初回 OAuth。refresh token を取得して .env へ) |
Discord 投稿は独立コマンドではなく
collect --post/draft --post/produce --post/publish --postに統合。
youtube.upload / youtube を含める。.env の YOUTUBE_CLIENT_ID / YOUTUBE_CLIENT_SECRET に設定する。uv run karyu youtube-auth を実行し、表示された URL を配信チャンネルの Google アカウントで認可 → 表示された YOUTUBE_REFRESH_TOKEN=... を .env に貼る。uv run karyu publish --dry-run (mp4 生成のみ) → uv run karyu publish (限定公開アップロード) → YouTube Studio で確認 → uv run karyu approve (公開する場合のみ)。アップロードは 1 本あたり 1600 quota units (既定 10,000/日)。自動テストから実 API は叩かない (IMPLEMENTATION_PLAN-3 §8)。
本リポジトリは docs/WORKFLOW.md で定義されたロール (人間 / Claude Code (Opus) / OpenCode / Codex / Antigravity) によって駆動される。実装は agent/<task-id>-impl ブランチで行い、main への直接 push は禁止。
156 commits
Python
97.1%
Shell
2.8%
中華圏特化AIポッドキャスト「華流テック通信 — HAL Daily Briefing」のリポジトリ。
中国語ネイティブの一次情報・準一次情報・コミュニティ情報を収集し、日本語リスナー向けに平日朝5〜10分で届けることを目的とする。
詳細な背景・意思決定の経緯は
docs/meeting.mdおよびdocs/meeting2.mdを参照。
human-decision ラベル #34〜#41 + バグ #42)。筆頭は #35 YouTube OAuth セットアップ と #34 T32 人間試聴 (docs/PROJECT_STATE.md)| パス | 役割 |
|---|---|
| config/sources.yaml | RSS/RSSHub ソース定義 (初期11本) |
| config/llm_profiles.yaml | MiMo/DeepSeek/Ollama プロファイル (Sprint 1B) |
| config/hal_persona.yaml | HAL 人格 (機械可読、TTS非依存) |
| config/show_format.yaml | 番組構成テンプレ (機械可読) |
| docker-compose.yml | RSSHub セルフホスト |
| .env.example | 環境変数サンプル (cp .env.example .env) |
| scripts/ | Spike 検証スクリプト (curl / feedparser) |
「収集 → LLM 編集判定 → 3-5 本選定 → Markdown 台本生成 → Irodori 600M VoiceDesign + caption による mp3 完パケ → Discord 投稿 → 波形動画 mp4 → YouTube 限定公開 → 朝確認 → approve 公開」 までコード実装済み (v0.5 経路)。variant A で運用中、音声品質の最終判断は T32 の人間試聴、実 YouTube アップロード smoke は OAuth セットアップ (人間) が残る。
uv sync # 基本依存 + Python 3.11+ を用意
uv sync --extra tts # produce / 実TTS を使う場合のみ
cp .env.example .env # DISCORD_WEBHOOK_URL を埋める
docker compose up -d rsshub # 掘金など RSSHub 経由ソース用
uv run python -m karyu_tech_news --help
uv run python -m karyu_tech_news validate-sources # ソース定義をスキーマ検証
uv run python -m karyu_tech_news init-db # SQLite 初期化
uv run python scripts/generate_bgm.py # 暫定BGM (コード生成, algorave風) を assets/bgm/ へ生成 (Issue #36)
uv run python -m karyu_tech_news collect --post # 収集 → SQLite → Discord 投稿
uv run python -m karyu_tech_news draft --dry-run # 台本候補の確認 (LLM 不使用)
uv run python -m karyu_tech_news draft --post # LLM 台本生成 → Discord (要 API キー)
uv run python -m karyu_tech_news produce --dry-run # 保存済み台本 → 音声完パケ (要 --extra tts + TTS 設定)
uv run python -m karyu_tech_news publish --dry-run # 完パケ mp3 → 波形動画 mp4 (要 ffmpeg)
uv run python -m karyu_tech_news publish --post # mp4 → YouTube 限定公開 + Discord 朝確認 (要 OAuth)
uv run python -m karyu_tech_news approve # 朝確認 ✅ → 公開へ切り替え (人間のみ)
uv run python -m karyu_tech_news evaluate # A/B/C 検証の定量サマリー
uv run pytest # テスト
.gitattributes で LF 固定 (bash スクリプトが CRLF だと実行不能)。core.autocrlf=true の既存チェックアウトで CRLF になっている場合は git rm -q --cached -r . && git reset --hard で再チェックアウトする。scripts/daily_pipeline.sh の契約テスト (smoke) は Windows ネイティブでは skip される (System32 の WSL bash が優先解決されるため)。実行したい場合は WSL / macOS / CI 上で走らせる。| コマンド | 状態 |
|---|---|
version / info / validate-sources | ✅ T1-T2 |
init-db | ✅ T4 (SQLite 初期化・冪等) |
collect (--source / --post / --dry-run) | ✅ T3-T10 (収集→保存→dedupe→source_health→Discord) |
draft (--variant / --post / --dry-run) | ✅ T12-T19, T21 (候補→判定→選定→台本→投稿)。実 API 接続済み (T13) |
produce (--engine / --post / --dry-run) | ✅ T31-T36 (構造化→TTS→BGM optional→-16 LUFS mp3→Discord、fail-fast品質ゲート) |
evaluate | ✅ T20 (採用率/修正回数/コスト/JSON安定性) |
publish (--audio-id / --post / --dry-run) | ✅ T38-T40 (mp3→波形動画→YouTube unlisted→video_versions→Discord 朝確認) |
approve (--video-id / --post) | ✅ T40 (朝確認 ✅ → public 切り替え。人間のみ実行) |
youtube-auth | ✅ T39 (初回 OAuth。refresh token を取得して .env へ) |
Discord 投稿は独立コマンドではなく
collect --post/draft --post/produce --post/publish --postに統合。
youtube.upload / youtube を含める。.env の YOUTUBE_CLIENT_ID / YOUTUBE_CLIENT_SECRET に設定する。uv run karyu youtube-auth を実行し、表示された URL を配信チャンネルの Google アカウントで認可 → 表示された YOUTUBE_REFRESH_TOKEN=... を .env に貼る。uv run karyu publish --dry-run (mp4 生成のみ) → uv run karyu publish (限定公開アップロード) → YouTube Studio で確認 → uv run karyu approve (公開する場合のみ)。アップロードは 1 本あたり 1600 quota units (既定 10,000/日)。自動テストから実 API は叩かない (IMPLEMENTATION_PLAN-3 §8)。
本リポジトリは docs/WORKFLOW.md で定義されたロール (人間 / Claude Code (Opus) / OpenCode / Codex / Antigravity) によって駆動される。実装は agent/<task-id>-impl ブランチで行い、main への直接 push は禁止。
156 commits
Python
97.1%
Shell
2.8%