noise2blog について
メモ、文字起こし、ツイートのまとめ、短い草稿、URL の内容を整ったブログ記事にするスキルです。Gemini で文章を生成し、設定時には Tavily の調査で主張を確認します。具体的な内容は必ず情報源に基づきます。
主な機能
- 01メモ、文字起こし、ツイート集、草稿、URL に対応
- 02入力形式と記事スタイルの判定
- 03設定時の Tavily による関連主張の確認
- 04記事、SEO メタディスクリプション、別タイトルの生成
- 05入力資料や調査結果に基づく主張の確認
活用シーン
- 01断片的なメモから公開用記事を作成
- 02文字起こしやツイートスレッドをブログ記事に編集
- 03草稿内の主張を情報源と照合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ varnan-tech/ opendirectory --skill noise2blogインストール後、Claude Code で/noise2blogを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.env.exampleREADME.mdevals/evals.jsonreferences/blog-format.mdoutput-template.md詳細
ノイズからブログへ
箇条書き、音声の書き起こし、ツイートの寄せ集め、短い下書きなど、どんな未整理の入力からでも、洗練された公開可能なブログ記事を作成します。すべての主張は、元の素材または Tavily で検証した調査に基づいています。
重要なルール:具体的な情報を捏造しないでください。 ブログ記事内のすべての主張、指標、事例は、元の入力または Tavily の検索結果に基づいている必要があります。データ、引用、結果を決して捏造しないでください。
ステップ 1:セットアップの確認
必要な環境変数が設定されていることを確認します。
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}"
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:-not set, Tavily enrichment will be skipped}"
GEMINI_API_KEY が設定されていない場合: 停止します。ユーザーに次のように伝えます。「GEMINI_API_KEY が必要です。aistudio.google.com → Get API key から取得し、.env ファイルに追加してください。」
TAVILY_API_KEY が設定されていない場合: 続行します。Tavily による情報の補足はスキップされることを伝えます。ブログ記事は、提供されたコンテンツのみに基づいて作成されます。個人的な体験談、経験に基づくチュートリアル、意見記事であれば問題ありません。
入力があることを確認します。 ユーザーは次のいずれかを提供する必要があります。
- 貼り付けたテキスト(箇条書き、ラフなメモ、書き起こし、ツイートの寄せ集め、短い下書き)
- 取得する URL
入力がない場合は、次のように尋ねます。「ラフなメモ、箇条書き、または書き起こしを共有してください。直接貼り付けるか、ソースを取得するための URL を教えてください。」
ステップ 2:入力を読み、分析する
入力が URL の場合: WebFetch を使ってページのコンテンツを取得します。タイトル、著者、公開日、本文全体、主な統計、番号付きリスト、小見出し、引用を抽出します。
入力が貼り付けられたテキストの場合: そのまま読みます。入力の種類を特定します。
- 箇条書きまたはラフなメモ:断片的なアイデア、不完全な文、思いつくままの文章
- 音声の書き起こし:会話調で、繰り返しやつなぎ言葉(ええと、あの、なんというか、ほらなど)があり、話が脱線しがちな文章
- ツイートスレッドの寄せ集め:短い断片、@メンション、ハッシュタグ、「1/8」のような番号付け
- 短い下書き:構成はあるものの内容が薄く、加筆と推敲が必要な文章
品質確認ポイント: 続行する前に、次の内容を伝えます。
- 特定した入力の種類
- 中心となる主題または主な主張を一文で
- 元のコンテンツから得られる、最も重要な洞察、事実、アイデアを 3~5 件
- 外部検証が必要な主張(ベンチマーク、統計、製品比較、調査結果)
中心となる主題を特定できない場合は、次のように尋ねます。「読者に持ち帰ってほしい、最も重要なことは何ですか?」
ステップ 3:ブログ記事のスタイルを選ぶ
スタイルは 4 種類あります。コンテンツの特徴から自動判定します。ユーザーによる指定があれば、常にそちらを優先します。
| スタイル | 使用する場面 | 特徴 |
|---|---|---|
| 技術チュートリアル | 手順を追ったガイド、やり方の説明、コードの解説 | 番号付きの手順、コマンド、コードスニペット、コンテンツ内の「方法」に関する説明 |
| ケーススタディ | 実施前後のストーリー、構築記録、学んだ教訓 | 具体的な結果、期間、第一人称の体験談 |
| オピニオンリーダーシップ | 意見、主張、直感に反する主張 | 「私はこう考えます」、「X の問題点」、通説に反する立場、議論の提示 |
| 解説 | X とは何か、なぜ重要なのか、どのように機能するのか | 概念を軸とする説明、比較が中心の内容、「ほとんどの人が知らない」という説明 |
判定ロジック:
- コンテンツに番号付きの手順やコマンドがある → 技術チュートリアル
- コンテンツに実施前後の比較、具体的な指標、または物語の展開がある → ケーススタディ
- コンテンツが一般的な通説に反論している、または強い意見を主張している → オピニオンリーダーシップ
- コンテンツが、その概念、ツール、トレンドに詳しくない人向けに説明している → 解説
選んだスタイルと、その理由を伝えます。判定が難しい場合は 1 つ選び、その選択を伝えます。
ステップ 4:Tavily リサーチで情報を補強する
TAVILY_API_KEY が設定されていない場合は、このステップを黙ってスキップします。
検証やデータによる裏付けが有効な、生のコンテンツ内の主張を裏付ける証拠を検索します。候補として適しているのは、次のようなものです。
- 製品のベンチマークやパフォーマンス数値
- 市場統計や業界のトレンド
- 技術的な比較(「X は Y より高速」など)
- 引用元ではなく、ユーザーの記憶に基づいている数値
検証が必要な主張ごとに、Tavily で 1 回検索します。情報源の過剰な追加を避けるため、検索は最大 3 回に制限します。
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "SPECIFIC_CLAIM_OR_TOPIC",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
score >= 0.65 の結果を保持します。次の情報を抽出します:タイトル、URL、コンテンツの抜粋。
Tavily の検索結果を使用する際のルール:
- 生の入力にすでに含まれている主張の裏付けや検証に使用します。検索結果からまったく新しい主張を加えてはいけません。
- 「[出典]によると」「[X]のデータによると」のように、本文中で自然に出典を示します。
- Tavily の検索結果で主張を裏付けられない場合は、無関係な結果で置き換えず、未検証のままにします
ステップ 5:ブログ記事を作成する
references/blog-format.md を最後まで読みます。references/output-template.md から該当するテンプレートを選択します。作成前にすべてのルールを把握します。
特殊文字を安全に扱うため、Gemini へのリクエストを一時ファイルに書き込みます。
cat > /tmp/noise2blog-request.json << 'ENDJSON'
{
"system_instruction": {
"parts": [{
"text": "You are a tech writer who sounds like a real person. Rules: Active voice only. Short paragraphs, 1-3 lines max, then a blank line. Use contractions naturally (don't, won't, it's, can't, you're, they're). No em dashes — use a comma or period instead. No semicolons. Every sentence needs a concrete detail: a number, a tool name, a file name, a command, a result. No filler phrases: no 'In today's rapidly evolving', no 'Let's dive in', no 'It's worth noting', no 'In conclusion', no 'I hope this was helpful'. No banned words: incredible, amazing, leveraging, synergize, game-changing, groundbreaking, revolutionary, paradigm, cutting-edge, seamless, robust, unprecedented, delve, harness, utilize, transformative, disruptive, unlock, comprehensive, actionable, crucial, pivotal. Title must not start with I, My, or We. Open with a hook paragraph that does not announce the topic. Close with something actionable. Do not invent claims, metrics, or outcomes not present in the source material."
}]
},
"contents": [{
"parts": [{
"text": "RAW_CONTENT_AND_INSTRUCTIONS_HERE"
}]
}],
"generationConfig": {
"temperature": 0.7,
"maxOutputTokens": 4096
}
}
ENDJSON
RAW_CONTENT_AND_INSTRUCTIONS_HERE を次の内容に置き換えます。
- 生の入力コンテンツ
- ブログ記事のスタイルと構成に関する指示(選択したテンプレートから)
- ステップ 4 で収集した Tavily の検索結果
- 目標文字数:800~1,800 語
リクエストを送信します。
curl -s -X POST \
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d @/tmp/noise2blog-request.json \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
次の内容も作成します。
- (B)SEO プレビュー用の 1~2 文のメタディスクリプション
- (C)異なる切り口のフックを使った代替タイトル 1 つ
ステップ 6:セルフ QA
すべての項目を確認し、違反があれば提示前に修正します。
- タイトルが「I」「My」「We」で始まっていない
- タイトルが具体的で会話調になっている(「X の包括的なガイド」「Y の究極のガイド」ではない)
- 冒頭の段落が、トピックを予告するのではなく読者を引きつけている(「この記事では……」などではない)
- どの行にも em ダッシュを使っていない
- セミコロンを使っていない
- 空行が入る前の段落が 3 行を超えていない
- 禁止語を使っていない:incredible、amazing、leveraging、game-changing、delve、harness、unlock、groundbreaking、cutting-edge、remarkable、paradigm、revolutionize、seamless、robust、utilize、unprecedented、comprehensive、actionable、crucial、pivotal
- データを捏造していない:すべての主張が生の入力または Tavily の検索結果に基づいている
- 記事の末尾が「In conclusion」「To summarize」「I hope this helped」になっていない
- 800~1,800 語(語数を明記)
- 論理的な流れになっている:導入 → 問題/背景 → 本文の各セクション → 実践につながる締めくくり
違反があれば、提示前に修正します。最終的な語数を明記します。
ステップ 7:出力
ブログ記事全文をコードブロックで提示します。
メタディスクリプションと代替タイトルは、記事の下に記載します。
次のように質問します:「エディターにコピーできる状態にしますか? 特定のプラットフォームで公開する場合は、お知らせいただければ frontmatter をその形式に整えます。」
プラットフォーム固有のリクエストの場合:
Ghost:
---
title: "POST_TITLE"
date: YYYY-MM-DD
tags: [tag1, tag2]
status: draft
---
dev.to:
---
title: POST_TITLE
description: META_DESCRIPTION
tags: [tag1, tag2, tag3]
published: false
---
Substack:通常の Markdown として提示します。Substack のエディターは Markdown を直接インポートします。
Hashnode:
---
title: POST_TITLE
subtitle: META_DESCRIPTION
tags: [tag1, tag2]
---