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


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

20210131追記：
フラッシュのサポート終了に伴い、下記の方法では録音ができなくなりました。[もっと便利なツール](https://qiita.com/el-coverage/items/7ede3652d95751e7f9a0)を紹介しているので、こちらをお試しください。

##環境

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

##インストール

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

##ラジオサーバを構築
[ラジオサーバを構築](https://qiita.com/yuppejp/items/04a904ee183dc69dcb73)します。raspberrypiでラジオサーバを構築する手段はいくつかありますが、この方法が最もシンプルでラクチンです。ただしGoogleドライブへのアップロードは、既にこの記事の通りの方法では構築できません。
別のクラウドストレージを使うか、あるいは後述のようにラズパイをストレージサーバとして運用するかして対処しましょう。

##外部ストレージのマウント
[外部ストレージのマウント](https://qiita.com/kenboo/items/62694afb38d9108bc0d7)を参考に、USBメモリやSDカードリーダーなどの外部ストレージを本体にマウントします。インストールメディアに巨大な容量のSDカードを使っているのであれば必須の作業ではありません。ホームストレージサーバはラジオ以外でも同期して使いたいので、うちの環境では[外付けHDD](http://sooch.hatenablog.com/entry/2017/03/26/061032)をマウントしました。
ここでは/mnt/usb1/にマウントし、radioディレクトリを作成しました。
/home/piに、このマウントされたメディアへの[シンボリックリンク](https://qiita.com/0084ken/items/6f39498c86fb592b2baf)を作っておくと良いでしょう。

```shell:
$ ln -s /mnt/usb1/ /home/pi/
```

##SAMBAを構築
[SAMBAを構築](https://www.itmedia.co.jp/news/articles/2002/09/news012.html)します。これはWinscp等でファイルやり取りするつもりならば必須ではありませんが、[AndroidのSAMBA自動同期アプリ・SMBsync2](http://bbfansite.com/wp/?p=45714)などを使うと、より便利にラジオサーバを運用できます。
具体的には、「火曜日の朝起きると、深夜の馬鹿力が既にスマホに同期されている」という状態を作り出すことができます。
※スマホでラジコ録音ツールを入れてもよいのですが、たまに録音をミスるのと、平日昼の番組を録音中にスマホが熱を持つので辞めました。

もしraspberrypi本体が2以降でメモリが1gb以上あるのであれば、[nextcloudpi](https://qiita.com/masataka55/items/182ac6b2fdd0a984f641)を導入しても良いかもしれません。
※うちは本体が1であり、どうしてもメモリが足りないようなので、諦めました。


##mp3spltを導入
[mp3splt](http://mp3splt.sourceforge.net/mp3splt_page/documentation/man.html)を導入します。OSが最新バージョンであれば特にaptのアップデートの必要なくinstallが可能です。

```shell:
$ sudo apt-get install mp3splt
```

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

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

これを反映させるため、録音シェルは少し改変を行います。
具体的には、mp3を格納するためのディレクトリを都度作成し、そこにmp3ファイルが出力されるようにします。
※mp3spltの引数「- d」で出力先のディレクトリを指定することもできます。その場合、修正は最後の一行のみで問題ありません。

```shell:/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が入るようであれば、無音時間をもう少し短めに設定する必要があります。
番組ごとにシェルファイルを作るか、このシェルの引数を増やすかすれば、番組ごとのカスタムが可能です。

そしてあえてスプリット前のファイルは削除せずに残しておきましょう。
万が一CMと間違えられて本編がカットされた場合にも聞き直せるようにするためです。
※「溜め」が発生するコーナーはカットされてしまう可能性が高いです。また伊集院の「鬱」の具合によっても無音時間が長くなるのかもしれません。

##cron登録

最後にcronを登録します。ついでに、「[伊集院光とらじおと](https://www.tbsradio.jp/ij/)」の方も設定を載せておきます。

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

```shell: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  |


この記事の反響が大きかったので、[追調査](https://qiita.com/el-coverage/items/c492082d675e6d490b33)してみました。こちらもご覧ください