Net Radioの製作

Python HTTP Serverの記事を書いていたら、これ使ったらNet Radioが簡単に作れるんじゃないかと思い作ってみる事にしました。巷にはRaspberry Pi Zero を使ったネットラジオも売っています。以前(かなり前)に買ったRaspberry PI model B+。動作が遅くて殆ど使って無かったのですが、Zeroで出来るなら model B+でもと思い、これで作ってみる事にしました。ネットラジオ専用機としてPCから操作出来るのはもちろんですが、今回はスマホから操作することをメインに考えています。動作環境は、ルーターの元にRaspberry Piとスマホが有るものとします。ルーターの外からのアクセスは想定していません。

使用した物

  • Raspberry PI model B+
  • Raspberry PI OS(32-bit) Released 2021-01-11
  • Micro SD (32G)
  • ACアダプタ
  • USBスピーカー(又はヘッドフォン)
  • LED + 4.7kオーム抵抗

Raspberry PIにUSBスピーカーをつないでいます。赤いLEDはパイロットランプ。Raspberry PIがレディーになった、ラジオ局とつながった等、状態表示に使用しています。

OSのインストールから

Raspberry PI model B+に新規にOSをインストールから始めます。インストールについてはWebに色々説明が有りますが、”Raspberry Pi にOSをInstall” でも簡単に説明しています。参照下さい。手順はPI 3 model B+と同じです。model B+は無線LANを持っていないので、有線LANでインストールとなります。手順は簡単ですが時間がかなりかかりました。Pi 3 Model B+の4倍か5倍位かかりました。これが性能の差なんでしょね。値段は4倍も違いませんが。

OSのインストールが終了したら、ホストとSSHでつながる様に設定すると便利です。できればSambaも使える様にするとさらに便利です。今回はホームディレクトリの下にソフトをコピーするので、Sambaの共有ディレクトリをホームディレクトリに指定して下さい。

Raspberry PI model B+は、あまりに動作が遅いので CUI 起動に設定しました。CUIでも遅いですがGUIよりは早いし実際問題、今回はGUIは使いません。(元々モニターを付ける予定は無い)

WiFiドングルが認識されない

インストールが終わって、有線ですがSSHでRaspberryPI に接続出来る所まで来ました。やっぱり、有線より無線でしょうと思いネットでWiFiドングルを探すと、こんな安いものを見つけました。TP-Link WIFI 無線LAN 子機 11n/11g/b デュアルモード対応モデル TL-WN725N。Linuxも対象OSだったのでオーダーしたのですが、Raspberry Piが認識して来れません。かなり苦労してやっとインストール出来ました。ここに詳細をまとめました。TL-WN725Nを使う 参照下さい。

追加のプログラムと固定アドレス

追加のプログラムは、”mplayer” と “Streamlink” です。インストールは下記の様に行って下さい。


sudo apt-get install mplayer
pip3 install --upgrade --user streamlink

“Streamlink”はRadikoの再生に使用しています。このアプリを使うとRadikoをURL指定するのみで再生出来ます。このHPに説明が有ります。参考にしました。この2つのインストールが終わったら動作の確認をします。USBスピーカをつないでReboot。レディになったら作業開始。先ずは、”mplayer”。ターミナルで、”mplayer -playlist http://yp.shoutcast.com/sbin/tunein-station.m3u?id=22146”と入力して下さい。しばらく待つとshoutcastのラジオ局が再生されます。

音が出ない場合は、USB音源が選択されているか確認して下さい。CUIからは ”raspi-config” で確認出来ます。

次に、”Streamlink”。これはリンク先に再生の例が有りますからそれに従って確認を行って下さい。スクリプトを書いたりちょっと面倒ですが確かめて下さい。

今回はスマホでのコントロールをメインに考えているのですが、スマホではHostNameでアクセス出来ない事が分かりました。そこでIPアドレスを、”192.168.3.200”に固定して8080ポートを使用する事にしました。IPアドレスの固定方法は、”その他MISC(8)”で説明しています。作業は内容は、/etc/dhcpcd.conf の修正です。また今回使用するアドレスで都合が悪い場合、状況に合わせて調整下さい。アドレスを変更した場合はソフトの該当箇所のアドレスを変更する必要が有ります。

/etc/dhcpcd.conf

interface wlan0
static ip_address=192.168.3.200/24
static routers=[デフォルトゲートウェイのIPアドレス]
static domain_name_servers=[DNSサーバーのIPアドレス]

Net Radio Program Files

必要なファイルとその説明を下記にまとめます。

File Name
説明
  radio.py メインプログラム。Python Scriptです。
ポートを変更した場合、ソースの287行、port = 8080 を変更
  radio.html  HTTPServer HPのHTML
  radio.js  HP内の表示、HPの状態をサーバーに送信しています。
 アドレスとポートを変更した場合、ソースの2行目の、var url = “http://192.168.3.200:8080/?80=0”; を変更
  radio.css  CSSファイル。ボタンやフォントの定義を行っています。
  edit.html ラジオ局の編集用HPのHTML
アドレスとポートを変更した場合、ソースの36行目の、var url = “http://192.168.3.200:8080/?90=0”; を変更
  title.txt ラジオ局の名前を保管するファイル
  link.txt ラジオ局のURLを保管するファイル
  radio_data.txt プレーヤーの状態を保管するファイル。起動した時に前回の状態を再現
  favicon.ico ファビコンファイル
radio.zip 圧縮ファイル。”radio”フォルダーに全てのファイルが解凍される

プログラムの起動

  • radio.zip をダウンロードし解凍。
  • 解凍して出来た、”radio”フォルダーを、ホームディレクトリ(/home/pi/)の下にコピーする。
  • ターミナルを上げてコピーしたディレクトリ、”/home/pi/radio/” に移動。
  • ターミナルで python3 radio.py と入力すればプログラムが実行されます。
  • プログラムがレディーになるとLEDが点灯します。
  • LEDの点灯後ブラウザに、”192.168.3.200:8080″と入力して下さい。
  • 下記の様な画面がブラウザに表示されます。

使い方の簡単な説明

  • 1: 固定URL
    • スマホでアクセスする場合、Host Nameが使えない。
    • ポート80の使用にはRoot権限が必要。
    • から、固定アドレス ”192.168.3.200:8080″ と設定しています。
  • 2: 音調節
    • 音量調整用のスライドバーです。
    • 0から100の間で音量を調整します。
    • 現在の値は、”Vol:xx”の xxに表示されます。
  • 3: 選曲
    • ラジオ局選曲用のプルダウンリストです。
    • 最大10局の登録が出来ます。
  • 4: Play
    • このボタンを押すと、再生が始まります。
    • 再生中は、ボタンの色が赤くなります。
  • 5: Stop
    • 再生を中止します。ラジオ局とのリンクが切れます。
  • 6: Mute
    • 消音します。ラジオ局とのリンクは切れません。
    • 消音中はボタンが青くなります。
    • 一回押すと消音、もう一度押すと解除です。
  • 7: Edit
    • このボタンを押すと、ラジオ局の追加削除等編集が出来ます。
    • 編集方法は後ほど説明します。
  • 8: Save
    • 現在の状態(ラジオ局、音量、再生中、Mute中)を保存します。
    • 次回の実行時、前回と同じ状況を再現します。
  • 9: Off
    • Raspberry PIを、シャットダウンします。
    • シャットダウンが完了すると、LEDが消灯するのでRaspberry PI の電源OFFの目安にします。
  • 10:Favicon
    • 今回は、Faviconを付けました。”favicon.ico” がFileNameです。

Editボタンを押すと画面が下記の様に変わります。

  • ラジオ局編集の画面です。10局の放送局を登録出来ます。
  • 左側Title欄がプルダウンリストに表示されます。ここにラジオ局のタイトルを入力。
  • 右側URL欄のラジオ局のリンク先入力ですが、
    • SHOUTcastの場合
      • SHOUTcast のHPの行く       
      • 聞きたい局のDownLoadマークをクリック
      • 出て来たウインドウで、”Any player(.m3u)の上にマウスを置いて右クリック
      • 出て来たウインドウで、”URLのコピー” を選択。
      • コピーされたURL ”http://yp.shoutcast.com/sbin/tunein-station.m3u?id=22146” の前に、”-playlist “を付けた”-playlist http://yp.shoutcast.com/sbin/tunein-station.m3u?id=22146” を入力
      • SHOUTcastは最後の数字で放送局を区別している様です。
    • サイマルラジオの場合
      • HPで音声のみのアイコンの上で右クリック
      • リンクのURLのコピーを選ぶ
      • コピーされたURLが、
        • http://www.simulradio.info/asx/fmpalulun.asxと .asxで終わる場合
          • ”-playlist http://www.simulradio.info/asx/fmpalulun.asx”と入力
        • https://www.beachfm.co.jp/radio/の様にそれ以外の場合
          • ”https://www.beachfm.co.jp/radio/” そのまま入力
    • radiko
      • ここの放送局は試して見ました
      • 聞きたい放送局をクリックするとブラウザのURL欄にアドレスが表示されます。
      • 例えばJ-WAVEは、”https://radiko.jp/#!/live/FMJ” と表示されます。このアドレスの先頭に半角のアスタリスク、”*”を付けて入力して下さい。
      • radikoは居住区以外の番組は聞けません。気を付けて番組を選択して下さい。
  • 入力後、OKボタンを押せば、リストが更新され、Quitボタンを押せば、リストの更新は無くメインに戻ります。

自動起動

このRaspberry PIは、Netラジオ専用として使うので電源をいれたらプログラムが自動で起動するようにします。自動起動には、systemd を使いました。”systemdを使ったプログラム自動起動” に詳細が有ります。参照下さい。

/etc/systemd/system/ ディレクトリに、”radio_run.service” を作成。ファイルの内容は以下の通り。

/etc/systemd/system/radio_run.service

[Unit]
Description=Net Radio
After=multi-user.target

[Service]
ExecStartPre=pulseaudio --start
ExecStart=/usr/bin/python3  radio.py
WorkingDirectory=/home/pi/radio
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

ターミナルで、sudo systemctl enable radio_run.service を実行してRebootして下さい。プログラムが自動で起動します。

自動起動の確認

確かに自動起動するのですが、電源スイッチを入れて約2分でレディLEDが点滅しました。レディになるまでにかなり時間がかかります。PI 3 B+ではもっと短かったのですが。でもそう何回の電源をオンオフする機器では無いのでとりあえず、OKとします。

使用感

スマホではHPがこの様になります。殆どPCと同じ画面で同じ様に使用出来ます。これで、Raspberry PIの電源を入れてPC無しでラジオがコントロール出来ます。

BGMに使っているので十分な機能ですが、つながるまでに若干時間がかかります。

  • SHOUTcast関係:
    • つながる時は比較的短時間でつながる。
    • 時々繋がらない。混んでいる。または放送していない可能性有り
  • サイマルラジオ関係:
    • 登録した放送局は比較的つながる。
    • つながる時間はSHOUTcastと同じか若干長い
  • radiko関係:
    • 必ずつながるが、時間がかかる。
    • つながるまでに30秒以上。

簡単なプログラムで予想以上の機能に満足しています。これで使い道の無かったModel B+も十分活用出来ました。