中級 12 分インターフェース

NotebookLMのローカル実行に代わるオープンソースの選択肢 セルフホスト型

NotebookLMは、資料をまとめて取り込み、質問への回答に出典を示し、ポッドキャストのように聴ける音声要約を生成するというシンプルなアイデアを広めました。問題は、すべてがGoogleのサーバーに送られることです。このガイドでは、自分でホストするLLMに接続したオープンソースツールで、ローカル版NotebookLMを実現する方法を紹介します。資料をまとめたノートブック、出典付きの回答、音声合成を利用でき、ファイルは一つもお使いのマシンの外に出ません。

著者 Léa B.·更新 2026-08-27·Windows・macOS・Linuxでテスト済み

#NotebookLMの機能と、再現できるもの

NotebookLMを再現する前に、実際に何を提供しているのかを把握する必要があります。汎用チャットボットではなく、自分で選んだ文書群に根拠を置くアシスタントです。これらの資料だけをもとに回答し、該当箇所を引用します。また、理論上は、資料にない情報を作り出すことを拒みます。この利用体験は3つの要素で構成されています。

ソース資料のノートブック
PDF、ウェブページ、メモ、文字起こしをインポートします。アシスタントが情報を参照してよい範囲は、これらの資料だけに限られます。
引用された回答
各主張はそれを裏付けるソースの該当箇所を参照しており、盲目的に信頼するのではなく、ワンクリックで確認できます。
音声要約(Audio Overview)
2つの合成音声が、お使いのドキュメントについてポッドキャスト風に対話します。要約を読む代わりに、歩きながら聞けます。

これら3つの機能は、現在では自由に利用できるオープンソースの構成要素で再現できます。1つ目と2つ目は、丁寧に構築したRAG(Retrieval-Augmented Generation、検索拡張生成)にほかなりません。情報源をインデックス化し、関連する箇所を検索し、それらを参照する回答を生成します。3つ目は、テキスト → 対話 → 音声合成(TTS)というパイプラインです。特殊な仕組みは必要なく、エントリークラスのGPUを搭載した1台のマシンですべてを実行できます。

i
完全に再現されない点について
NotebookLM の非常に優れたユーザビリティおよび Audio Overview の音声品質は、ピクセル単位で再現することが難しいです。ここでの目的はインターフェースを完全にコピーすることではなく、ソース、引用、音声といった同じ使い方を維持しつつ、自らのデータをしっかり管理することです。

#NotebookLMをローカルで使いたい理由

ローカルAIキット

お使いのマシンで、プライベートかつ無料のChatGPTを1時間で構築 — LM Studio、Ollama、Open WebUI、ご自身のドキュメント、クラウド不要。

  • 永久に利用できるオンラインスペース
  • PDF + ファイル
  • 生涯アップデート

最も重要な理由は、プライバシーです。ノートブックには、研究ノートや未公開の資料、企業の内部文書、顧客ファイル、契約書、医療記録など、最も敏感な情報が含まれています。Googleにデータを保存することは、第三者にデータのコピーを委ねることを意味し、その利用条件は変更されやすく、ユーザーがその条件に影響を与えることはできません。NotebookLMをローカルで実行することで、根本的な問題が解決します。データはあなたのデスクトップに残り、推論処理は自らのハードウェア上で行われます。

データ主権
どのドキュメントも、どのリクエストも第三者サービスを経由しません。GDPR、職業秘密、または開発秘密の観点から不可欠です。
クォータやサブスクリプションは存在しません
スタックを構築すれば、ディスク容量と忍耐力が許す限り、いくつでもソースを処理できます。月ごとの上限はありません。
オフライン
処理の流れ全体がネット接続なしで動作するため、外出先やネットワークが隔離された環境で役立ちます。
モデルの制御
ブラックボックスのモデルに振り回されるのではなく、LLM、主に使う言語、量子化方式、各種設定を自分で選べます。

#信頼できるオープンソースの代替案

複数のプロジェクトが、ローカル版NotebookLMになることを明確に目指しています。完璧なものはありませんが、いずれも Ollama に接続でき、急速に進化しています。ここでは、2026年に実用に耐えるものを、NotebookLMに最も近いものから、最も「自分で手を加えやすい」ものまで順に紹介します。

Open Notebook
NotebookLMの精神に最も忠実:ノートブックの概念、情報ソースの管理、引用付きチャット、統合されたポッドキャスト生成。オープンソースでDocker化され、Ollama との互換性を保ち、100%ローカルで動作します。
SurfSense
複数の情報源(ドキュメント、ウェブ、コネクタ)を扱うオープンソースのリサーチアシスタント。情報を集約し、質問する用途に適しており、ローカルLLMにも対応しています。
Open WebUI / AnythingLLM
NotebookLMのクローンではありませんが、文書のインポート、出典付きのチャット、ローカルの埋め込みモデルという主要機能を備えた、成熟した2つのRAGインターフェースです。「出典+質疑応答」の機能を実現する最も簡単な方法です。
Podcastfy
音声部分だけを担当するコンポーネントです。ドキュメントやURLを、2人が話す会話形式に変換します。ローカルLLMと、お好みのTTSエンジンで動かせます。
→
2 つの戦略
NotebookLMと真正面から競合する「オールインワン」ツール(Open Notebook)を使うか、ソースと引用を扱うRAGインターフェース(Open WebUI)を自分で組み立て、音声用には別のTTSパイプラインを用意するか、二つの方法があります。後者はよりモジュール化しやすく、すでに持っているかもしれない構成要素を再利用できます。

#前提条件

Ollama
モデルを提供するデーモン。デフォルトのアドレスはhttp://localhost:11434です。まだインストールしていない場合は、インストールガイドを参照する。
生成モデル
Qwen 3.5 9B(Q4_K_MでVRAM約6.6 GB、コンテキスト256k、マルチモーダル対応)、または優れたフランス語性能を求めるならMistral Small 24B(約14 GB)。小規模なハードウェア構成では、Granite 4.2 8B(約5.3 GB)で十分です。
埋め込みモデル
nomic-embed-textまたはmxbai-embed-large。ollama pullで取得可能です。軽量でGPUなしでも動作します
Docker
ほとんどの代替ツール(Open Notebook、Open WebUI、AnythingLLM)は、1つのコンテナでデプロイできるため、依存関係の競合を避けられます。
ローカルTTSエンジン
音声部分に Piper を使用:高速で軽量で、フランス語の声を備えています。音声合成には GPU が必須ではありません。
モデルの取得
# Modèle de génération (adaptez à votre VRAM)
ollama pull qwen3.5:9b

# Modèle d'embeddings pour le RAG
ollama pull nomic-embed-text
i
Q4_K_MでのVRAMの基準値
3Bには約2GB、7Bには5GB、14Bには9GB、32Bには19GBを見込んでください。RTX 3060 12GBでは14Bモデルを快適に動かせます。ユニファイドメモリを搭載したMac(M4 Pro 24〜48GB)なら、32Bモデルも選択肢に入ります。

#ステップ1:Ollamaで資料をまとめたノートブックを作る

ローカル版NotebookLMを構築する最初の要素は、ノートブックそのものです。ソースを登録し、インデックス化する場所に当たります。ここでは、そのコンセプトを忠実に再現するOpen Notebookを使います。コンテナで起動し、クラウドサービスではなく利用者のOllamaと通信するように設定します。

  1. 01
    プロジェクトを取得する
    Open Notebookのリポジトリをクローンし、そのディレクトリに移動してください。リポジトリには、そのまま使えるdocker-composeファイルが含まれています。
  2. 02
    接続先をOllamaに設定
    設定(環境変数ファイル)で、モデルプロバイダーにOllamaを指定し、URLをhttp://localhost:11434(コンテナ内から接続する場合はhttp://host.docker.internal:11434)に設定してください。生成用のモデルを選び、埋め込み用にはnomic-embed-textを選択してください。
  3. 03
    スタックを起動する
    docker compose upを実行してください。するとブラウザでウェブインターフェースが開き、データベースとインデックス作成は自動で処理されます。
  4. 04
    ノートブックを作成してインポート
    ノートブックを作成し、そこにPDFをドラッグ&ドロップするか、URLやテキストを貼り付けてください。各ソースは自動的に分割され、ベクトル化されます。
ターミナル
# Récupérer et lancer Open Notebook
git clone https://github.com/lfnovo/open-notebook.git
cd open-notebook

# Configurer le fournisseur Ollama dans le fichier d'environnement
cp .env.example .env
# éditez .env : OLLAMA_API_BASE=http://host.docker.internal:11434

# Démarrer la stack complète
docker compose up -d
!
Linuxでのhost.docker.internal
Dockerコンテナ内では、localhostはコンテナ自身を指し、ホストマシンを指すわけではありません。macOSとWindowsでは、host.docker.internalはホストを指します。Linuxでは、明示的に追加する必要がある場合があります(composeファイル内のextra_hosts: host.docker.internal:host-gateway)。または、DockerゲートウェイのIPアドレスを使用します。そうしないと、Ollamaに接続できないままになります。

ツールをこれ以上増やしたくない場合は、Open WebUI や AnythingLLM が資料をまとめるノートブックとして十分に役立ちます。ワークスペース(workspace)を作成し、そこに文書を取り込むと、nomic-embed-text によるインデックス作成が自動で行われます。これは、このサイトの RAG ガイドで詳しく説明している「ノーコード」の方法です。

#ステップ2:出典付きの質疑応答

ローカル版NotebookLMの中心となるのは、自然言語で質問し、自分の資料だけに基づく回答を、根拠となる正確な箇所とともに得ることです。技術的には、RAGが質問に最も近い抜粋を取得し、LLMは自身の一般知識ではなく、その抜粋に基づいて回答を作成します。引用の質は主に2つの要素に左右されます。厳格なシステムプロンプトと、出典を明示的に求めることです。

Open NotebookでもOpen WebUIでも、この動作はすでに組み込まれています。ノートブックのチャットで質問すると、回答に使用した抜粋が表示されます。独自の処理チェーンを構築する場合は、システムプロンプトが決定的な違いを生みます。

出典付きの回答のためのシステムプロンプト
Tu réponds UNIQUEMENT à partir des extraits fournis ci-dessous.

Règles :
- Si la réponse ne figure pas dans les extraits, dis « Je ne trouve pas cette information dans les sources. »
- N'utilise jamais tes connaissances générales pour compléter.
- Après chaque affirmation, indique la source entre crochets, ex. [source 2].
- Cite mot pour mot le passage clé quand c'est utile.

Réponds en français, de façon concise.

モデルの設定では、2つのパラメータが重要です。温度を低く(0.2)設定すると、余計な創作を抑え、モデルが情報源に忠実に回答しやすくなります。コンテキストウィンドウ(num_ctx)を十分に確保すれば、検索で取得した抜粋を切り詰めずに取り込めます。そうでなければ、モデルは取得した文章の一部だけに基づいて回答します。

ソースを含めて Ollama を呼び出す
import requests

SYSTEM = open('prompt_systeme.txt').read()

# extraits = passages renvoyés par votre recherche vectorielle
contexte = "\n\n".join(
    f"[source {i+1}] {e}" for i, e in enumerate(extraits)
)

resp = requests.post("http://localhost:11434/api/chat", json={
    "model": "qwen3.5:9b",
    "stream": False,
    "options": {"num_ctx": 8192, "temperature": 0.2},
    "messages": [
        {"role": "system", "content": SYSTEM},
        {"role": "user", "content": f"{contexte}\n\nQuestion : {question}"},
    ],
})

print(resp.json()["message"]["content"])
i
RAGは「すべて」を読みません
一般に思われているのとは異なり、モデルは質問のたびに参照資料のすべてに目を通すわけではありません。受け取るのは、質問との関連性が最も高い数か所の文章だけです。質問の表現が適切でないと、的外れな抜粋が取得され、回答も質問から外れてしまいます。回答に満足できない場合は、文書で使われている用語をそのまま使って質問を言い換えてください。

#ステップ3:ローカルで音声による要約を生成する(TTS)

これはNotebookLMを代表する機能、Audio Overviewです。2人の話者が文書について語り合うもので、ローカルで再現したときにも最も印象的な機能です。パイプラインは2段階に分かれます。まずLLMがソースをもとに対話スクリプトを作成し、次にローカルのTTSエンジンがそのスクリプトを音声に変換します。これにより、音声もテキストも完全にオフラインで扱えます。

最初のステップは、会話の作成をLLMに依頼することです。内容を分かりやすく説明する2人のキャラクターのやり取りをLLMに求め、各セリフを話者でタグ付けします。このタグ付けは、音声合成時に声を交互に切り替えるために使用されます。

ポッドキャスト用スクリプトプロンプト
À partir des sources ci-dessous, écris un dialogue de podcast en français
entre deux animateurs, Alex et Camille, qui vulgarisent le contenu.

Règles :
- Format strict, une réplique par ligne : « Alex: ... » ou « Camille: ... ».
- Reste fidèle aux sources, n'invente aucun fait ni chiffre.
- Ton vivant et curieux, phrases courtes, adaptées à l'oral.
- 12 à 18 répliques, une vraie conversation qui se répond.

2段階目、音声合成です。ローカル環境では Piper が自然な選択です。高速で軽量であり、高品質なフランス語ボイスが利用できます。Alex と Camille を区別するために、話者ごとに異なる .onnx モデルファイル(2つのファイル)を割り当て、その後、音声セグメントを連結します。

Piperとフランス語の音声モデルをインストールする
# Installer Piper
pip install piper-tts

# Télécharger deux voix françaises depuis Hugging Face (rhasspy/piper-voices)
# ex. fr_FR-siwis-medium et fr_FR-upmc-medium (fichiers .onnx + .onnx.json)

# Synthétiser une réplique
echo "Bonjour et bienvenue dans cet épisode." | \
  piper --model fr_FR-siwis-medium.onnx --output_file alex_01.wav
script_vers_audio.py
import subprocess, re

VOIX = {
    "Alex": "fr_FR-siwis-medium.onnx",
    "Camille": "fr_FR-upmc-medium.onnx",
}

segments = []
for i, ligne in enumerate(open("script.txt")):
    m = re.match(r"(Alex|Camille):\s*(.+)", ligne.strip())
    if not m:
        continue
    locuteur, texte = m.group(1), m.group(2)
    wav = f"seg_{i:03d}.wav"
    subprocess.run(
        ["piper", "--model", VOIX[locuteur], "--output_file", wav],
        input=texte.encode(),
    )
    segments.append(wav)

# Concaténer les segments (ex. avec ffmpeg ou pydub)
print("Segments générés :", len(segments))

このパイプラインを手作業で書かずに済むよう、Open Notebookにはポッドキャスト生成機能が組み込まれています。また、PodcastfyはローカルLLMと好みのTTSエンジンを使って、まさにこの「ドキュメント → 音声会話」の変換を行います。上記の手動パイプラインも、処理の仕組みを理解し、声や出力形式を完全に制御するために引き続き役立ちます。

→
より自然な声
Piperは表現力よりも速度を優先します。出力音声が機械的すぎると感じる場合、KokoroやCoqui XTTSなどのエンジンなら、より自然な声を生成できます。ただし、音声合成の処理負荷が高くなり、GPUがほぼ必須になります。実用目的で聞くのであれば、Piperで十分です。

#トラブルシューティング

コンテナから Ollama に接続できません
Docker コンテナ内では、localhost はそのコンテナ自身を指します。host.docker.internal(Linux では extra_hosts で追加)またはホストの IP アドレスを使用し、必要に応じて Ollama が 0.0.0.0 で待ち受けていることを確認してください。
出典のない回答や、捏造された回答
システムプロンプトの制約が十分に厳しくないか、温度が高すぎます。「抜粋のみを根拠にする」という制約を設け、[source N]形式を必須にし、温度を0.2に下げてください。
インデックス作成時にPDFが空で返されます
テキストレイヤーのないスキャンです。インポートする前に、OCR 処理(ocrmypdf entree.pdf sortie.pdf)を行ってください。
回答は一部のソースを無視しています
num_ctxが小さすぎるため、抜粋が切り詰められています。VRAMに余裕があればnum_ctxを増やすか、取得する文章の数を減らしてください。
Piperで音声が見つからない
音声ごとに、.onnx と対応する .onnx.json の2つのファイルが必要です。同じディレクトリに配置してください。--model に渡すパスが正しいか確認してください。
発話と発話の間で音声が途切れる
WAVファイルをそのまま連結すると、音声の間に間がなくなります。より滑らかな仕上がりにするために、ffmpegまたはpydubで各セグメントの間に短い無音を挿入してください。

#さらに詳しく

このガイドは、サイト上で既に詳細に解説されている要素をまとめています。各ステップをさらに深く理解するには:

Ollama のインストール:Windows、macOS、Linux
まだ環境が整っていない場合に、ポート11434でローカルモデルを提供するための出発点となります。
OllamaによるローカルRAG(コーディング不要、Open WebUI、AnythingLLM)
ローカル版NotebookLMの「ソース+出典付きの質問応答」部分をノーコードで実現する方法。
100%ローカルの音声アシスタント:Whisper + Ollama + Piper
音声要約だけにとどまらず、Piperとローカル音声合成についてさらに詳しく知るために。
このガイドは役に立ちましたか?

ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。