Summary
- 前回の記事で IBM Bob + Foam の PKM 環境を構築した。運用していく中で入力が手間になり、「声でさっとメモして、それをきちんとしたノートに整形したい」と考えるようになった
- 音声入力 → whisper-rs(Apple Silicon Metal 加速) でローカル文字起こし → AI 整形して Daily Note の各セクションへ自動マージ、という一連の流れを実現するデスクトップアプリを作った
- 「作りたいものを日本語で伝える」だけで、IBM Bob が Plan モードで設計判断・技術選定を行い開発計画を提案、Agent モードで計画に従い実装・テストまで完成させた
やらないこと
- Tauri・Rust・whisper.cpp の基本的なチュートリアル
- 他の PKM アプリ(Obsidian・Notion 等)との機能比較・優劣の議論
- 音声認識精度の詳細なベンチマーク
本記事における背景
「声でメモして、ちゃんとしたノートにしたい」
前回の環境を運用し始めてから、音声でさっとメモして、それをきちんと構造化されたノートに仕立てたい、と考えるようになった。
会議の合間や移動前のふとした時間、アイデアが浮かんだ瞬間に文章を考え、適切なメモ・セクションを作成し、キーボードで入力する余裕がないことは多い。声で話しかけるだけでメモが取れれば、その負担はほぼゼロになる。
ただし、声で入力した雑な文字起こしをそのままノートに貼り付けても使いづらい。口語のままでは後から読み返しにくく、メモのどのセクションに入れるべきかも判断が必要になる。「話す → 整形して適切な場所に入れる」という流れを自動化したかった。
音声認識の手段として、macOS の音声入力機能(ディクテーション)を使う方法もある。しかしこれはオンラインで処理されるため、社内の会議内容や個人的なメモをクラウドに送信することへの懸念があった。また、認識結果をそのままノートに流し込む仕組みを自作するのも手間がかかる。
そこで、ローカルで音声認識を完結させ、ノート整形まで一気通貫で行う専用アプリを作るという方針に至った。
なぜ Tauri + Rust を選んだか
デスクトップアプリを作るフレームワークとして Electron も候補に挙がった。Electron は JavaScript でネイティブアプリを書ける定番の選択肢だが、今回は Tauri を選んだ。理由は主に3つある。
- Rust の安全性と省メモリ
- Tauri のバックエンドは Rust で書く。Rust はメモリ管理を厳密にコントロールできる言語で、メモリリークやクラッシュが起きにくい。常駐アプリとして長時間動かし続けることを想定すると、メモリを食い続けないことは重要な要件だった。
- アプリが軽い
- Electron は内部に Chrome(Chromium)を丸ごと同梱するため、アプリサイズが数百 MB になる。Tauri は macOS が標準で持っている WebView を使うため、アプリ本体は数 MB に収まる。
- 音声認識をローカルで動かせる
- 今回は
whisper-rs(OpenAI が開発した音声認識 AI「Whisper」)を Rust から直接使えるライブラリ)を組み込むことで、音声認識をインターネット接続なしでローカル処理することを目指した。Rust ではこのライブラリを設定ファイルに一行追加するだけで使える。別途 Python や追加ツールのインストールは一切不要である。
- 今回は
作ったもの
アーキテクチャ概要
┌────────────────────────────────────────────┐
│ pkm-desktop.app │
│ │
│ ┌──────────────┐ ┌──────────────────┐ │
│ │ React UI │◄──►│ Tauri v2 Core │ │
│ │ TypeScript │ │ (Rust) │ │
│ │ Tailwind │ │ │ │
│ └──────────────┘ │ ・note.rs │ │
│ │ ・note_merge.rs │ │
│ │ ・recorder.rs │ │
│ │ ・transcribe_ │ │
│ │ whisper.rs │ │
│ │ ・ai_client.rs │ │
│ │ ・db.rs (SQLite) │ │
│ └──────────────────┘ │
│ │
│ 永続化: Markdown ファイル + pkm.db │
└────────────────────────────────────────────┘
画面(フロントエンド)は React + TypeScript + Tailwind CSS、裏側の処理(バックエンド)は Rust で実装した。
保存するMarkdownファイルは前回記事と同じフォルダー構造をそのまま使うため、既存のノートは一切移行不要である。
技術スタック
| レイヤー | 技術 | 役割 |
|---|---|---|
| フレームワーク | Tauri v2 | デスクトップアプリの土台 |
| フロントエンド | React 18 + TypeScript + Vite | 画面の描画 |
| スタイリング | Tailwind CSS | デザイン |
| 音声録音・認識 | cpal + whisper-rs(Metal GPU 加速) | マイク録音 → ローカル文字起こし |
| データベース | SQLite | ノートのインデックスと設定の保存 |
| AI クライアント | reqwest(OpenAI 互換 REST API) | ノート整形・議事録生成(任意のモデルを設定可能) |
| グラフ描画 | Cytoscape.js | ノート間リンクの可視化 |
主要機能
1. Daily Note 管理
左サイドバーには前回記事と同じ PARA 法のフォルダー構成(Inbox / Daily Note / Projects / Areas / Resources / Archive)がそのまま並ぶ。フォルダーの場所を覚え直す必要はない。
日付のボタンで前日・翌日・今日に素早く切り替えられ、その日の Daily Note がまだ存在しなければ前回記事で設計したテンプレート(ゴール / Inbox / 作業ログ / KPT / 明日へ)が自動生成される。書いた内容は1.5秒後に自動で保存されるため、保存し忘れがない。
2. 音声入力 & 文字起こし
録音ボタンを押すとマイクの収音が始まり、停止ボタンを押した時点で録音データが whisper-rs に渡される。whisper-rs は Apple Silicon の GPU(Metal)を使って高速に推論するため、1〜2分程度の録音であれば数秒で文字起こしが完了する。
再び録音ボタンを押すと、続きから吹き込むことができるので、一度に話し続けなくても良い。
インターネット接続は不要である。音声データがクラウドに送信されることもないため、社内の会議内容を録音する際も安心して使える。
3. AI 整形 & セクション自動マージ
文字起こしされたテキストをそのまま貼り付けても、話し言葉のままで読みづらい。そこで「AI 整形」ボタンを押すと、AI がテキストを解析して Daily Note の各セクションに適切に振り分け、既存の内容を壊さずに追記する。
| セクション | マージ戦略 |
|---|---|
## 🎯 今日のゴール |
リスト項目として追記(空プレースホルダーは削除) |
## 📥 Inbox |
アイデア・メモを箇条書きで追記 |
## 🔧 作業ログ |
Markdown テーブルに新しいデータ行を追加 |
## 💬 振り返り(KPT) |
Keep / Problem / Try の各ブロックに追記 |
## ➡️ 明日へ |
タスク項目として追記 |
セクションを指定して追記したい場合は「追記先セクション」のボタンで明示的に選択できる。Auto を選ぶと AI がテキストの内容を判断して最適なセクションに振り分ける。
4. 議事録作成
会議後にタイトルと文字起こしテキスト(または音声録音)を入力すると、AI が決定事項・アクションアイテム・議題サマリーを含む構造化された議事録を生成し、対応する日付のフォルダーに自動保存する。
PDF や画像の添付もサポートしており、ホワイトボードの写真を添付すれば内容も議事録に取り込める。保存された議事録は Daily Note の右ペインに「本日の議事録」として一覧表示され、クリックで即座に開ける。
5. グラフビュー
前回の Foam でもグラフビューはあったが、今回はアプリに内蔵した。ノート間の [[wikilink]] でつながりをグラフとして描画し、種類(Daily Note / Project / Area / Resource 等)によって色分けされる。どこからもリンクされていない孤立ノートも一目で分かる。
グラフ上の丸をダブルクリックすると、対応するノートが直接開く。
6. AI ノート生成(Web / MCP)
Projects / Areas / Resources のいずれかのカテゴリでノートを新規作成する際、以下の 2 通りの AI 補助が使える。
- Web モード: URL を指定すると、ページ内容を取得して AI がノートに整形する。技術記事や公式ドキュメントをそのまま資料ノートにするのに便利
- MCP モード: 事前に設定したMCPとを利用して比較・調査ノートを作成するのに使っている
MCP サーバーは設定画面より Streamable HTTP または任意の Command を指定できる。これらをノート生成に活用することができる。
IBM Bob とのペアプログラミング体験
まず Plan モードで設計を詰める
今回の開発は「こういうアプリを作りたい」という要件を日本語で IBM Bob に伝えることから始めた。
前回 Foam で作った PKM 環境の続きで、Tauri + Rust + whisper-rs を使ってデスクトップアプリを作りたい。音声入力でメモを取り、AI が Daily Note の各セクションに自動で振り分ける機能を中心に据えたい。外部ツールへの依存は排除し、単一バイナリで動くようにしたい。
Bob を Plan モード(コードを書く前に設計を整理するモード)で起動すると、アーキテクチャの構成・Rust 側とフロントエンド側の役割分担・実装の順序・各機能のサブタスクを細かく整理したプランを提示してくれた。このプランは .bob/plans/ に保存されており、後から見返せるようになっている。
プランを確認して「この方針で進めよう」と判断したら、Agent モード(実際にコードを書いて実装するモード)に切り替えて実装を依頼した。
ビルド・テストを自律的に実行
バックエンドの Rust からフロントエンドの React まで、コードはすべて Bob が書いた。自分は「何を作りたいか」を伝え、Bob が設計・実装・修正を担う、という役割分担である。
また、 Rust はメモリの扱いに厳格なルールがある言語で、ビルド時にエラーが出やすい。しかし Bob はエラーメッセージを読んで原因の説明と修正を繰り返してくれるほか、元々の計画に影響する部分はユーザーに方針の確認を取ってから進めてくれる。
グラフビューの実装では「ノートのリンク関係を図で見られるようにしたい。ノードをダブルクリックしたらそのノートを開けるようにしたい」という要件だけ伝えたところ、Cytoscape.js を選定してフロントエンドのコンポーネントごと書いてくれた。
また、実際にビルドするだけでなく、開発サーバーを立ち上げて Playwright MCP を活用した自動操作による動作確認を行いながら、見た目や実際の挙動の不備がないかどうかチェックしてくれた。一通りのチェックを終えた後、本番ビルドを行い、成果物を自動で立ち上げて確認を促してくれた。
実際の使用感
- アプリを起動(Dock から1クリック)
- Daily Note タブが開き、今日のノートが表示される(初日はテンプレートが自動生成)
- 録音ボタンを押して話す
- 停止ボタンを押すと whisper-rs が走り、数秒で文字起こし完了
- 「✨ AI整形して各セクションに追記」を押すと Daily Note の適切なセクションに自動マージ
IBM Bob を起動しなくてもメモが取れる、という点が想像以上に心理的ハードルを下げる。「ちょっとメモしたい」という瞬間に、アプリが既に開いていれば3秒で録音を始められる。
ちょっと宣伝
この記事もBobに下書きしてもらいました!
生成AIによる開発プロセスの効率化に関心がある場合は、IBMのAIエージェント製品コミュニティであるBobサロンのような場もおすすめです!実際にBobを活用されているユーザー様の声にも触れてみてください!
私がBobを試した記事もご参考になれば幸いです。
- WebブラウザからIBM Bobを使ってみた ― ACPで開発環境を変えずにAIエージェントを使う
- IBM Bobに自作MCPサーバーを組み合わせ、他社AIにレビューさせてみた
- IBM Bob + Foam で構築する Personal Knowledge Management 環境
- IBM Bobを使って就活管理アプリをExcel VBAからWebアプリへ移行した話
- IBM BobでAWS&AzureのDocumentation MCPサーバーを使ったクラウドサービス比較レポートを作成させてみた
- IBM Bobと一緒にOpen Notebookのモバイル版UIを開発してみた
まとめ・所感
Tauri + Rust の組み合わせは、「追加ツールなしで動く軽量なアプリにしたい」「音声認識をローカルで完結させたい」「単一バイナリのネイティブアプリとして動かしたい」という要件に応えてくれた。Rust はライブラリエコシステムが充実してきているようで、音声録音から文字起こしまでに必要な機能がすべて設定ファイルに一行書くだけで使える。
IBM Bob との開発体験で改めて感じたのは、「何を作るか」を言語化することの重要性である。Plan モードで設計を詰めてから実装に入ると、Bob が迷いなくコードを書いてくれる。曖昧なまま「とりあえず動くコード」を出してもらうより、一度立ち止まって設計を言語化する時間のほうがトータルでは速い。
Rust は堅牢かつ厳格な言語だが、Bob がエラーの説明と修正案をセットで提示してくれるため、Rust 経験がなくても円滑に Tauri アプリの開発を進めることができた。今後も運用しながら必要な機能を足していきたい。








