Intermédiaire 12 minInterfaces

NotebookLM en local : les alternatives open-source auto-hébergées

NotebookLM a popularisé une idée simple : déposer un paquet de documents, poser des questions dont les réponses citent leurs sources, et générer un résumé audio écoutable comme un podcast. Le hic, c'est que tout part sur les serveurs de Google. Ce guide montre comment obtenir un NotebookLM local avec des outils open-source branchés sur un LLM auto-hébergé : notebooks de sources, réponses citées et synthèse vocale, sans qu'un seul de vos fichiers ne quitte votre machine.

Par Léa B.·Màj 2026-08-01·Testé sur Windows, macOS, Linux

#Ce que fait NotebookLM, et ce qu'on peut répliquer

Avant de le reconstruire, il faut cerner ce que NotebookLM apporte vraiment. Ce n'est pas un chatbot généraliste : c'est un assistant « ancré » dans un corpus de documents que vous choisissez. Il ne répond qu'à partir de ces sources, cite ses passages, et refuse en théorie d'inventer ce qui n'y figure pas. Trois briques composent l'expérience.

Le notebook de sources
On importe des PDF, des pages web, des notes ou des transcriptions. Ils forment le périmètre unique dans lequel l'assistant a le droit de puiser.
Les réponses citées
Chaque affirmation renvoie au passage source qui l'appuie, ce qui permet de vérifier d'un clic au lieu de faire confiance aveuglément.
Le résumé audio (Audio Overview)
Deux voix synthétiques discutent de vos documents façon podcast, pour écouter une synthèse en marchant plutôt que de la lire.

Ces trois fonctions se répliquent aujourd'hui avec des briques libres. La première et la deuxième ne sont rien d'autre que du RAG (Retrieval-Augmented Generation) soigné : indexation des sources, recherche des passages pertinents, génération d'une réponse qui pointe vers eux. La troisième est un pipeline texte → dialogue → synthèse vocale (TTS). Rien d'exotique — le tout tient sur une machine avec un GPU d'entrée de gamme.

i
Ce qu'on ne réplique pas à l'identique
L'ergonomie très polie de NotebookLM et la qualité des voix de son Audio Overview restent difficiles à égaler pixel pour pixel. L'objectif ici n'est pas de cloner l'interface, mais de retrouver les mêmes usages — sources, citations, audio — en gardant la main sur vos données.

#Pourquoi vouloir un NotebookLM local

La raison numéro un est la confidentialité. Un notebook contient souvent ce qu'on a de plus sensible : notes de recherche non publiées, documents internes d'entreprise, dossiers clients, contrats, comptes rendus médicaux. Les déposer chez Google, c'est en confier une copie à un tiers, avec des conditions d'usage qui évoluent et sur lesquelles vous n'avez aucune prise. Monter un NotebookLM local règle le problème à la racine : les fichiers restent sur votre disque, l'inférence tourne sur votre matériel.

Souveraineté des données
Aucun document, aucune requête ne transite par un service tiers. Indispensable pour le RGPD, le secret professionnel ou de la R&D confidentielle.
Pas de quota ni d'abonnement
Une fois la stack en place, vous traitez autant de sources que votre disque et votre patience le permettent, sans limite mensuelle.
Hors ligne
La chaîne complète fonctionne sans connexion, ce qui compte en déplacement ou sur un réseau isolé.
Contrôle du modèle
Vous choisissez le LLM, la langue de prédilection, la quantization et les réglages — plutôt que de subir un modèle boîte noire.

#Les alternatives open-source crédibles

Plusieurs projets visent explicitement à être un NotebookLM local. Aucun n'est parfait, mais tous se branchent sur Ollama et progressent vite. Voici ceux qui tiennent la route en 2026, du plus proche de NotebookLM au plus « bricolable ».

Open Notebook
Le plus fidèle à l'esprit NotebookLM : notion de notebooks, gestion des sources, chat cité et génération de podcast intégrée. Open-source, dockerisé, compatible Ollama pour rester 100 % local.
SurfSense
Un assistant de recherche open-source orienté sources multiples (documents, web, connecteurs). Bon pour agréger et interroger, avec support des LLM locaux.
Open WebUI / AnythingLLM
Pas des clones de NotebookLM, mais deux interfaces RAG matures qui couvrent l'essentiel : import de documents, chat avec citations et modèles d'embeddings locaux. Le chemin le plus simple pour la partie « sources + Q/R ».
Podcastfy
Une brique dédiée à la seule partie audio : transformer des documents ou des URL en conversation à deux voix. Elle se pilote avec un LLM local et un moteur TTS de votre choix.
Deux stratégies
Soit vous prenez un outil « tout-en-un » qui vise NotebookLM de front (Open Notebook), soit vous assemblez vous-même une interface RAG (Open WebUI) pour les sources et les citations, puis un pipeline TTS séparé pour l'audio. La seconde voie est plus modulaire et réutilise des briques que vous avez peut-être déjà.

#Prérequis

Ollama
Le daemon qui sert les modèles, sur http://localhost:11434 par défaut. Voir le guide d'installation si ce n'est pas encore fait.
Un modèle de génération
Qwen2.5 14B (≈9 Go de VRAM en Q4_K_M) ou Mistral-Small pour un bon français ; un 7B (≈5 Go) suffit sur petite config.
Un modèle d'embeddings
nomic-embed-text ou mxbai-embed-large, récupérables via ollama pull. Légers, ils tournent même sans GPU.
Docker
La plupart des alternatives (Open Notebook, Open WebUI, AnythingLLM) se déploient en un conteneur, ce qui évite les conflits de dépendances.
Un moteur TTS local
Piper pour la partie audio : rapide, léger, avec des voix françaises. Un GPU n'est même pas obligatoire pour la synthèse vocale.
Récupérer les modèles
# Modèle de génération (adaptez à votre VRAM)
ollama pull qwen2.5:14b

# Modèle d'embeddings pour le RAG
ollama pull nomic-embed-text
i
Repères VRAM en Q4_K_M
Comptez environ 2 Go pour un 3B, 5 Go pour un 7B, 9 Go pour un 14B et 19 Go pour un 32B. Une RTX 3060 12 Go fait tourner un 14B confortablement ; sur un Mac à mémoire unifiée (M4 Pro 24-48 Go), un 32B reste envisageable.

#Étape 1 : monter son notebook de sources avec Ollama

La première brique d'un NotebookLM local, c'est le notebook lui-même : l'endroit où l'on dépose les sources et où elles sont indexées. On prend ici Open Notebook, qui reproduit fidèlement ce concept. Il se lance en conteneur et se configure pour parler à votre Ollama plutôt qu'à un service cloud.

  1. 01
    Récupérer le projet
    Clonez le dépôt Open Notebook et placez-vous dedans. Il fournit un fichier docker-compose prêt à l'emploi.
  2. 02
    Pointer vers Ollama
    Dans la configuration (fichier d'environnement), indiquez Ollama comme fournisseur de modèles et l'URL http://localhost:11434 (ou http://host.docker.internal:11434 depuis le conteneur). Choisissez votre modèle de génération et nomic-embed-text pour les embeddings.
  3. 03
    Démarrer la stack
    Lancez docker compose up. L'interface web s'ouvre alors dans le navigateur, avec la base de données et l'indexation gérées pour vous.
  4. 04
    Créer un notebook et importer
    Créez un notebook, puis glissez-y vos PDF, collez des URL ou du texte. Chaque source est découpée et vectorisée automatiquement.
Terminal
# 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
!
host.docker.internal sous Linux
Depuis un conteneur Docker, localhost désigne le conteneur, pas votre machine. Sous macOS et Windows, host.docker.internal pointe vers l'hôte. Sous Linux, il faut parfois l'ajouter explicitement (extra_hosts: host.docker.internal:host-gateway dans le compose) ou utiliser l'IP de la passerelle Docker. Sinon Ollama restera injoignable.

Si vous préférez ne pas ajouter un outil de plus, Open WebUI et AnythingLLM font très bien office de notebook de sources : on crée un espace de travail (workspace), on y importe les documents, et l'indexation via nomic-embed-text se fait toute seule. C'est la voie « sans code » détaillée dans les guides RAG du site.

#Étape 2 : des questions-réponses citées

C'est le cœur d'un NotebookLM local : poser une question en langage naturel et obtenir une réponse qui ne s'appuie que sur vos sources, avec le passage exact à l'appui. Techniquement, le RAG récupère les extraits les plus proches de la question, puis le LLM rédige à partir d'eux — pas de sa culture générale. La qualité des citations dépend surtout de deux choses : un prompt système strict, et le fait de demander explicitement la source.

Dans Open Notebook comme dans Open WebUI, ce comportement est déjà câblé : posez la question dans le chat du notebook, et la réponse affiche les extraits utilisés. Si vous montez votre propre chaîne, le prompt système fait toute la différence.

Prompt système pour réponses citées
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.

Côté réglages du modèle, deux paramètres comptent. Une température basse (0.2) limite les broderies et garde le modèle collé aux sources. Une fenêtre de contexte (num_ctx) suffisante permet d'ingérer les extraits récupérés sans les tronquer — sinon le modèle répond sur une partie seulement des passages.

Appel Ollama avec sources
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": "qwen2.5:14b",
    "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
Le RAG ne lit pas « tout »
Contrairement à une intuition répandue, le modèle ne parcourt pas l'intégralité de vos sources à chaque question : il ne reçoit que les quelques passages les plus proches. Une question mal formulée récupère les mauvais extraits et donne une réponse à côté. Reformulez avec les termes exacts du document si la réponse déçoit.

#Étape 3 : générer un résumé audio local (TTS)

C'est la fonction signature de NotebookLM — l'Audio Overview, deux voix qui discutent de vos documents — et c'est aussi la plus impressionnante à recréer en local. Le pipeline se décompose en deux temps : le LLM écrit un script de dialogue à partir des sources, puis un moteur TTS local transforme ce script en audio. On garde ainsi la voix comme le texte entièrement hors ligne.

Première étape, faire rédiger la conversation. On demande au LLM un échange à deux personnages qui vulgarise le contenu, en balisant chaque réplique par le locuteur — ce balisage servira à alterner les voix à la synthèse.

Prompt de script podcast
À 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.

Seconde étape, la synthèse vocale. Piper est le choix naturel en local : rapide, léger, avec des voix françaises de bonne qualité. On lui donne une voix par locuteur (deux fichiers de modèle .onnx différents) pour distinguer Alex et Camille, puis on concatène les segments audio.

Installer Piper et une voix FR
# 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))

Pour éviter d'écrire ce pipeline à la main, Open Notebook intègre une génération de podcast, et Podcastfy fait exactement ce travail « documents → conversation audio » avec un LLM local et le moteur TTS de votre choix. Le pipeline manuel ci-dessus reste utile pour comprendre ce qui se passe et garder un contrôle total sur les voix et la mise en forme.

Des voix plus naturelles
Piper privilégie la vitesse à l'expressivité. Si le rendu vous semble trop robotique, des moteurs comme Kokoro ou Coqui XTTS produisent des voix plus naturelles, au prix d'une synthèse plus lourde et d'un GPU quasi obligatoire. Pour une écoute utilitaire, Piper suffit largement.

#Dépannage

Le conteneur ne joint pas Ollama
Depuis Docker, localhost pointe sur le conteneur. Utilisez host.docker.internal (ajouté via extra_hosts sous Linux) ou l'IP de l'hôte, et vérifiez qu'Ollama écoute bien sur 0.0.0.0 si besoin.
Réponses non citées ou inventées
Le prompt système n'est pas assez strict, ou la température trop haute. Imposez « uniquement à partir des extraits », exigez le format [source N] et baissez la température à 0.2.
Le PDF ressort vide à l'indexation
C'est un scan sans couche texte. Passez-le à l'OCR (ocrmypdf entree.pdf sortie.pdf) avant de l'importer.
La réponse ignore une partie des sources
num_ctx trop petit : les extraits ont été tronqués. Augmentez-le si la VRAM suit, ou réduisez le nombre de passages récupérés.
Piper ne trouve pas la voix
Il faut les deux fichiers par voix : le .onnx et son .onnx.json à côté. Vérifiez le chemin exact passé à --model.
Audio saccadé entre les répliques
La concaténation brute colle les WAV sans respiration. Insérez un court silence entre segments (ffmpeg ou pydub) pour un rendu plus fluide.

#Pour aller plus loin

Ce guide assemble des briques déjà détaillées ailleurs sur le site. Pour approfondir chaque étape :

Installer Ollama : Windows, macOS et Linux
Le point de départ pour servir vos modèles en local sur le port 11434, si ce n'est pas encore en place.
RAG local avec Ollama sans coder (Open WebUI, AnythingLLM)
La voie sans code pour la partie « sources + questions-réponses citées » de votre NotebookLM local.
Assistant vocal 100 % local : Whisper + Ollama + Piper
Pour aller plus loin avec Piper et la synthèse vocale locale, au-delà du seul résumé audio.
Ce guide vous a aidé ?

Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.