
会議の録音から検索まで、ローカルで完結できる議事録アプリ「Seam」を作りました
オンライン会議の内容を、あとから正確に思い出すのは意外と難しいです。
誰が何を決めたのか。次に何をやるのか。前回の議論はどこまで進んでいたのか。
会議中は理解していたつもりでも、数日経つと細かい文脈は抜けていきます。
議事録を毎回きれいに残せればよいのですが、実際にはそう簡単ではありません。会議に参加しながらメモを取ると発言に集中しづらいですし、録音をあとから聞き直すのは時間がかかります。AI議事録サービスは便利ですが、会議の内容によっては外部サービスへ送ってよいか判断が必要です。
そこで、macOS向けのローカルファーストな議事録アプリ Seam を作りました。
Seam は、会議の録音、リアルタイム文字起こし、要約、検索までをローカル環境中心で扱えるアプリです。Ollama を使えば要約までローカルで完結できますし、必要に応じて Codex CLI や Claude Code CLI と接続して、プロジェクト資料を参照した議事録生成もできます。
GitHubはこちらです。

Seamでできること
Seam の基本的な流れはシンプルです。
- プロジェクトを選ぶ
- マイクと、必要ならPC内部音声を録音する
- 録音中にリアルタイムで文字起こしを確認する
- 録音停止後に議事録として保存する
- 要約、検索、再文字起こし、Markdown書き出しを行う
会議アプリにbotを参加させるタイプではなく、自分のMac上で音声を拾って処理します。ZoomやGoogle Meetなど、会議ツールに依存しない形で使えるのが特徴です。
この方式にした理由は、導入の軽さです。bot型の議事録ツールは便利ですが、会議に参加者として表示されるため、相手への説明が必要になることがあります。Seam は自分のMacで録音するので、普段の会議の流れを変えずに使えます。
もちろん、録音する以上は会議参加者への説明や社内ルールの確認は必要です。ただ、ツールとしては「いつもの会議環境に足す」形で使えることを意識しています。
ローカルで扱えることを重視した理由
議事録ツールは便利ですが、会議の内容には社内の意思決定、顧客名、設計情報、採用情報、まだ公開していないアイデアなどが含まれます。
毎回クラウドサービスに送る前提だと、便利さと引き換えに扱いづらい会議が出てきます。そこで Seam では、まずローカルで完結できる構成を基本にしました。
録音データと議事録データはローカルに保存されます。文字起こしは mlx-whisper を使い、Apple Silicon上で動かします。要約も Ollama を選べばローカルLLMで生成できます。
ここで大事なのは「クラウドを一切使わない」ことだけを目的にしていない点です。会議によっては、より強いモデルを使いたい場面もあります。プロジェクト資料を読み込ませたうえで、決定事項や論点を整理したい場面もあります。
そのため Seam では、ローカル要約に加えて Claude API 、 OpenAI API 、 Claude Code CLI 、 Codex CLI も選べるようにしています。
完全ローカルで閉じたい会議はローカルで処理する。外部APIを使ってよい会議では、より強いモデルを選ぶ。開発プロジェクトの文脈を含めたい場合は、Codex CLI や Claude Code CLI に渡す。
会議の性質に合わせて処理方法を変えられることを重視しています。
マイクと内部音声を同時に録音する
会議の議事録を作るうえで、マイクだけを録音しても十分ではありません。自分の声は録れても、相手の声が入らないからです。
Seam では、マイク音声に加えて、PC内部音声も録音できます。内部音声は macOS の ScreenCaptureKit を使って取り込みます。macOSの仕様上、初回利用時には画面収録権限が必要です。
録音中はマイクと内部音声をリアルタイムにミックスし、その音声を Whisper に渡して文字起こしします。マイクだけ、またはマイク + 内部音声のどちらでも使えるので、会議環境に合わせて切り替えられます。

録音中にマイクをソフトミュートする機能も入れています。これは「会議の相手の声は残したいが、自分の手元の雑音は入れたくない」といった場面で使えます。
地味な機能ですが、実際の会議ではこういう調整が必要になります。キーボード音、手元の会話、少し席を外すときの生活音など、議事録に残したくない音は意外とあります。録音を止めるほどではないけれど、自分のマイクだけ一時的に切りたい。そういう使い方を想定しています。
録音中に文字起こしを見られる
Seam は録音が終わるまで待たず、会議中からリアルタイムで文字起こしを表示します。
発話をVADで区切り、数秒単位のチャンクとして処理します。Whisperの出力には、短い無音や音楽、会議終端などで不自然な文が出ることがあります。そのため、よくあるハルシネーション表現を除外するフィルタも入れています。
リアルタイム文字起こしは、最終的な議事録のためだけではありません。会議中に「あれ、今の話ちゃんと拾えているかな」と確認できることにも価値があります。録音が失敗していた、入力デバイスが違っていた、内部音声が入っていなかった、といった問題は会議後に気づくと取り返しづらいからです。
また、プロジェクトごとに登録した用語集や誤転写補正を、文字起こしにも反映します。固有名詞やサービス名が多い会議では、ここが地味に効きます。
議事録はあとから検索できる
会議の文字起こしは、保存しただけでは使い切れません。あとから探せることが重要です。
Seam では、議事録をSQLiteに保存し、タイトル、要約、全文書き起こしを検索対象にしています。検索にはSQLite FTS5のtrigram tokenizerを使っているため、日本語の部分一致検索にも対応できます。
たとえば「ローカル」「議事録」「認証」「画面収録」のようなキーワードで、過去の会議を横断して探せます。検索結果では、タイトル・要約・本文のどこに一致したのかも分かるようにしています。

この検索機能は、Seam の中でもかなり重要です。
議事録は、会議直後よりも数週間後に役立つことが多いです。「この仕様って前に話したよね」「リリース前に何を確認するんだっけ」「採用サイトの文言は誰が決めたんだっけ」といった場面で、議事録が検索できるかどうかが効いてきます。
きれいな要約だけでは、細かい発言や途中の論点が落ちることがあります。だから Seam では、要約だけでなく全文書き起こしも検索対象にしています。
要約だけでなく、全文も残す
議事録ツールでは、きれいな要約だけが残ることもあります。ただ、あとから確認したいのは要約に入らなかった発言だったりします。
Seam では、要約と全文書き起こしを同じ議事録の中で扱います。詳細画面では Summary と Transcribe のタブを切り替えられます。全文側にはタイムスタンプと話者ラベルが付き、音声を再生しながら該当箇所を追うこともできます。

要約は読むための入口です。全文は確認のための根拠です。
Seam では、この2つを分けて扱えるようにしています。
議事録として読むときは要約を見る。発言の細部を確認したいときは全文に戻る。必要なら保存済み音声から文字起こしを再実行する。モデル設定や話者分離の設定を変えたあとに、同じ音声で文字起こしし直せるようにするためです。
話者をあとから整理できる
会議の文字起こしでは、「話者1」「話者2」のままだと読み返しづらくなります。
Seam には話者管理機能があります。話者プロファイルを自動作成し、あとから名前を変更できます。似た話者が分かれてしまった場合は統合できますし、不要な話者プロファイルは削除できます。サンプル音声を再生して確認することもできます。
話者分離は2つのモードを用意しています。
- 高速モード: ローカルの軽量な特徴量で話者を推定
- 高精度モード:
pyannote.audioを使って録音後に再ラベリング
高精度モードではHugging Faceトークンとモデル利用規約の承認が必要です。速度と精度のバランスを見て、会議の重要度に応じて切り替えられるようにしています。

話者分離は、完璧に当てることだけが目的ではありません。あとから読み返すときに、発言の流れを追いやすくするための補助です。間違って分かれた話者を統合したり、名前を付け直したりできるようにしているのは、実際の会議では自動処理だけで完結しない場面があるからです。
プロジェクト資料を議事録に活かす
Seam では、議事録をプロジェクト単位で管理します。
プロジェクトには、保存先、関連リポジトリ、ドキュメントフォルダ、参加者、用語集、誤転写補正を設定できます。
これにより、単なる「音声から文字起こし」ではなく、プロジェクトの文脈を踏まえた議事録に近づけられます。たとえば、リポジトリ直下のREADMEや、ドキュメントフォルダ内の用語集を参照しながら、正式名称や関係者名を揃えることができます。
Codex CLI や Claude Code CLI を使う場合は、関連リポジトリやドキュメントフォルダをCLIエージェントに渡します。エージェントが必要な資料を読みに行き、その内容を参考にしながら議事録を生成します。

この機能は、特に開発プロジェクトの会議で効きます。
会議では、PR番号、ブランチ名、設計書名、社内用語、機能名などが自然に出てきます。音声だけを要約すると、そこが曖昧になりがちです。プロジェクトの資料やリポジトリを参照できるようにしておくと、議事録が単なる会話の要約ではなく、作業の文脈に近づきます。
CodexやClaude Codeと接続できるようにした
Seam の特徴のひとつが、今流行りのCodex CLI と Claude Code CLI に対応していることです。
通常のAPI連携だけでなく、CLIエージェントを起動して議事録生成に使えます。APIキーをアプリに入れなくても、手元でログイン済みのCLIを利用できます。
Codex では codex exec -、Claude Code では claude -p を使っています。プロンプトは標準入力で渡し、生成中の出力やツール利用状況をUIに表示します。
また、CLIの起動コマンドは設定画面から変更できます。PATH上の codex / claude を直接実行するだけでなく、zsh functionや独自のwrapperを経由した起動も想定しています。
この機能は、ローカル議事録アプリでありつつ、普段の開発ワークフローに寄せられるようにしたかった部分です。
特に、開発会議の議事録では「何を決めたか」だけでなく、「どのファイル、どの仕様、どのPRに関係する話だったか」が重要になります。Codex や Claude Code と接続できるようにしておくことで、議事録生成の入口を普段の開発文脈に近づけられます。
少し技術的な話
Seam は見た目にはシンプルな録音アプリですが、裏側ではいくつか気をつけた点があります。
まず、録音中の体験を止めないことを優先しました。文字起こしはチャンク単位で処理し、キューや未処理音声の状態を見られるようにしています。処理が詰まったときに原因を追いやすくするため、デバッグモードではメモリ、キュー、ログ、セッション状態も確認できます。
次に、議事録をあとから使うための保存設計です。本文、要約、メタデータはSQLiteに保存し、検索用に全文テキストを別途持たせています。Markdownは必要なタイミングで書き出せるようにしました。
また、クラッシュや途中終了への復旧も考えました。録音中のセッション情報や確定済みの文字起こしは一時ファイルにも残し、アプリ再起動時に復元できるようにしています。
最後に、設定の置き場所です。APIキーやHugging FaceトークンはmacOS Keyringに保存し、通常の設定値は ~/.seam/config.yaml に保存します。.env に依存しないため、アプリ上の設定だけで使いやすくしています。
ここはローカルアプリとしてかなり大事なところです。
議事録データは SQLite、ユーザーが外部で扱う出力は Markdown、アプリ内部の一時データは runtime 領域、秘密情報は Keyring。こうして役割を分けることで、あとからデータの所在を説明しやすくなります。
まだ割り切っているところ
Seam は万能な会議管理ツールではありません。
チーム全員で共有する管理画面、カレンダー連携、CRM連携、参加者ごとの発言分析などは主目的にしていません。まずは、1人のユーザーが自分のMacで会議を記録し、あとから検索できるようにすることに集中しています。
また、システム音声録音には macOS の権限設定が必要です。ローカルLLMを使う場合は、モデルの準備やマシン性能にも影響されます。こうした制約はありますが、その代わりに会議データを自分の管理下に置きやすいというメリットがあります。
動作確認した環境
手元では、以下の環境で動作を確認しています。
- MacBook Pro, 2024
- Apple M4
- メモリ 16GB
- macOS Sequoia 15.6.1
Apple Silicon向けに作っているため、現時点ではmacOS前提です。
まとめ
Seam は、会議の録音から文字起こし、要約、検索までをローカル環境中心で扱うために作った議事録アプリです。
Ollamaを使えば、録音・文字起こし・要約までローカルで完結できます。必要に応じて、Claude APIやOpenAI API、Codex CLI、Claude Code CLIも選べます。
「会議の内容を外に出しづらい」「Mac上でローカルに議事録を蓄積したい」「あとから全文検索できる形で残したい」という人には、相性のいいアプリだと思います。
特に、日々の開発会議や社内の意思決定を、あとから検索できる形で残したい人に向いています。録音、要約、検索、Markdown出力、CLI連携をひとつの流れにまとめることで、会議の内容をその場限りにしないことを目指しています。
まだ改善したいところは多いですが、実際の会議で使いながら育てています。
GitHubで公開しているので、気になった方は見てみてください。