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のインストールからやり直しました。
ところで、スイッチサイエンスさんの調査で、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ポートが一個で間に合うのはちょっと便利かな。
G433 7.1 WIRED SURROUND GAMING HEADSET (BLACK)
- 出版社/メーカー: Logitech
- メディア: Personal Computers
- この商品を含むブログを見る
接続したら、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を動かすのが目標ですので、文法ファイルの作り方も、おいおい試してみようと思います。
技術書典4、行ってきました
技術書典4というイベントが秋葉原UDXで開催されると聞いたので、行ってきました。
技術書限定の同人誌即売会です。ヘンテコな趣味(誉め言葉)を持った人たちが集まるに違いなく、また相当混雑すると思ったので、11時開場のところ、9時半ほどに現地到着しました。しかし、すでに人が集まってきており、サークル参加の方が並び始めたところという感じでした。10時には一般参加者も行列して整理券配布、私は上記の写真の通り整理券118番をゲットしました。
私はコミケのようなマンガ・アニメ主体のイベントには行ったことがなく、運営スタッフのかたは行列の捌きに慣れているなぁという印象でみていました。運営さんの発表によれば、今回は6380人の方が来たそうです。前回の倍くらい?の参加者だったようで、大変だったでしょうね…… お疲れさまでした。
twitter.comただいまを持ちまして、 #技術書典4 閉幕しました!今回の総参加者数は6380人でした。
— 技術書典公式アカウント (@techbookfest) 2018年4月22日
皆さんご来場ありがとうございました。
さて、第二陣として入場することができた私は、売り切れにがっくりすることもなく、11冊入手することに成功しました。ところで、ヘンテコな趣味(誉め言葉)をもっているだけでなく書籍を作るノウハウまで持っている皆さんはどういう修行を積んでいらっしゃるのでしょう。尊敬の念を込めていくつかご紹介します。
自作キーボード
まずその①。自作キーボードの方。帰宅してまずはこれを読みました。もちろん中身が大事ですが、キャッチーな表紙はそそられますね。装丁もデザインも商業誌のようです。歩いていて目を惹かれました。
biacco42.hatenablog.com
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で…… という話題はでないのです。なぜなんだ。みんなクローズドなコミュニケーションをしたいのでしょうか。
内容はSkypeとAzureを使ってBotを作るもの。動き出して基本的な受け答えをするところまでの内容です。Botって、キャラに性格が感じられるところまで作りこむのをどうしたらよいのかわからず手が止まっています。プログラミングの問題じゃなくてアイディアの問題なんでしょうかね。
ほか
ほかにもいくつも買ったものがあるのですが、まだ中身を見ていないので次の機会に書くかもしれません。聞いたことのない技術的なキーワードが目に留まるこういったイベントはモチベーションがあがっていいですね!また次の機会も参加したいと思いました。
Raspberry pi 3のバックアップ再び(rpi-clone)
以前バックアップについては一度書きましたが、以前のエントリでは、microSDカードを抜いてPCでバックアップを取る方法でした。今回はRaspberry piを起動したままで取得することを試みます。
準備
今回のバックアップはmicroSDカードに取得します。以前書いた方法はPCにファイルの形でとることができるので、場合によってはこちらのほうが便利かもしれません。SDカードを交換して簡単に環境を入れ替えたい場合は今回の方法がよさそうです。まずは安いSDカードとUSB-microSDカードリーダを入手しました。どっちも安いです。
I-O DATA microSDHCカード 32GB Class10対応 防水モデル SDカード変換アダプター付 EX-MSDC10/32G
- 出版社/メーカー: アイ・オー・データ
- 発売日: 2016/07/28
- メディア: Personal Computers
- この商品を含むブログを見る
iBUFFALO カードリーダー/ライター microSD対応 超コンパクト ブラック 【PlayStation4,PS4 動作確認済】BSCRMSDCBK
- 出版社/メーカー: バッファロー
- 発売日: 2008/12/01
- メディア: Personal Computers
- 購入: 12人 クリック: 162回
- この商品を含むブログ (25件) を見る
rpi-cloneのインストール
インストールというほどのことはないですが…… GitHubにソースがあるのでcloneしました。
シェルスクリプトで、作者の方によれば/usr/local/binにコピーする説明となっています。
pi@raspberrypi:~ $ git clone https://github.com/billw2/rpi-clone.git Cloning into 'rpi-clone'... remote: Counting objects: 58, done. remote: Total 58 (delta 0), reused 0 (delta 0), pack-reused 58 Unpacking objects: 100% (58/58), done. Checking connectivity... done. pi@raspberrypi:~ $ cd rpi-clone/ pi@raspberrypi:~/rpi-clone $ ls README.md rpi-clone pi@raspberrypi:~/rpi-clone $ sudo cp rpi-clone /usr/local/sbin pi@raspberrypi:~/rpi-clone $ type rpi-clone rpi-clone は /usr/local/sbin/rpi-clone です pi@raspberrypi:~/rpi-clone $
USBメモリとして認識させる
実はここでしばらくうまくいかなくて悩みました。ネットを探しても、みんなすんなり認識しているのですが、なぜか私のmicroSDカードは認識しない…… 結局カードリーダにしっかりカードがささっていなくて認識していなかったようです。このカードリーダ、ちゃんと差し込まれていなくても青いLEDが点灯するので怪しいと思いませんでした。最終的には/dev/sdbとして認識しました。
pi@raspberrypi:/dev $ sudo lsusb Bus 001 Device 009: ID 0bda:0109 Realtek Semiconductor Corp.★ Bus 001 Device 004: ID 174c:1153 ASMedia Technology 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. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub pi@raspberrypi:/dev $ sudo fdisk -l Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes ... Disk /dev/sdb: 28.8 GiB, 30945574912 bytes, 60440576 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x00000000 Device Boot Start End Sectors Size Id Type /dev/sdb1 8192 60440575 60432384 28.8G c W95 FAT32 (LBA) pi@raspberrypi:/dev $
rpi-cloneでコピー
コマンドにバックアップ先のmicroSDカードのデバイス名(sdb)を指定します。SDカードは最初FATでフォーマットされているので、そのままではバックアップできません。パーティションから作り直しになるので、--force-initializeオプションを指定しました。あとはひたすら、ひたすら待ちます。忍耐です。なお、バックアップ中はrootファイルシステムの変更があるのは良くないと思われます。コピーしたカードから正常に起動できない可能性がでてくるからです。信頼性の高さが求められるような状況では使わないほうがいいかもね。
pi@raspberrypi:~/rpi-clone $ sudo rpi-clone sdb --force-initialize Forcing a partition initialization of destination disk sdb The existing destination disk 'sdb' partitions are: Disk /dev/sdb: 30946MB Partition Table: msdos Number Start End Size Type File system Flags 1 4.19MB 30946MB 30941MB primary fat32 lba *** All data on destination disk sdb will be overwritten! *** Do you want to initialize the destination disk /dev/sdb? (yes/no): yes Imaging the partition structure, copying 1181 megabytes... 1181+0 レコード入力 1181+0 レコード出力 1238368256 バイト (1.2 GB) コピーされました、 140.037 秒、 8.8 MB/秒 Running fsck on /dev/sdb1... Sizing partition 2 (root partition) to use all SD card space... mke2fs 1.42.12 (29-Aug-2014) Found a dos partition table in /dev/sdb2 Creating filesystem with 7268695 4k blocks and 1818624 inodes Filesystem UUID: 01ad2d41-0ad0-4b22-a402-d4bc93355317 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done /dev/sdb is initialized and resized. Its partitions are: Disk /dev/sdb: 30946MB Partition Table: msdos Number Start End Size Type File system Flags 1 4.19MB 1173MB 1169MB primary fat32 lba 2 1173MB 30946MB 29773MB primary ext4 e2label: Attempt to read block from filesystem resulted in short read while trying to open /dev/mmcblk0p2 Couldn't find valid filesystem superblock. Your booted /dev/mmcblk0p2 rootfs existing label: You may enter a label for the destination rootfs /dev/sdb2: bkuppi ======== Clone Summary ======== Clone mode : rsync all files to sdb root file system Clone destination disk : sdb Clone destination rootfs : /dev/sdb2 (bkuppi) on /mnt/clone Clone destination bootfs : /dev/sdb1 on /mnt/clone/boot Verbose mode : off =============================== Final check, is it Ok to proceed with the clone (yes/no)?: yes => Mounting /dev/sdb2 (bkuppi) on /mnt/clone => Mounting /dev/sdb1 on /mnt/clone/boot =============================== Starting the filesystem rsync to sdb (This may take several minutes)... *** Done with clone to /dev/sdb *** Started: 09:58:10 Finished: 12:13:47 Hit Enter when ready to unmount the /dev/sdb partitions...unmounting /mnt/clone/boot unmounting /mnt/clone =============================== pi@raspberrypi:~/rpi-clone $
最後に
コピーには時間がかかります。大きいことはいいことだ、ということで32GBのカードを使っているのですが、コピーに2時間15分かかりました。忍耐です。終わるまでひたすら忍耐です。
Raspberry pi 3 + USB HDD(6TB)でNASを作る
しばらく間が空いてしまいました。
最近は買い物する度にここでネタにしていますが、今回は自宅用のNASを作ろうという話です。
NASは別に自分で作らなくても、買うことができます。ただ結構お値段がするんですよね。RAIDを組むことができたりする利点はありますし機能に応じて値段も大きく変わるのですが、安くて数万円(HDDは別で)というところじゃないでしょうか。自宅用の軽い用途のものなので、本格的なストレージがほしいわけでもありませんし。Windows PCやRaspiやSurfaceなどいろいろ使うようになるにつれてファイルサーバの必要性が高まってきました。
で、今回もなるべく安く(できればHDDの値段に近いくらいの予算で)、低機能でもいいから…… ということで探しました。
もともと、NASの本体には組み込みのLinuxが入っていたりします。もちろんファイルサーバとしてふさわしいチューニングがされていたりもするのでしょうけど、Raspberry piがあるのですから自分で作ってもいいんじゃないかな。少しだけDIYしている感じですね。
買い物
今回の買い物のキモはこちら。SATAのHDDをUSB3.0に変換するケーブルです。Raspberry pi 3はUSB3.0ではありませんが、しかし互換性があるのであってもこまらないということでこちらにしました。電源アダプタがついているのでRaspberry piの動作が不安定になることもありません。
サンワサプライ SATA-USB3.0変換ケーブル 0.8m USB-CVIDE3
- 出版社/メーカー: サンワサプライ
- メディア: Personal Computers
- 購入: 7人 クリック: 10回
- この商品を含むブログを見る
HDDとしては、Western DigitalのNAS用HDD(Red)です。消費電力が少なめで常時起動に向いているタイプだそうです。容量は正直なところ6TBもいらないのですが、容量単価を計算するとこのあたりが魅力的なのかなということで選択しています。今回は26,000円ほど。
WD HDD 内蔵ハードディスク 3.5インチ 6TB WD Red WD60EFRX SATA3.0 5400rpm 64MB 3年保証
- 出版社/メーカー: Western Digital
- 発売日: 2014/08/01
- メディア: Personal Computers
- この商品を含むブログ (3件) を見る
3.5インチのHDDを常時裸のままで放置しておくのもさすがにいかがなものかと思いましたので、ケースというかカバーも用意しました。シリコーンでできた柔らかいカバーです。なんと464円。買った時点では裸よりはマシというくらいの期待でした。放熱とかどうなのかなと思いましたが、今回使ってみて、書き込み続けてもさほど熱くならないのでWD Redとの組み合わせなら大丈夫そうです。
グリーンハウス 3.5インチHD用シリコンケース ホワイト GH-CA-HD35W
- 出版社/メーカー: グリーンハウス
- 発売日: 2007/06/20
- メディア: Personal Computers
- クリック: 5回
- この商品を含むブログ (1件) を見る
組み立て
説明無用かと思います。直感的につなぐだけ。アダプタをコンセントにつないだら、本体のスイッチをONにするとHDDの電源が入ります。
試行錯誤
NASに入れたいファイルは、WindowsのPCにあります。ざっと計ったら1.5TB。ネットで見かけた物とか動画なども捨てずにダウンロードしてため続けているのでファイルも小さいのや大きいのやさまざまです。ともかく、最初は単純にSambaとext4で…… と思って作り始めました。
USB接続すると、普通に/dev/sdaとして認識しました。
この時点ではディスクラベルも記録されていないまっさらなHDDです。
pi@pi3:~$ sudo fdisk -l /dev/sda Disk /dev/sda: 5.5 TiB, 6001175126016 bytes, 11721045168 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes pi@pi3:~$
fdiskは2TBまでのストレージしか扱えないそうで、最近はGPTというディスクラベルが使えるGNU Partedを使うんだそうです。ネットで探してパーティションを作ります。下の記録では無くなってしまっていますが、実際にはmklabelしてからmkpartでパーティションを作っています。
pi@pi3:~$ sudo parted /dev/sda GNU Parted 3.2 Using /dev/sda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mkpart Partition name? []? File system type? [ext2]? ext4 Start? 0G End? 6001G (parted) p Model: ASMT 2115 (scsi) Disk /dev/sda: 6001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 6001GB 6001GB ext4 (parted) q Information: You may need to update /etc/fstab. pi@pi3:~$
で、そのあとはext4でフォーマットです。さらに/smbディレクトリに自動でマウントされるように設定します。
pi@pi3:~$ sudo mkfs.ext4 /dev/sda mke2fs 1.42.12 (29-Aug-2014) Found a gpt partition table in /dev/sda Proceed anyway? (y,n) y Creating filesystem with 1465130646 4k blocks and 183144448 inodes Filesystem UUID: 72fa8af4-ea42-4319-9987-3e0be3cf542d Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848, 512000000, 550731776, 644972544 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done pi@pi3:~$ sudo mount -t ext4 /dev/sda /smb/ pi@pi3:~$ df -h ファイルシス サイズ 使用 残り 使用% マウント位置 /dev/root 28G 5.9G 21G 23% / devtmpfs 459M 0 459M 0% /dev tmpfs 463M 0 463M 0% /dev/shm tmpfs 463M 6.6M 457M 2% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 463M 0 463M 0% /sys/fs/cgroup /dev/mmcblk0p6 63M 21M 43M 33% /boot tmpfs 93M 0 93M 0% /run/user/1000 /dev/mmcblk0p5 30M 398K 28M 2% /media/pi/SETTINGS /dev/sda 5.5T 58M 5.2T 1% /smb pi@pi3:~$ pi@pi3:~$ sudo vi /etc/fstab pi@pi3:~$ cat /etc/fstab proc /proc proc defaults 0 0 /dev/mmcblk0p6 /boot vfat defaults 0 2 /dev/mmcblk0p7 / ext4 defaults,noatime 0 1 /dev/sda /smb ext4 defaults 0 0 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that pi@pi3:~$ sudo chown pi /smb
NASにするためにSambaを設定するわけですが、いつもここで躓きます。何が正しい設定かわからん……
試行錯誤の結果、とりあえず/etc/samba/smb.confはこんな風にして動いています。PCのWindVoiceユーザが/smbディレクトリにアクセスするとき\\pi3\nasというネットワークフォルダ名に見えます。アクセスするときはRaspberry piの内部ではpiユーザの権限で読み書きされます。ですから/smbディレクトリはpiユーザの所有権にしておくことが必要です。
[nas] comment = NAS Directories path = /smb browseable = yes read only = no valid user = WindVoice force user = pi public = yes
結果
ここまでで一応使えるようになるのですが、心配はしていたのですがやっぱり遅いですね。
Wi-Fiネットワークのせいなのか、USB2.0のせいなのかはっきりしませんが、書き込み速度が1.5MB/sec程度になっています。先ほども書いたのですが、ファイルはなんだかんだで1.5TBもあり(それを何とかしろということだとは重々承知しているのですが)、1.5MB/secでコピーしていては12日もかかってしまいます。これで動画読み取りとかできるのでしょうか……
しかたないので、上記の方法はいったん諦め、Windows PCにUSB3.0接続してNTFSフォーマットしたあと、ファイルをコピーしています。USB3.0接続なら大きいファイルの場合で50MB/Secから最大70MB/Sec程度の速度がでているので、今日のうちにはコピーが終わりそうです。
最近はLinuxでもNTFSがスムーズに使えるので、コピーが終わってからRaspberry piに接続してNASにしようと思います。便利な使い方はもう少し追求しないといけませんね。
Smart Video Car Kit for Raspberry pi(消費電力が測れない編)
引き続きSmart Video Carをいじって遊びます。
もうちょっとスマートにコントロールしたい
前回の最後にスクリーンショットを載せましたが、Smart Video Carの操作はなんといいますか、「簡易な」という表現がぴったりの見た目です。現代的なゲーム世代には到底受け入れられそうにありません。マウスでボタンをクリックして操作するということは、一度に一つの操作しかできないという意味でもあります。非常にプリミティブな前進、後退、ハンドルを右に、左に、上向け、下向け…… など、ひとつひとつやるのでは眠くなってしまいます。
このあたりソースコードではどうなっているのかなということで調べました。
まずはWindowsから直接コントロールしよう
コントローラの役をしているクライアントプログラムは、Pythonで動いています。Raspberry piとTCP接続して、前進、後退などのコマンドを送るという単純な仕組みで動作しています。Windows版のPythonをインストールしてWindows PCにもSunFounderのGitHubサイトからソースコードをダウンロードしておけばOKです。Surfaceなので64bit版をインストールです。
あとはRaspberry piでサーバプログラムを起動して、Windows PCからクライアントプログラム(接続先IPはRaspberry piに変更)を起動すれば、GUIがWindows上に表示されます。
マウスではなくキーボードでコントロール
マウスのコントロールより少し便利にキーボードで操作したいわけですが、ソースコードをよく見たらもうWASDでの操作には対応していました。でもカメラの向きを操作するキーはバインドされていなかったので、この部分だけ追記しています。
ゲームコントローラで操作しようとするともう少し工夫が必要だと思いますが、とりあえずこれだけなら簡単でした。というかソースコード短いですね。ほとんど見たまんまのことしか書いていないというか……
# ============================================================================= # Bind buttons on the keyboard with the corresponding callback function to # control the car remotely with the keyboard. # ============================================================================= top.bind('<KeyPress-a>', left_fun) # Press down key 'A' on the keyboard and the car will turn left. top.bind('<KeyPress-d>', right_fun) top.bind('<KeyPress-s>', backward_fun) top.bind('<KeyPress-w>', forward_fun) top.bind('<KeyPress-h>', home_fun) top.bind('<KeyRelease-a>', home_fun) # Release key 'A' and the car will turn back. top.bind('<KeyRelease-d>', home_fun) top.bind('<KeyRelease-s>', stop_fun) top.bind('<KeyRelease-w>', stop_fun) # ちょっとした改良。ikjlキーでカメラの向きを変更 top.bind('<KeyPress-i>', y_increase) top.bind('<KeyPress-k>', y_decrease) top.bind('<KeyPress-j>', x_decrease) top.bind('<KeyPress-l>', x_increase)
消費電力はどうなのか?
Raspberry piは消費電力が少ないことがひとつのウリなわけですが、追加のボードを使ったりDCモーターを2個つけたりしていますから、消費電力が大きくなっているはずです。これを測りたいのですがよい方法がありません。以前購入したUSB電流/電圧計で測ってみましたが、この場所ではモーターの消費電力はふくまれていませんでした。モーターを回しても数字はほとんど変わりません。4.99V - 0.28Aですから、だいたい1.4Wくらいの消費電力になりますね。
SunFounder(サンファウンダー)スマートビデオカーキット [並行輸入品]
- 出版社/メーカー: SunFounder(サンファウンダー)
- メディア: エレクトロニクス
- この商品を含むブログを見る
Smart Video Car Kit for Raspberry pi(試験走行編)
さて、前回の組み立てから間が開いてしまいました。試験走行の様子です。
インストール
メーカーであるSunFounderから、動かすためのプログラムが提供されています。これを搭載したRaspberry piに配置(git clone)しておくのが最初のポイントになります。
git clone https://github.com/sunfounder/Sunfounder_Smart_Video_Car_Kit_for_RaspberryPi.git
モータドライバ他との接続でRaspberry piのI2Cポートを使用していますので、raspi-configコマンドでポートを有効にしたり、/boot/config.txtを変更したりします。このあたりは解説の小冊子がついていますので(英語ですが)、コマンドラインをそのまま入力していけば準備ができると思います。
ほかにカメラの映像をストリーミング配信するためのMJPG-streamerをインストールしたりなどしてゆきます。
カリブレーション(調整)
サーボモータの初期の状態がとても重要です。くみ上げの段階で、サーボモータがちょうど首振りの真ん中になるようにしているのですが、プログラムも初期配置の状態を記憶しておかなくてはなりません。
カリブレーションのためのプログラムもGitHubに含まれています。Raspberry piのIPアドレスだけちょっと書き換えて動かせばOKです。Raspberry piにリモートデスクトップ接続して、このプログラムを起動すると、簡易的なGUIが起動します。
なんかよくわからない画面ですが(笑)、とりあえずこれで車が前後に正しく走るか(ケーブルの接続を間違えているとモーターが片方逆回転になったりなどするかも)、左右にタイヤが振れるか、カメラの首振りが正常かを確認します。うまくいったところでConfirmボタンです。
いざ出発
プログラムは、サーバプログラム(DCモータ、サーボモータ、カメラを制御する)と、クライアントプログラム(サーバへ動作コマンドを送信する)に分かれます。クライアントプログラムはGUIを使うので、リモートデスクトップ環境から起動する必要があります。
またストリーミングサーバプログラムも別に起動することができ、車載カメラ視点の映像をFirefoxから(なぜかIE非対応)参照することができます。
こんな感じで車をリモコン操作して楽しむ…… というのが、とりあえずデフォルトの機能でできる部分です。動作している状態の動画はこちら。
今後の展開
正直なところ低機能です。工作キットですから、ここから各自でいろいろ試してみてね、というのがメーカーの意図なんだろうと思います。プログラムはPythonでできていますから読むことができますし、GUIのボタンをポチポチ押しながら動かすちょっとイケてない感じも、それが嫌なら自分で開発しよう、ということなんだろうと前向きに解釈するのがよいでしょう。
やってみたらいいかも、というToDoを挙げておきます。
- クライアントプログラムはWindows PCにおいておく(難易度:低)
- 車の操作をゲームコントローラに対応させる(難易度:中)
- カメラに映ったものを識別する(難易度:高)
- さらに自動走行までできちゃったりする(難易度:超高)
- DCモーターを換装してパワフルにする(もしかすると電源強化が必要かも)
SunFounder(サンファウンダー)スマートビデオカーキット [並行輸入品]
- 出版社/メーカー: SunFounder(サンファウンダー)
- メディア: エレクトロニクス
- この商品を含むブログを見る
Smart Video Car Kit for Raspberry pi(組み立て編)
車体の組み立て
基本的には、アクリル板のボディにパーツを搭載してゆく手順です。
前輪がサーボモータSG90で左右に振れることで曲がれるようになっています。アクリル板は左右対称ではないので注意が必要です。気がつかずに裏表逆のまま組み立ててしまい一度分解することになりました。
後輪はDCモータ2個とギアがセットになっています。モータはそれほどパワーのある感じではありません。スピード感のある走りを期待していたのですが……
車体の前後を合体させて電池ボックスをつけました。青のリボンはあとで電池を抜きやすくするためのひもです。
フロントカメラの組み立て
USBカメラが付属しており、これを車の眼にすることができます。カメラの上下角度、左右角度を変えるためのサーボモータSG90が2個付いておりこれを組み立てます。
こんなのと……
こんなのを組み合わせて……
こうなります。
車体と結合してこんな結果になります。
電子部品の組み立て
ここまできてやっとRaspberry pi 2を搭載です。古くなってちょっとサビてきていますが。
PWMドライバ(これはサーボモータSG90の制御で使います)、電源モジュール、L298N DCモータドライバを搭載します。
念のため注:PWMドライバモジュールは上下逆につけてしまっています。あとで直しました。
ボード類が載ったらケーブルをつないでいきます。ハンダごてはいりません。ドライバを使って締めて固定する部品があります。
カメラやWi-Fiアンテナを接続して組み立て完成です。ここまでくるのに約4時間かかりました。
次回は電池(18650 3.7V リチウムイオン充電池)を2本セットして動作確認です。
SunFounder(サンファウンダー)スマートビデオカーキット [並行輸入品]
- 出版社/メーカー: SunFounder(サンファウンダー)
- メディア: エレクトロニクス
- この商品を含むブログを見る