AzooKeyKanaKanjiConverterを変換に利用するskkservです。
AzooKeyKanaKanjiConverterから参照される、ニューラルかな漢字変換システム「Zenzai」で利用するモデルはzenz-v1を利用させていただいています。
zenz-v1はKeita Miwa (𝕏)さんによって開発され、CC-BY-SA 4.0で提供されています。
Linux環境向けのバイナリにはllama.cppのShared Objectを同梱させていただいております。
かつ RUNPATH
を $ORIGIN
にpatchさせていただいております。
macOSで動作する、受け取った読みをAzooKeyKanaKanjiConverterで漢字変換し、候補を辞書として返すskkservです。
これにより例えば:
配達業者
などそれぞれの熟語は辞書に入っているけれど、繋がったものは登録されていないケースでも候補を表示できます。- 送り仮名が不明瞭であったりする際、送り仮名ごと入力しても候補が表示されます。
- SKKの流儀とは反しそうですが、Zenzaiの強力な変換力により、長文をそのまま変換することも可能です。
- SKKの仕様上ユーザー辞書にそのまま登録されてしまうと思うので、その点はご注意ください。
Untitled.mov
Releasesよりご自身のarchに対応したパッケージをダウンロードしてください。
その後、解凍されたパッケージをお好きなところに配置してください。
パッケージ内の azoo-key-skkserv
が実行ファイルです。
こちらのLinux検証環境だと libgomp.so.1
が見つからないエラーが出ました。
もし見つからない場合は、以下のようなコマンドでインストールお願いします。
apt install libgomp1
macOS版はGUIアプリケーションの提供もございます。(mtgtoさんありがとうございます!)
Releasesに .pkg
ファイルも置いてあるので、そちらからインストールしてください。
azoo-key-skkserv [--port <port-number>] [--incoming-charset <charset>] [--inference-limit <limit>] [--help] [--version]
EUC-JP範囲外の候補があるため --outgoing-charset
オプションはなく、サーバーからは常にUTF-8で返します。
私はmacOSのAutomatorで以下のshellを実行するアプリケーションを作成しています。
nohup ~/opt/azoo-key-skkserv/azoo-key-skkserv --incoming-charset EUC-JP >&/dev/null &
作成したアプリケーションはログイン項目に登録しておき、自動的にサーバーが立ち上がるようにしています。
skkservの標準に準拠しているつもりです。
入力の1文字目を opcode
とし、それ以降を operand
とした場合:
opcode | operand | 説明 | 出力 |
---|---|---|---|
0 | なし | コネクション破棄 | なし |
1 | 見出し語 | 辞書要求 | 候補がある時は 1/{候補1}/{候補2}/.../{候補n}/\n |
2 | なし | サーバー情報要求 | azoo-key-skkserve/{バージョン} |
3 | なし | ホスト情報要求 | {ホスト名}/127.0.0.1:{ポート}/ |
4 | 見出し語 | 補完要求 | 4\n (未実装) |
swift run azoo-key-skkserve
macSKKと結合して動作確認
動作未確認
macOS上で動作するDockerにて、netcatで動作確認
一応コンパイルできていそうなのですが、エミュレータだとうまく実行できていません。
まだまだ使いながら調整したりしてる段階なので、不具合や不安定なところがあるかと思います。
もし何かございましたら、Issueでご報告いただいたりPRを投げていただけると大変助かります🙇
- PoC
- Zenzaiの導入
- linux向けビルド
- コマンドラインオプション
- homebrewでバイナリ配布など
- ネットワークサンドボックス
- 見出し語の入力がどこにも送信されないことを保証したい
- SKKにはTCPで通信できる必要がある。リモートへの通信のみ制限することができるのか?
- 詳しい方いたら教えてください🙏
- そもそもコンポーネント分けてもいいかもしれない
- skkservのゲートウェイを作ってかませる
- ゲートウェイと各辞書エンジンの通信形式は自由
- ここでtcp使わなければ、sandbox化も楽そう
- 別でprogrammableなエンジンとかを用意しても良さそう
- もしくはgateway自体がprogrammableで、通信もその一部という考え方もありそう