📖 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 統計モデルで「文脈に合う方」を予測し、同時打鍵を賢く判定
  • 5 種類の確定モードからタイピングスタイルに合わせて選択
  • AutoHotKey など他のフックソフトウェアとも共存可能

カスタマイズ自由

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

オープンソース

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

アプリ対応状況

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

従来ツールで苦手

Chrome / Edge

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

従来ツールで苦手

Zoom

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

従来ツールで苦手

TSF アプリ全般

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

完全対応

Google 日本語入力

Google 日本語入力の内部動作に合わせた専用の制御方式で、IME ON/OFF を確実かつ副作用なく切り替えます。

完全対応

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

5 種類の確定モード

ngram_predictive n-gram 統計モデルで文脈予測。速度と精度のバランスが最も良い(推奨)
adaptive_timing 直前のタイピング速度に応じて閾値を自動調整
two_phase 投機出力で速度を確保しつつ、親指キーが来れば差し替え
speculative 単独打鍵を即時出力。最速だが高速タイピング時は誤変換が増える場合あり
wait タイマーまで待機してから確定。最も正確で、ゆったり打つ方に向く

インストール

MSI インストーラー(推奨)

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

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

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

ZIP 版(ポータブル)

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

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

ソースからビルド

cargo build -p awase-windows --release

使い方

基本操作

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

config.toml の主要設定

confirm_mode 確定モードの選択。ngram_predictive(推奨)、wait(正確重視)、speculative(速度重視)など
output_mode 出力方式。unicode がデフォルト
hook_mode フックの動作方式。relay がデフォルトで、安定性を重視した設計

よくある質問

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 日本語入力に対応しています。従来ツールの多くは「トグルキー」で 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 統計モデルを使って「日本語として自然かどうか」を判断するため、タイミングが多少ずれても正しく判定できます。確定モードも 5 種類から選べるため、自分のタイピング速度に合わせた調整も可能です。

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

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
中指