はじめに
こんにちは!
@piacerex さんが制作された噂のNotebookLMクローンプロジェクト 「notex」 を、Docker(Ubuntu 24.04 LTSベース)環境で動かしてみました。
ローカルで動かすための準備から、起動中に遭遇したちょっとしたバグ(Elixir PhoenixのLiveView関連など)の修正、そして実際にRAGや各種メディア生成(マインドマップ、スライド、動画)を試した結果まで、体験記事としてまとめます。
1. 動作環境とベースイメージの選定
READMEによると、ナレーション付き動画生成のために open-jtalk や ffmpeg などのパッケージが必要になります。
apt-getの例が書いてあったので、Ubuntu Noble(24.04 LTS)ベースのイメージを選択しました。
- ベースイメージ: hexpm/elixir:1.20.2-erlang-29.0.3-ubuntu-noble-20260610
- 対象リビジョン (Git HEAD): 78c18c4e21b93f6960bd10d49883c6515ffe825a (Refine web search relevance)
2. Dockerfile の作成
必要な各種メディアライブラリ(動画用の ffmpeg、日本語音声合成用の open-jtalk、日本語フォントなど)とElixirビルドツールをDockerfile内でまとめてインストールします。
プロジェクトルートに以下の Dockerfile を作成しました。
FROM hexpm/elixir:1.20.2-erlang-29.0.3-ubuntu-noble-20260610
# 回避:パッケージインストール時の対話プロンプト
ENV DEBIAN_FRONTEND=noninteractive
# READMEで指定されているメディア系パッケージおよびビルドツールのインストール
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
git \
curl \
ffmpeg \
open-jtalk \
open-jtalk-mecab-naist-jdic \
hts-voice-nitech-jp-atr503-m001 \
fonts-noto-cjk \
espeak-ng \
&& rm -rf /var/lib/apt/lists/*
# 作業ディレクトリの設定
WORKDIR /app
# Hex と Rebar のインストール
RUN mix local.hex --force && \
mix local.rebar --force
# ソースコードをコピーして依存関係の取得・ビルドを実行
COPY . .
RUN mix deps.get && \
mix setup
# Phoenix のデフォルトポート
EXPOSE 4000
# サーバーの起動コマンド
CMD ["mix", "phx.server"]
3. 遭遇した2つのトラブルとパッチ(修正方法)
リポジトリを as-is でそのままコンテナ化して起動したところ、動かすために以下の2つのパッチ修正が必要になりました。
① ホストからアクセスできない問題(0.0.0.0 バインド)
-
現象: コンテナは正常に立ち上がっているように見えるが、ホストマシンのブラウザから
http://localhost:4000にアクセスするとConnection reset by peerで接続が拒否される。 -
原因: 開発環境設定(
config/dev.exs)でバインドアドレスがループバック(127.0.0.1)に固定されていたため、コンテナ外からの通信が遮断されていました。 -
修正方法:
config/dev.exsの12行目付近を0.0.0.0に変更して、どこからでもアクセスできるようにします。
- http: [ip: {127, 0, 0, 1}],
+ http: [ip: {0, 0, 0, 0}],
② ソース追加時にLiveViewがクラッシュする問題(as: :source の指定漏れ)
-
現象: UI上の「Add Source」からテキストソースを入力して送信すると、LiveViewプロセスがクラッシュ(
FunctionClauseError)する。 -
原因:
HTMLフォーム側はsource[title]/source[body]というネストされたパラメータ名で送信する設計になっており、サーバー側も%{"source" => source_params}というパターンマッチで待ち受けていました。
しかし、LiveViewのバックエンド(lib/notex_web/live/notebook_live.ex)でフォームデータを初期化・構築するto_form呼び出し時に、パラメータをネストさせるためのオプション:asの指定が漏れていました。その結果、フラットなパラメータが送信されてマッチできずに落ちていました。 -
修正方法:
notebook_live.ex内の該当するto_formの呼び出し箇所(計4箇所)に、as: :sourceを明示的に指定するように修正しました。
# 例 (notebook_live.ex 32行目付近)
- |> assign(:source_form, to_form(Notebooks.change_source()))
+ |> assign(:source_form, to_form(Notebooks.change_source(), as: :source))
この修正が正しいのかどうかは確信がありませんが、私の手元ではこれで、ソース追加ができるようになりました。
4. コンテナのビルドと起動
パッチを当てた後、以下のコマンドでDockerイメージをビルドし、環境変数を指定してコンテナを起動します。
# 1. ビルド
docker build -t notex .
# 2-A. OpenAI公式 APIを使用して起動
docker run -p 4000:4000 \
-e NOTEX_LLM_PROVIDER="openai" \
-e OPENAI_API_KEY="your-open-ai-api-key" \
-e NOTEX_LLM_MODEL="gpt-5.6-luna" \
-e NOTEX_LLM_BASE_URL="https://api.openai.com/v1" \
-e NOTEX_OPEN_JTALK_RATE="1.0" \
-e NOTEX_VIDEO_FONTFILE="/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc" \
-e NOTEX_LLM_REASONING_EFFORT="low" \
notex
OpenAIのAPI Keyは、 https://platform.openai.com/api-keys から取得します。
5. 実際に使ってみた結果
ブラウザで http://localhost:4000 にアクセスすると、無事にNotebookLMそっくりのモダンなUIが立ち上がりました!
① ソースの追加
選んだのは以下のリソースです。
② RAG(ソースに基づく回答)と引用機能
ノートに「ElixirやAIについてのテキスト」をソースとして貼り付け、「AIとは何ですか?」と質問してみました。
すると、登録したソースから正確に情報を読み込み、回答の語尾に [1] などの引用リンクを付けて答えてくれました。私好みの回答が得られています。
③ 各種メディア(成果物)の生成
右側の「Media」パネルから、ワンクリックで多様なインフォグラフィックやレポートが作成できます。今回は以下を試しました。
- マインドマップ: ノートの要約構造を円と線で繋いだ図として出力してくれます。
- スライド: 内容を要約した説明スライドが自動作成されます。
-
動画:
OpenAIには台本(テキスト)を作らせ、コンテナ内のopen-jtalkで日本語ナレーションを生成し、ffmpegで字幕(fonts-noto-cjk)と合成してスライド解説動画(MP4)をローカルで完全生成してくれます。
④ ai& Inference (deepseek-ai/deepseek-v4-flash) での動作検証
国内のAIモデル推論プラットフォームである ai& Inference 経由でも動作を確認しました。
- 動作ステータス: RAG(チャット)機能の生成は動作しました。一方、今回のコンテナ環境およびAPI仕様の違いからか、動画(Video)の生成処理はエラーとなり動きませんでした(今回は深追いしていません)。
- もっと性能のよいモデルでの検証: 『GPT5.5 相当の GLM5.2 (ai& Inference提供) を GitHub Copilot で動かしてみた $50=8000円分使えますよ!』を参考に、8,000円分のクレジットをいただいています。GPTと相性がよいような気がなんとなくするので、「openai/gpt-oss-120b」を試してみたいと思っています。あくまでも思っています。
以下、ai& Inference のAPIを使用する場合の起動例です。
docker run -p 4000:4000 \
-e NOTEX_LLM_PROVIDER="openai" \
-e OPENAI_API_KEY="your-ai&-api-key" \
-e NOTEX_LLM_MODEL="deepseek-ai/deepseek-v4-flash" \
-e NOTEX_LLM_BASE_URL="https://api.aiand.com/v1" \
-e NOTEX_OPEN_JTALK_RATE="1.0" \
-e NOTEX_VIDEO_FONTFILE="/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc" \
-e NOTEX_LLM_REASONING_EFFORT="low" \
notex
NOTEX_LLM_PROVIDER の指定について
Notexの内部実装では、環境変数 NOTEX_LLM_PROVIDER に指定された文字列("openai" / "codex_app_server")によって、どの通信モジュールをロードするかを分岐しています。
ai& InferenceなどのOpenAI互換APIサービスを利用する場合、内部でHTTP通信用のクライアント(Notex.LLM.OpenAI)をロードさせる必要があるため、プロバイダー名には "openai" を指定する必要があります。
まとめ
ローカルで動作する、Elixir Phoenix製NotebookLMクローン「Notex」の体験レポートでした。
Elixir(Phoenix LiveView)で書かれているためUIのレスポンスが非常に高速で、コンテナ内のローカルツール(ffmpeg / open-jtalk)をフル活用した動画生成のアーキテクチャなどは、非常に開発の参考になります。
動かす際は一部のバグ(!?)修正や、環境によっては 0.0.0.0 バインドの設定が必要になるため、この記事のパッチを参考に試してみてください!
ai& Inference については、『OpenAI APIからai& InferenceのOpenAI互換APIへ載せ替えたら、ほぼbaseURL変更だけで動いた話』の記事でも書いた通り、baseURL変更だけで動きます!
編集後記
NewPJ (新プロジェクト) ということだと思いますが、私には、New Japanつまり、新日本(プロレス)にしか見えませんでした。新日本プロレスを創設したのは、もちろんアントニオ猪木さんです。





