tl;dr
- 素朴なものなら自作できそうだったので SKK のサブセットを自作してみた
- サポートしていない機能があります(全英入力モードなど)
- ついでに軽くSKKを試せるアプリにしてみた
- こちらからどうぞ(DXOpal を使っているのでブラウザで試せます)
SKKとは
日本語インプットメソッドの一つ。形態素解析を行わず、かなと漢字の境界をユーザーが明示的に指示するのが特徴です。
本家は Emacs上で動く ddskk ですが、さまざまなクローンや派生プロダクトが作られているようです。
概要や詳しい使い方に関してはウェブに情報がありますので詳しくはそちらも参照してください。
簡単な例で入力操作を見てみましょう。たとえば「なんだ猫か」と入力したい場合、 SKK では次のように操作します。
※ SPC: スペースキー / RET: エンターキー / C-j: ctrl + j
(1)
キー入力: n a n n d a
結果: なんだ
(2)
キー入力: N e k o SPC C-j ... SPC で変換(候補が複数ある場合は繰り返す)
C-j で確定(この例の場合は省略可)
結果: なんだ猫
(3)
キー入力: k a
結果: なんだ猫か
- 変換したい部分の開始位置は
Shiftキーで指示する(N e k oの先頭がshift + nであることに注意) - 終了位置は
N e k oまで入力した時点でSPCを押すことで認識できる
この操作によって「ねこ」の部分が変換対象であるとプログラム側で認識できます。
ローマ字からひらがなへの変換は単純な辞書引きでよいでしょう。パターンも限られています。
「ねこ」を「猫」という漢字に変換するのも、これも単純な辞書引きでよさそうです。
Simple Kana to Kanji conversion program の名前の通りシンプルそうです。自分でも作れそうな気がしてきますよね。
作ってみた
というわけで軽い気持ちで手を出してみました。初回チャレンジとしてはまずまずかな……という感想です。
- 今回は既存実装を見ない縛り
- 使い方の説明や ddskk の挙動だけを参考にする
- 「なんだ猫か」のような単純なパターンが入力できる最低限のものは 200行+ くらいですぐできた
- そこから辞書登録機能などを追加して今は
skk.rbが 600行くらい - 送り仮名ありの場合や「この状態でバックスペース押すとどこまで消える?」みたいな細かい挙動をケアしようとするとあれこれ必要になる
- 暗黙の確定のように「必須ではないが操作感・入力効率の面であるとベター」という機能もあり、半分以上は(コアのロジックをいじっているというよりは)UIの作り込みのような感覚で作っていた
- その他、違和感のある挙動になっていたり「この場合どうするのがいいんだろう?」と気になったらその都度 ddskk で確認してテストケースを追加して修正
- 網羅的なチェックはできていません。たぶんまだ漏れてる。
- 辞書データが大きい場合やリソースが貧弱な環境で動かしたい場合は工夫が必要かも?
- 今回は不要
- 最後の方は割と場当たり的な修正になったりしてましたが、全体像が見えてないところからの手探りだったのでまあしょうがないかな……。一度捨てて作り直すのがよさそう。
たとえば ddskk だと見出し語入力モードでひらがなを入力 → q でカタカナに変換されるのですが、こういう動作は未実装だったりします。
(1)
キー入力: R a m u d a
結果: ▽らむだ
(2)
キー入力: q
結果: ラムダ
おためしアプリ化
動作確認用に作っていた簡易なエディタに手を加えてオンラインで試せるアプリにしてみました。
ランダムに表示される例文を入力していくだけのアプリです。例文の通りに入力できると次の例文が表示されます。
得点や時間制限といったゲーム的な要素は今回は盛り込みませんでした。おためし・練習アプリ的な感じでしょうか。「SKKに興味があり、軽くためしてみたいがインストールするのが億劫」という利用者をなんとなく想定しています。
例文を無視して好きな文を入力することもできますが、最低限のものしか辞書に登録していないため変換できない漢字の方が多いと思います。
音を鳴らすのが好きなので適当に効果音を付けています。デフォルトでは無効化していますが右下の
ボタンで切り替えられます。効果音はパブリック・ドメイン扱いとします。何かに使えそうだったらご自由に使ってください。
DXOpal でウェブフォントを使ってみた
今回は文字表示がメインなこともありウェブフォントを使ってみました。これでどの環境でも同じ表示にできるはずです。無加工の TTFフォントをそのまま使っているので初回はロードに少し時間がかかると思います。
以下のようにスタイルシートで適当な名前(下の例では my_monospace)で定義し、Font.new に同じ名前を渡しています。
<!-- index.html -->
<style>
@font-face {
font-family: "my_monospace";
src: url("./font/Firge-Bold.ttf");
}
</style>
# main.rb
FONT_S = Font.new(16, "my_monospace")
半角・全角の幅が 1:2 になっているフォントを使うと幅の計算が楽になります。今回は Firge を使わせてもらいました。
環境によってフォントが変わってしまう問題については以前スイカゲームっぽいのを作ったときもちょっと気になってたんですが、この時はそこまで手が回らなかったんですよね。
RubyとSKK
ついでに調べた Ruby + SKK 関連のあれこれのメモ。
SDLSKK
Ruby/SDL のサブモジュール的な位置づけ。Ruby/SDL アプリ内で日本語入力できる。
Ruby/SDL のリポジトリ内にサンプルがあります。
https://github.com/ohai/rubysdl/blob/master/sample/sdlskk.rb
Ruby SDL SKK Markov Typing - shinh.skr.jp
Ruby/SDL + SDLSKK を使ったアプリ。少し手直しが必要+(修正の仕方がよくないのか)ちょいちょいクラッシュしますが Ubuntu 24.04 でも動かせました。
動かせた記念に撮った動画:
rskkserv
SKKサーバーの Ruby 実装。
google-ime-skk
Google IME SKK サーバー 作った - hitode909の日記
Google CGI API for Japanese Input*1を使って変換するSKKサーバーを作った.
Googleのサーバーが高性能なので,通常のSKK辞書ではできないような変換ができる.以下は例.
手元の辞書にないが世の中にはあるような言葉を変換できる.
リッチでない環境での日本語入力
Linux等のOSなしのマイコンボードでも日本語「入力」ができるようになります。
変換方式 独自(SKK方式とは異なります。)
M5Stackの小さい画面に日本語を表示させるだけでもかなりかわいいですが、こう…その場で好きな日本語を表示させたくなりました。WebやWiFiやシリアルポートを弄ることなく日本語を入力するには…?
(こちらは特に Ruby とは関係なく SKK でもないとのことですが「このような環境で日本語入力したいケースがある」という例として挙げてみました)
かな漢字変換処理の自作が必要になる場面というのは通常ないと思いますが、特殊な環境で日本語入力したい場合は SKK のようにシンプルなものが有力な選択肢になりそうです。mruby で日本語入力できると嬉しい場面があったりするかもしれませんね。
DXJRuby
DXOpal の JRuby 移植です。とりあえず自分用に作っていて丁寧なガイドなどは用意できていませんが、ご興味あればどうぞ。
Java は標準ライブラリでグラフィックの表示や音声の再生まで扱えるので、そこに乗っかればグラフィックや音声を扱うアプリをプラットフォーム非依存で作れるのでは? と思いつき、じゃあ作るかと。
コア部分は Java で書いており、 JRuby 側からその機能を呼び出す形になっています。一度ビルドして jar を作ってしまえば各環境向けのビルドが不要なのが嬉しいところ。
「JRuby はこういう用途で使うとうまくはまりますよ」という事例の一つとしてどうでしょうか。
以前 DXOpal 向けに作った論理回路シミュレータはすでに動かせています。基本的な機能しか使っていないのでこれを動かすのは割と楽。
動画:
参考
例文探しの参考にさせてもらいました。田山花袋、小川未明など今まで読んだことなかった作家の作品が読めてよい機会になりました。
せっかくの Advent Calendar なので今年書いたものとかいろいろ
これで音を作って DXRuby の Sound.load_from_memory に渡してあげれば、 DXRuby でファミコンのノイズ音が出せそう……と思いつつまだ試せてません。
参考: DirectSoundとRubyのプログラミング その10 - mirichiの日記
Emacs + Eglot
dxopal-demos にデモを追加しました。
● マウスでドラッグ
● タイマーアプリ
この記事は以上です。それではよいお年を〜。



