実践IoT:ラズベリーパイでアナウンス機能付音楽再生サーバを作る

IT・DX

 当店内にはスピーカーがないのですが、ある理由で来客時の即案内(しばしお待ちのお詫び音声案内)が必要になり、アナウンス機能付きの音楽再生デバイスをラズパイ(Raspberry Pi)で作ってみました。

仕様

目標とした仕様は下記です。

  • ラズパイの電源をONにすると家庭内のNASサーバに接続し、所定の音楽(MP3)フォルダをマウントする。
  • そのフォルダにある曲をランダムに小さめの音量で再生する。(BGM)
  • 再生する音楽ファイルは約1分~10分(1MB~15MB)とする。
  • 曲の再生開始・中断・アナウンスをスマホのブラウザからコントロールできるようにする。
  • アナウンスは、ブラウザの所定のボタンを押すと、音楽再生をSTOPし、所定のアナウンス音声MP3を再生する。
  • アナウンス再生後BGM再生にもどる。
  • ラズパイは10年前に購入して使っていないPi2-ModelBでトライ。動作が遅ければPi4にする。
  • 再生デバイスは極力配線がシンプルになるようにUSBスピーカーにする。

ChatGPT先生に相談

上記の仕様をChatGPTに投げかけるとPythonのコードを教えてくれます。詳細は割愛しますが概要は下記になります。
まとめ
NFSでサーバーのフォルダをマウント
PythonでランダムにMP3を再生
Flaskを使えばブラウザから操作可能
crontabを使えば自動実行も可能

また、出力デバイスについても問いかけると下記の回答でした。
1. 3.5mmジャック(有線スピーカー)
Raspberry Piの3.5mmオーディオジャックに有線スピーカーを接続できます。
ただし、音質はあまり良くなく、音量も小さいので、アンプ付きスピーカーを使うと良いです。
2. HDMI経由のオーディオ
Raspberry PiのHDMIポートに接続されたモニターにスピーカーがある場合、そのスピーカーから音を出せます。
3. USBスピーカー
USB接続のスピーカーやUSB-DACを使用することもできます。
USBスピーカーを接続すると、通常 /proc/asound/cards で認識されるので、デフォルトの出力先を変更します。
4. Bluetoothスピーカー
Bluetoothスピーカーを使う場合は、pulseaudio を利用します。
5. I2S DAC + アンプ
高音質な音声出力を求める場合、I2S接続のDAC(デジタル-アナログコンバーター)とアンプをRaspberry Piに接続する方法もあります。

音質・音量・配線の手軽さからUSBスピーカとし、メルカリで中古のLogiCoolの製品を1100円で購入しました。

ラズパイ2-ModelBにMP3再生を実装

まずPi2でMP3のランダム再生ができるか実装してみます。ChatGPTに聞くと下記の概要でした。


Raspberry Pi で、特定のフォルダ以下のすべてのフォルダ内にある MP3 ファイルをランダムに再生する Python スクリプトを作成できます。以下の方法で実装できます。


✅ 実装方法

  1. 指定フォルダ以下のすべての MP3 をリストアップ
  2. リストからランダムに 1 つ選択
  3. MP3 を再生(mpg321 または pygame.mixer を使用)
  4. 繰り返し再生する(無限ループや一定回数)

✅ 必要なライブラリ

Python で MP3 を再生するには、以下の方法があります。
pygame.mixer(Python のみで完結)
mpg321(Raspberry Pi で軽量で安定)

✅ 違いと選び方

方法メリットデメリット
mpg321軽量で安定mpg321 のインストールが必要
pygame.mixerPython だけで完結Raspberry Pi の一部環境で不安定
  • Raspberry Pi で音楽プレーヤー的に使うなら mpg321(推奨)
  • Python 内で処理を完結させたいなら pygame.mixer

実装のポイント

各ブロックのテストを行って、最終仕様を目標に少しずつ組み立てていきます。悩んだところや苦労したところは下記です。

  • Pi2でMP3再生すると音がとぎれとぎれ。
    →CPUパワー要因かネットワーク(WiFi)要因かを切り分けるために、Pi2の実行環境をGUIからCUIにし、使わないプログラム・サービスをカット。
    →pi2+WiFiで問題なく再生でき、Pi2を採用決定!
  • 電源ON時の自動実行はcrontabに記載するが、ネットワークが確立する前にNFSマウントが動くことがあり、pingでNASサーバがみえるようになってからマウントするように修正。
  • MP3再生はmpg321+USBスピーカーとしたが、USBスピーカーのドライバは48KHzサンプリングにしか対応していないことがわかり、mpg321の設定ファイル(asound.conf)を常に48KHzで再生するように設定。
  • アナウンス音声ファイルはモノラルのため、両方のスピーカから再生するようにasound.confを修正。
  • 曲が最後まで再生される前に次の楽曲が始まることがあり、再生するスレッドが完了するまでWaitし、さらに2秒待つように調整。
  • コントローラのボタンをFlaskで作成。ブラウザのアラートボタンをおすと「いらっしゃいませ~。今いきまーす」を再生。

完成!

現場に設置し、音量を適切にチューニングし完成です。事前テストから3日ほどかかりました。今回は手持ちのラズパイ+新規購入USBスピーカー1100円で導入できましたが、すべてを新規購入すれば1万円くらいになるでしょうか。
機能は限られていますが、ファイルサイズの上下限やフォルダ最下階層までの検索など市販のミュージックサーバではできないことが可能です。
応用としてFlaskでボタンを複数つくり、そのボタン押した後の動作をラズパイから音や光で知らせる、メールを飛ばす、なんてこともできますね。

ちなみにBGMは50年来のファンであるユーミン(荒井由実・松任谷由実)の楽曲で、すべてのアルバム・シングル・ラジオ番組から取り込んだ約1500曲の中からランダムに選ばれています。(^^;)

コメントお待ちしております。

コメント