Engineering

音声入力アーキテクチャ: Loqua の三モデル音声入力スタックの内側

なぜ音声認識、言語インテリジェンス、画面コンテキストを分離するのか - そして内部数値を正直にどう考えるか。

TL;DR

これは Loqua の音声入力アーキテクチャをブログレベルで眺めるもの — そしてディクテーションのための正しい音声 AI アーキテクチャが一つの大きな ASR モデルではない理由について。Loqua は三つの協力するレイヤーとして構築されています: 音声認識、言語インテリジェンス、マルチモーダルコンテキスト。理由はシンプルです: ディクテーション品質は単なる単語エラー率ではありません。有用なディクテーションモデルスタックは言葉を聞き、技術名を理解し、宛先アプリ用に出力を整形しなければなりません。内部ターゲットは 200ms クラスのレスポンス性、高い技術用語認識、サポート条件での低い 1 桁台 WER です。ベンチマークページを公開するまで、それらを第三者主張ではなく内部測定として扱ってください。

私は Shuran。音声入力を毎日使うアルゴリズム研究者の小さなチームを運営しています。Loqua を作ったのは、評価したディクテーションツール — そのほとんどがよくエンジニアリングされ、ほとんどが本当に有用 — のすべてが、コード、多言語混合、アプリ認識フォーマットで押すと同じ天井に平らになったからです。天井は構造的で、チューニング問題ではありません。これは構造が変わる必要があると決めた後で到達したアーキテクチャです。

これは論文ではありません。ブログレベルのウォークスルー — 各レイヤーの背後にある直観、出てきた数値、スタックを何に実際に使うか。より深い学術コンテキストが欲しければ、最後の参考文献セクションが私たちが引いた論文を指します。

wrap-Whisper の罠

OpenAI の Whisper は英語音声認識で可能なことを変えました。注目すべきモデルです。Whisper 論文は、弱教師あり音声訓練のスケーリングがドメインごとのファインチューニングなしで堅牢な汎用 ASR を生成することを示しました — 訛り、条件、99 言語にわたって。それは分野にとっての構造的勝利です。

しかし Whisper は ASR モデルであり、ディクテーション製品ではありません。「音声を正確に書き起こす」と「編集せずにメールに貼り付けられるテキストを生成する」の間のギャップは大きいです。wrap-Whisper アプローチ — Whisper の出力を取り、フォーマットレイヤーを通す — はそのギャップの一部を埋めます。私たちが気にした三つの場所で失敗します:

  • 技術用語。 Whisper は「react query」を聞いて「react query」をくれます。あなたのコードベースではそれが @tanstack/react-query で、パッケージインポートがあなたが望んだものだと知りません。技術用語に対する NER は、音素を聞くモデルではなく、周囲のコンテキストを見るモデルを必要とします。
  • アプリ認識フォーマット。 Whisper は書き起こします。Slack にいるか Python ファイルにいるかは知りません。上にフォーマッターをボルトオンするにはヒューリスティック (脆い) か発話ごとに重い LLM コール (遅くてクラウド依存) が必要です。
  • 厳しいレイテンシ予算下のストリーミング。 Whisper はバッチ書き起こしには優秀です。ストリーミング、低レイテンシ、オンデバイス Whisper には妥協 (小さなモデル、低い精度) かモデルの構造に戦う積極的なエンジニアリングが必要です。

研究プロトタイプ用に wrap-Whisper 経路を試しました。アイデアをテストするには十分でした。日常ツールとして使うには十分ではありませんでした。

三モデルの直観: 異なる種類の音声認識スタック

直観は、音声入力は三つのジョブであり、同じモデルがそのすべてに苦手だということです。三つのジョブ:

  1. 言葉を聞く。 音響からトークンへ。これは ASR が得意なものです。
  2. 意図を理解する。 フィラー、フォルススタート、文中修正をクリーンアップ。技術エンティティを認識。ユーザーが実際にタイプしたかったものを決定。
  3. 正しく配置する。 宛先アプリ用に出力をフォーマット。同じ意図が VS Code でコード、Slack で Slack メッセージ、Cursor で構造化プロンプトとして出るようにする。

すべての三つをやろうとする単一エンドツーエンドモデルには困難な構造的問題があります: 「音素を書き起こす」の損失面と「Slack 用にフォーマットする」の損失面は異なる方向を指します。共同訓練は両方を妥協します。これは自分のアブレーションで確認できます — レイヤー 2 と 3 をマルチタスクデータで訓練された一つの transformer に統合しようとし、両方の精度が落ちました。

三つに分割することで、各モデルが一つのジョブをよく行えます。コストはレイヤー間ハンドオフのための少量のレイテンシで、それは Neural Engine 上で単一パイプラインですべてを実行することで回復します。それが Loqua の音声入力アーキテクチャの心臓です: 単一のモノリシック書き起こし器ではなく、各レイヤーが問題のその部分のために目的別に訓練された小さなディクテーションモデルスタックです。

レイヤー 1: 音声認識

音響入力 → トークンシーケンス。これは Whisper の直接ラッパーではなくタスク固有の音声認識器です。アーキテクチャ選択は妥協しない三つの制約で駆動されました:

  • ストリーミングファースト。 出力は話者が発話を終える前に始まります。これはデフォルトとしてフル音声シーケンスへの非因果的 attention を排除します — ストリーミングフレンドリーなバリアントを使います。
  • オンデバイス Neural Engine 互換性。 モデルサイズとオペレータ選択は Apple の Core ML を介して Neural Engine で効率的に動作するものに制約されます。これは実在する制約です — 論文では問題なく見えるオペレータが Neural Engine 経路から外れて CPU バウンドになることがあります。
  • 低振幅堅牢性。 訓練データには意図的にささやき音量の入力 (カフェで、深夜に静かにディクテーションする人々) が含まれます。大半の汎用 ASR 訓練データは通常音量です。ささやき音量には明示的なカバレッジが必要です。

このレイヤーの出力はタイミングと信頼度スコアを持つトークンシーケンスです。最終テキストではありません — 次のレイヤーがクリーンアップする生の認識です。

レイヤー 2: 言語インテリジェンス

トークンシーケンス → クリーンアップされ、意図解決されたテキスト。これが最大の研究投資をする場所です。ユーザー可視品質の大半がここに住むからです。

このレイヤーのジョブ: 音声モデルが聞いたものを取り、ユーザーが意図したものを生成します。三つのことが並列に起こります:

  • フィラーとフォルススタートの除去。 「Um, so, basically, we should — actually wait, let me start over — we should cache this」が「これをキャッシュすべきです」になります。文中修正は尊重され、咳払いは消えます。
  • 技術用語のための NER。 このレイヤーは一般的なライブラリ、フレームワーク、モデルファミリー、ファイル拡張子、ターミナルコマンド、慣用 API 表面の名前を学習します。「React query」は周囲コンテキストが JavaScript ファイルのとき @tanstack/react-query になります。内部ターゲットは curate された内ドメイン技術用語で 90 年代後半の認識で、識別子がすべての一般用語のために個人辞書を強制せずに正しく出ます。
  • 構造的形成。 出力が文、ブレットリスト、markdown テーブル、コードコメントのどれになるかは、次のレイヤー (マルチモーダルコンテキスト) が宛先について何と言うかに基づいてここで決まります。

このレイヤーはパラメータ数でスタック最小のモデルですが、ユーザー体験で最高インパクトです。他の二つを合わせたよりも多くのチーム時間をここに費やしました。

レイヤー 3: マルチモーダルコンテキスト

アプリ状態 + 画面 + カーソル → フォーマット指示。これがオムニモーダルレイヤー — そしてこれをただ「ディクテーションアプリ」と呼ばない理由です。Loqua のジョブは書き起こすことではなく、意図したものを意図した場所に書くことです。

コンテキストレイヤーは macOS Accessibility 経由でアクティブアプリを、選択テキスト (あれば) を、可視近接テキストを、宛先の構造的手がかり (Gmail 作成 vs Slack スレッド vs VS Code Python ファイル vs Cursor チャットパネル) を読みます。言語レイヤーが最終テキストを整形するのに使うフォーマット指示を出力します。

より深い直観 — なぜオムニモーダルアーキテクチャが音声入力を強化するのではなく変えるか — はそれ自身のピースです。そのスレッドが欲しければ 音声と視覚の出会い: オムニモーダルモデルがコンテキスト認識ディクテーションをどう解き放つかを参照してください。

私たちが追跡する数値

メトリック現在の内部ターゲットなぜ重要か
エンドツーエンドレイテンシApple Silicon 上で 200ms クラスディクテーションが待つように感じ始めるポイントの下
最初のトークンまでの時間 (TTFT)一般的なストリーミングケースで 200ms 未満長い発話がまだ話されている間に最初の言葉が現れる
NER 精度curate された内ドメイン技術用語で 90 年代後半識別子、ライブラリ、モデル名が正しく出る必要がある
多言語 WERサポートされたテスト条件で低い 1 桁台混合英中と訛り英語が実ワークフローで機能する必要がある

これらは内部ベンチマークとドッグフード数値であり、第三者ベンチマークスイートではありません。テストセットには自身の技術用語、コードスイッチング例、訛り英語サンプル、ノイジーな日常環境が含まれます。次のコンテンツステップは、これらの数値が手を振らずに引用できるよう、公開方法論ページであるべきです。

自分たちで使うこと

このスタックについて言える最も重要なことは、私たちが使うから書いたということです。チームのすべてのメンバーが毎日ディクテーションします — コミット、PR、内部 Slack、より長い技術ライティング、(私の場合) この投稿のような大半のブログ投稿の散文。アーキテクチャを形作った決定は製品仕様ではなく、実使用から来ました。

アーキテクチャ vs 機能の区別が日常使用に現れる三つの場所:

  • コードディクテーション。 NER 品質はコードのための実行可能インターフェースとしての音声と、おもちゃとしての音声の違いです。これが何を可能にするかは コードディクテーションガイドを参照してください。
  • 多言語コードスイッチング。 内部 Slack の半分は北京語と英語の混合です。言語レイヤーはコードスイッチされたデータを回避するのではなく、それで訓練されています。文中切り替えはモード切り替えなしで機能します。
  • アプリ認識フォーマット。 同じ音声フレーズが VS Code でコードコメント、GitHub で構造化 PR 説明になることが、音声入力と有用な製品の違いです。

私たちは小さなチームです。このストーリーの正直なバージョンは、wrap-Whisper 製品と三モデル研究スタックの両方を維持するリソースがないということです。構造的経路に賭けたのは、自分たちのために品質が必要だったからで、品質なしの幅広いものよりも品質を持つ狭いものを出荷したかったからです。

2026 年に各レイヤーがどう再構築されたか

レイヤー 1 — 音声認識。 認識器はストリーミング、低振幅音声、技術用語を中心に締められました。より深いウォークスルーは 私たちのオムニモーダル音声スタックの内側に、ポストトレーニング詳細は 私たちの音声スタックでの RL にあります。

レイヤー 2 — 言語インテリジェンス。 言語レイヤーは現在、クリーンアップ、エンティティ保持、アプリ認識構造を別々のポストプロセッサではなく一つのディクテーションモデルスタックとして扱います。そこで強化学習が最も助けます: ユーザーが最も少なく編集する出力を選ぶこと。

レイヤー 3 — マルチモーダルコンテキスト。 コンテキストレイヤーはローカル画面証拠 (アクティブアプリ、選択テキスト、可視識別子、カーソル周辺) を中心に再構築されました。アーキテクチャは 画面を見るリスナーを作るを参照してください。

次のフロンティアは非言語音響: オプションでローカルファーストなコンテキストとしての AED と音声キャプショニング。そのプロトタイプ段階の業務は sounds with meaning でカバーします。

参考文献

このブログレベルの扱いより深く行きたいなら:

アーキテクチャについて質問があるか、これらのレイヤーのいずれかをより深く掘り下げたければ、ピングしてください。私たちは小さなチームで、すべてのメールを読みます。

Frequently asked questions

なぜ一つの大きな LLM ではなく三つのモデルなのですか?
単一エンドツーエンドモデルには構造的問題があります: 「音素を正しく書き起こす」損失面と「Slack 用に出力をフォーマットする」損失面は異なる方向を指します。レイヤー 2 と 3 をマルチタスクデータで訓練された一つの transformer に統合しようとして、両方の精度が落ちました。各々一つのジョブをよく行う三つの目的別訓練されたモデルが、三つすべてをやろうとする一つのモデルに勝ります。
なぜ単に Whisper をラップしないのですか?
Whisper は素晴らしい ASR モデルですが、ディクテーション製品ではありません。wrap-Whisper アプローチは技術用語 (インコンテキスト NER なし)、アプリ認識フォーマット (重いポストプロセッサが必要)、オンデバイスストリーミング (Whisper はバッチに最適化されている) で不足します。自身の日常使用にすべての三つが必要でした。
モデルをゼロから訓練しましたか?
はい、音声認識と言語インテリジェンスレイヤーについて。マルチモーダルコンテキストレイヤーはオムニモーダル研究パターン (系譜についてはオムニモーダルブログ投稿参照) の上に、自身の訓練データとディクテーション用タスク固有ファインチューニングで構築されています。
各モデルはどれくらい大きいですか?
正確なパラメータ数は公開しません — レイテンシと精度ターゲットを達成しながら Neural Engine 予算に収まるようチューニングされています。三つのレイヤーすべてがスタックのオンデバイス部分内で動作します。クラウドは特定のケース (長文書き換え、特定の翻訳) のために予約され、ユーザートグル可能です。
精度をどう評価しますか?
各レイヤー用の社内ベンチマークスイートと毎日のチームドッグフード。音声認識はサポート条件で WER スタイルプロトコルで測定。NER は curate された技術用語で測定。任意の数値を外部ベンチマーク主張として扱う前に方法論を公開すべきです。
これのいずれかをオープンソース化しますか?
本番スタックには現在計画されていません — チームは小さく、製品と並行してクリーンな公開リリースを維持する業務が遅くします。何か言う価値があるときはこのようなノートを公開します。研究で協力したければメールしてください。

Try Loqua today

Free to start. Mac native. Built by algorithm researchers who use it every day.

Download for Mac

More from the Loqua Blog

engineering
オムニモーダル音声入力: マルチモーダル理解、MoE、ストリーミングテキスト出力
engineering
強化学習による音声入力: GRPO、DPO、オンポリシー蒸留を Loqua の音声スタックで
engineering
マルチモーダル音声認識: 画面を見るリスナーを作る
productivity
音声プロダクティビティスタック: 私たちが実際に使っている 9 つのツール
how-to
Mac の会議メモを音声で: ノートとアクションアイテムを音声から完了まで