トホホな疑問(4) Raspberry Pi、Google Home Mini 音を出す小ネタ

JosephHalfmoon

この間、Raspberry Pi ZeroにUSBオーディオを取り付けて、音声の録音と再生などを行ってみたことは書かせていただきました。Raspberry Piなどの音声関係については疎くて知らずにいたことも多いです。USBオーディオの記事で書かなかったことについてもメモを残しておくことにいたしました。なにせ記録せずに1週間もたつと皆忘れている今日この頃。

まずはオーディオ出力のテストの時にもっとも役立ったツール。最初からRaspbianのファイルシステムの中にひっそりと格納されておりました。これに気付いたのは、以下のページのお陰です。

Raspberry Piで音を出すまで

/opt/vc配下に、Broadcom社コピーライトのハードウエアに近い階層のテスト用のファイルがいろいろ存在していることは知っていたのです。しかし、そのソースディレクトリの中に音声用のテストにちょうど良いものが入っているのは上記ページで知りました。

hello_audio.bin

ビルド後のオブジェクト名です。実行すると「フォン、フォン」という感じの警報音ぽい音が鳴り続けます。単純な正弦波の音ですと単調過ぎて、ボリュームの設定がまずくてごくごく小さく鳴っていると、本当に鳴っているのかどうか怪しくて聞きもらしますが(実際経験しました)、このファイルの奏でる音は独特なのでかなり小音量でも気づくんじゃないかと思います。aplayとか、arecordとか再生、録音用の標準コマンドは存在しますが、それらは、ソフトウエアの階層構造を成すalsaレイヤ以下が正常に設定されていないとうまく動作しないもの。それに対して上記のコマンドは、低レベルでサウンド出力をテストしてくれるので、音声出力のハードウエアが正常か否かを検証するのにはファーストチョイスではないかと思います。格納されているソースコード audio.cを読むとヘッドフォン・ジャック側だけでなくHDMI側にも出力できるようです(第1引数に1を設定した場合、デフォルトはヘッドフォン側)。ただし、手元にはHDMIに音声出力したときに鳴るHDMIのモニタを持っていないので確かめていません。確かめたのはピンジャックの方のみ。

なお、hello_audio.binは、見た限りバイナリは含まれておらず、ビルドが必要です。ソースディレクトリ

/opt/vc/src/hello_pi

内には、複数のhello_xxxというディレクトリがあり、オーディオテスト用のhello_audioはその内の一つです。hello_pi内のREADMEを読むと、まずライブラリ2つをビルドした後、各フォルダ内のMakefileを使う各ディレクトリ毎のビルド手順が記されています。それらの後に全てを一気にビルドする rebuild.sh というスクリプトファイルがあることも書かれています。今回はそのスクリプトを使ってビルドしました。大きなプログラムではないので、それほど時間もかからずビルドは完了しました。

Raspberry Piのすぐ横にGoogle Home Miniあるんですけど、こいつに出力できない?

Raspberry Piから数cmのところにGoogle Home Miniを置いてあるのです。当然ですが、どうみてもスピーカ。Raspberry Piのピンジャックからのアナログ音声出力をテストしたときには、わざわざ別のスピーカを繋いでやっていたのです。横にあるGoogle Home Miniは知らんぷりで働いていない。そこで、こいつに何か喋らせたいと思いました。調べると直ぐに発見できると思いますが、以下のソフトウエアをnode.js上で実行すれば(AI的な意味で喋ってはいないけれど)、TTS(Text to Speach)や音声ファイルの再生は直ぐにできます。

google-home-notifier

これを設定して試してみる上で、参考になったのが以下のサイトです。

Google Homeにプッシュ発話をさせる、Raspberry Pi 3へのgoogle-home-notifierの最新導入手順

この記事を書かれているのは、Google Homeの活用も含めたあたりで働いていらっしゃるプロの方のようです。ありがたいことです。ほぼ、上記の記事どおりで、直ぐにRaspberry Piに喋らせることができました。

$ node main.js ”アホ、バカ、マヌケ!”

ちゃんと手元のGoogle Home Mini、上記、御覧のとおりの罵詈雑言をおしゃべりになりました。GoogleのAPIを使ってテキストを音声データファイルに変換してそれを再生しているので、なんでも所望の文章を喋らせることができそうです。実はひと昔以上前に、無線トリガで、スピーカから何種類かの文章を喋らせるというものを作ったことがあるのですが、その時は別なTTSシステムで音声ファイルを事前準備したりして面倒でした。今昔の感があります。

なお、google-home-notifierにはnofifyというTTSのメソッド以外に、playというmp3ファイルを再生するためのメソッドも含まれます。スクリプトをちょっと書き換えれば、Raspberry Pi上のmp3の音楽ファイルをGoogle Home Miniに再生させるといったこともできます。ただし、Raspberry Pi上のローカルファイルではなく

Google Home Miniからhttpで該当のmp3ファイルにアクセスできる

ことが必須です。都合の良いことに運用中の3台のRaspberry Piの内、Raspberry Pi 1 model B+ 上でhttpdを動作させてあるので、そこからアクセスできるディレクトリにmp3ファイルを配置いたしました。これでGoogle Home Miniに音楽を鳴らさせることもOK。今も鳴っております。

しかし1点忘れないように

aplayじゃmp3ファイルは再生できず

生のオーディオデータに近いwav型式であれば、いろいろ解析したり加工したりに便利ですが、音楽ファイルは何らかの型式にエンコードされておる、と。

オーディオコーデックのプレイヤー、コンバータ、ライブラリなど多数

よりどりみどりなので、適当に使うしかありますまい。不勉強にてどれが良いとも分からず。

トホホな疑問(3) PYTHONHOME、忘れてました へ戻る

トホホな疑問(5) aplay -l、返ってこない へ進む