mcpField
G
Griasa

Griasa

ローカル
stari-am.github.io生産性71 日前に更新

Griasa について

Griasaは、会議から約束事項を抽出し、次の通話向けブリーフを作成するローカル優先のmacOSメニューバーアプリです。録音、約束、同僚ページ、リマインダーを関連付け、AIアシスタント向けにローカルの読み取り専用MCPエンドポイントを提供します。

主な機能

  1. 01参加者と履歴に基づく通話前ブリーフ
  2. 02マイクとシステム音声を別トラックで録音
  3. 03会議の約束事項を抽出して追跡
  4. 04状況に応じたリマインダーと同僚ページ
  5. 05オンデバイス音声認識とAIの選択肢
  6. 06ローカルのトークン保護付き読み取り専用エンドポイント

活用シーン

  1. 01会議前に関連する約束事項を確認
  2. 02現在のアプリやウィンドウからリマインダーを作成
  3. 03フォーカス中のアプリに音声入力
  4. 04MCPクライアントから会議記録を参照

MCP 対応

互換クライアントが会議情報を読み取るための、ローカルでトークン保護された読み取り専用MCPエンドポイントを提供します。Claude Desktopではワンクリックでインストールできます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ
パッケージ
mcpbGriasa.mcpb

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

README の画像

Griasa

期限のある約束は、期限を過ぎると表面化します。期限のない約束は、決して表面化しません。

Griasa は、あなたの会議を自分の Mac に記録し、誰が何を約束したのかを整理して、 あなたが相手に返すべき約束を、次にその人と通話する前に提示します。 サービスではなく、メニューバーアプリです。

macOS 版をダウンロード · プロジェクトページ · 変更内容

最新リリース ライセンス プラットフォーム 依存関係

19秒のループ動画:文字起こしの一文が、期限と元になった正確な発言を添えた約束に変わり、次の通話前にブリーフが表示され、Claude Desktop が Griasa から「先週、Maya に何を約束した?」という質問に回答します

会議前のブリーフ:通話の参加者と各人の未完了の約束の数、前回の会議の内容、期限超過、この会議より前の約束、1対1の会話、このメンバーとの別の場での約束に分類された約束

キーボードのフォーカスを奪わず、通話の5分前に表示されます。スクリーンショットに写っている人は全員架空の人物です。撮影のために、Support/shoot-docs.shを使ってアプリに架空のチームを表示しています。

できること

通話の前。 カレンダーの予定の数分前に、参加者と最後に話し合った内容を示すパネルが表示されます。未完了の約束は、表示する理由ごとに分類されます。期限を過ぎているもの、まったく同じ参加者との以前の通話で約束したもの、同席者との1対1の会話でのもの、または同じメンバーとの別の場でのものです。誰も同席していない約束は、表示されません。ボタンを1つ押すだけで Zoom または Meet のリンクを開き、録音を開始できます。

通話中。 マイクと Mac で再生されるすべての音を、話者を文字起こしで識別できるように2つのトラックとして録音します。画面上のどの内容からでもリマインダーを作成でき(⌃⌥⌘R)、元のアプリ、ウィンドウ、ブラウザーのタブを記録します。キーを押しながら話すと、フォーカスのあるアプリに言葉が入力されます。

通話の後。 文字起こしから、誰が何をいつまでに引き受けたのかという約束を抽出し、あなたが相手に負うものと、相手があなたに負うものに分けます。後の会話では、約束を完了として扱うことを提案できますが、完了を示す文を引用する必要があります。約束が自動的に完了扱いになることはありません。古くて期限のない約束については、確認を求めます。そうした約束は、自力では表面化しないからです。同僚ごとのページは、会議の参加者一覧をもとに作成され、設定は不要です。

自分のアシスタントからも読み取れます。 Claude Code、Codex、Cursor など、MCP を使うものなら何でも、ローカルのトークン保護された読み取り専用エンドポイント経由で利用できます。また、Claude Desktop にはワンクリックでインストールできます。

すべてを同時に実行できます。会話を録音しながら、音声入力もできます。各機能の多くは小さなもので、Apple ならいくつかを明日にでも提供できるでしょう。模倣が難しいのは、それらが1つの仕組みになっていることです。通話中に作成したリマインダー、その通話から抽出した約束、それをした人のページ、そしてその人との次の会議前に表示するブリーフ。どれも、同じ人々と同じ履歴を参照します。別々のアプリでは、それぞれに個別の連携が必要になり、結びつきも失われてしまいます。そのつながりは、どのアプリ単独の機能でもないからです。

プロジェクトページでは、さらに詳しく紹介しています。スクリーンショット、Mac から送信されるものと送信されないもの、想像以上に難しかったエンジニアリング、そして実際によく寄せられる質問をご覧ください。

プライバシーポリシー

概要は以下のとおりです。ポリシー全文はstari-am.github.io/griasa/privacy.htmlをご覧ください。

  • 音声がMacの外に出ることはありません。 文字起こしはローカルで行われ、Appleの音声認識機能またはwhisper.cppを使用します。Griasaのサーバーもアカウントもありません。
  • テキストはデフォルトでMac内に保存されます。 新規インストール時は、最初の質問のあとにGriasaがセットアップするローカルモデルを使用します。Anthropic、OpenAI、Geminiを使用するのは、ご自身で選択した場合のみです。
  • カレンダーは読み取り専用です。 リマインダーは作成されますが、作成するのは依頼があった場合のみです。
  • APIキーはmacOSのキーチェーンに暗号化して保存され、通常の設定ファイルには保存されません。
  • すべてのアクセス許可は任意です。 許可しない場合に何が使えなくなるかは、アプリが説明します。
  • 録音中であることを相手に伝えるためのリマインダーは任意です。 通話相手の画面にmacOSから録音中の表示は出ません。Settings → Meetings → Remind me to tell everyoneをオンにすると、録音の開始時に、通話のチャットに貼り付ける文章が表示されます。
  • ほかのツールのメモも取り込めます。 *Import Meeting Notes…*を使うと、ChatGPT Record、Zoom、Meetの要約をGriasaのミーティングとして取り込み、約束、人物ページ、概要を作成します。日付にはミーティングの開催日が使われます。
  • 古い音声を自動削除できます。 文字起こしとメモは保持されますが、文字起こし済みの録音音声は、選択した期間が過ぎたあとに削除できます(Settings → Meetings → Recordings on disk)。録音が使用する容量のほぼすべてを占めるのは、この音声です。
  • 企業はMDMで利用を制限できます — デバイス上のAIのみ、企業のモデルサーバー、MCPの無効化などに設定できます。Support/mdmをご覧ください。

ダウンロード

最新リリースをダウンロード — 署名済み、公証済み、ユニバーサル。または./build.shを実行して、ご自身でコンパイルできます。

Homebrewを使う場合は、コマンドひとつでアプリと、アプリが使う2つのエンジン(音声認識用のwhisper.cppと、デバイス上のAI用のllama.cpp)をインストールできます。

brew install --cask stari-am/tap/griasa

無料で、機能制限もありません。ライセンスチェックはなく、GPL-3.0のもとでは意味のあるチェックを設けることもできません。時間の節約になったら、Ko-fiで29ドルを寄付していただけるとうれしいです — いくらでも歓迎です。もちろん、寄付なしでも問題ありません。

WinRARのようなものだと思ってください。試用期間は終わらず、支払うかどうかにかかわらず使い続けられます。どうやらWinRARはこの方法で実際に利益を上げているようです。30年間誰も解き明かせていない謎が残ります — 誰かが支払っているのです。ぜひ、その誰かになってください。

Commitmentsタブ:完了したことを示す一文とともに2つの約束の完了を提案する「Looks done」カード、1か月以上日付がない3つの約束について尋ねる「Still real?」カード、続いて「My promises」

リストを減らす2つの方法:何かが完了したことを示す証拠と、1か月間日付がないままのことを尋ねる質問です。

ドキュメント

以下はすべて、実行、ビルド、変更に関する内容です。

ディクテーションの動作

起動方法右Option/右Command/Fnを押したままにします(設定可能)。どのアプリのテキストフィールドでも使えます
入力話している間はリアルタイムで入力され、キーを離すと一度だけ修正済みのテキストに置き換わります
自動編集フィラー語を削除し、句読点を補い、リストを整形し、言い直しを解決します
文体最前面のアプリ名がAIプロンプトに渡されるため、Slackではカジュアルに、Mailではフォーマルになります
音声認識デバイス上で処理します(Appleの音声認識機能、またはローカルのwhisper.cpp)。音声がMacの外に出ることはありません
クラウドの使用LLMを呼び出す可能性があるのは、短いクリーンアップ処理のみです。テキストだけが対象で、有効にした場合に限ります
言語システムが提供する任意のロケールに対応します。2~3個を同時に並行して処理し、最良の結果を採用します
スニペット入力した略語をその場で展開できます。インラインの質問には;ai … ;;も使えます

ビルドと実行

./build.sh        # produces "Griasa Dev.app"
open "Griasa Dev.app"
./test.sh         # the invariant checks; release.sh runs these first

ローカルビルドはひと目でわかります。アンバー色の DEV アイコン、独自のファイル名、「Griasa Dev」という表示(プライバシー設定とアクティビティモニタ内)、そして角張ったメニューバーアイコンが使われます。また、独自のバンドル識別子 am.stari.griasa.dev も使用します。最後の点は見た目だけの問題ではありません。macOS はプライバシー許可を識別子 と 確認した署名の両方に紐付けて保存するため、署名の異なる2つのビルドが同じ識別子を共有すると、互いの許可を上書きし、どちらも起動するたびに許可を求めることになります。識別子を分ければ、許可を求めるのは一度で済みます。release.sh ではこの処理は行われず、署名済みビルドには本来の識別子、アイコン、名前が使われます。

test.sh は、ライブ入力で決して破ってはならないルールを検証します。出力されるテキストは常に増加すること、発話の冒頭の言い換えを行う仮説では末尾を延長できないこと、言語の判定は一度だけ固定されることです。最初の2つは実際にリリース後に発生したリグレッションでしたが、今ではテキストフィールドではなくコマンドを失敗させます。テストフレームワークは使いません。swiftc が PartialStabilizer.swift と検証コードをコンパイルし、バイナリがゼロ以外で終了するため、Command Line Tools しかないマシンでも動作します。それぞれの失敗メッセージには、ルールとその重要性が記されています。「true が期待されましたが false でした」だけでは、読む人には何も伝わらないからです。

自分で配布する

./release.sh      # signed + notarized dist/Griasa-<version>.dmg — the one on Releases
./dist.sh         # ad-hoc signed dmg, no Apple account needed

release.sh は公開用ビルドで使う手順です。Developer ID 署名、Hardened Runtime、アプリ本体とディスクイメージ 両方 に Apple の公証チケットをステープルし、最後にビルド設定ではなく、第三者の Mac で確認する方法と同じく spctl、stapler、完成したファイルに対する lipo -archs で検証します。Developer ID Application 証明書と、保存済みの notarytool 認証情報が必要です。それらがない状態で実行すると、事前チェックで用意すべきものが具体的に説明されます。最も時間がかかる2つの落とし穴も含まれます(ダブルクリックすると -25294 が表示されるため security import で証明書を読み込むこと、そして G2 中間証明書を別途インストールしないと codesign が "unable to build chain to self-signed root" で失敗することです)。

dist.sh は、Apple Developer アカウントを持たない同僚にビルドを渡すためのものです。アプリアイコン、/Applications へのショートカット、INSTALL.txt を含む ユニバーサル dmg を作成します。アドホック署名のため、受け取った人は一度 右クリック → 開く を行う必要があります。どちらの場合も、その後の準備は自動で行われます。初回起動時にアプリが Homebrew 経由で whisper-cpp をインストールし、モデルをダウンロードして、4つのアクセス許可を求めます。

macOS 14 以降で、フル版 Xcode またはスタンドアロンの Command Line Tools を使ってビルドでき、macOS 14 以降で動作します。build.sh は swiftc を直接使ってコンパイルするため、正常に動作する SwiftPM は不要です。一部のスタンドアロン Command Line Tools には、壊れたマニフェストライブラリが含まれています。Package.swift も同等で、フル版 Xcode では swift build が動作します。お好みの方法をお使いください。

Intel 向けビルドには期限があります。 Xcode 26 は Intel Mac で動作する最後のリリースであり、x86_64 を無料で利用できる最後のリリースでもあります。Xcode 27 では、デプロイメントターゲットを 27.0 以降にすると、エラーが表示されることなく ARCHS_STANDARD から x86_64 が削除され、arm64 のみのバイナリになります。また、macOS 28 で Intel ソフトウェアのサポートは完全に終了します。このプロジェクトの対象は macOS 14.0 のため、release.sh は引き続き正真正銘のユニバーサルバイナリを生成します。ビルド設定を鵜呑みにせず lipo -archs で検証するため、対象バージョンを引き上げる場合も同じ方法を続けてください。

コントリビューション

パッチもフォークも歓迎します。CONTRIBUTING.md では、ビルド、各種不変条件のチェック、そしてパッチで問題になりやすいいくつかの規約について説明しています。プロンプトの配置場所、新しい UI をウィンドウではなくハブのタブにする理由、実データを使ったスクリーンショットを決して撮影してはいけない理由などです。

自分向けにカスタマイズする(フォークとカスタムビルド)

ビルドの所有者を特定する情報は、Sources/Griasa/BuildConfig.swiftの1つのファイルにまとめられています。ビルド前に編集してください:

定数役割空のままにした場合
supportEmail「フィードバックを送信」メールの下書きフィードバックボタンが非表示になります
donateURL♥ 寄付ボタン寄付ボタンが非表示になります
updateRepogithub.com/<owner>/<name> の Releases を対象とした毎日のアップデート確認アップデート確認が無効になります
appNameメールの件名とバージョン行—

コード署名は環境変数でパラメーター化されているため、スクリプトを編集する必要はありません:

CODESIGN_IDENTITY="My Own Cert" ./build.sh                       # dev build (default: "Griasa Dev Signing")
DIST_SIGN_IDENTITY="Developer ID Application: You (TEAM)" ./dist.sh  # distributable (default: ad-hoc)

バンドル識別子とバージョンはSupport/Info.plistにあります。フォークを配布する場合はCFBundleIdentifierを変更し、権限の許可やアップデートフィードが上流のビルドと競合しないようにしてください。

AI に伝える内容を変更する

Griasa がモデルに送信するシステムプロンプトはすべて、Sources/Griasa/Prompts.swiftの1つのファイルにあります。音声入力の整形、会議メモ、約束事項の抽出、同僚の情報ファイル、プロジェクトへの振り分け、文書の作成、リマインダーの解析、チャットへの返信、インライン回答が含まれます。このファイルを読めば、アプリがモデルに何を求めているかを正確に把握できます。編集して再ビルドすると、アプリの動作を変更できます。

実行時の値は{{placeholder}}形式で記述し、呼び出し元で値を設定します。たとえば、{{today}}、{{participants}}、{{skeleton}}などです。呼び出し元から渡されないプレースホルダーは、空欄に置き換えられず、プロンプト内にそのまま表示されます。そのため、間違いが隠れるのではなく、出力に現れます。

試すだけなら再ビルドは不要です:設定 → AI とアクション → システムプロンプト → 編集用にエクスポートを選ぶと、現在の文面が~/Documents/Griasa Prompts.jsonに書き出されます。そこに含まれるキーは、組み込みのバージョンを上書きします。キー(またはファイル)を削除すると、元に戻ります。編集内容を再読み込みすると、再起動せずに変更が反映されます。

プロンプトプリセットのライブラリ(設定 → プロンプトプリセット)は、意図的にこのファイルには含めていません。これらはアプリの動作ではなく、UI で編集してユーザーごとに保存する独自のドキュメントです。

常にバンドルされたアプリ(ローカルではGriasa Dev.app、インストール後はGriasa.app)を実行してください。macOS の権限プロンプト(マイク、音声認識)には、バンドル内の Info.plist が必要です。

権限(初回のみ)

初回起動時に、Griasa は必要な権限をすべて要求します。プロンプトが表示されない場合は、システム設定 → プライバシーとセキュリティで手動で許可してください:

権限用途
マイク音声入力と録音
音声認識デバイス上での文字起こし
アクセシビリティグローバルホットキーとテキストの挿入(⌘V による入力)
画面収録システムオーディオのキャプチャ(macOS ではアプリの音声がこの権限で制限されています)

アクセシビリティまたは画面収録を許可した後は、Griasa を終了して再起動してください。

署名と権限の維持:macOS はプライバシー権限をアプリのコード署名に結び付けます。build.shはローカルの自己署名証明書(「Griasa Dev Signing」。ログインキーチェーンに一度作成)で署名するため、署名 ID と権限の許可は再ビルド後も維持されます。この証明書がない場合、スクリプトはアドホック署名に切り替えて警告します(アドホック署名では、再ビルドのたびに別のアプリとして認識され、権限がリセットされます)。証明書を再作成するには、codeSigning EKU を含む自己署名証明書を生成し、.p12(レガシー形式)をログインキーチェーンに読み込んで、security add-trusted-cert -r trustRoot -p codeSignで信頼済みに設定してください。権限の状態がおかしくなった場合は、tccutil reset All am.stari.griasaでリセットし、もう一度許可してください。

使い方

ディクテーション
  1. 任意のアプリで、テキストフィールドをクリックします。
  2. Right Option(⌥)を押し続けます — メニューバーのマイクが入力状態になります。
  3. 話します — 話した内容がカーソル位置にリアルタイムで表示されます(オンデバイスの即時音声認識)。
  4. キーを離します — リアルタイムで入力されたテキストがその場で修正され、整えられた Whisper + AI によるクリーンアップ版に置き換わります(合成キー入力の差分を使い、異なる末尾部分のみを書き換えます)。

リアルタイム入力は「Settings → Dictation」でオフにできます(その場合は、最後にすべてまとめて貼り付けます)。合成キー入力がうまく動作しないアプリ(積極的なオートコンプリート機能を備えたフィールドなど)で便利です。

Griasa は、メニューバーパネルと「Settings → System」に、生涯の節約時間カウンター(ディクテーションした単語数 × 入力速度の40 wpmと発話速度の150 wpmの差)を表示します。

初回起動時には、ハブでウェルカムガイドが開きます。クイックスタートに加え、3つのシステム権限をリアルタイムで確認できるチェックリストが表示されます。各項目から該当する「System Settings」の画面にワンクリックで移動でき、権限を許可しなかった場合に利用できる機能についても説明しています。「Settings → System」からいつでも再度開けます。

AI によるクリーンアップには、設定済みのAI プロバイダーを使用します(下記参照)。AI プロバイダーが設定されていない場合や、呼び出しに失敗した場合は、代わりにローカルのルールベースのクリーンアップを実行するため、ディクテーションは常にオフラインで利用できます。

AI プロバイダー — デフォルトではローカル。選択すれば Anthropic、OpenAI、Gemini、または既存のサブスクリプションを利用できます

すべての AI 機能は、設定可能な 1 つのプロバイダーを経由します(設定 → AI とアクション)。新規インストールではローカルモデルが選択されています — 誰かがクラウドベンダーを選択するまで、データがクラウドベンダーに送信されることはありません。

  • ローカル(デフォルト) — キーも手動でのインストールも不要です。Griasa は Mac のメモリと空きディスク容量を確認し、Ollama または LM Studio にモデルがあればそれを使い、なければ Mac のメモリに合ったサイズのモデル(約 3 GB〜37 GB)を一度だけダウンロードするよう求め、独自のエンジンにインストールします(127.0.0.1:8177)。短い英語のクリーンアップ処理では、Mac に搭載されている場合、Apple のオンデバイスモデルを使います。設定で入力されたサーバーアドレスやモデル名(customBaseURL、customFastModel、customSmartModel)が置き換えられることはありません。モデルの準備が整う前に終了した会議は、あとから要約されます。ローカルモデルが起動していない場合、最初の AI アクションでそのことと修正方法が表示されます。内蔵のローカル Whisper と組み合わせると、Griasa は完全にオフラインで動作し、テキストが Mac の外部に送信されることはありません。(組織向け:MDM ガイド。)
  • Anthropic(Claude) — 設定または ANTHROPIC_API_KEY からキーを指定します。設定で入力したキーは macOS のログインキーチェーンに保存され、環境設定ファイルに保存されることはありません。
  • OpenAI — 設定または OPENAI_API_KEY からキーを指定します(デフォルトでは GPT-5.6 ファミリー)。
  • Google(Gemini) — 設定または GEMINI_API_KEY からキーを指定します(Google の OpenAI 互換エンドポイント経由。デフォルトでは Gemini 3.x)。
  • Claude Code(サブスクリプション)/Codex CLI(ChatGPT サブスクリプション) — API キーは一切不要です:claude または codex CLI がインストールされ、ログイン済みであれば、Griasa はすでに契約しているサブスクリプションに請求される形で回答します。自動検出されます(必要に応じてパスを上書きできます)。リクエストごとに約 5〜10 秒かかります — 会議メモ、資料、ドキュメントには最適ですが、;tldr のような入力中に使う機能では API キーより低速です。(CLIRunner.swift)

各プロバイダーには、高速モデル(ディクテーションのクリーンアップ、リマインダーの解析、分類、返信の下書き)と高性能モデル(プリセット、要約、Ask Project、会議メモ)があります。デフォルト設定は適切なものになっています(Haiku 4.5/Opus 4.8、GPT-5.6 Luna/Terra、Gemini 3.1 Flash-Lite/3.5 Flash。手動でセットアップしたローカルサーバーでは Qwen3 8B/30B — Griasa が自動でセットアップするモデルは、両方の用途に対応します)。また、設定は変更できます。ローカルエンドポイントでは、モデル一覧を読み込むボタンから実際にインストールされているモデルを確認でき、テストではプロバイダーに接続して応答時間を表示します。ローカルモデルでは、会議の文字起こしはコンテキスト予算に合わせて短縮されます(Griasa がセットアップするモデルでは 38k 文字で、返信のための余裕が残ります。手動でセットアップしたサーバーではデフォルトで 24k 文字ですが、変更可能です。クラウドモデルでは 400k 文字です)。ローカルがデフォルトになる前にインストールされ、クラウドキーが設定済みでプロバイダーの選択が保存されていない場合は、そのプロバイダーが引き続き使われます — キーを貼り付けた時点で選択したものとみなされます。選択したプロバイダーに問題が発生し、ローカルモデルが起動していない場合が一般的ですが、クラウドプロバイダーも利用可能であれば、明示的なアクションでは、そのリクエストをクラウド経由で再送信する前に確認を求めます(「毎回確認」。再起動までのオプションもあります)。ディクテーションのクリーンアップとバックグラウンドでの分類では確認を求めず、機能を静かに縮退させます。(LLMProvider.swift、AIFormatter.swift)

音声エンジン

Griasa は Whisper(whisper.cpp、large-v3-turbo) を優先します。Apple の音声認識より大幅に精度が高く、完全にローカルで動作し、モデルに本物の自動言語検出機能が組み込まれています。

初回起動時に自動でセットアップされます。アプリは(未インストールの場合)Homebrew 経由で whisper-cpp をインストールし、1.6 GB のモデルを ~/Library/Application Support/Griasa/ にダウンロードします。進行状況はメニューバーのメニューと設定 → 音声エンジンに表示されます(失敗した場合は再試行ボタンが表示されます)。必要なのは Homebrew だけです。Homebrew がない場合はその旨を知らせ、Apple のエンジンで動作を続けます。

モデルは使用前にすべて検証されます。 ダウンロード元はブランチではなく、固定されたリポジトリのコミットです。アプリに記録された SHA-256 とサイズ(ModelManifest.swift)に照らして検証してから所定の場所に移動するため、検証に一致しないファイルがインストールされることはありません。ディスク上にすでにあるモデルはアップデート後に一度検証され、その結果が記録されます。検証に失敗したモデルは *.unverified に名前が変更され、検証済みのダウンロードに置き換えられます。手動で同等の操作を行う場合:

brew install whisper-cpp
curl -L -o ~/Library/Application\ Support/Griasa/ggml-large-v3-turbo.bin \
  https://huggingface.co/ggerganov/whisper.cpp/resolve/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-large-v3-turbo.bin
shasum -a 256 ~/Library/Application\ Support/Griasa/ggml-large-v3-turbo.bin
# expect 1fc70f774d38eb169993ac391eea357ef47c88757ef72ee5943879b7e8e2bc69

Griasa はモデルを読み込んだ状態でローカルの whisper-server を実行し続けるため、ホットキーを離すとほぼ瞬時にディクテーションを文字起こしできます。また、会議の区間ごとにモデルを読み込む必要もありません。whisper-cli またはモデルが見つからない場合は、すべて Apple の音声認識にフォールバックします。

会議のタイムラインを正確に保つ:whisper.cpp に組み込まれた --vad は音声チャンクを連結して継続的に時間を付け直すため、長い無音の後のテキストほど実際より早い時刻にずれていきます(上流のissue #3634)。Griasa はこれを避けるため、Silero VAD(whisper-vad-speech-segments)を独自に実行し、音声から各発話区間を切り出して、起動状態のサーバーに対して個別に文字起こしし、それぞれに実際の開始時刻を付与します。これにより、長い無音があってもセグメントは実際の時系列順に保たれます。ヘッドレスモードでは、過去の録音に対してパイプラインを再実行できます:"./Griasa Dev.app"/Contents/MacOS/Griasa --transcribe "<recording folder>"。

自動言語検出
  • Whisper:言語検出はモデルに標準搭載されています(-l auto)。設定は不要です。
  • Apple のフォールバック:Apple の音声認識では、リクエストごとに固定のロケールが必要です。そのため Griasa は、設定された言語ごとに音声認識を並行して実行し(設定 → ディクテーション → 言語、デフォルトは en-US, ru-RU)、最も信頼度スコアの高い文字起こし結果を採用します。ディクテーションではフレーズごと、会議では30秒のチャンクごとに判定します。

混在する 英語の技術・暗号資産関連用語 には、次の2つの方法で対応します:

  • 組み込みの語彙(Vocabulary.swift:GitHub、deploy、staking、jetton、seed phrase、mainnet…)に加え、設定から追加した独自の用語を、Whisper には初期プロンプトとして、Apple の音声認識には文脈ヒントとして渡します。
  • クリーンアップ用のプロンプトでは、英語の用語を翻訳せずに保持し、音声的に音訳された用語(「гит хаб」→「GitHub」など)を修正する一方、それ以外のテキストは翻訳しないようモデルに指示します。
選択したテキストに適用するプロンプトプリセット(すべてのアプリ)

ブラウザー、Slack、PDF など、どこでもテキストを選択し、メニューまたはそのホットキーからプロンプトプリセットを適用できます。要約(⌃⌥⌘S)、文法を修正(⌃⌥⌘G)、英語に翻訳、プロフェッショナルな表現にする、箇条書きにする、コミットメッセージとして書き直す、が付属しています。テキストを書き換えるプリセット(文法修正、翻訳など)には「選択範囲を置換」ボタンが表示されますが、要約には表示されません。

独自のプリセットを追加するには、設定 → AI とアクションを開きます。名前、絵文字、モデルへの指示、選択範囲を置き換えるかどうか、任意のホットキーを設定できます。デフォルトでは修飾キーを3つ組み合わせた ⌃⌥⌘ を使います。macOS のグローバルホットキーはアプリ側で消費できず、最前面のアプリにもキー入力が届くため、どのアプリにも割り当てられていない組み合わせにする必要があります。Griasa は修飾キーが離されるまで選択範囲の読み取りを待ちます(修飾キーを押したまま ⌘C を合成すると、一部のアプリでは通常のテキストとして入力され、選択範囲が消去されることがあります)。クリップボードは保存され、元に戻されます。

履歴とエクスポート

すべてのディクテーション、会議の文字起こし、プリセットの結果は、検索可能な履歴ウィンドウ(メニュー → 履歴…)に保存されます。全文を検索して、コピー、挿入、ファイルを表示、またはエクスポートできます。~/Library/Application Support/Griasa/history.json にローカル保存されます(直近の 500 件)。

エクスポート(履歴および各結果ポップアップから利用可能)には、外部サービスや認証は不要です。

  • 名前を付けて保存… → Markdown(.md)、PDF、HTML、RTF、またはプレーンテキスト。
  • リッチテキストとしてコピー → 書式(見出し、太字、箇条書き)を維持したまま、Google Docs、Notion、Confluence、Word、Slack に直接貼り付けられます。

Markdown は Notion/Obsidian/GitHub にきれいにインポートできます。HTML と RTF は Docs/Confluence に書式付きで貼り付けられ、PDF は印刷用にすぐ使えます。(Exporter.swift — 依存関係のない小さな Markdown→HTML コンバーターが、macOS のリッチテキストおよび印刷システムにデータを渡します。)

キャプチャ(すべてのアプリ)

システム全体で使える 4 つのアクションがあり、それぞれにメニュー項目と設定可能なホットキーがあります(設定 → キャプチャ)。

  • ⏰ リマインダーを設定 (⌃⌥⌘R) — テキストを選択して実行するか、選択されていない場合は画面の範囲をドラッグします。カーソル位置に Slack 風のメニューが表示されます:20 分後/1 時間後/3 時間後/明日 9:00/来週月曜 9:00/カスタム…(日付ピッカー)に加え、モデルがテキスト自体から期限を読み取る テキストから(「завтра в 3」、「in 2 hours」)も選べます。固定時刻の設定には API キーは不要です。リマインダーはリマインダーアプリに登録され、iPhone/Watch と同期されます。すべてのリマインダーには作成元が記録されます:メモにはソースアプリとウィンドウタイトル(Slack のワークスペース/チャンネル、Telegram のチャット)が記録され、ブラウザーの場合は、取得したテキストの位置までスクロールするアンカー付きタブ URL がリマインダーのリンクとして追加されます。ワンクリックで該当箇所に戻れます。範囲をドラッグして作成したリマインダーでは、切り抜いた画像も Documents/Griasa/Reminders/ に保存し、リマインダーからリンクします(EventKit ではファイルを直接添付できないためです)。OCR テキストだけでなく、画像も保存できます。(ReminderSource.swift;ブラウザーの URL を取得するには、ブラウザーごとに初回のみオートメーションの許可が必要です。)
  • 🔤 範囲を OCR (⌃⌥⌘O) — 矩形範囲をドラッグすると、その中のテキストがデバイス上で認識され(Apple Vision、ロシア語+英語、オフライン対応)、クリップボードにコピーされます。画像、PDF、他の人が共有している画面で使えます。
  • 💬 返信の下書きを作成 (⌃⌥⌘Y) — 最前面のチャットウィンドウを OCR で読み取り、スレッドの言語と文体に合わせて返信の下書きを作成します。Telegram、Slack、Gmail など、どのアプリでも使えます。選択部分を置き換えを使うと、返信を元の場所に貼り付けられます。
  • クリップボードで実行(メニュー) — 選択範囲がなくても、現在のクリップボードの内容に任意のプロンプトプリセットを実行できます。
  • ✂️ スニペット — 任意のアプリで略語(;meet、;sig)を入力すると、その場で展開されます。メニューから挿入することもできます。テンプレートでは、挿入時に展開される動的プレースホルダーに対応しています:{date} {date+3d} {time} {clipboard} {meetlink}(設定にある、Zoom/Meet の固定ルーム)、{slot}/{slots:3}(カレンダー上の直近の空き時間 — EventKit の読み取り専用機能で、勤務時間を設定できます)、{commitments}/{commitments:mine}/{commitments:theirs}(「コミットメント」タブにある未完了の約束を、元の会議、日付、期限とともに箇条書きで表示します — ;todos を入力すると、自分の約束を任意のステータス報告に貼り付けられます)、および {ai: 指示}。デフォルトの ;meet は、たとえば 「7 月 21 日(火)15:00 はご都合いかがでしょうか?こちらのルームをご利用ください:…」 のように展開されます。設定 → スニペット。
  • ✨ ;ai … ;; — 文を書いたまま質問できます。 任意のアプリで ;ai を入力して質問を書き、;; で閉じると、入力した範囲全体がその場で回答に置き換わります:;ai как по-английски "предварительный расчёт";;。設定するスニペットは不要です。組み込み機能で、マーカーの間にある内容をすべて読み取るため、質問はいくらでも長くできます。Escape キーを押すかキャレットを移動するとキャンセルされます。モデルが失敗した場合は、入力したテキストがそのまま元に戻ります。(SnippetExpander.swift)
  • ✨ {ai:} — どんなテキストフィールドにも入力できる AI。 {ai: 指示}プレースホルダーを使うと、モデルの出力がカーソル位置に挿入されます。プレースホルダーはネストできるため、プロンプトで最新のコンテキストを参照できます:;tldr は {ai: Summarize in 3 bullets: {clipboard}} を展開し、コピーした内容を要約します。;en はクリップボードの内容を英語に翻訳します。また、1 行のカスタムスニペットを作れば、丁寧な断り文、スタンドアップミーティングの冒頭文、コミットメッセージの文体など、繰り返し行う文章作成を 3 回のキー入力で済ませられます。Slack、Jira、コードレビューなど、テキストを入力できる場所ならどこでも使えます。(モデルの知識とローカルのコンテキストを活用します。ウェブの閲覧は行いません。)

画面/ウィンドウのキャプチャには既存の画面収録の許可を使用します。「リマインダー」では、リマインダーへのアクセスを一度だけ許可する必要があります。(CaptureController.swift、OCR.swift、RegionCapture.swift、WindowCapture.swift、Reminders.swift)

リモートでチームを率いる方へ:コミットメント、メンバー、ミーティングの準備、ドキュメント
  • ✅ コミットメント — ミーティングを録音するたびに、通話中に交わした約束(誰が何をいつまでに引き受けたか。「金曜日まで」は実際の期限チップになります)がバックグラウンドで抽出され、コミットメントタブに追加されます。自分の約束と他の人からの返答待ちに分けて表示されます。項目にチェックを付けたり、ワンクリックで Apple Reminders に送信したり(iPhone に通知が届きます)、手動で追加したりできます。元のミーティングはワンクリックで開けます。メニューバーの項目には未完了の件数が表示されます。エクスポートでは、未完了のリストを Markdown チェックリスト(Notion/Obsidian/GitHub 向け)または 1 行に 1 件のすっきりしたタスクとしてコピーできます。Todoist、Things、Linear では複数行の貼り付けが個別のタスクに変換され、期限も含まれます。;todos スニペットを使えば、未完了の約束を入力中の場所に貼り付けられます。(Commitments.swift)
  • 📇 メンバー — ミーティングの参加者一覧をもとに、設定不要で同僚ごとのページが作成されます。自由形式のメモ(自動保存)、その人と行ったすべてのミーティング、未完了の約束、オンデマンドのAI プロフィール(役割と担当領域、約束の履行状況、仕事の進め方、最近の話題)がまとめられます。AI プロフィールは、その人が登場するトランスクリプトをもとに作成されます。(People.swift、PeopleView.swift)
  • 📋 ミーティングの準備 — 参加者または通話リンクがあるカレンダーの予定の数分前(リードタイムは「設定」→「ミーティング」で設定可能)に、キーボードフォーカスを奪わずに「準備」タブがスライド表示されます。通話の参加者(自分のメモと相手の未完了の約束の件数付き)、このメンバーとの前回のミーティングの内容、自分が相手に約束したことと相手が自分に約束したことを確認できます。また、Zoom/Meet/Teams のリンクを開いて録音を同時に開始する参加して録音ボタンもあります。オンデマンドで使う場合は、メニューから次のミーティングを準備を選択します。(MeetingPrep.swift)
  • 📄 新しいドキュメント — テンプレート(PRD、RFC、One-pager、Postmortem。すべて編集可能で、「設定」→「AI とアクション」から独自のテンプレートを追加できます)を選び、概要を話すか貼り付けると、スマートモデルがテンプレートの各セクションを埋めます。概要に記載がない項目には、内容を埋めるための質問を添えて、正直にTBDと記載します。事実を捏造することはありません。結果はその場で編集でき、ワンクリックでコピーできます。履歴にも保存され、プロジェクトに自動で振り分けられます。(DocTemplates.swift)
プロジェクト(すべてを整理し、内容について質問する)

履歴の各項目(ディクテーション、ミーティング、キャプチャ結果)は、自動的にプロジェクトに振り分けられます。スマートモデルが各プロジェクトの名前と説明(「設定」→「プロジェクト」)に照らして項目を判定し、確信が持てない場合やオフラインの場合は受信箱に振り分けます。履歴ウィンドウから項目を再割り当てできます(詳細ペインのプロジェクト選択メニュー、サイドバーのフィルターを使用)。この機能が追加される前に記録された項目をすべて振り分けるには、既存の履歴を分類を一度実行します。

各プロジェクトは、YAML フロントマター付きのプレーンな Markdown としてディスク上にミラーリングされます。保存先は ~/Documents/Griasa/Projects/<Project>/YYYY-MM-DD-HHmm-<kind>-<id>.md です。閲覧しやすく、git/Obsidian との相性もよく、削除されることはありません(プロジェクトを削除すると、そのファイルは受信箱に移動します)。

🗂 プロジェクトに質問(⌃⌥⌘P またはメニュー)を開くと、スマートモデルがプロジェクトの項目と添付したソースフォルダーをコンテキストとして使い、質問に回答するウィンドウが表示されます。リポジトリ、ドキュメントフォルダーなど、任意のフォルダーを添付できます。テキストファイルは新しい項目から順に最大約 150k 文字まで読み込まれます。回答はプロジェクトの履歴に保存されます。(Projects.swift、ProjectFiles.swift、ProjectAI.swift、AskProjectWindow.swift)

アシスタントに会議を読み取らせる(MCP)

設定 → システム → AI アシスタント(MCP) をオンにすると、Griasa はこの Mac 上で読み取り専用のエンドポイント(127.0.0.1、ポート 8179 または次に空いているポート、ベアラートークン)を提供します。Griasa は、未完了の約束(あなたがしたものと、あなたが返答を待っているもの)、同僚 1 人、検索による会議、特定の会議の要約、文字起こし(要求された場合のみ)、次の会議の概要、人物、プロジェクトという 8 つの質問に回答します。これを通じて何かを変更することはできません。

  • Claude Desktop — ワンクリック。 Add to Claude Desktop を押します。Griasa は Griasa.mcpb をストアフォルダーに書き込み、Claude Desktop で開きます。Claude Desktop ではインストールの確認が求められます。この拡張機能は小さな Node スクリプトです(Node は Claude Desktop に同梱されています)。Claude からのリクエストをアプリに転送します。ポートとトークンは毎回 mcp.json から読み込むため、新しいトークンや別のポートを使う場合も再インストールは不要です。Griasa は起動している必要があります。起動していない場合、Claude はメニューバーから開くよう案内します。
  • Claude Code、Codex、Cursor など。 Copy client configuration を押し、表示されたブロックをクライアントの MCP 設定に貼り付けます。次のような内容です。{"mcpServers": {"griasa": {"type": "http", "url": "http://127.0.0.1:8179/mcp", "headers": {"Authorization": "Bearer …"}}}}
  • プロトコル。 Streamable HTTP、MCP 2026-07-28(ステートレス、server/discover、リクエストごとのバージョンとヘッダー)、および同じエンドポイント上での initialize ハンドシェイクを使う 2025-06-18 と 2025-11-25 のクライアントに対応します。ツールにはタイトル、読み取り専用のアノテーション、出力スキーマがあります。ソース:MCPEndpoint.swift、MCPTools.swift、MCPBundle.swift。

アシスタントが読み取った内容は、そのアシスタントがコンテキストを送る先に渡されます。文字起こしは独立したツールなので、約束についての質問によって、誤って文字起こしが取得されることはありません。

通話中のライブメモ

録音中にライブメモを表示 を有効にします(設定 → 会議)。録音中、ハブの Recording tab では、ウォーム状態の Whisper サーバーを使い、約 18 秒ごとに区切って両方の音声トラックを文字起こしし、進行中の要約(見出し、重要なポイント、未解決の質問、アクション項目)を表示します。Auto トグルがオンの場合、要約は毎分更新されます。オフの場合は、⟳ Summarize now を押したときにのみ更新されます。どちらにするかは選べます。文字起こしの下には note field があります。入力した内容は現在のタイムコードで文字起こしにピン留めされ(📝 行)、ライブ要約に重要度の高い入力として渡され、最終的な会議メモにも織り込まれます。モデルはあなたのメモを「要約」「重要なポイント」「アクション項目」に反映し、文字起こしには > 📝 **Note [mm:ss]:** の引用ブロックとして残します。

誰も止めなかった録音を、無音を検知して停止

誰も話していない録音は、誰かが気づくまで続いていました。一晩中録音し続けて、ディスクをいっぱいにしてしまったこともあります。マイクにも Mac 自体の音声にも、しばらく音声が含まれないと、小さなウィンドウが表示され、録音を続けるかどうか確認します。Keep recording を押すとタイマーがリセットされるため、同じ時間が経過すると、二度と確認されないままになるのではなく、再び確認されます。回答がない場合、録音は自動的に停止します。手動で停止した場合と同様に文字起こしされ、文字起こしの最終行には、自動停止したことと、停止までにかかった時間が記されます。どちらの間隔も「設定 → 会議 → 無音」で設定できます(デフォルトは 5 分と 2 分です)。確認ウィンドウの表示中に音声が再開すると、ウィンドウが閉じ、録音が続行されます。(SilenceWatch.swift、SilenceLevel.swift)

ポップアップが散らからない、ひとつのハブウィンドウ

すべてがタブ付きの単一のフローティングハブウィンドウに収まります。アクションの結果、ライブ録音タブ、カスタムリマインダーの日付選択、通話参加者に関する質問、Ask Project、履歴をまとめて表示します。通話を録音しながら、プリセットの結果からリマインダーを設定するような忙しい場面でも、フォーカスを奪い合う3つのウィンドウではなく、3つのタブがある1つのウィンドウで済みます。タブを閉じると、その処理は適切に完了します(リマインダーを閉じると、紐づけ先のない録音クリップが削除されます。参加者タブを閉じると「スキップ」として扱われ、文字起こしのパイプラインが停止しません)。タブの横にあるピンを使うと、アプリを切り替えてもウィンドウを開いたままにできます。パネルはデフォルトで非アクティブになると自動的に隠れますが、これはポップアップには適していても、履歴を1時間かけて読む用途には向いていません。外に残るのは、設定(標準のmacOS設定シーン)とシステムダイアログ(ファイルの保存/選択、範囲ドラッグ式のキャプチャオーバーレイ)だけです。(HubWindow.swift)

話者名

自分の名前を設定し、通話の参加者を尋ねるを有効にします(設定 → ミーティング)。録音を停止すると、Griasaは参加した既知の人物(参加者リストは記憶されます)と、新しい名前を尋ねます。モデルは、自己紹介や互いに名前で呼びかけるなどの会話上の手がかりを使って、文字起こしの内容を「You」/「Them」ではなく実際の名前に割り当てます。これは内容に基づく割り当てです(2つの音声トラックはマイク音声とそれ以外のすべてであり、話者ごとの音声ではありません)。そのため、参加者リストを指定すると最も正確になります。

ミーティングの録音とAI文字起こし
  • メニューバー → 録音を開始(または設定でGriasaの起動時に録音を開始を有効にして、常時キャプチャします)。
  • 録音を停止すると、Griasaは自動的に次の処理を行います。
    1. タイムスタンプ付きで、30秒ごとのチャンクに分けて両方のトラックをデバイス上で文字起こしします(対応しているプロバイダーはすべてテキストのみを扱うため、音声認識は常にローカルで行われ、マシンの外に出るのはテキストだけです)。
    2. それらを時系列に並べて、You: / Them:形式の会話にします(transcript-raw.txt)。
    3. 会話を設定済みのスマートモデルに送信します。モデルは認識エラーを修正し、要約、要点、アクションアイテム、話者名付きで整えた文字起こしを含むmeeting-transcript.mdを作成して開きます(切り替え可能)。
  • APIキーがなくても、統合済みの生の文字起こしがmeeting-transcript.mdに保存されます。
  • ~/Documents/Griasa Recordings/<timestamp>/内の各セッションフォルダーには、次のファイルが含まれます。
    • microphone.caf — あなたの声
    • system-audio.caf — Macで再生されたすべての音声(通話参加者、動画など)
    • transcript-raw.txt — タイムスタンプ付きで統合された会話
    • meeting-transcript.md — AIが整形したミーティングのメモ
  • 必要に応じて、完成した文字起こしを指定したミラーフォルダーにもコピーできます(設定 → フォルダー → 文字起こしのミラーフォルダー。デフォルトでは空なので、指定しない限り複製されません)。コーディングエージェントのプロジェクトディレクトリ、Obsidianのボルト、またはgitリポジトリを指定すると、ミーティングの内容がプレーンなMarkdownファイルとして保存されます。
  • セッションの実行中はメニューバーのアイコンに赤い録音バッジが表示され、モデルの処理中はメニューに進行状況が表示されます。

⚠️ 同意:通話の録音には、管轄地域によってすべての参加者の同意が必要な場合があります(多くの地域では二者間の同意が必要です)。録音することを相手に伝えてください。

アーキテクチャ

Sources/Griasa/
├── GriasaApp.swift          # MenuBarExtra app entry
├── AppState.swift           # Central state + settings (UserDefaults)
├── HotkeyMonitor.swift      # Global flagsChanged monitor (hold-to-talk)
├── MicCapture.swift         # Single shared AVAudioEngine mic tap, multi-consumer
├── DictationEngine.swift    # Parallel per-language recognizers, best-confidence pick
├── Vocabulary.swift         # Built-in tech/crypto contextual vocabulary
├── LLMProvider.swift        # Provider config (Anthropic/OpenAI/Gemini/local) + fallback consent
├── AIFormatter.swift        # Provider router, dictation cleanup + local fallback
├── TextInserter.swift       # Pasteboard swap + synthetic ⌘V
├── SystemAudioCapture.swift # ScreenCaptureKit audio stream → .caf
├── ConversationRecorder.swift # Session folders, mic+system tracks
├── WhisperTranscriber.swift # whisper.cpp integration (preferred engine)
├── WhisperInstaller.swift   # First-launch auto-install: brew + model download
├── FileTranscriber.swift    # Apple-recognizer fallback (chunked, timestamped)
├── MeetingTranscriber.swift # Merge tracks + AI meeting-notes formatting
├── Permissions.swift        # TCC requests/status
├── SelectionActions.swift   # Global preset hotkeys, selection grab
├── PromptPresets.swift      # Prompt-preset model + store (built-in + custom)
├── HubWindow.swift          # The shared tabbed hub window all activities open in
├── PopupController.swift    # Result tab content (preset/action output)
├── HistoryStore.swift       # Persistent searchable history
├── HistoryWindow.swift      # History browser (hub tab)
├── Participants.swift       # Speaker roster + "who's who" prompt
├── LiveNotes.swift          # Realtime transcript, typed notes + running summary
├── LiveTyper.swift          # Synthetic keystrokes for live dictation typing
├── CaptureController.swift  # Capture actions: remind / OCR / draft reply / clipboard
├── CaptureAI.swift          # AI calls for reminder parsing + reply drafting
├── OCR.swift                # On-device text recognition (Apple Vision)
├── RegionCapture.swift      # Interactive screen-region screenshot
├── WindowCapture.swift      # Frontmost-window screenshot
├── Reminders.swift          # EventKit reminder creation
├── ReminderSource.swift     # source app / window / tab URL for reminders
├── Projects.swift           # Project model + store (auto-categorized history)
├── ProjectFiles.swift       # Markdown mirror: one .md per entry per project
├── ProjectAI.swift          # AI classification + Ask Project context/Q&A
├── AskProjectWindow.swift   # Ask Project window (question → answer over context)
├── Exporter.swift           # Markdown → MD/PDF/HTML/RTF/plain export + rich copy
├── Prompts.swift            # EVERY system prompt, in one place (JSON-overridable)
├── Snippets.swift           # Snippet model + store (defaults incl. ;meet)
├── SnippetEngine.swift      # Placeholder rendering: date/clipboard/meetlink/slot/ai
├── SnippetExpander.swift    # Type-anywhere abbreviation expansion + `;ai … ;;` inline ask
├── FreeSlotFinder.swift     # EventKit free-slot search for {slot}
├── Commitments.swift        # Promise model/store + AI extraction from meetings
├── CommitmentsView.swift    # ✅ Commitments hub tab (mine / theirs / done)
├── People.swift             # Person pages store, avatars, AI dossier
├── PeopleView.swift         # 📇 People hub tab (notes, meetings, promises)
├── MeetingPrep.swift        # Calendar watcher + pre-meeting brief assembly
├── PrepView.swift           # 📋 Prep hub tab (countdown, Join & Record)
├── DocTemplates.swift       # Editable PRD/RFC/1-pager/postmortem templates + generator
├── NewDocumentView.swift    # 📄 New Document hub tab (brief → filled draft)
├── OnboardingView.swift     # First-launch welcome guide + live permission checklist
├── UsageStats.swift         # Lifetime dictation counters ("time saved vs typing")
├── UpdateChecker.swift      # Daily GitHub-Releases update check (pre-Sparkle)
├── BuildConfig.swift        # ← fork here: support email, donate URL, update repo
├── Support.swift            # Donate / feedback actions driven by BuildConfig
├── HubStyle.swift           # Shared hub visual language: cards, empty states
├── MenuView.swift           # Menu-bar popover UI
└── SettingsView.swift       # Settings window

設計上の注意点:

  • マイク入力は1回、利用先は複数 — MicCaptureは単一のAVAudioEngineタップを設定してバッファーを複数の利用先に配信するため、ディクテーションと録音が入力デバイスを奪い合いません。
  • プライバシー優先の文字起こし — ロケールが対応している場合、Appleの音声認識機能はデバイス上で実行されます(requiresOnDeviceRecognition)。設定済みのプロバイダーに送信されるのは短い整形処理のテキストだけで、音声は送信されません。また、この処理は有効にした場合に限り実行されます。
  • ScreenCaptureKitによるシステム音声の取得 — macOS 13以降でアプリの音声を取得するための対応済みの方法です。映像部分は2×2 px、1 fpsのストリームに設定され、破棄されます。

既知の制限事項/アイデア

  • 話者の分離は2者のみです(「あなた」=マイク、「相手」=システム音声)。複数のリモート参加者を区別することはできません。Whisper.cpp と話者ダイアライゼーションを使えば改善できます。
  • 個人用辞書やハンズフリー切り替えモードはまだありません。カスタム辞書を挿入する場合は、Prompts.swift(キー dictationCleanup)を編集してください。
  • 録音はミックスしたファイルではなく、2つのトラックに分けて保存されます。これは意図的な仕様です(文字起こしの品質が向上します)が、後処理で ffmpeg -filter_complex amix を使えば1つのファイルにまとめられます。
  • モデルは large-v3-turbo です。公開されているベンチマークによると、フルサイズの large-v3 と比べて平均 WER の差は約 0.4 pp にすぎず、速度は約4倍です。そのため、ディクテーションの応答時間と会議の処理量の両方に適しています。速度よりロシア語の精度を最優先する場合は、ggml-large-v3.bin を ~/Library/Application Support/Griasa/ に配置し(3 GB)、WhisperTranscriber.swift 内のファイル名を更新してください。
  • Whisper は音声区間ごとに1つの言語を検出します。文の途中で頻繁に言語が切り替わる場合、優勢な言語で出力されることがあります(AI によるクリーンアップ処理で技術用語を修正します)。
  • Apple のフォールバック言語検出では、設定された言語ごとに認識器を1つずつ並行して実行します。言語リストは短く(2~3言語に)保ってください。

ライセンス

GPL-3.0。ビルド、変更、共有は自由です。派生物も同じライセンスのもとでオープンソースのまま公開してください。Griasa が時間の節約に役立ったら、メニューの ♥ ボタンを押していただけると嬉しいです。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。