APIwokakuninshitekudasai. と打つと、「APIを確認してください。」になる。
英字を挟むたびに入力モードを切り替えるのが面倒で、Windows向けのIME「Yomitsugu」を作っています。ローマ字を打ち続けると、入力中の文字列が日本語へ変わっていきます。
英字を交えた文章を、そのまま打つ
候補は入力中に変わります。表示された文章でよければ Enter で確定し、別の候補を選びたいときは Space を押します。
| 入力 | 変換例 |
|---|---|
kyouhaiitennkidesune. |
今日はいい天気ですね。 |
APIwokakuninshitekudasai. |
APIを確認してください。 |
softwarewokoushinsuru |
softwareを更新する |
insuto-ru |
インストール |
aninsuto-ru |
アンインストール |
yajirushi |
→ |
小さい「っ」は ltu、句点「。」は . でも入力できます。記号や外来語も辞書から候補を出します。
名前や用語をユーザー辞書に登録する
仕事で使う名前やプロジェクト名は、ユーザー辞書に登録できます。たとえば「よみつぐ」に「Yomitsugu」を登録すると、次の変換から候補に出ます。
設定画面の「ユーザー辞書を編集」から開き、「読み」「単語」「品詞」を入力します。「登録・更新」を押して一覧へ追加し、最後に「保存」で反映します。
一覧で選んだ単語の修正や削除、TSV形式の辞書の取り込みにも対応しています。
選んだ候補を覚える
候補を選んで確定すると、その読みと選択した語をPC内に記録します。次に同じ読みを入力したときは、選択回数と最近の選択をもとに候補の順番を変えます。
設定画面の「候補の選択を学習する」で切り替えられます。「学習履歴を削除」を押しても、ユーザー辞書に登録した単語は残ります。
辞書の更新状況も設定画面で確認する
「公開辞書を確認・更新」を押すと、公開されている辞書データを取得します。一般語・外来語・記号など、約30万項目を同梱しています。
画面には「最終更新」と「最終確認」を分けて表示します。確認した結果、辞書の内容が同じなら、最終更新日はそのままで確認日時が進みます。確認に失敗した場合も、前に取得した辞書を使い続けます。
アプリ本体は「アプリを更新」から更新できます。新しい版があればインストーラーをダウンロードし、ファイルを検証してから起動します。
変換はPC内で処理します。辞書やアプリの更新時にも、入力文・ユーザー辞書・学習内容は送信しません。
インストールするには
- GitHubのインストール案内からWindows用インストーラーをダウンロードします。
-
.exeを実行し、画面の案内に従ってインストールします。 -
Win+SpaceでYomitsuguを選びます。
設定は通知領域のYomitsuguアイコンを右クリックして開きます。アイコンが見当たらなければ、スタートメニューの「Yomitsugu → 設定と辞書」からも開けます。
Windows x64向けの評価版です。インストールには管理者権限が必要で、未署名のためWindowsの警告が出る場合があります。
変換エンジンを入力先アプリから分離した
ここからは実装の話です。
Windowsの入力欄との接続には、テキスト入力の仕組みであるTSFを使っています。その中でキー入力や候補表示を担うのがTIP(Text Input Processor)です。TIPのDLLは入力先アプリのプロセス内で動きます。
一方、変換エンジンにはSwiftのランタイム、辞書、モデルが必要です。これらは専用の ime_engine_host.exe にまとめ、TIPとはパイプで通信させています。
この構成なら、辞書やモデルはIMEのインストール先に置けます。変換エンジンの終了時も、TIPが保持している編集中の文字は残ります。
かな漢字変換には AzooKeyKanaKanjiConverter の辞書とZenzaiのローカルモデルを使い、Windows向けの統合には myime を利用しています。公開辞書にはMozc・EDRDG・Unicode由来のデータも含まれます。
遅れて届いた候補で入力を巻き戻さない
変換中も次の文字は打てます。たとえば kakunin の結果が届いた時点で、すでに kakuninshite まで進んでいることがあります。
そこで、未処理の要求は最新の入力だけを残し、戻ってきた結果が現在の入力に対応するかを確認します。文字列だけでなく、入力の版、前後の文脈、候補を選ぶ操作が進んでいないかも判定します。
if (request.raw_text != raw_text_ ||
request.revision != revision_ ||
request.context_generation != context_generation_ ||
request.interaction_generation != interaction_generation_) {
return false;
}
これは Session::ApplyCandidates の判定です。手で選んだ候補を、後から届いた結果が上書きするのも防ぎます。
これから直していくところ
文脈に合った同音語の選択や、複数箇所にあるタイプミスの補正は改善を続けています。文節の長さを変える操作と、確定後の再変換も開発中です。
ソースと対応範囲は GitHub、各辞書やモデルの出典・ライセンスは THIRD_PARTY.md にまとめています。



