📖 awase 開発の舞台裏を解説した書籍を公開中 → 『信頼できないWindows API応答を、正しい入力に変える技術 親指シフトエミュレータ設計記』

awase(合わせ)

親指シフト(NICOLA)キーボードエミュレータ

親指シフトを、もっと快適に。

Rust 製の高速・安定な親指シフトエミュレータ。Chrome・Zoom・LINE など、従来のツールが苦手としてきたアプリでも完全に動作します。

Windows 対応 Chrome / Edge 完全対応 Zoom 対応 Google 日本語入力 最適化 MS-IME 対応

特徴

他の親指シフトツールにはない機能を、徹底的に作り込んでいます。

安定動作

  • 独自のリレーモードで、キーボードフックが OS に強制解除されにくい設計
  • 万が一解除されても、自動復旧機能で即座に再登録
  • スリープ復帰やスクリーンロック解除時も自動回復
  • ALT+TAB ウィンドウ切替時も IME 状態を正確に維持
  • DLL インジェクション不使用 — ウイルス対策ソフトに誤検知されない

高速・正確

  • Rust 製で処理速度 1–5ms。入力遅延を感じさせない
  • n-gram 統計モデルで「文脈に合う方」を予測し、同時打鍵を賢く判定
  • 2 種類の確定モードからタイピングスタイルに合わせて選択
  • AutoHotKey など他のフックソフトウェアとも共存可能

カスタマイズ自由

  • .yab 形式で配列定義を自由に編集
  • JIS / US キーボード両対応
  • 親指キーの割り当て、同時打鍵の閾値など細かく調整可能
  • GUI 設定画面で直感的に設定変更

オープンソース

  • MIT / Apache 2.0 デュアルライセンス
  • GitHub でソースコード公開
  • MSI インストーラーで簡単セットアップ

アプリ対応状況

従来の親指シフトツールが苦手としてきたアプリに、徹底対応しています。

従来ツールで苦手

Chrome / Edge

TSF composition のタイミング問題を独自の Google 日本語入力 I/O 監視で解決。候補ウィンドウ表示中も安定して動作します。

従来ツールで苦手

Zoom

TSF アプリケーションとして動作する Zoom に完全対応。ビデオ会議中のチャット入力も快適です。

従来ツールで苦手

TSF アプリ全般

Windows Terminal などの TSF ネイティブアプリでも、cold-start 問題を解決して正確に動作します。

完全対応

Google 日本語入力

Google 日本語入力の内部動作に合わせた専用の制御方式で、IME ON/OFF を確実かつ副作用なく切り替えます。Mozc(公式版・mozc-readable)も Google 日本語入力と同じ系統として扱います(キー設定の自動読み取りは Google 日本語入力のみ)。

完全対応

LINE / Qt アプリ

LINE が内部で行う IME 状態遷移を推測し、意図通りの IME ON/OFF 切り替えを実現します。ALT+TAB でのアプリ切替時の誤動作も解消。Qt ベースのアプリ全般に対応しています。

完全対応

Microsoft IME

Windows 標準の Microsoft IME に対応しています。

なぜ awase は動くのか

従来ツールとの根本的な違いは「内部状態を外部から推測する」アーキテクチャにあります。

IMM32 アプリケーション — 問題なし(どのツールでも動く)

サクラエディタ・秀丸エディタなど IMM32 API を使うアプリは、IME との連携が単純で、キーを送り込むだけで正しく動作します。多くの親指シフトソフトがここでは問題なく動いていました。

TSF アプリ(Zoom・LINE など)— 内部状態が見えない

Zoom・LINE・Windows Terminal などの TSF(Text Services Framework)アプリは、IME との通信が高度な内部プロトコルで行われており、外部プログラムから「今 IME が文字を受け付けられる状態かどうか」を直接問い合わせる手段がありません。

awase は Google 日本語入力の I/O アクティビティをバックグラウンドで監視し、その静止タイミングから「TSF composition context が準備完了したか」を推測します。DLL インジェクションなどの侵襲的手法を使わずに、外部観測だけで内部状態を推定するアプローチです。

Chrome / Microsoft Edge — プロセスをまたぐ制御

Chrome や Edge は複数のプロセスが協調動作するため、通常の IMM32 クロスプロセス API が使えません。従来の親指シフトツールが IME ON/OFF 切り替えで誤動作しやすいのはこのためです。

awase は Chrome/Edge 向けに専用の制御戦略を持ちます。IME の実際の状態を shadow モデルとして内部で追跡し、OS に送信したキーと観測された結果の差分から「本当に IME が切り替わったか」を継続的に検証します。

Windows ストアアプリ(UWP)— 入力経路が異なる

UWP アプリはフォーカスの仕組みが Win32 と異なり、入力経路も独自です。awase はフォーカス変化のたびにアプリの種別を自動検出し、UWP・TSF・Win32 それぞれに最適な入力戦略を切り替えます。

キーボードフック・同時打鍵判定・n-gram モデル・IME 制御戦略の詳しい仕組みは 内部動作の解説 で説明しています。

n-gram による賢い同時打鍵判定

タイミングだけでなく「日本語として自然かどうか」を統計モデルで判断します。

高速タイピング時、「よかった」の か は右親指と組み合わせて が になるのか、か のままなのか——タイミングだけで判断すると誤変換が起きやすくなります。

awase は日本語 n-gram コーパスから学習した統計モデルを内蔵し、前後の文脈から「どちらが自然な日本語か」を判定します。速く打っても誤変換が少なく、長文入力でも快適です。

2 種類の確定モード

ngram_predictive n-gram 統計モデルで文脈予測。速度と精度のバランスを取る
wait タイマーまで待機してから確定。最も正確で、ゆったり打つ方に向く(既定・推奨)

v1(1.x)の保守は終了しました。最後の版は 1.21.2 で、今後 v1 には不具合修正も新機能も入りません。v2 への更新をおすすめします。 設定ファイルはそのまま引き継げますが、これまで効いていなかった設定が、更新すると効き始めることがあります。 v1 から v2 への違いと移行ガイドをご確認ください。 v1 のアプリ内更新通知では v2 は案内されないため、このページか GitHub Releases からダウンロードしてください。

v2 の主な変更(v1 との違い)

v2 は「IME の状態は IME 自身が正。awase は書かずに観測して追随する」方針に作り直した版です。

先回りの書き込みをやめた 確定キーごと・フォーカス変更時・Ctrl を離したとき・エンジン ON/OFF 時の IME キー自動送信を撤去。IME の状態は観測して追随します
IME キーが必ず合う Ctrl+変換/無変換・かな・半角/全角などを押すと、内部状態によらず、絶対指定は 1 回、トグルは 2 回以内で実際の IME が一致します
キーの役割を IME 設定から逆算 Google 日本語入力・MS-IME のキー設定を読み取り、半角/全角・無変換/変換・F13〜F24 の扱いを決めます(カスタム設定でも動く)
キー効果の学習 カスタムキー設定の IME で、キーを押すと IME がどうなるかを実機で学習し表にします(設定画面から採用・再検証)
設定の診断 キー名の書き方を全項目で寛容に解釈し、間違いは黙って無視せず警告します。設定画面の保存はコメントを保ちます
不具合修正 Windows Terminal + Google 日本語入力のカタカナ固着、Chrome の高速打鍵での文字消失、外部から閉じられた IME への追随ほか 約 20 件(BUG 番号つき 18 件を移行ガイドに一覧)

設定ファイル(config.toml)は引き継げますが、一部の設定は変わります。 v1 から v2 への違いと移行ガイド と 更新履歴 を確認してください。

インストール

MSI インストーラー

ダブルクリックでセットアップ完了。スタートアップ登録も自動で行います。

最新版をダウンロード (MSI)

ダウンロードできない場合は GitHub Releases から手動でダウンロードしてください。

その他のインストール方法(ZIP版・ソースからビルド)

ZIP 版(ポータブル)

インストール不要。解凍してすぐ使えます。

最新版をダウンロード (ZIP)
  1. GitHub Releases から awase-x.x.x-x64.zip をダウンロードして解凍
  2. 解凍したフォルダ内の install.ps1 を PowerShell で実行(スタートアップ登録)
  3. awase.exe を実行(トレイアイコンに常駐)

アップグレード時: 新しい ZIP を解凍し、同じフォルダへ install.ps1 を再度実行するだけで構いません( config.toml と配列ファイルは既定で保持されます)。 uninstall.ps1 を先に実行する必要はありません。

ソースからビルド

cargo build -p awase-windows --release
mozc-readable(任意・実験的)

Google 日本語入力のオープンソース版 Mozc に、 IME の ON/OFF と入力モードを他のプロセスから読めるようにする変更を加えたビルドです。 awase が読めない窓の IME 状態を、推測ではなく IME 自身の値で知るために作っています。 公式の Mozc とは別名(別の識別子・別のインストール先)で作っています。

mozc-readable は IME の開閉と入力モードを IME 自身が出す値で awase に伝えるため、『awase の想定と実際の IME の状態がずれる』問題を根本から解決できる見込みです。まだ実験的な機能で、実機での検証を続けています。

最新版をダウンロード (MSI)
  • インストール後、Windows の言語設定で入力方式に「Mozc Readable」を追加して使います(入力方式の表示名は「Mozc Readable」です)。
  • 以前の版の上に入れた場合、新しい表示名が言語設定の一覧に反映されるのにサインアウトが要ることがあります。
  • インストーラーに署名はありません。SmartScreen の警告が出ます。SHA-256 は Release の SHA256SUMS.txt にあります。
  • 利用者のプロファイルは公式の Mozc と分かれます。公式 Mozc のユーザー辞書は引き継がれません。
  • awase は mozc-readable が共有メモリに出す値を読んで IME の開閉を知り、親指シフト(NICOLA)入力の ON/OFF をそれに合わせます(設定は不要です。mozc-readable を使っていない窓では何もしません)。
  • 窓の切り替えやひらがなキーの直後の最初のローマ字が、入力中の文字にならず英字のまま残ったときは、awase がそれを検出して消し、打ち直します。

ソース: cuzic/mozc-readable(BSD-3-Clause。Google とは無関係の非公式の派生版です)

使い方

基本操作

  • 半角/全角キーで IME ON → 親指シフト入力が有効に
  • 変換キー / 無変換キーが親指シフトキーとして機能
  • Ctrl+Shift+変換 でエンジン ON、Ctrl+Shift+無変換 でエンジン OFF
  • トレイアイコンで状態確認、右クリックで設定・終了

config.toml の主要設定

confirm_mode 確定モードの選択。wait(既定・推奨、正確重視)、ngram_predictive

よくある質問

Chrome や Edge でちゃんと動きますか?

はい。Chrome / Edge は TSF composition のタイミングが難しく、従来ツールでは文字化けや遅延が発生しがちでした。awase は Google 日本語入力 の I/O を監視して composition の準備完了を検知する独自方式で、これを解決しています。

Zoom のチャットでも使えますか?

はい。Zoom は TSF アプリケーションとして動作しますが、awase は TSF ネイティブアプリへの入力を最適化しており、問題なく使用できます。

ウイルス対策ソフトに誤検知されませんか?

awase は DLL インジェクションを一切使用しないため、セキュリティソフトに誤検知されにくい設計です。キーボードフックと SendInput による標準的な Windows API のみを使用しています。

IME は何に対応していますか?

Microsoft IME と Google 日本語入力に対応しています。Mozc(公式版と mozc-readable)は Google 日本語入力と同じ系統として扱います。ただし、IME のキー設定の自動読み取りは Google 日本語入力だけが対象です。従来ツールの多くは「トグルキー」で IME を切り替えるため、現在の状態を正確に把握していないと意図と逆の状態になってしまうという根本的な問題がありました。Google 日本語入力はとくに現在の IME 状態を外部から正しく取得できないため、この問題が起きやすい IME でした。awase は「IME を ON にする」「IME を OFF にする」という冪等(何度実行しても結果が変わらない)な操作で制御するため、状態がずれていても常に意図した結果になります。

他のキーリマッパー(AutoHotKey 等)と併用できますか?

はい。リレーモードでは全キーが再注入されるため、他のフックベースのソフトウェアにもキーが届きます。

スリープ復帰後に動かなくなりませんか?

スリープ復帰・スクリーンロック解除時に自動でフックを再登録します。また定期的なヘルスチェックで異常を検知し、自動復旧します。Windows Update 後も動作に影響しにくい設計にしており、OS の文字出力方式の内部変更に依存しない実装を採用しています。

パスワード入力画面で誤動作しませんか?

IME が OFF のときは自動的にエンジンが無効になり、通常のキー入力になります。

NICOLA 以外の配列は使えますか?

.yab 形式の配列定義ファイルを作成すれば、任意の配列を定義できます。

Chrome で入力すると最初の1文字だけ英字で出てくることがありました

TSF cold-start 問題です。Chrome は IME の composition context を初期化するのに数百ミリ秒かかることがあり、その完了前にローマ字が届くと「こ → ko」「か → kあ」のように文字が化けます。awase は Google 日本語入力の I/O アクティビティを監視して composition の準備完了を検知し、タイミングを自動的に合わせて送信します。

速く打つとシフトが隣のキーに響いて濁点になることがありました

やまぶきR・紅皿など従来ツールで広く報告されていた問題です。親指シフトキーを離すタイミングが次のキー入力に重なると、意図しない同時打鍵と判定されて濁音や別の文字が出てしまいます。「ゆっくり打てば誤動作しない」という状況が生まれていました。awase は n-gram 統計モデルを使って「日本語として自然かどうか」を判断するため、タイミングが多少ずれても正しく判定できます。確定モードも 2 種類から選べるため、自分のタイピング速度に合わせた調整も可能です。

高速タイピングで文字の順番がおかしくなることがありました

TSF 出力処理の完了を待っている間にキーが溜まり、処理再開後に誤った順序で出力されるバグです。例えば「というのは」と打ったつもりが「とはいうの」になるケースが知られていました。awase はタイマーイベントのインスタンスを厳密に識別することでこの問題を解決し、どんな速度で打っても正しい順序で出力します。

Windows Terminal などターミナルで1文字目だけ英字になることがありました

TSF ネイティブアプリでは、変換確定キー(Enter・スペース)を押した直後に composition context がリセットされます。awase はこのリセットを検知して warmup 処理を行い、次の文字入力までに確実に TSF を ready 状態にします。長時間入力がなかった後の最初の1文字も正しく入力できます。

IME の ON/OFF 切り替えが2回目以降効かなくなることがありました

awase が内部で持つ「IME の状態」と実際の OS の状態がずれてしまい、「もう切り替え済み」と誤判定してしまうケースです。awase はフォーカス変化・アプリ切り替えのたびに IME の実態を再観測し、shadow モデルと照合することでずれを継続的に修正します。

ALT+TAB で別アプリに切り替えると LINE でエンジンが OFF になることがありました

ALT+TAB のタスクスイッチャーが表示されている間、OS は一時的にスイッチャーのウィンドウにフォーカスを移します。この瞬間に IME 状態を読み取ると誤って「IME OFF」と判定され、エンジンが停止してしまうことがありました。awase はフォーカス変更のたびに内部カウンタ(エポック)を更新し、切替アニメーション中に発生した古い観測を自動的に無効化します。これにより ALT+TAB 後も正しく IME 状態が維持されます。

名前の由来

a w a s e

「awase」は QWERTY キーボードで打つと、左小指 → 左薬指 → 左小指 → 左薬指 → 左中指 と、左手だけで外側から内側へ流れるように進みます。

キーボードソフトウェアの名前がキーボード上で美しい動きをする——「合わせ(同時打鍵を合わせる)」という意味とともに、そんな遊び心から名付けました。

A
小指
W
薬指
A
小指
S
薬指
E
中指