Text Expansion でステノワードを実現できないかな、という話

喋るより早く打てるステノワード(※1)。あれを PC 上で実現できないかなぁと考えて、Text Expansion を駆使すればいけるんじゃないかと考えている。

予備知識その1

ステノワード

字幕放送で使われているキーボード。肝は「1番目のキーと3番目のキーと5番目のキーを同時押しすると、XXXX という単語が入力される」のように 同時押しのパターンに(よく使われる)単語を充てる というもの。これにより一単語を(実際は同時押しだがほぼ)一打鍵で入力するという驚異的スピードを実現できる。字幕放送にも追いつく。

参考:

スピードワープロ学院

ステノワードに関する教育(有償)を行っている組織。たぶん国内唯一。

ちなみに「スピードワープロ」という単語は、ステノワードが商標だからと代わりに考えられたのだと思う(詳しい方いましたら正確な情報など教えてください)。

参考:

予備知識その2

Text Expansion とは?

パターン(単語とテキストの組)を登録しておくと、その単語(入力語と呼ぶ)を入力しただけで即座にテキストが挿入されるという文章入力システム。

  • パターン例: HTML の li タグを入力する例
    • 入力語: li[
    • テキスト: <li></li>

辞書変換や定型文ツールとは違い、余分な変換作業は要らず、またウィンドウも表示しないので、たとえば Windows のファイル名編集中でも挿入できる。

qiita.com

本題

Text Expansion を使えばステノワードっぽいことを実現できるのでは?

案1: 文字キー26個を用いる場合(同時押し不可)

表現可能なパターン数は以下のとおり。

  • 長さ1文字の入力語: 26通り
  • 長さ2文字の入力語: 26*26= 676通り
  • 長さ3文字の入力語: 26*26*26= 17576通り
  • 長さ4文字の入力語: 26*26*26*26= 456976通り

仮に長さ3文字以内までを使うとしたら、26+676+17576=18278 通りのパターンを表現できる計算に。

国語辞書が(辞書にもよるが手元にあるものだと)7万語くらいなので、日本語を網羅するには足りない。頻出語に絞れば、日常会話くらいはこなせそう?

弱点: 同時押し方式ではない

ステノワードの真髄は同時押しである。たとえば abc という三つのキー組み合わせに「コミュニケーション」という単語を割り当てた場合、abc の順で同時押ししても、bca の順で同時押ししても「コミュニケーション」と打てる。

が、この案1 では bcaabc とは別物であるため、bca の順で同時押ししても「コミュニケーション」とは打てない。

案2: 文字キー26個を用いる場合(同時押し可)

ならばと同時押しに対応させてみると、表現力は以下のようになる。

  • 長さ1文字の入力語: 26通り
  • 長さ2文字の入力語: C{26,2}= 325通り
  • 長さ3文字の入力語: C{26,3}= 2600通り
  • 長さ4文字の入力語: C{26,4}= 14950通り

入力語 3 文字以内では 3000 パターンにも満たなくなってしまった。入力語 4 文字まで使えば 1.7 万パターンほど使える。

弱点: 習熟が困難

これは案1にも当てはまるが、文字キー26個の同時押しの組み合わせを覚えるなど、狂気にもほどがある。人間に習得出来るとは思えない。

もう少し負担を減らしたい。

案3: 文字キーを asdf の列にある 8 個のみ用いる場合(同時押し可)

たとえば a,s,d,f と j,k,l,; の 8 キーのみを使うとしよう。

これなら手を常に固定しておけるのでタイプミスは大幅に減る。キー数も 8 個しかないので(26個と比べるとはるかに)学習もしやすいはず。

表現力を求めてみる。

  • 長さ1文字の入力語: 8 通り
  • 長さ2文字の入力語: 28 通り C{8,2}=(8*7)/(2*1)
  • 長さ3文字の入力語: 56 通り C{8,3}=(8*7*6)/(3*2*1)
  • 長さ4文字の入力語: 70 通り C{8,4}=(8*7*6*5)/(4*3*2*1)
  • 長さ5文字の入力語: 56 通り C{8,5}=C{8,3}
  • 長さ6文字の入力語: 28 通り C{8,6}=C{8,2}
  • 長さ7文字の入力語: 8 通り C{8,7}=C{8,1}
  • 長さ8文字の入力語: 1 通り C{8,8}

合計すると 8+28+56+70+56+28+8+1 = 255 255 通りのパターンを表現できる。

……明らかに少ない。

弱点: パターン数が少ない

たかが 255 通りではまともな意思疎通や文章記述は行えないだろう。

ちなみにステノワードはキー 10 個だが 3000 単語以上を表現できるらしい。

案4: 案3に「修飾キー」を実装する

Shift や Ctrl といった修飾キーにより、キー入力の幅が広がっていることは周知の事実だ。これを導入してみる。

まず案 3 では指を 8 本使うので、あと 2 本余っている。これを修飾キーを押す用に割り当てる。

次に、修飾キーを用いてどうパターン数を増やすかには色んなアイデアがあるので、各自見ていく。

アイデア1: 同時押し

修飾キーを押しながら文字キーも押す、というアイデアである。

修飾キーは 2 つあるので、これを m1、m2 とすると、修飾の組み合わせは 4 通りある

  • 何も修飾しない
  • m1 のみ
  • m2 のみ
  • m2 と m2

それぞれについて 255 通りを割り当てれば、計 1020 通りのパターンを実現できる。

アイデア2: スロット切り替え

これは修飾キーにより「どの利用領域(スロット)を使うかを切り替える」というアイデアである。

修飾キーは 2 つあるので、これを m1、m2 とする。m1 では一つ前のスロットを開き、m2 では一つ後のスロットを開くものとする。スロット 1 つには 255 通りのパターンを入れることができるとする。

すると、スロットが n 個あれば、計 255*n 通りのパターンを表現できることになる。

しかしスロット切替時は修飾キーの連打が必要になってしまう。目的のスロットを開くのに、最大で n/2 回の連打が必要になる。

仮にスロットが 10 個だとすると、2550 通りのパターンを表現できるが、スロット切り替えには最大で 5 回の連打を要する

アイデア3: 同時押しとスロットの複合

アイデア1とアイデア2を合わせるとどうなるか。

まず修飾キー m1 には、アイデア1 の同時押し機能を与える。ここまでで表現可能なパターンは、

  • m1 を押さないで 255通り
  • m2 を押しながらで 255通り

なので計 510 通り。

続いて修飾キー m2 には、アイデア2 のスロット切り替え機能を与える。ただし、切り替え方は少し独特にして、m2 を押しながらn番目の文字キーを押すと、n番目のスロットに切り替える、という動作にする。文字キーは 8 個あるから、計 8 スロットが存在する。また、スロットの切り替えは m2 + 文字キーの同時押しだけであり、連打という弱点もない。

まとめると、

  • スロット 1 つにつき 510 通りのパターン
  • スロットは計 8 個ある

ということで全部で 4080 通りのパターンを表現できる。これはステノワードの 3000 単語以上に匹敵するし、もしかしたら勝っているかもしれない。

実装上の課題

ここからは話を変えて、実装の話に移りたい。ステノワードのような「同時押し時に特定単語を入力する」を Text Expansion で実現するにはどうしたら良いか。

課題1. 既存の Text Expansion に「同時押し」という概念はない

Text Expansion というと TextExpanderPhraseExpress あたりが有名か。Windows であれば AutoHotkey の Hotstring 機能を使う手もある。

しかし、いずれにせよ、同時押しに対して単語を挿入する機能は無い。abcbac は別の入力語として区別されてしまう。両者を同一視する Text Expansion は、私の知る限り存在しない(もしあったら教えてください)。

したがって、本記事は「Text Expansion でステノワードを実現する」というテーマになっているが、答えとしては たぶん無理 となる。やるにしても、同時押しに対して単語を挿入するという独自の Text Expansion を自ら考えて、実装することになる。

課題2. 検出アルゴリズムはどうするか

自力で実装するとして、まず問題となるのは「ある入力語が入力されたことを検出するにはどうすればよいか」という話である。

Text Expansion であれば、abc と入力された場合は、入力バッファに [a, b, c] あるいは [c, b, a] と入っているから、単にこれを調べるだけで済む。もっと賢く実装するなら、1 文字入力される度に照合する手もあるだろう。

しかしステノワードのような同時押しを検出する場合は、そうはいかない。abc について検出するとしたら、同時に acb bac bca cba cab の 5 つについても検出しなければならない。これをスマートに検出するにはどうしたら良いのだろう?

検出アルゴリズムは高速でなくてはならない。なぜならキー入力は(人にもよるが)秒間 10 打は珍しくないし、20 を超えることもあるからだ。検出に時間を要していては間に合わない可能性がある。

課題3. パターンデータをどうするか

ステノワードはパターン(入力語と挿入単語の組)が 1000 以上も存在するが、その中身は明かされていない。スピードワープロ学院で学ぶ以外に知り得る手段はないのだろう。

ということは、パターンデータはすべて自力で作る必要がある。仮に案4のアイデア3(4080通りのパターン)を採用するとしたら、4080個のパターンを考えてデータに落とさなくてはならない。これには「挿入単語として何を使うか」「asd にどの単語を割り当てるか」「よく使う単語には短い同時押しを割り当てよう」などと、それはもう壮大な調査と設計が必要になる。

課題4. 通常の入力とステノワード入力はどう切り替える?

仮に案4のアイデア3(4080通りのパターン)を採用するとすると、a s d f j k l ; の 8 つのキーと、修飾キーとして用いる 2 つのキーの計 10 個のキーは、そのまま使う(本来の働きとして使う)ことができなくなる。これでは当然困る。

通常の入力とステノワード入力。この二つのモードを切り替えるインターフェースが必要だろう。

その他の課題

課題はまだある。

習熟コストの高さ だ。

ステノワード入力を使いこなすためには、何千ものパターンを覚え、瞬時に思い出す瞬発力を身につける必要がある。学院という専門機関で教育させるとおり、一長一短には身に付かないスキルだろうし、少なくとも私は出来る気がしない。QWERTY 配列を覚えるのとはワケが違う。文字通り記憶すべき情報量の桁が違う。

おわりに

ステノワードをソフトウェア的に実現するアイデアについて、Text Expansion をもとに考えてみた。妄想の域を出ないかもしれないが、ステノワードの暴力的スピードに価値があることは確かだ。将来的に、だれかが研究し始め、発展していくかもしれない。

私としてはスピードワープロのようなクローズドな世界ではなく、オープンソースのようにオープンに発展していったらいいなと思っている。

補足

コメントがあったので補足しておく。

(2018/11/16 追記) ※1 「喋るより早く打てる」の根拠について

私は実物を見たり試したりしたわけではないが、以下の動画を視聴してそう思うに至った。

また、以下は「コミュニケーション」という単語を同時押しで打っている例である。

本記事のすべてはこの動画から始まったと言っても過言ではない。また、私が捉えている「ステノワード」は、この動画から得た情報や印象によるところが大きい。