NHKの語学講座を自動録音する
はじめに
NHKではラジオ第2放送で多くの語学番組が放送されています。
この記事では、ストリーミングされている語学番組を自動録音し、自分の聴きたい時間に再生できるようにする方法を紹介します。
動作確認はLinuxで行なっていますが、Macでもcron以外の部分は同様にできます。
Macでの自動実行についてはこの記事を参照して下さい。
NHKラジオサービスに関する設定情報取得
ブラウザでhttps://www.nhk.or.jp/radio/config/config_web.xml にアクセスすると次のように表示されます。
これはNHKのラジオサービスに関する設定情報です。
xmlファイルの内容
<radiru_config>
<!-- お知らせ -->
<info>
<![CDATA[ /radio/include/oshirase.txt ]]>
</info>
<!-- 各地域のストリームURL -->
<stream_url>
<data>
<areajp>札幌</areajp>
<area>sapporo</area>
<apikey>700</apikey>
<areakey>010</areakey>
<r1hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023545/nhkradiruikr1/master.m3u8 ]]>
</r1hls>
<r2hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 ]]>
</r2hls>
<fmhls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023546/nhkradiruikfm/master.m3u8 ]]>
</fmhls>
</data>
<data>
<areajp>仙台</areajp>
<area>sendai</area>
<apikey>600</apikey>
<areakey>040</areakey>
<r1hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023543/nhkradiruhkr1/master.m3u8 ]]>
</r1hls>
<r2hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 ]]>
</r2hls>
<fmhls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023544/nhkradiruhkfm/master.m3u8 ]]>
</fmhls>
</data>
<data>
<areajp>東京</areajp>
<area>tokyo</area>
<apikey>001</apikey>
<areakey>130</areakey>
<r1hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023229/nhkradiruakr1/master.m3u8 ]]>
</r1hls>
<r2hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 ]]>
</r2hls>
<fmhls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023507/nhkradiruakfm/master.m3u8 ]]>
</fmhls>
</data>
<data>
<areajp>名古屋</areajp>
<area>nagoya</area>
<apikey>300</apikey>
<areakey>230</areakey>
<r1hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023510/nhkradiruckr1/master.m3u8 ]]>
</r1hls>
<r2hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 ]]>
</r2hls>
<fmhls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023511/nhkradiruckfm/master.m3u8 ]]>
</fmhls>
</data>
<data>
<areajp>大阪</areajp>
<area>osaka</area>
<apikey>200</apikey>
<areakey>270</areakey>
<r1hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023508/nhkradirubkr1/master.m3u8 ]]>
</r1hls>
<r2hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 ]]>
</r2hls>
<fmhls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023509/nhkradirubkfm/master.m3u8 ]]>
</fmhls>
</data>
<data>
<areajp>広島</areajp>
<area>hiroshima</area>
<apikey>400</apikey>
<areakey>340</areakey>
<r1hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023512/nhkradirufkr1/master.m3u8 ]]>
</r1hls>
<r2hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 ]]>
</r2hls>
<fmhls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023513/nhkradirufkfm/master.m3u8 ]]>
</fmhls>
</data>
<data>
<areajp>松山</areajp>
<area>matsuyama</area>
<apikey>800</apikey>
<areakey>380</areakey>
<r1hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023547/nhkradiruzkr1/master.m3u8 ]]>
</r1hls>
<r2hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 ]]>
</r2hls>
<fmhls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023548/nhkradiruzkfm/master.m3u8 ]]>
</fmhls>
</data>
<data>
<areajp>福岡</areajp>
<area>fukuoka</area>
<apikey>501</apikey>
<areakey>400</areakey>
<r1hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023541/nhkradirulkr1/master.m3u8 ]]>
</r1hls>
<r2hls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 ]]>
</r2hls>
<fmhls>
<![CDATA[ https://radio-stream.nhk.jp/hls/live/2023542/nhkradirulkfm/master.m3u8 ]]>
</fmhls>
</data>
</stream_url>
<!-- noa api -->
<url_program_noa>
<![CDATA[ //api.nhk.jp/r7/pg/now/radio/{area}/now.json ]]>
</url_program_noa>
<!-- program detail api -->
<url_program_day>
<![CDATA[ //api.nhk.jp/r7/pg/date/{service}/{area}/[YYYY-MM-DD].json ]]>
</url_program_day>
<!-- program info api -->
<url_program_detail>
<![CDATA[ //api.nhk.jp/r7/t/broadcastevent/be/{broadcastEventId}.json ]]>
</url_program_detail>
<!-- tweet cgi @radiru -->
<radiru_twitter_timeline>
<![CDATA[ //cgi4.nhk.or.jp/tweet/api/tweet.cgi?twname=nhk_radiru ]]>
</radiru_twitter_timeline>
</radiru_config>
M3U8形式のプレイリストファイル取得
上のxmlファイルから適当なエリアのURLを使用します。
例えば、大阪エリアの第2放送なら https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 となります。
第2放送はどのエリアも共通で、上のxmファイルから https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 となります。
(kkddさんのご指摘により修正しました。ありがとうございました。)
このURLをcurlでアクセスしてファイルに保存します。ここでは保存するファイル名をmaster.m3u8 としています。
$ curl -O https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 maser.m3u8
curl で取得したmaster.m3u8ファイルの中身を確認します。
例えば、次のようになっています。
master.m3u8ファイルの内容
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=52800,AVERAGE-BANDWIDTH=52800,CODECS="mp4a.40.5"
https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master48k.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=52800,AVERAGE-BANDWIDTH=52800,CODECS="mp4a.40.5"
https://radio-stream.nhk.jp/hls/live/2023501-b/nhkradiruakr2/master48k.m3u8
URLが二つありますが、これらがストリーミングのURLとなります。
ffplayで再生できるか確認
二つのURLがありますが、ffplayで再生できることを確認できればどちらでもOKです。
以下のように、ffplayの引数にURLを与えて再生できるか確認します。
$ ffplay https://radio-stream.nhk.jp/hls/live/2023501-b/nhkradiruakr2/master48k.m3u8
ffmpegで録音できるか確認
ffplayコマンドで再生が確認できれば、続いてffmpegコマンドでファイルに保存できるか確認します。
$ ffmpeg -i https://radio-stream.nhk.jp/hls/live/2023501-b/nhkradiruakr2/master48k.m3u8 -t 60 -codec:a libmp3lame -qscale:a 2 test.mp3
カレントディレクトリに1分間録音したtest.mp3ファイルができるはずです。
確認のため、このファイルを適当なアプリで再生してみます。
オプションの意味は以下の通りです。
-t 60:: 60秒間録音します。
-codec:a libmp3lame: 音声コーデックを指定し、MP3形式の音声をエンコードするためのライブラリlibmp3lameを使用して出力ファイルがMP3形式でエンコードされます。
-qscale:a 2:音声の品質を指定し、値が小さいほど高品質になります。
シェルスクリプトの作成
以下のシェルスクリプトを作成します。
#!/bin/zsh
# NKH第2放送を録音する
# Mar. 16th 2025
OUTDIR='/どこかの/保存したい/ディレクトリ'
# このURLは変更されるかも
URL="https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master48k.m3u8"
# 録音時間15分(単位は秒: ストリーミング開始に遅延がある場合は30秒程度長くする必要がある。)
# TIMER=900
TIMER=930
OPT=(-loglevel error -t $TIMER -codec:a libmp3lame -qscale:a 2)
# ファイル名はyymmdd.mp3
OUTFILE=$OUTDIR"/"$(date +"%Y%m%d").mp3
ffmpeg -i "$URL" "${OPT[@]}" "$OUTFILE"
シェルスクリプトの実行
次のようにシェルスクリプトを実行可能にしてから実行し、OUTDIRで指定したディレクトリにyymmdd.mp3のファイルができるか確認します。TIMERが900となっているので、15分間録音されます。
$ chmod +x record.sh
$ ./record.sh
cronで自動実行
シェルスクリプトの動作が確認できれば、cronで自動録音するように設定します。
次の例は月曜から金曜(1-5)の午前9時15分に/home/hoge/shellに置いたrecord.shが実行されます。
$ crontab -e
15 9 * * 1-5 /home/hoge/shell/record.sh
15 9 1-5 * * /home/hoge/shell/record.sh
(上のように、crontabの記述に誤りがあったので修正しました。曜日を指定するフィールドの誤りです。)
録音を開始する時刻についてはNHKの番組表を参照して下さい。
ストリーミング開始に遅延があるので、cronで設定するには1分開始時刻を遅らせるか、録音時間を30秒程度長くする必要がありそうです。
Discussion
こんにちは。
第2放送については各局共通でのようです(
2023501/nhkradiruakr2
)。こんにちは。ご指摘ありがとうございました。
xmlファイルを確認したところ、各局共通でした。本文を書き換えました。