はじめに
Utter は Wayland 上の Linux 向けの、ローカルでコンテキストを理解する音声 → デスクトップアクションのアシスタントです。 キーを押しながら話すと、Utter はそれをデスクトップの動作に変えます: アプリや Web サイトを開く、ウィンドウをフォーカスまたは閉じる、ワークスペースを切り替える、メディアを再生または一時停止する、 アプリ固有のショートカットを押す、見えているボタンをクリックする、話した内容をフォーカス中のフィールドに入力する。
すべてはお使いのマシン上で動作します。音声認識、小さな AI モデル、スクリーンショットが外部に出ることはありません。
| プッシュトゥトーク | アシスタントキー を押しながら話すか、ディクテーションキー を押しながら任意のフィールドに話した内容を入力します。 |
| デスクトップアクション | アプリと Web サイトを開く、ウィンドウをフォーカス・閉じる、ワークスペースを切り替える、メディアを操作する、アプリのショートカットを押す。 |
| コンテキストを理解 | どのアプリがフォーカスされ画面に何があるかを把握します。まずアクセシビリティ情報を使い、最後の手段としてのみスクリーンショットを撮ります。 |
| 編集できるアプリ別アクション | ショートカット付きの 100 以上のアプリプロファイル。設定アプリから任意のキーの組み合わせを変更できます。 |
| 既定で安全 | 危険な機能(ターミナルコマンド、生の入力)は有効にするまでオフのままです。重要なアクションは先に確認します。 |
| ローカライズ | 10 の UI ロケール(en、es、de、fr、it、pt、zh、ja、ko、ru)を同梱。話す言語は別設定なので、日本語 UI で英語を話すこともできます。 |
ルール優先、モデルは選ぶだけ
Section titled “ルール優先、モデルは選ぶだけ”ほとんどの音声アシスタントは、あなたの言葉を大きなモデルに渡して何を実行するかを決めさせます。Utter は その逆を行い、それが設計の核心です:
you speak ──▶ speech-to-text ──▶ router ──▶ safety policy ──▶ desktop actions (local model) │ rules first (keys, windows, │ then a small local AI apps, media) ▼ that only *chooses* app & screen context- 決定論的なルールが最初。 ほとんどのコマンド(「open youtube」「close this」「workspace 3」 「next track」)は高速で予測可能なルールに一致します。ウィンドウをフォーカスしてから閉じるような複数ステップの 計画は、ルールが直接生成します。
- 制約された決定ヘッドは選ぶだけで、書くことはありません。 どのルールにも一致しないとき、Utter は 完全に解決済みの候補アクション(最大 12 個と必須の「none」)の小さなリストを作り、 小さなローカルモデルに文字で 1 つ選ばせます。信頼度しきい値を下回る選択は棄権とみなされます。 モデルは独自の引数を書けないので、コマンドを作り出すことはできません。
- 自由形式のプランナーは最後の手段で、ルールと決定ヘッドの両方が失敗したときだけ使われます。 完全にオフにすることもできます。
- 知覚はステップが必要とするときにだけ使われます。 「click the search box」はまず アクセシビリティツリーを試します。それが失敗したときだけ、Utter はスクリーンショットを撮り、 ローカルのビジョンモデルにどこをクリックするかを尋ねます。
Utter は意図を満たせる最も安価な段階を選びます:
| 段階 | 名前 | 使用するもの | 例 |
|---|---|---|---|
| T0 | アプリ | フォーカス中のアプリとウィンドウ、アプリプロファイル、URL ハンドラー | ブラウザがフォーカスされているとき「open youtube」で URL を開く。モデルもスクリーンショットも不要。 |
| T1 | アクセシビリティ | AT-SPI ツリー(ロール、名前、アクション) | 「press the Play button」でノードを見つけて呼び出す。ピクセル不要。 |
| T2 | キーボード | アプリ別ショートカット | 「new tab」で ctrl+t を押す。 |
| T3 | ビジョン | ローカルのビジョンモデルで根拠づけたスクリーンショット | T0〜T2 で対象を解決できないときだけ。 |
画面のテキストは導けるが、命令はできない
Section titled “画面のテキストは導けるが、命令はできない”Utter が画面から読み取るすべてのもの(ウィンドウタイトル、アクセシビリティ名、OCR テキスト、 クリップボード、Web コンテンツ)は 信頼できないものとしてタグ付けされます。信頼できないコンテンツは Utter がすでに用意した選択肢の中から 選ぶ ことしかできません。アクションの引数になることは決してできないので、 Web ページが Utter を説得してコマンドを実行させたり、任意の URL を開かせたりすることはできません。ランナーは、 具体的な引数が画面コンテンツに由来するリクエストを拒否します。
危険な機能は既定でオフです。ターミナルコマンドの実行と生のキーボード・マウス入力の送信は、 明示的に有効化する必要があり、それでも確認を求めます。確認は常に具体的な URL、コマンド、対象を表示し、 承認後に再検証されます。詳しくは 信頼と安全性 を参照してください。
完全オフライン
Section titled “完全オフライン”何もお使いのコンピューターから出ません。 音声はローカルで認識され、AI モデルはローカルで動作し、 スクリーンショットがマシンから出ることはありません。アカウントもテレメトリもありません。
Utter がオンラインになる唯一のときは、あなたがモデルをダウンロードするときです。意図的に 別のマシンのサーバーを指定した場合、設定アプリが琥珀色でそれを知らせます。
Utter は モデルがまったくなくても動作します。ルール、ウィンドウの状態、アクセシビリティが 決定論的なコマンドを処理します。音声には音声モデルが必要で、ビジョンと言語モデルは あいまいなリクエストを可能にする任意の追加機能です。
どのように作られているか
Section titled “どのように作られているか”内部では、小さな ランナー が交換可能な プラグイン(音声、決定、知覚、アクション、 音声出力、UI)を、単一のバージョン管理された JSON-RPC プロトコルで監督します。ランナーは信頼の 境界です。ポリシー、確認、データプレーンを所有し、すべてのプラグインとその出力を 信頼できないものとして扱います。
- コアは Python で、標準ライブラリのみを使用します。
- 設定アプリは Tauri v2 + React です。純粋なクライアントで、設定ファイルを編集し、
assistantCLI を 呼び出し、systemd ユーザーユニットを操作します。アシスタントのロジックはそこにありません。 - コンポジタ統合はまず niri を対象とし、他の Wayland コンポジタは 汎用ツールで扱います。
全体像は アーキテクチャ を、拡張したい場合は プラグインプロトコル を参照してください。
Utter は AI コーディングアシスタントの助けを借りて作られ、人間がレビューした若いソフトウェアです。 重要なことを任せる前にコードを読み、 おかしいと思った点は報告してください。 Wayland 上の Linux x86_64 が主にサポートされるプラットフォームです。macOS ポートは利用可能ですが 実験的です(macOS を参照)。Windows はサポートされていません。