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

自作スマートスピーカー機能を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カメラで代用)のみ追加、どちらでも一連の機能を利用できるようにした。

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

 うん、よい感じ、そろそろ自動起動させてみるか...ついては、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ファイルからcuせずに呼んでいる為、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マイクを追加調達


Aliexpress/Enjoying+e Store
USB 2.0コンデンサーマイク録音マイク SF-555B 黒
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による起動の自動化をしてみたが、変わらず。


Aliexpress/VeFly Store
金属ミニジャック 3.5 ミリメートルスタジオプロマイクハンドヘルドマイク携帯電話コンピュータ iphone ipad カラオケ

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

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

ウェブ造ホーム前へ次へ