raspberry pi をラジオサーバにしてラジオ番組のCMカットを企む

伊集院光のラジオ番組を録音し、それをCMカットする事を試してみました。

環境

・デバイス:raspberrypi 1B ※zeroと同等のスペック
・OS:2019-09-26-raspbian-buster-lite

インストール

raspberry pi インストールを参考に初期設定を行います。いずれの設定も、絶対に必須というわけではないのですが、SSHの設定とwi-fiの設定はしておくとteraterm接続が出来るようになるので非常に便利です。

外部ストレージのマウント

外部ストレージのマウントを参考に、USBメモリやSDカードリーダーなどの外部ストレージを本体にマウントします。インストールメディアに巨大な容量のSDカードを使っているのであれば必須の作業ではありません。ホームストレージサーバはラジオ以外でも同期して使いたいので、うちの環境では外付けHDDをマウントしました。
/mnt/usb1/にマウントし、radioディレクトリを作成しました。
/home/piに、このマウントされたメディアへのシンボリックリンクを作っておくと良いでしょう。

$ ln -s /mnt/usb1/ /home/pi/

SAMBAを構築

SAMBAを構築します。これはWinscp等でファイルやり取りするつもりならば必須ではありませんが、AndroidのSAMBA自動同期アプリ・SMBsync2などを使うと、より便利にラジオサーバを運用できます。

ラジオサーバを構築

ラジオサーバを構築します。raspberrypiでラジオサーバを構築する手段はいくつかありますが、この方法が最もシンプルでラクチンです。ただしGoogleドライブへのアップロードは、既にこの記事の通りの方法では構築できません。別のクラウドストレージを使うか、あるいはこのサーバをストレージサーバとして運用するかして対処しましょう。

mp3spltを導入

mp3spltを導入します。OSが最新バージョンであれば特にaptのアップデートの必要なくinstallが可能です。

$ sudo apt-get install mp3splt

このmp3spltは、mp3を無音部分でスプリットしてくれるアプリです。「最低無音時間(スプリット対象となる無音時間)」の設定や、「スキップ対象時間(=CMとして扱われて、カット対象となる時間)」などを設定可能です。

月曜JUNK 深夜の馬鹿力は、MCの伊集院がほぼ一人で話しているため、かなり頻繁に無音時間が発生してしまうようです。なので少し長めに、最低無音時間を長めに設定しました。
またタイムテーブルが存在しない番組であるため、CMもまとめて流される傾向が強いです。このため、スキップ対象時間は、150秒ほどに設定します。
このため、もしフリートークで150秒の間に、伊集院が1.6秒ほどの「貯め」をしてしまうと、その部分がカットされてしまいます。最後の挨拶が150秒以内で終わっても同様です。
めったにない事だとは思いますが、それが頻発するようであれば、CMと判定されるための時間をもう少し短めに設定しましょう。※ただしその場合、CMがカットされなくなる場合があります。
なお、曲については、イントロと伊集院のトークが被ってしまうため、この手段を使っての曲カットは不可能でした。
shotsは一応短く設定しているのですが、この設定が何だったのかイマイチわからなかったです。

これを反映させるため、録音シェルは少し改変を行います。
具体的には、mp3を格納するためのディレクトリを都度作成し、そこにmp3ファイルが出力されるようにします。

/home/pi/rec_radiko.sh
(中略)mkdir ${outdir}/${PREFIX}_${date}
ffmpeg -loglevel quiet -y -i "/tmp/${channel}_${date}" -acodec libmp3lame -ab 128k "${outdir}/${PREFIX}_${date}/${PREFIX}_${date}.mp3"
if [ $? = 0 ]; then
  rm -f "/tmp/${channel}_${date}"
fi
sudo mp3splt -sn -p th=-50,min=1.6,trackmin=150,shots=10 "${outdir}/${PREFIX}_${date}/${PREFIX}_${date}.mp3"

これでcmカットが出来るようになります。
とはいえ、cm入りの無音時間が短いときはどうしてもカットされません。
その場合は次のトラックに移動してみてください。二個目のCMはおそらくカットされているはずなので。
番組ごとにシェルファイルを作るか、このシェルの引数を増やすかすれば、番組ごとのカスタムが可能です。

そしてあえてスプリット前のファイルは削除せずに残しておきます。
万が一CMと間違えられて本編がカットされた場合にも聞き直せるようにするためです。

cron登録

最後にcronを登録します。ついでに、「伊集院光とらじおと」の方も設定を載せておきます。

プロセスが増えて重くなりすぎることはまずないとは思うのですが、念のため毎日18時に一度再起動をするように設定しておきます。
これでラジオの録音がなされるはずです。私の環境ではsleep時間は15秒がベストですが、これはもしかすると環境によって変わる可能性があります。

crontab
0 1 * * 2 sleep 15; /home/pi/rec_radiko.sh TBS 120 /mnt/usb1/radio "伊集院光・深夜の馬鹿力"
30 8 * * 1-4 sleep 15; /home/pi/rec_radiko.sh TBS 150 /mnt/usb1/radio "伊集院光とらじおと"
0 18 * * * /sbin/shutdown -r now

以上は、伊集院光のラジオ番組に特化した内容となりますが、「最低無音時間」と「スキップ対象時間」をカスタムすれば他の番組にも応用できると思います。また、mp3wrapを使う事で、スプリットされたファイルをくっつける事も可能ですが、あまりメリットを感じなかったため省きました。
CMが本編トラックにくっついてしまう事があるため、トラック移動できる方が何かと便利ですからね。
むしろ結合せずにスプリットされていることの方が、なにかとメリットが多いのです。

おまけ

最後に、番組ごとの最適な設定を一応乗っけておきます。
「伊集院光・深夜の馬鹿力」はMCが一人であることから、無音時間が少々長いようです。
またタイムテーブルがなく、計画性がない番組であることから2分以内の短いトークが挟まる可能性もあります。shotsは「無音の後に非無音として検出される最小ショット数」らしいのですが、よくわからないですね。。。
逆に「伊集院光とらじおと」はトーク中は常にパートナーやゲストがほぼ確実におり、CMも計画的に入るため、無音時間は短めで大丈夫みたいです。しかし番組最後の挨拶が短い時が多いので、番組最後の挨拶がカットされないようにtrackminを設定します。直近では2020/01/24の放送では最後の挨拶が85秒と非常に短かったので、それに対応したtrackminを設定します。さらにこれ以上短くなることがあるようならば、スプリット前のファイルの最後だけ聞き直してみましょう。

また木曜日の「伊集院光とらじおと放哉と山頭火と」のコーナーでは俳句を読むたびに細かく切れてしまうので、今度も注意が必要ですね。もし切れてしまうようであれば、minをもう少し長く設定する必要がありそうです。
なお設定の「min」はminimumの略称のようで、分単位ではなく秒単位が設定されますので注意して下さい。

下記に、単位時間を細かく刻んでスプリットを試してみた最適結果を載せておきます。
どうしてもCMが少し入っていしまいますが、短いトークが削られないようにするには仕方ない感じですね。

番組名 min trackmin shots
伊集院光とらじおと 0.7 84 10
伊集院光・深夜の馬鹿力 1.6 150 10
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account