気の向くままに辿るIT/ICT/IoT
システム開発

自作スマートスピーカー機能をPC/Debianにも実装

ホーム前へ次へ
*BSD/PC-UNIX/Linuxって?

自作スマートスピーカー機能をPC/Debianにも実装

自作スマートスピーカー機能をPC/Debianにも実装

2018/12/22

 以前、作って運用しつつもブラッシュアップ中のRaspberry Pi 3 Model B+JuliusOpen JTalkベースの自作スマートスピーカーがあります。

 主な機能は、

 買ってまでは要らないと思いつつ、作るのは楽しそう、でも、何れにせよ、クラウドにはちょっと抵抗が、あんまり変わらないけどWeb APIならいっかなと作り始めてみたら、結構便利でパソコンにもスマートスピーカー機能を入れてみた話。

ノートパソコンにも自作スマートスピーカー機能を入れてみた

 ラズパイスマートスピーカーとは、起動ワードを変えてメインのノートPC/OS Debian Stretch 64bit(amd64)にも自作スマートスピーカー機能を入れてみることにしました。

 というか、開発段階はノートを使っていた為、環境はありますが、最新機能を反映させ、マイク(マイク内蔵Webカメラで代用)のみ追加、一連の機能を利用できるようにしました。

 そういえば、こうやってパソコンやラズパイさえあれば、環境をコピーして、ちょっと整える程度で、いくらでも水平展開できることこそ、自作スマートスピーカーの最大のメリットかもと思ってみたり。

 違いますね、Alexaなどもラズパイから操作できるわけで、それを言うなら、Linuxならでは、ですかね。

 うん、よい感じ、そろそろ自動起動させてみるか...ついては、PCからと思うに至りました。

ノートパソコンでの自作スマートスピーカー自動起動でハマった

2018/12/23

 ラズパイはまだですが、ノートパソコンで自作スマートスピーカーの自動起動をやってみたら、思いの外、ハマりました。(ラズパイでも後日やってみたらPC版と同様にはできず、ラズパイスマートスピーカーはsystemdで自動起動することにしました。)

 結果からすると/etc/environmentに[ALSADEV=plughw:1,0]、[AUDIODEV=/dev/dsp1]を追記、/etc/rc.localにJulius、sleep、自作スマートスピーカー用スクリプトをsleep以外を[su - USER -c "COMMAND" ... &]のようにしてバックグランド起動設定しただけで自動起動できました。

 ハマったのは、自身が、/etc/environmentの存在を知らなかったこと、コマンドラインでは使っていたsuをスクリプト起動で使ったことがなかったこと、/etc/rc.localを使ったことがなかったこと、端末上での検証と/etc/rc.localに書いた際では、sleepするべき時間に結構な差があったことなどに起因します。

 そんな中、当初、Juliusコマンドがroot権限で実行されるとユーザーからの音声入力を受け付けてくれないと思っていて(*後述の通り、思い込みだった)今時のsystemctl(systemd)による方法は論外と考えていましたが、実は、/etc/rc.localで[su]/[su -]に関わらず、環境変数を設定しても反映されないことに起因していた模様で環境変数の設定をどこですべきか悩みました。

 検証時、一方の端末でJuliusコマンド、他方の端末で自作スクリプトを実行した際、(ラズパイではなくノートPC環境では)「あらかじめ」AUDIODEVが定まらない( or USBマイクを挿していない)とマイクデバイスファイルを[/dev/dsp]とJuliusに判断され、当然のごとく、後で設定(export)し直してもマイク入力を受付けてくれない。

 よってユーザー環境(~/)で環境変数を設定するのは、遅いだろうと思う一方、~/.profileを消したり、工夫するのは面倒そうなので/etc/profileに書いても意味はない、/etc/bash.bashrcは、対話シェルでないと意味はない...、さてどうしたものかと思っていたら、さすが困った時のArch Linuxドキュメント、/etc/environmentは単に行ごとに[環境変数=]を書くだけで何らかの制約はないとのことで、これで見事反映されるようになりました。

 続いて2台の端末で検証中は、Juliusコマンドと自作スクリプトは、sleep 2で十分機能したが、/etc/rc.localだと5でも、何れか、もしくは両方とも起動せず、精査はしていないものの、sleep 10にして、ようやく正常に機能することを確認できました。

 これでノートパソコン環境では、マイクも認識され、自作スマートスピーカー機能を自動起動できるようになりました。

 PCを起動したら、スマートスピーカーとして即機能するというのも、かなり、イケてます。

 それまでは、もっぱらブラウザアドオンWorldwide Radioづいていましたが、今後BGMについては、作業しながら、声で操作できる自作スマートスピーカー on ノートパソコンだな...当初、スマートスピーカーなんて...と思っていた自身も自分で作ってみると愛着がわくのか、すっかり、どっぷり...。

 ちなみにノートパソコンの場合、出力音声が操作指示に影響して反応しないことがあるなと思ったら、内蔵スピーカーを使ったからでラズパイ同様、USBスピーカーにしてみたら、聞き漏らしもなく、快適でした。

 それでもマイクとスピーカーが密接していると認識しづらく、ある程度は離した方が良いと思われ、マイクは、スピーカー後方にあった方が、より良い気がする、それもあって市販の多くのスマートスピーカーのスピーカー(じゃなくてマイク?)が上向きなのかも...と思ってみたり。

 また、スリープやサスペンド等に設定してあると復帰後、Juliusが落ちていることがあり、そうした状態でもUSB電源をONに設定できればよいものなのか、そもそも常時電源が入った状態にしておく必要があるのかは、よくわかりませんが、常時ON状態にしておく必要がありそう。

 尚、/etc/rc.localにおいてsuせず、root起動のJuliusでマイク入力を受け付けるか否かについては、未検証。
 => [2019/01/04] systemdを使ったラズパイで確認したところ、Juliusも自作スクリプトも実行がrootでも問題なく音声指示を受け付けることがわかりました。

 「ノートパソコン環境では」とわざわざ但書しているのは、自身がラズパイで未検証だからということもさることながら、おそらく、ラズパイでも同様の手法「も」使えるとは思いますが、冒頭追記したように自身が今回自作スマートスピーカーに採用したRaspberry Pi 3 B+は、最新カーネルを必須とし、これには、snd-pcm-ossが含まれておらず、代替策をとる関係で環境変数AUDIODEVは指定する必要がないなどの違いがあることもあります。

 ちなみにALSADEV、AUDIODEVの設定値は、固定であり、あくまで他の類似機器を装着しない前提に立っている点に注意。

 そのままでも良かったのですが、後日、PCも/etc/rc.localを使わず、ラズパイスマートスピーカー同様、systemdで自動起動させることにしました。

[2019/02/11]

 ある日から、なぜか、ログが増大したため、先日来、これらを整理・削除するためのfind文を追加しています。

 これまた、ある日突然、なぜか、オーディオUSBを認識しない素振りを見せるようになり、たまにsudo modprobe snd_usb_audioしていました。

$ chmod +x diy_smartspeaker.sh
$ cat diy_smartspeaker.sh
#!/bin/sh
 
find /var/log/ -type f -name \* -exec cp -f /dev/null {} \;
 
modprobe snd_usb_audio && \
export ALSADEV=plughw:1,0 && \
export AUDIODEV=/dev/dsp1 && \
julius -C /path/to/dictation-kit-v4.4/mydebug.conf -C /path/to/dictation-kit-v4.4/am-gmm.jconf -module &
 
sleep 10
 
/path/to/voicerecieve.pl &
$

 が、結構な頻度で必要となったので、systemdの.serviceファイルからsuせずに呼んでいる為、rootで実行されるホームディレクトリに置いたスクリプトdiy_smartspeaker.shに先のmodprobe文も追記し、こんな風にしてみました。

 尚、このスクリプト作成当初は、Julius実行前の設定は、 && でつなげていなかったのですが、つなげた方が良さげだったので先日変更しました。

USBスピーカーを追加調達

2018/12/27

 というわけでノートPCとラズパイ、スマートスピーカー機能が2つになって、ノートの内蔵スピーカーだとマイクと干渉しやすく、うまく機能しないことが判明し、USBスピーカーがもう1つ必要となりました。

 AmazonやAliexpressも物色したが、事前調査で100均ダイソーの300円USBスピーカーが意外と良いという情報が多々あることに気づき、早速、淡い期待を持って近所の店舗に行ってみたら、あったので買ってきました。

 話半分に買ってみたこともありますが、事前調査で絶賛する声が多いと知った上にも関わらず、特別なこだわりのない自身の感想ながら期待以上の音質で驚きました。

 背面にある音量調整ダイヤルによる調節レンジも心なしか広く感じる、また、PC直なら爆音轟くほどの最大音量...にしても音割れもしない...USBケーブル&フォーンプラグケーブル(割ける)圧着で1mと若干短いながらも、これが324円か...。

 何も条件は変えていないと思いますが、マイクと離してみてもZ120と比べると指示が通りにくい気がするのは、気のせいか...、スピーカーに起因するなんてことはあるのだろうか?...出力周波数とか関係ないよね?、まぁ、まだ、買ってきたばかり、これから長時間使ってみないと評価はできませんけど。

 他に使う予定ありませんが、これなら、もう1個あったのも買ってくればよかった...と思ったほど。

USBマイクを追加調達

2019/01/03

 試しに追加で買っておいたUSBマイクが今日届いたのですが、比較的静かな環境で口元〜50cm程度までが音を拾う限界のようでスマートスピーカー向きとは言い難い感じです。

 ちなみに代用しているWebカメラ内蔵マイクだと同じ環境でも少なくとも1.5mは音声指示が届くし、環境によっては、3m程度でも音声操作可能。

 とは言え、USBマイクなら、ラズパイでもノイズも入らず、快適に使えることはわかりました。

 また、50cm届けば、ノートパソコンに入れたスマートスピーカーなら、使えなくもありません。

 ただ、Webカメラ内蔵マイクで使えるノートPC上のスマートスピーカーも、USBコンデンサマイクで書いた通り、なぜか、このUSBマイクだと起動後のパソコンでスクリプトを起動する分には、問題ないのですが、自動起動させるとモジュールモードのJuius起動はできるものの、スピーカー用スクリプトを起動するやいなやJuliusが落ちてしまう現象に遭遇。

 エラー前後でも/dev/dsp1で認識され、このデバイスファイルも存在しますが、なぜか、リンク先のようなエラーとなるため、Raspberry Pi/ESP8266・ESP32/Julius/Open JTalkスマートスピーカーで冒頭に追記した通り、最新カーネルを要するラズパイ3B+と同様、ossではなく、alsaを使うべく、Juliusをconfigureし直せばいけるのかもしれないと思いつつも未検証。

2019/01/15

 ちなみに後日、ラズパイ同様、ノートPCもsystemdによる起動の自動化をしてみましたが、変わらず。

 他方、その前に同じ目的で買ってみたCTIA仕様らしき4極フォーンプラグのミニマイクは、少なくとも2mは音声が届く一方、3.5mmジャックに映像入力はあれどマイク入力はないらしきラズパイで使えなかったのが残念。

2019/07/23

 代用しているWebカメラというのが、PCではなんの問題もないものの、なぜかラズパイ+USB HDDだと起動に関して相性のよくないLogicool C270。

 一時期、後にAliexpressで買ってみた5ドル弱のマイク内蔵Webカメラが思いの外、よく、デフォルトの映像の彩度は、むしろこっちの方が良い気がした為、C270を在庫にして交換して使っていました。

 その後、新機能追加にあたり、ラズパイスマートスピーカー含め、オーディオサーバをOSSやALSAからPulseAudioに変更しました。

 するとノートPCの場合、ハイバネート復帰後などに内蔵マイクが優先され、pulseaudio -kしないと(Webカメラ内蔵マイクがデフォルトではなく認識しないため、)スマートスピーカー機能が使えない状態になり、面倒ながらも、しばらく、そうしていました。

 他方、その為ではなく、何の気なしにノートで在庫にしていたC270を、ラズパイ3B+とデスクトップ用周辺機器によるサブPCでAliのWebカメラを使うことにしました。

 その結果、期せずしてハイバネーション復帰時の問題が解消され、以後、C270内蔵マイクをPCに入れたスマートスピーカー機能用として使っています。

 一方、サブPC用にしたAliのWebカメラ、ノートPCで使っていた時は、何事もありませんでしたが、ラズパイだとCheeseやguvcviewなどで640x480にするとチラツキが...ラズパイ上の前者はなぜか設定メニューがなく設定自体ができず、後者で解像度を下げるとチラつきもなく、おさまるという謎な状態になったものの、サブPC自体ほぼ使うこともなく、特に不便もない為、そのまま使用中。

 まぁ、AliのUSBカメラは激安品なので多少の難は「なん」てことのない些細な問題ということで。

USBハブを追加調達

2019/02/21

 USB2.0 4ポートUSBハブ 1.44ドルを購入。

 デスクトップマシン流用品によるラズパイパソコンにと試し買いした2つの内、残った極々シンプルな方をノートで使っていたのですが、当初こそ良好だったものの、1ヶ月もしたら微妙な壊れ方をしたため、代替として。

 尤も、このdynabook B45/Bには、USB2.0 2ポートの他、USB 3.0も2ポートあって空いているので、そっちを使えばよいって話もありますが。

2019/02/27

 改めて試してみたら壊れていなかったのでdynabook用に復帰、ならば、新たに買ったものはラズパイパソコンで、今ラズパイパソコンで使っている個別スイッチ式4ポートは、デスク上のAC接続USB充電器につないで電子工作で使おうかと。

2019/03/11

 無事、届き、予定通り、ラズパイパソコンで利用中。

LINK

ホーム前へ次へ