日記とか、工作記録とか

自分に書けることを何でも書いてゆきます。作った物、買ったもの、コンピュータ系の話題が多くなるかもしれません。

Raspberry pi 3 Model B + Juliusで音声認識

まえおき

ここしばらく、AIアシスタント付きのPCやスマホやスピーカーが汎用品になってきました。

私もiPhoneのSiri、Surface ProのCortana、Echo dotのAlexaとちょっとずつ使ってみましたけど、まだ少しだけ新しいことができるという段階で、生活が便利になるにはまだまだ発展が必要かなぁという感じですね。ただ、短期間のうちにSiriもAlexaもできることが増えたり、こちらの言うことに正しく応答してくれるようになってきました。この先が楽しみです。

で、私もマネをしてみたくなったので、多くの人の後追いではありますが、音声認識を試してみることにしました。おいおいやっていこうとしている遠大な(?)計画はあるのですが、ひとまずは私の言うことを聞き取るところを目指そうと思います。今回は日本語音声を認識して文字にしてくれるJuliusを試してみます。

準備

いつものRaspberry pi 3 Model Bです。今回、32GBのmicroSDカードを使ってRaspbian OSのインストールからやり直しました。

f:id:WindVoice:20180826151438j:plain

ところで、スイッチサイエンスさんの調査で、pi 3は快適に使うには5V / 2.5Aの電源が必要とあるのですが、これがなかなか難しい条件で、私の部屋で見つけられるのは、iPad用の充電アダプタ(2.4A)が精一杯でした。確かに、言われてみれば/var/log/messagesにVoltage関係のメッセージがでていたりするので、これまでは電源不足から制限がかかった状態で動いていたのだなぁと認識した次第です。iPadの電源でもまだVoltageエラーは出るのですが、以前よりは明らかに快速になったので、しばらくはこれで行こうかと思います。

Juliusのダウンロード

Juliusは、最新版がGitHubに置かれていますので、git cloneで取り寄せます。現在の最新版は4.4.1です。

pi@raspberrypi:~ $ git clone https://github.com/julius-speech/julius.git
Cloning into 'julius'...
remote: Counting objects: 2341, done.
remote: Total 2341 (delta 0), reused 0 (delta 0), pack-reused 2341
Receiving objects: 100% (2341/2341), 8.54 MiB | 3.21 MiB/s, done.
Resolving deltas: 100% (1059/1059), done.
pi@raspberrypi:~ $

実はうまく動作させることができず、いろいろ試行錯誤したのですが、結果的には下の要領でconfigureしてうまくいきました。--with-mictypeというのは、音声入力をOSのどの仕組みから受け取るか、を選択するものですが、最初OSS(Open Sound System)経由で受け取ることになっていました。しかし、これは動作させることはできませんでした。

ALSA(Advanced Linux Sound Architecture)のほうが新しい仕組みなのだそうで、こちらを使うと動作しました。パッケージも試行錯誤の途中でいろいろ入れたので、どれが重要だったかわからないのですが、ALSA関係は必要だったはずです。

他に使えるconfigureオプションは、ここにリストがあります。

pi@raspberrypi:~ $ sudo apt-get install alsa-utils
pi@raspberrypi:~ $ sudo apt-get install sox
pi@raspberrypi:~ $ sudo apt-get install libsox-fmt-all
pi@raspberrypi:~ $ sudo apt-get install osspd-alsa
pi@raspberrypi:~ $ sudo apt-get install libasound2-dev libesd0-dev libsndfile1-dev
:
:
:
pi@raspberrypi:~/julius $ ./configure --enable-words-int --with-mictype=alsa

ちょっとでも速く動いてほしいので、コンパイル最適化オプションをつけてmakeします。

pi@raspberrypi:~/julius $ export CFLAGS="-O3"
pi@raspberrypi:~/julius $ make
pi@raspberrypi:~/julius $ make install
:
:
:
pi@raspberrypi:~/julius $ julius -setting
JuliusLib rev.4.4.2.1 (fast)

Engine specification:
-  Base setup   : fast
-  Supported LM : DFA, N-gram, Word
-  Extension    : WordsInt LibSndFile
-  Compiled by  : gcc -O3

Library configuration: version 4.4.2.1
- Audio input
    primary A/D-in driver   : alsa (Advanced Linux Sound Architecture)
    available drivers       : alsa
    wavefile formats        : various formats by libsndfile ver.1
    max. length of an input : 320000 samples, 150 words
- Language Model
    class N-gram support    : yes
    MBR weight support      : yes
    word id unit            : integer (4 bytes)
- Acoustic Model
    multi-path treatment    : autodetect
- External library
    file decompression by   : zlib library
- Process hangling
    fork on adinnet input   : no
- built-in SIMD instruction set for DNN

    NONE AVAILABLE, DNN computation may be too slow!

Try `-help' for more information.
pi@raspberrypi:~/julius $

USBマイクの優先順位を上げる

Raspberry pi 3にはマイク端子は付属していないので、USBマイクを使います。こちらも手元にあるものを使うということで、こちらを引っ張り出してきました(ゲーム用ですが)。マイクとスピーカーが一体になっているので、USBポートが一個で間に合うのはちょっと便利かな。

接続したら、lsusbで認識していることを確認します。1行目ですね。

pi@raspberrypi:~ $ lsusb
Bus 001 Device 007: ID 046d:0a6d Logitech, Inc.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $

音声関係のデバイスが複数ある場合、どれに優先してデータを流すかを決める必要があります。下のコマンドでデバイスの優先度がわかるのですが、このままだとUSBポートに接続したヘッドフォンの優先度が低いので、これを最上位(ゼロ)に持ってきます。alsa-base.confファイルを作成して、下の通り記載して保存したらRaspberry piを再起動です。options ... index=0が最上位のデバイスになります。

pi@raspberrypi:~ $ sudo cat /proc/asound/modules
 0 snd_bcm2835
 1 snd_usb_audio
pi@raspberrypi:~ $ sudo vi /etc/modprobe.d/alsa-base.conf
options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1
pi@raspberrypi:~ $
:
(再起動)
:
pi@raspberrypi:~ $ sudo cat /proc/asound/modules
 0 snd_usb_audio
 1 snd_bcm2835
pi@raspberrypi:~ $

録音テスト

他の方のJuliusの利用例では、arecordコマンドを使っていることが多いのですが、Juliusには同梱の録音ツールadinrecがあります。トラブルシューティング的には、こちらを使ったほうが良いかと思います。arecord -lで録音可能なデバイス(=マイク)の一覧を取得すると、カード0、デバイス0でヘッドフォンが認識されていることがわかります。環境変数ALSADEVに、"plughw:0,0"を設定してからadinrecを起動すれば、ファイルに録音することができます。

pi@raspberrypi:~/julius $ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: Headset [G433 Gaming Headset], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
pi@raspberrypi:~/julius $
pi@raspberrypi:~ $ export ALSADEV="plughw:0,0"
pi@raspberrypi:~ $ adinrec -nostrip /tmp/test.wav
STAT: ###### initialize input device
Stat: adin_alsa: device name from ALSADEV: "plughw:0,0"
Stat: capture audio at 16000Hz
Stat: adin_alsa: latency set to 32 msec (chunk = 512 bytes)
Stat: "plughw:0,0": Headset [G433 Gaming Headset] device USB Audio [USB Audio] subdevice #0
STAT: AD-in thread created
.............Error: adin_alsa: error in snd_pcm_wait() (Input/output error)
Error: adin thread exit with error

14528 samples (29056 bytes, 0.91 sec.) recorded
pi@raspberrypi:~ $
pi@raspberrypi:~/julius $ aplay -D plughw:0,0 /tmp/test.wav
再生中 WAVE '/tmp/test.wav' : Signed 16 bit Little Endian, レート 16000 Hz, モノラル
pi@raspberrypi:~/julius $

実は、動作しているようなのに録音されない…… という問題にかなり悩みました。マイクに近づいて、ハキハキ喋ると発生を認識してくれます。ある程度音圧がないと、認識が始まらないようです。できあがる録音ファイルは、無音部分がなくなって「発声」として認識したところだけが保存されています。aplayコマンドを上のように使うと、再生することができます。

ディクテーションキットの入手

日本語音声をテキストデータに変換するには、日本語の音の特徴がどういうものか、というデータが必要になります。例えば「あ」という声が、どのような音でできているのか、あらかじめ知っている必要があるわけです。Juliusの場合、日本語用のキットが用意されているので、これを活用させてもらいます(便利!)。

pi@raspberrypi:~/julius-kit $ wget --trust-server-names 'https://osdn.net/frs/redir.php?m=iij&f=julius%2F66544%2Fdictation-kit-v4.4.zip'
--2018-08-24 22:16:28--  https://osdn.net/frs/redir.php?m=iij&f=julius%2F66544%2Fdictation-kit-v4.4.zip
osdn.net (osdn.net) をDNSに問いあわせています... 202.221.179.17
osdn.net (osdn.net)|202.221.179.17|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: http://iij.dl.osdn.jp/julius/66544/dictation-kit-v4.4.zip [続く]
--2018-08-24 22:16:28--  http://iij.dl.osdn.jp/julius/66544/dictation-kit-v4.4.zip
iij.dl.osdn.jp (iij.dl.osdn.jp) をDNSに問いあわせています... 202.232.140.70, 2001:240:bb8f::1:70
iij.dl.osdn.jp (iij.dl.osdn.jp)|202.232.140.70|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 426837341 (407M) [application/zip]
`dictation-kit-v4.4.zip' に保存中

dictation-kit-v4.4.zip        100%[==============================================>] 407.06M  7.56MB/s    in 44s     

2018-08-24 22:17:12 (9.26 MB/s) - `dictation-kit-v4.4.zip' へ保存完了 [426837341/426837341]

pi@raspberrypi:~/julius-kit $

これをunzipコマンドで展開して、ディレクトリ内にあるmain.jconfと、am-gmm.jconfファイルに一般的な設定が作られていますので、これをJuliusコマンドで読み込み、あとは適宜オプションを追加して起動する、ということになります。ちなみに、うまくいかないときのトラブルシューティング用資料がこのディレクトリのTROUBLE.txtにあるので、参考にしました(SJISで書かれたテキストファイルなので、読むときはiconv -f sjis -t utf8 TROUBLE.txtで読みます)。

起動後は、マイクに向かってハキハキ喋ります。-recordオプションをつけておくと、認識した音声を細切れのファイルに保存しておいてくれます。発音に所定の無音時間があると別の発言と認識されるので、一続きに読み上げるように話す必要があります。

pi@raspberrypi:~ $ unzip dictation-kit-v4.4.zip
pi@raspberrypi:~ $ cd dictation-kit-v4.4
pi@raspberrypi:~/dictation-kit-v4.4 $ julius -C main.jconf -C am-gmm.jconf -input mic -nostrip -record /tmp
:
:
:
(だーっと長い出力があって……)
:
:
:
------
### read waveform input
Stat: adin_alsa: device name from ALSADEV: "plughw:0,0"
Stat: capture audio at 16000Hz
Stat: adin_alsa: latency set to 32 msec (chunk = 512 bytes)
Stat: "plughw:0,0": Headset [G433 Gaming Headset] device USB Audio [USB Audio] subdevice #0

recorded to "/tmp/2018.0826.112825.wav" (74112 bytes, 2.32 sec.)
pass1_best:  こんにちは 今日 は い て です 。
pass1_best_wordseq: <s> こんにちは+感動詞 今日+名詞 は+助詞 い+動詞 て+助詞 です+助動詞 </s>
pass1_best_phonemeseq: silB | k o N n i ch i w a | ky o: | w a | i | t e | d e s u | silE
pass1_best_score: -6249.713867
### Recognition: 2nd pass (RL heuristic best-first)
STAT: 00 _default: 42918 generated, 2459 pushed, 535 nodes popped in 230
sentence1:  こんにちは 今日 は いい 天気 です 。
wseq1: <s> こんにちは+感動詞 今日+名詞 は+助詞 いい+形容詞 天気+名詞 です+助動詞 </s>
phseq1: silB | k o N n i ch i w a | ky o: | w a | i: | t e N k i | d e s u | silE
cmscore1: 1.000 0.819 0.412 0.255 0.294 0.277 0.764 1.000
score1: -6235.160645

<<< please speak >>>^C
pi@raspberrypi:~/dictation-kit-v4.4 $

トラブルシューティングとか

GitHubからダウンロードされるファイルは、ところどころ日本語で書かれたものがあるのですが、日本語部分のキャラクタコードはSJISなので、Raspberry pi(UTF-8)では文字化けして読めません。iconvコマンドは、覚えておく必要があると思います。こんな感じですね。

pi@raspberrypi:~/julius $ iconv -f sjis -t utf8 Release-ja.txt | less
4.4.2.1 (2016.12.20)
====================
- AndroidとiOS用の細かい修正
- msvcディレクトリの整理

4.4.2 (2016.09.12)
===================
- dnnconf 内の相対パスをそのdnnconf自身からの相対パスとして扱うよう修正
- DNN使用時、認識処理の第2パスが異常に遅いことがある不具合を修正
- AVX非対応のCPUでDNN計算が動作しない不具合を修正
- ARMとVisualStudioでのビルドを改善

4.4.1 (2016.09.07)
===================
- DNNのSIMD計算の高速化と安定化:SSE命令、FMA命令、ARMのNEON命令を実装
- DNN使用時にCPUを自動チェックして最適なSIMDコードを選択使用するよう拡張
- VisualStudio2013でのコンパイル用に PortAudio と zlib のソースを同梱
- mkbinhmmlistで作ったバイナリHMMListが正しく読めないことがあるバグを修正
- adintool-gui コンパイル時のSDL周りが動かないのを修正
- "INSTALL.txt" に各OSでのビルドのセットアップと実行方法を記述
- pkg-config に対応
- その他バグの修正

juliusコマンドの出力の日本語は、何もしなくてもUTF-8で出力されます。これはおそらくLANG環境変数が設定されているからだと思います。

今後

Juliusの日本語の認識能力は「特定の発言がある」と分かっている場合は、文法ファイルをあらかじめ作っておくことで精度をあげることができるようです。「アレクサ」と言うことがあるとわかっていれば、準備をしておくことで認識しやすくなるわけですね。命令でいろいろRaspberry piを動かすのが目標ですので、文法ファイルの作り方も、おいおい試してみようと思います。

Ergo42という自作キーボードを作りました(組立編1)

前回に引き続き、今回は組み立てに注目して書いてゆきます。写真多めで長くなるので組み立て編も分割します。なお「良い組み立て例」ではないのであしからずご了承ください。エレガントな組み立て例はグーグル他で検索いただくと見つかりますので、そちらも併せてどうぞ。

届いたErgo42キット

f:id:WindVoice:20180601211420j:plain

届いたキットはこんな感じでした。基板、アクリル板、左右をつなぐケーブル、ダイオード、スペーサー、スイッチなど。これらにキースイッチとキーキャップをお好みで買い足せば、準備OKです。

組み立てに必要なもの

組み立てには、電子工作でよく使われる基本的な工具が必要です。はんだごて、こて台、はんだのほか、ダイオードの余分な脚を切るニッパー、小さめのプラスドライバが必須です。

白光 ダイヤル式温度制御はんだこて FX600

白光 ダイヤル式温度制御はんだこて FX600

goot はんだこて台 ST-11

goot はんだこて台 ST-11

goot 電子工作用ハンダ SD-53

goot 電子工作用ハンダ SD-53

あったら良いもの

もしこの記事を読んで初めて挑戦するという方がいたら、はんだ吸い取り線も必須とお伝えしたいです。一度も失敗しなければ不要なのですが、私のような場当たり的なチャレンジャーには必要になるんじゃないかと思います。

他には小さなラジオペンチ、ピンセットもあると何かと便利です。私は持っています。

ダイオードをつける

さて、簡単そうなものからということで、基板にダイオードをつけるところから始めました。ダイオードには取り付け向きがあります。ラジオペンチで脚を曲げて、差し込んで、向きをチェックしてから固定します。私はこちらの記事を見て向きを確認しました。

f:id:WindVoice:20180603163025j:plain

なお、ダイオードは基板の表裏のどちらにも取り付け可能なのですが、ロープロファイルで制作するときには、スイッチの脚が基板に届くよう、ダイオードが基板の厚みを増やさないようにする必要があります。このため実装面が限定(キーボードの裏側に実装する)されます。これは重要なことです(私は深く考えず2枚に基板の同じ側に実装してしまい、左手側のダイオードを全部取り外して付け直すことになりました)。

f:id:WindVoice:20180608231556j:plain
左側がロープロファイルのスイッチ(Kailh ML)。右はCherry MX。

完成時のキーボードの裏側はこんな感じ。左手側(写真右)の基板には、壮絶な戦いの跡が生々しく残されています…… いや、遠目にはそうでもないかな?

f:id:WindVoice:20180627095631j:plain

余談:はんだ付けした部品を取り外すときは

不幸にして、一度はんだ付けしてから間違いに気が付くことがあります。そんな場合、はんだ吸い取り線を使ってはんだを取り除きます。吸い取り線は細い銅線をより合わせたようなメッシュ構造になっていて、溶けたはんだが吸収されるようになっています。銅線とはんだを押し当ててはんだごてで溶かし、吸い取るわけです。

私の場合、吸い取り線を5cmくらいの長さでニッパーで切り、ペンチでつかんで吸い取る場所に押し当て、銅線の上からはんだごてを当てます。銅線はとても熱いので、必ずペンチでつかみます。なお、一度で全てのはんだを吸い取ることが重要です。中途半端に手を放してしまうと、基板の穴の奥にわずかに残ってしまい、銅線が届かず吸い取れなくなってしまいます。

そんな時は迎え塩ならぬ「迎えはんだ」をしましょう。つまりもう一度はんだ付けをしてから、今度こそ全部吸い取るわけです。これでまぁ、だいたいなんとかなります。今回の工作で80ヵ所くらい吸い取った末に身に着けたスキルでした。

余談:脚が折れたら

部品を取り外すときに、ダイオードの脚が折れてしまうことがありました。

f:id:WindVoice:20180610111624j:plain

Ergo42のキットにはダイオードが少し余分に入っているのでそれを使ってもよいのですが、組み立て時にニッパーで切り取った脚がたくさんありますので、継ぎ足して動くようにすることもできます。こんな感じですね。

f:id:WindVoice:20180610111806j:plain

Ergo42という自作キーボードを作りました(時系列編)

自作キーボード Ergo42

ここ2か月ほどの間、少しずつ自作のキーボードを作っていました。

f:id:WindVoice:20180624165704j:plain

これまで、Raspberry piを使ってちょっとした工作をしたりはしていましたが、ちゃんとした実用品を作るのは初めてかもしれません。ざっくり完成までの流れを説明すると、Ergo42という入門(?)キットを購入して、キットに含まれていないパーツは自分好みのものを取り寄せて、それらを組み上げ、ファームウェアを書き込んでできあがり、となります。

Ergo42で検索すると、ネット上にすでに技術者目線での作成レポートを上げている方はいらっしゃるので、私はこの界隈の初心者目線で「いかに沼に足を踏み入れたか」と「好みを反映するためにしたこと」と「ぎゃぁ(失敗も楽しい)」に着目して書いていこうと思っています。長くなるので2回に分けて書きます。

ことの発端は技術書典4(2018/04/22@アキバ・スクエア@け08たのしい人生)

技術書典というイベントがあるということを4回目の開催で初めて知りました。コミケなど同人誌即売会の存在は知っていましたが、私はどちらかというと遠巻きに眺めているタイプで、自分から渦中に飛び込むことはありませんでした。しかし技術書典は技術方面限定のイベントということだったので、気持ちのハードルがぐっと下がり遊びに行くことになりました(過去ブログ)。

ここで入手した自作キーボードの本。1000円。

f:id:WindVoice:20180422142411j:plain

キーボードにこだわりたいという思いは以前からあったけれど、HHKBみたいなギュッとしたのは正直あまり乗り気ではありませんでした。キーが少ないと、使い慣れるまでにそれだけ訓練が求められます。テンキーが分離しているほうが正確に入力できるし、InsertやDeleteキーはその他一般のキーから少し離れたところにあるほうがミスタイプしにくいと思っていました(現在も思っています)。

セキュリティに厳しい職場で働いているので、自前のデバイスを持ち込むことは許可されておらず、会社と自宅でレイアウトが違うキーを使うことになるのも負担に感じていました。だけど、でも、スイッチの指触りにこだわりたい気持ちは、とても、あるのでした。

Ergo42のキーボードキットをBOOTHで購入(2018/05/05)

そんな日々を過ごしていた私に、こんなツイートが飛び込んできました。

思えば、ここが沼の入り口だったのです。「明日から受けつける」という掲示が目に留まりました。理想と比べるとキーの数は少なくて、もやもやする気持ちはあるのですが、単純に入門として作ってみたくなりました。また、こういったところは数が決まっていてほしいときに買わないと次の機会がない(バーゲンセール理論)こともしばしばあるものです。

そんなこんなで背中を押されるようにして勢いで購入しました。9000円。キットには、基板2枚(左手用/右手用)、Pro Micro(ファームウェアを書き込むところ)2枚、ダイオード(60個くらい?)、タクトスイッチ(Pro Microのリセットボタン用)、それから基板を保護してイケてる外観にするためのアクリル板、などが含まれています。キーボードを完成するのに必要なすべてがあるわけではないので、追加の買い物をしていきます。

キースイッチの好みを探す(2018/05/25)

Ergo42のキットには、キースイッチ(個別のキーの土台の部分にあって、押されたら電気が通るスイッチ)が含まれていません。ついでにいうとキーキャップ(スイッチの上にかぶせるもので、指が触れる部分)もありません。ここは人により好みが大きく分かれるところです。Ergo42は幅広いキースイッチを分け隔てなく(たぶん)取り付けられるように設計されており、つまり「このへんは各自お好みで選んでね」という製作者の意図が現れているわけです。

1980年代のMSX2の時代からいろんなキーボードを触ってきた私ですが、なんとなく自分の好みはカチカチ音がするメカニカルスイッチだなと思っていました。今回、キースイッチの感触にこだわりたかったので、まずは9ボタンのサンプルをAmazonで購入。このときスイッチ引き抜き工具も併せて購入しました。このサンプルスイッチ、自作キーボーダーでなくても、手遊びのためにデスクサイドに置いておくのをお勧めします。ちょっとストレス発散になるかも。

入手してから、これはCherry MXという種類のスイッチだということを認識しました。「メカニカルキーボード」はどれもカチカチいうものだと思っていたのですが、必ずしもそうではないということもわかりました。メカニカルというのはバネとスイッチがキーひとつひとつについているものの総称のようです(注:そうでないものがあるのか?と思われるかもしれませんが、お求めやすい量産キーボードでは、大きな一枚のゴム膜のようなものでキーの弾力感を実装していて、バネはありません。すべてのキーを一枚の膜で面倒みたりしています。メンブレン式と呼ばれているらしいです)。カチカチ言わなくても、メカニカルキーボードと呼ぶ場合があるということですね。

購入したサンプルでは、一定の重さでスッと押せる感触(リニア)のものもあるし、私が想像していたカチカチ鳴るもの(クリッキー)とか他にもタクタイルとか、押す感触ごとに呼び名が付いています。メーカーのWebページを見にゆくと、押し込みの強さを分析したグラフも掲示されていたりします。その界隈でだけ使われる用語を覚え始めると、ますます好奇心が湧いてきたりするものです。そういうタイプの人が、沼にはまるわけですが……

Cherry MXのスイッチはカチカチいうところは気持ち良くてOKだけれど、トラベル(押し込みの深さ)が少し長く感じられました。トラベルが短いものはロープロファイル(もともとは「場所を取らない」的な意味ですが)と呼ばれているそうです。また、押し込み圧はあまり重すぎないほうが疲れなさそうだ、という感想も持ちました。Cherry社にはCherry MLというロープロファイルのキースイッチシリーズもあるのですが、この辺りになって、キースイッチはほかのメーカーも作っているのだということに気が付きました。どうやら、かつてCherry社はこのあたりで特許を持っていたらしいのですが、それが期限切れになったあと、他の会社が類似品を製造するようになっているそうです。

これらもろもろの事情を含めて、ロープロファイルのキースイッチを試してみることにしました。

ロープロファイルのキースイッチの好みを探す(2018/05/27)

キースイッチを作っている会社に、Kailh(カイラー?)社というところがあります。そもそもキースイッチを個人向けにばら売りしている、という事実も初めて知ったのですが、その界隈の人たちはアリババで買ったりするらしいです。アリババはもちろん知っていたのですが、中国の人が利用するAmazonというくらいにしか思っていませんでした。自分の手の届くところにあるものだったとは。いずれ使ってみようと思います。

ひとまず、今回は米国のNovelKeysというところで、ロープロファイルのスイッチのサンプルセットを注文しました(2018/05/27:承認05/30:出荷06/08)。 Kailh MLのサンプル8種類セット($24.89)を選びました。手元に届くまで結構時間がかかり、実際に触れたのは2週間ちょっとあとでした。想像していたとおり、ロープロファイルのほうが手が疲れないようです。カチカチいうスイッチで、比較的軽いものを選んで、Kailh ML(白軸)を採用することにしました。

f:id:WindVoice:20180608225116j:plain

最終的な材料調達(2018/06/09)

NovelKeysから届くまでの間に少しずつ情報収集を進めると、国内でも遊舎工房というところでKailh MLとこれに適合したキーキャップを取り扱っていることを知り、今回はこちらから必要なものを購入しました。キースイッチとキーキャップはお互いに合った形状のものを選ばなけれはいけません。キースイッチ2260円/60個。キーキャップ3000円/104キーボード用。あとから追加で無地キーキャップも購入1296円/30個。これでキーボードの材料になるものはひととおりそろいました。遊舎工房さんは、注文して数日で届くのでお手軽です。

f:id:WindVoice:20180626204257j:plain

まとめ

今回は買い物編ということで、実際の組み立て前の計画とテストと調達について書いてみました。ただ買うだけなら正直高い買い物です。でもあれこれ調べる途中で知ることとか、初めてやってみることから得られる経験は有益だし楽しいものです。ご興味を持つかたがいらっしゃったら、沼においでよ!ということで、この界隈の人たちが集まっている場所をご紹介して今回は終了です。

DiscardのSelf-Made Keyboards in Japan
discord.gg

キースイッチのサンプル

先日、技術書典4で自作キーボードに関する情報を手に入れたので、自分も試してみたくなりました。いろいろ探していたところ、こんなものを見つけたので入手しました。

f:id:WindVoice:20180603102712j:plain

自作のキーボードを作るときには、自分好みのキースイッチ(ひとつのキーが押されたことを検出するスイッチ)と、キーキャップ(キーの指が触れる部分)を探し当てることがまず第一歩です。好みの大きく分かれる部分でもありますし、ミスタイプを減らす効果もありそうですし、カチカチ言うのが好きなひと(=私)も周りの人にうるさく思われているのではないか、と気になったりもします。ほどほどの良いものを見つけたいところです。

PCショップに行くと、キーボードが多数並んでいて試したりもできるのですが、店頭の商品はどんなスイッチが使われているのかわからないですし、店頭で触るのと自宅でリラックスして触るのとではまたちょっと印象が違ったりもします。写真の商品は、9種類のキースイッチを試すことができるサンプルセットになっていて、落ち着いて好きなだけ触ることができます。キースイッチを固定するアクリルの台座と、半透明のキーキャップがセットになっています。

セットになっているキースイッチは、この界隈では大手企業のCherry社のもので、Cherry MXという種類です。キーを押し込む距離(Travel)が比較的長い(4mm程度)タイプのキーボードで使われています。

f:id:WindVoice:20180603105457j:plain

というわけでデスク上にこれを放置しておいて折に触れてカチカチやっていたわけですが、結論としては押し込み距離が短い(ロープロファイル)のがいいなぁと、9個もあるキースイッチのどれもイマイチ、という感想になってしまいました。Cherry社にはCherry MLというロープロファイルスイッチもありますので、そちらも試してみたいと思っています。

雑談:巻き爪ロボ

変わったものが目に留まったので…… 巻き爪修正ツールというのがあるんですね。
youtu.be

ブラTube(?)していてふと立ち止まっただけなのですが、器具で矯正しつつ、お湯につけて爪を柔らかくして、十分に巻き爪が開いたところでドライヤーで乾かすと、巻き爪が改善されるという代物だそうです。

なんといいますか、実際に使っているところを見ると確かにそれは効くだろうなぁと思うわけですが、売っているんですねこんなものも。

Winows 10でPython3とPython2を共存させる

趣味ではPythonをちょくちょく使うのですが、いつも悩むのがPython2と3の共存です。printからして2と3では書き方が違って文法エラーになりますから、いつも意識していなくてはなりません(といいつつ、実行できなくなってから気が付いたりして)。

今日もちょっと遊ぼうと思ってGoogle Search Console Appを試していたら、これ、Python2のサンプルコードなんですね。そこでこれらを共存させる方法を使うことにしました。備忘録的に書き残しておきます。

Python 2とPython 3の共存

Microsoft Windows [Version 10.0.16299.371]
(c) 2017 Microsoft Corporation. All rights reserved.

C:\Users\windv>py -3
Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> ^Z


C:\Users\windv>py -2
Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> ^Z

C:\Users\windv>

pipなども、py -2 -m pip ... のような書き方でそれぞれパッケージのインストール先を変えられるようです。

技術書典4、行ってきました

技術書典4というイベントが秋葉原UDXで開催されると聞いたので、行ってきました。
f:id:WindVoice:20180422101007j:plain

技術書限定の同人誌即売会です。ヘンテコな趣味(誉め言葉)を持った人たちが集まるに違いなく、また相当混雑すると思ったので、11時開場のところ、9時半ほどに現地到着しました。しかし、すでに人が集まってきており、サークル参加の方が並び始めたところという感じでした。10時には一般参加者も行列して整理券配布、私は上記の写真の通り整理券118番をゲットしました。

私はコミケのようなマンガ・アニメ主体のイベントには行ったことがなく、運営スタッフのかたは行列の捌きに慣れているなぁという印象でみていました。運営さんの発表によれば、今回は6380人の方が来たそうです。前回の倍くらい?の参加者だったようで、大変だったでしょうね…… お疲れさまでした。

twitter.com

さて、第二陣として入場することができた私は、売り切れにがっくりすることもなく、11冊入手することに成功しました。ところで、ヘンテコな趣味(誉め言葉)をもっているだけでなく書籍を作るノウハウまで持っている皆さんはどういう修行を積んでいらっしゃるのでしょう。尊敬の念を込めていくつかご紹介します。

自作キーボード

まずその①。自作キーボードの方。帰宅してまずはこれを読みました。もちろん中身が大事ですが、キャッチーな表紙はそそられますね。装丁もデザインも商業誌のようです。歩いていて目を惹かれました。
biacco42.hatenablog.com
f:id:WindVoice:20180422142411j:plain

Raspberry piのあれこれをちょっと作ってみたりしている私ですが、仕事はソフトウェア系なんです。しかし、ソフトウェアのなかでは低レベル処理が好きな性質なので、こういったものは心惹かれます。『自作キーボード』ってどのレベルで?という疑問が手を伸ばしたきっかけでした。読んでみると、個別のパーツ自体は入手可能なもののようです。3Dプリントとかしなくてもいいのか…… ファームウェアオープンソースを入手してカスタマイズ、のレベルで良いとか。う~ん、これはなかなか…… 手を(足を?)伸ばせば届きそうな危険な沼の予感がします。

なお、新刊(2018 APRIL)も買いました。ARMベースの自作キーボードということですが、私が手を出すならこちらのほうが簡単…… なのかなぁ。

将棋AI

その②「ディープラーニングを使った将棋AIの作り方」のかた。コンピュータ将棋選手権の放送を一日中眺めていた私は通りすがりで目に留まったこの本を買いました。2冊。
tadaoyamaoka.hatenablog.com
コンピュータ将棋界隈では、まだディープラーニングを本格的に使って大成功した例はなく、山本一成さんが試みたくらい(あとGoogleができたと主張しているものくらい)というのが私の認識です。興味を持って購入しましたが、将棋の本なのに(?)ぱらぱらめくっても文字が多く歯ごたえがありそうです。今日は精神力不足なのでゴールデンウィークくらいに第28回世界コンピュータ将棋選手権を見ながら読む…… かもしれません。

SkypeBot

その③Bot系のかた。
dakaradame.hateblo.jp

Rasiperry piでTwitter Botを作った私としては、ちょっと興味が出て買いました。会社では、どうしたわけかSkypeで…… LINEで…… という話題にはなってもTwitterで…… という話題はでないのです。なぜなんだ。みんなクローズドなコミュニケーションをしたいのでしょうか。
f:id:WindVoice:20180422201429j:plain

内容はSkypeとAzureを使ってBotを作るもの。動き出して基本的な受け答えをするところまでの内容です。Botって、キャラに性格が感じられるところまで作りこむのをどうしたらよいのかわからず手が止まっています。プログラミングの問題じゃなくてアイディアの問題なんでしょうかね。

ほか

ほかにもいくつも買ったものがあるのですが、まだ中身を見ていないので次の機会に書くかもしれません。聞いたことのない技術的なキーワードが目に留まるこういったイベントはモチベーションがあがっていいですね!また次の機会も参加したいと思いました。