Локальный аналог NotebookLM: генерация видео из документов без облаков | AiManual
AiManual Logo Ai / Manual.
05 Янв 2026 Гайд

Собираем локальный NotebookLM: стек для генерации видео из документов с приватностью

Пошаговый гайд по сборке локального стека для генерации видео с озвучкой из PDF, DOCX. Ollama, TTS, видеогенерация. Конфиденциальность данных.

Почему ваш документ не должен лететь в Google

NotebookLM от Google - штука удобная. Загрузил PDF, получил конспект, даже озвучку. Но есть одна деталь, которую обычно замалчивают: ваш документ улетает на серверы Google. Весь. Безвозвратно. И если вы работаете с внутренними техзаданиями, медицинскими заключениями или просто не хотите, чтобы ваши данные стали тренировочным набором для следующей модели - этот вариант не подходит.

Конфиденциальность - не абстрактное понятие. Это конкретная потребность, которая заставляет искать локальные решения. Хорошая новость: собрать свой аналог NotebookLM, который будет работать полностью на вашем железе, реально. Плохая новость: готового единого инструмента нет. Придется склеивать несколько открытых проектов. Но это и есть настоящий DevOps-подход.

Забудьте про облачные API. Весь процесс - от загрузки документа до финального видеофайла - должен происходить внутри вашей сети. Или хотя бы на вашем ноутбуке.

Из чего будем собирать наш Франкенштейн

Нам нужно разбить задачу на компоненты. Каждый компонент заменяем локальным аналогом:

  • Чтение документов: Библиотеки типа PyPDF2, python-docx. Тривиально.
  • Анализ и генерация текста: Локальная LLM. Здесь выбор огромный: Ollama или LM Studio. Я предпочитаю Ollama за простоту, но если нужен GUI, то LM Studio. Для нашей задачи подойдет модель размером 7-13 миллиардов параметров, например, Mistral или Llama 3.1.
  • Синтез речи (TTS): Coqui TTS или Piper. Coqui мощнее, но капризнее в установке. Piper проще и легче, но с немного худшим качеством. Выбираем Piper для первого прототипа.
  • Генерация видео: Тут два пути. Manim - монстр для математической анимации, но его можно использовать для создания простых слайдов. MoviePy - проще, легче, но менее эффектно. Мы возьмем MoviePy, потому что наша цель - рабочий прототип, а не произведение искусства.

Теперь, когда мы знаем компоненты, давайте посмотрим, как они соединяются в единый пайплайн.

💡
Если вы не хотите возиться с терминалом, посмотрите One-Click установщик для локальных LLM. Но учтите, наш стек требует большего контроля.

1 Подготовка фундамента: Установка Ollama и загрузка модели

Первым делом ставим Ollama. Это займет минуту. Открываем терминал и выполняем:

curl -fsSL https://ollama.com/install.sh | sh

После установки запускаем сервис и качаем модель. Для нашего кейса подойдет llama3.2:3b - маленькая, но достаточно умная для анализа текста и генерации сценария.

ollama run llama3.2:3b

Оставляем Ollama работать в фоне. Он будет слушать запросы на localhost:11434. Теперь у нас есть локальный мозг.

Не пытайтесь запустить 70-миллиардную модель на ноутбуке без видеокарты. Выберите модель по размеру вашей VRAM или RAM. В этой статье есть подборка моделей для разных задач.

2 Голос для текста: Ставим и настраиваем Piper TTS

Piper - это TTS движок, который работает на CPU. Установка через pip проста, но сначала нужно скачать голосовую модель. Выбираем русскую модель, если нужен русский язык. Например, voice-ru-ekaterina-v4.onnx.

pip install piper-tts

Скачиваем модель голоса (пример для русского):

wget -O ekaterina.onnx https://github.com/rhasspy/piper/releases/download/v0.0.2/voice-ru-ekaterina-v4.onnx
wget -O ekaterina.onnx.json https://github.com/rhasspy/piper/releases/download/v0.0.2/voice-ru-ekaterina-v4.onnx.json

Теперь можно протестировать синтез:

echo 'Привет, это тестовое сообщение.' | piper --model ekaterina.onnx --config_file ekaterina.onnx.json --output_file test.wav

Если слышите речь - отлично. Если нет, проверьте установку и права доступа к файлам.

3 Скелет пайплайна: Пишем Python-скрипт для связки всего

Теперь нужно написать скрипт, который будет:

  1. Читать PDF-файл.
  2. Отправлять текст в Ollama с промптом "Разбей этот текст на логические части для озвучки и создай сценарий для видео: каждый слайд - заголовок и 1-2 предложения".
  3. Для каждой части генерировать аудио через Piper.
  4. Создавать видео со слайдами (просто текст на черном фоне) и накладывать аудио.

Устанавливаем необходимые библиотеки:

pip install pypdf2 moviepy requests

Создаем файл local_notebooklm.py. Вот его упрощенная структура:

import json
import subprocess
import requests
from pypdf2 import PdfReader
from moviepy.editor import TextClip, CompositeVideoClip, AudioFileClip, concatenate_videoclips

# 1. Чтение PDF
def extract_text_from_pdf(pdf_path):
    reader = PdfReader(pdf_path)
    text = ""
    for page in reader.pages:
        text += page.extract_text()
    return text

# 2. Запрос к локальной LLM (Ollama)
def ask_ollama(prompt, model="llama3.2:3b"):
    url = "http://localhost:11434/api/generate"
    data = {
        "model": model,
        "prompt": prompt,
        "stream": False
    }
    response = requests.post(url, json=data)
    return response.json()["response"]

# 3. Генерация аудио через Piper
def text_to_speech(text, output_wav):
    # Используем subprocess для вызова piper
    cmd = f"echo '{text}' | piper --model ekaterina.onnx --config_file ekaterina.onnx.json --output_file {output_wav}"
    subprocess.run(cmd, shell=True, check=True)

# 4. Создание видео из слайдов и аудио
def create_video_from_slides(slides, audio_files, output_video):
    clips = []
    for i, (slide_text, audio_file) in enumerate(zip(slides, audio_files)):
        # Создаем текстовый клип
        txt_clip = TextClip(slide_text, fontsize=24, color='white', size=(1280,720), bg_color='black')
        txt_clip = txt_clip.set_duration(AudioFileClip(audio_file).duration)
        # Накладываем аудио
        txt_clip = txt_clip.set_audio(AudioFileClip(audio_file))
        clips.append(txt_clip)
    
    final_clip = concatenate_videoclips(clips)
    final_clip.write_videofile(output_video, fps=24)

# Основной процесс
def main(pdf_path):
    # Извлекаем текст
    full_text = extract_text_from_pdf(pdf_path)
    
    # Просим LLM разбить текст на слайды и сгенерировать сценарий
    prompt = f"""Разбей следующий текст на логические части для озвучки в видео. 
    Для каждой части придумай короткий заголовок и 1-2 предложения основного содержания.
    Верни ответ в формате JSON: [{{"title": "...", "narration": "..."}}]
    Текст: {full_text[:3000]}  # Ограничиваем длину для скорости
    """
    
    llm_response = ask_ollama(prompt)
    # Парсим JSON ответ (здесь нужно добавить обработку ошибок)
    try:
        slides_data = json.loads(llm_response)
    except:
        # Если LLM вернула не JSON, дефолтный вариант
        slides_data = [{"title": "Слайд 1", "narration": full_text[:500]}]
    
    # Генерируем аудио для каждого слайда
    audio_files = []
    for idx, slide in enumerate(slides_data):
        audio_file = f"slide_{idx}.wav"
        text_to_speech(slide["narration"], audio_file)
        audio_files.append(audio_file)
    
    # Создаем видео
    slide_texts = [f"{s['title']}\n\n{s['narration']}" for s in slides_data]
    create_video_from_slides(slide_texts, audio_files, "output_video.mp4")
    
    print("Готово! Видео сохранено как output_video.mp4")

if __name__ == "__main__":
    main("your_document.pdf")

Это сырой, но рабочий прототип. Он будет падать, если LLM вернет невалидный JSON, если Piper не установлен правильно, если текст слишком длинный. Но это основа, которую можно дорабатывать.

Где спрятаны грабли: нюансы, которые сломают ваш пайплайн

Теория гладкая, но практика - это набор костылей. Вот что может пойти не так:

  • LLM генерирует не JSON. Модели не всегда следуют инструкциям. Нужно либо использовать режим JSON в Ollama (не все модели поддерживают), либо парсить ответ регулярками, либо использовать более умную модель.
  • Длинные тексты. Модель может "забывать" начало. Нужно разбивать текст на чанки и обрабатывать по частям. Или использовать контекстное окно побольше, но для этого нужна модель покрупнее и больше памяти.
  • Качество озвучки. Piper на CPU может тормозить. Для длинных текстов лучше использовать асинхронную генерацию или батчи. Или поискать более оптимизированные модели TTS.
  • Создание видео. MoviePy может не установиться из-за зависимостей от FFmpeg. Убедитесь, что FFmpeg установлен в системе. И помните, что рендеринг видео - ресурсоемкая задача.
💡
Если вы хотите глубже погрузиться в оптимизацию железа для подобных задач, почитайте гайд по сборке станции за $15 000 или более бюджетный вариант за копейки.

Вопросы, которые вы зададите себе через час отладки

Проблема Решение
Ollama отвечает "Model not found" Убедитесь, что модель скачана: ollama pull llama3.2:3b
Piper не генерирует аудио, тишина Проверьте пути к модели и конфигу. Запустите Piper из командной строки с простым текстом.
MoviePy ругается на отсутствие FFmpeg Установите FFmpeg: на Ubuntu sudo apt install ffmpeg, на Mac brew install ffmpeg.
Видео получается слишком длинным и скучным Добавьте фоновую музыку, меняйте слайды чаще, используйте более агрессивное сокращение текста в промпте.

Самый главный совет: не пытайтесь сделать идеально с первого раза. Соберите минимально рабочий пайплайн, который из одного PDF делает одно кривое видео. Потом улучшайте каждую часть отдельно. Сначала добейтесь стабильной работы LLM, потом настройте TTS, затем займитесь визуалом.

И помните: ваше решение будет в 10 раз менее удобным, чем NotebookLM. Зато ваши данные никуда не уйдут. Иногда это единственный аргумент, который имеет значение.