以前、作って運用しつつもブラッシュアップ中のRaspberry Pi 3 Model B+とJulius、Open JTalkベースの自作スマートスピーカーがあります。
主な機能は、
尚、ラズパイ用ACアダプタを挿したスイッチ付きコンセントでのON/OFFとは別にラズパイ用boot/reboot/shutdown物理ボタン付き。
音声認識にJuliusを使った自作スマートスピーカーに伝言とメモの機能を実装するにあたり、マイクとスピーカーを専有してしまうOSSやALSAからPulseAudioに移行しました。
ちなみに便利なのでラズパイだけでなく、PC/Debianにも自作スマートスピーカー機能を搭載しています。
自ずとモニタ付きとなるPC版スマートスピーカーには、PC及びラズパイ双方のスマートスピーカー機能のデスクトップアプリとしてPyQt5/Qt Designerによる操作パネルも作成しました。
Raspbianにおいてsudo apt update && sudo apt upgrade -y && sudo apt clean -y && sudo apt autoclen-y && sudo apt autoremove-y の結果に起因するのか、そうではないのかは不明も、タイミング的には、その後、自作スマートスピーカーのスピーカーから突然、音が出なくなりました。
メインのノートPCにつなぐと普通に音が出ますし、逆にノートPCで使っているダイソーの300円スピーカーを自作スマートスピーカーの方につないでも音が出ないのでスピーカーが壊れている可能性は消え、ラズパイ側の問題と判断しました。
また、今までも常用していましたし、直前までは、正常にスマートスピーカーも機能していたのでラズパイのオーディオジャックの破損ではない、USBスピーカー(Logicool Z120)と着脱後、lsusbに反映されるマイクとして使っているWebカメラとUSBポートを差し替えてもWebカメラは正常に認識されるのでラズパイのUSBポートの故障の可能性もないと判断。
だとすると何が原因なのか...。
検索しても全くヒットせず、暗中模索、raspi-config、Advanced Options、Audioとメニューをたどり、3.5mm HeadPhoneを選択したり、端末からamixerしたり、/etc/modprobe.d/alsa-base.confで優先順の設定を確認したり、~/.asoundrcを見直したりもしましたが、どれも関係なかったようです。
結果、使用中のサウンドサーバPulseAudioの設定で無事、スピーカーから音声出力されるようになりました。
何かの拍子に後述のような複数の事象が重なり、既定の音声出力デバイスとして3.5mmオーディオジャックを指定していたはずのものが、HDMIに変わってしまったことが原因のようです。
何かの拍子と言っても、自分で変更した覚えはなく、やったとすれば、lm-sensorsのインストール・アンインストールとシステムの更新作業くらいですが。
そのシステムの更新作業に起因する可能性が極めて高い...と思われます。
USBスピーカーが、dmesgにもlsusbの結果にも出力されないように見受けられ、あれ?Raspbian(OS)が認識してないの!?それともこういうものだっけ?と一瞬、面くらいました。
というのも以前もどう出力されたのか覚えていなかったので...。
が、PCでも表示されていない様子、そういうものらしい。
電源供給だけ?だから?
ということで気を取り直して調査続行。
もちろん、前述の通り、raspi-config => Advanced Options => Audioで3.5mmヘッドフォンを強制する方に設定し、再起動もしましたが、それだけではダメだったわけです。
この時、意味も理解しないまま、以前やった通り、amixer -ccset ALSA numid=3 1を実行してみたら、そんなのないよと言われ、-cオプションをとってamixer numid=3 1としてもエラーとなりダメでした。
このコマンド引数の意味を理解してみれば、当然でした。
numidに指定する値は、以前も参照させて頂いたとりあえずこれだけ知っておけばなんとかなるRaspberry Piのオーディオ設定にある通り、amixer controlsにある[name='Master Playback Volume']のnumid値であり、末尾の1としている部分については、アナログオーディオかHDMIかを示す値で前者が1、後者が2とのこと。
このvaluesの値はどっからくるのか、ということでraspi-configからAdvanced Options、Audioとたどってみると...。
なんと今の自身の環境では、HDMIの値が0、空欄の値が1、Headphonesの値が2と異なりました。
PulseAudioを使いつつ、ベースはALSAなはずなのでRaspberry Pi オーディオまとめを参考にサウンドカード、デバイス、PCMストリームを確認してみるとこのようになりました。
つまり、オーディオデバイスが3つあり、HDMIが0、スマートスピーカーのマイクとして使っているWebカメラが1、Headphonesが2に割り振られており、valuesの値は、必ずしも1か2、HDMIかアナログオーディオの2択ではなく、確認が必要であることがわかりました。
また、numidを知るに至ったリンク先は、以前、自身が、Julius / Open JTalkスマートスピーカーで OSS/ALSA/PulseAudioでも参照させて頂いており、当時としては、aplay -lの結果から、カード名を指定するamixerの-cオプションへの設定値をALSAとすればよいことを知り、うまくいったのですが、なんと今回は、ALSAではなく、これがHeadphonesとなっており、変更する必要がありました。
つまり、自身の今の環境で、もし設定するにしてもamixer -ccset Headphones numid=3 2とする必要があったわけです。
ただ、この設定は、どうも必須ではないようで、これを設定したからと言ってスピーカーから出力を得ることができたわけではありませんでした。
というか、OSS、ALSA、PulseAudioとサウンドサーバを変更してきた自作スマートスピーカー、当時はALSAだったものの、今は、PulseAudioなのでPulseAudioでの設定が必要なのかも...と思いつつ、問題の切り分けへ。
どうにもわけがわからないので原点に戻り、ラズパイ自体に起因するのか、カーネルやソフトウェア、設定に起因するのかを切り分けるべく、自作ラズパイスピーカーのRaspberry Pi 3 B+とデスクトップPC周辺機器でパソコン化したRaspberry Pi 3 Model B+を入れ替えてみることにしました。
前者のスピーカー出力は、3.5mmアナログオーディオ、後者もスピーカー出力は、3.5mmアナログオーディオながら、モニタは、古いこともあり、VGA/HDMI変換アダプタを介したHDMI。
後者は、少し、ややこしいのですが、スピーカーはモニタ内蔵のもので変換アダプタにある3.5mmジャック経由だと音が出なかった為、ラズパイの3.5mmジャックから直結する恰好になっており、Audio設定は、モニタの都合上、HDMIにする必要があり、詳細は覚えていませんが、何かごにょごにょしたのか、それでも音声は、3.5mmジャックから出力されます。
というわけでラズパイから入れ替えてパソコン化した方は、raspi-configのAudio設定でHDMIに設定...しようと思ったら、選択肢がHeadphonesしかない...。
そのまま、aplay /usr/share/sounds/alsa/Front_Center.wavしてみると、かすかに聴こえてくる...、気づけば、50〜60%ほどに下がっていた音量を上げることで拍子抜けするほど簡単にスピーカーからの出力を得られることがわかりました。
とは言え、入れ替える前もスピーカーのボリュームで最大音量までしてみたりもしたのでボリュームが下がっていただけで実は最初からスピーカーから音は出ていたというわけではなさそうです。
50〜60%で微かにしか聴こえなかったということは、大元のボリューム(ゲイン?)が限りなく0に近かった可能性もなくもないですが...仮にそうだったとしてもそんな設定いじってないので。
何れにせよ、自作スマートスピーカーに使っていたラズパイ自体の不具合・故障でないことが、改めてはっきりしました。
スピーカーやラズパイといったハードウェアに問題がないとすれば、設定を含むソフトウェアしかない...どっかの設定をいじれば...。
結果、前掲の自身のページを見てPulseAudioには、CLI用としてpacmd/pactlコマンドがあることを思い出し、当時は、マイクの設定をするのみでしたが、今回は、スピーカーの設定をしなければならないのかもしれないと気づくに至り、まさにそうでした。
[pacmd -h]としてヘルプを見るとデフォルトのスピーカー設定には、[pacmd list-sinks]で列挙・表示される名前(name)かポート番号を引数にとるらしき[pacmd set-default-sink]を使えば良さそうです。
[pacmd list-sinks]でindex: ...の先頭にアスタリスクが付いているものが、デフォルトとして設定されているとのこと。
確認してみると案の定、HDMIのindex: 0の方にアスタリスクが付いていました。
そこでこのように確認しつつ、Headphonesのindex: 1の方をデフォルトにすべく設定、必要に応じて再起動してくれる[pulseaudio -k]でPulseAudioを再起動したところ、aplayにハードウェア・デバイスを指定する-Dオプションを付与することなく、スピーカーから音声を出力することができるようになりました。
これにより、これを前提に設定してあるスマートスピーカーで使用する音声合成も、また、音楽再生などもできるようになりました。
ただ、このようにカードやデバイス、PCMストリームに関しては、感覚的には、0がデフォルトかと思いきや、Headphonesがカード0に割り当てられるわけではないようでHDMIとHeadphonesが1と2に割り当てられるようにはなったものの、常にそうなるのかについては定かではありません。
ちなみに、やはり、外付けWebカメラのあるパソコン化したラズパイの方で後述の通り、システム更新してみたところ、内容に変更は見られたものの、Headphonesが0、Webカメラが1、HDMIが2のようにこの順にはなりませんでした。
また、このパソコン化したラズパイの方は、VGA/HDMI変換アダプタを使用しているとは言え、ラズパイ側はHDMI接続なのに、なぜか、raspi-config、Advanced Options、Audioには、Headphonesしか選択肢がない、ラズパイからも変換アダプタ経由だとVGAとして認識している!?、先の割り当ても、もしかして、これの影響がある?、だからこそのHeadphonesが0???というのが気になり、それによっては正確に比較ができないな...と。
で、結局、何に起因して、これらの設定内容が突然変わってしまったのか...というわけでパソコン化した方のラズパイというか、Raspbianでも冒頭の通り、システム更新してみると...。
やはり、オーディオカードやデバイス、PCMストリームの割り当てがシステム更新前と後で前述の通り、変わっていることが判明しました。
が、/proc/asound以下ではHDMIも認識・割り当てされている模様も前述の通り、raspi-configのAudioにHDMIの選択肢がなく、Headphonesのみであることから、pacmd list-sinksのデフォルトがHeadphonesのまま、変わらないのが、この影響だとすると単純比較できない...。
というわけでシステム更新が原因である可能性が、とてつもなく高いものの、究明するまでには至りませんでした。
マイクを含め、3択ということは、これがなければ2択、スマートスピーカーに限らず、PulseAudioでマイクとスピーカーを使う場合、いや、と言っても0、1となる可能性が高く、そうなるとALSAでもスピーカーを使う場合、それらのラズパイでも起こり得る?
自作スマートスピーカー用としているラズパイにおいてbuster 10からbullseye 11にフルアップグレードする際にも再発したので、やはり、アップグレード・フルアップグレードを機に設定が変わってしまうようです。