SynologyでNHKラジオ(らじるらじる)の録音
NHKラジオで英語の勉強をするから忘れずに録音するように、と妻が言うので、いくつかのサイトを軽く眺めたところ、家にある Synology DS218j が常時起動なので、便利に使えそう、と。 以下、やったことのメモ。
- らじるらじる m3u8 を ffmpeg で録音する(8放送局)2021/4 以降対応 · GitHub や 第95回 「らじる☆らじる」をHLS経由で:玩式草子─ソフトウェアとたわむれる日々|gihyo.jp … 技術評論社 を読めば、必要なことはおおよそ把握できると思います。ここでは Synology を使って録音する方法について。
- synology で ssh アクセスを有効化(コントロールパネル > 端末とSNMP > SSHサービスを有効化する)し、ログイン。
- 作業後は無効化
- 最初から ffmpeg (/bin/ffmpeg と /usr/ffmpeg) は入っていたが、このバイナリでらじるらじるの録音を試すと、以下のとおり、HTTPS 対応がないとのエラーで動作せず。
$ ffmpeg -i https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8 -t 10 a.mp3 ffmpeg version 2.7.1 Copyright (c) 2000-2015 the FFmpeg developers built with gcc 4.9.3 (crosstool-NG 1.20.0) 20150311 (prerelease) ... https protocol not found, recompile FFmpeg with openssl, gnutls, or securetransport enabled. https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8: Protocol not found
- むむと思いつつ、もう少し調べると、 SynoCommunity に ffmpeg パッケージがあるので、これを試してみることにした。
- SynoCommunity のパッケージを使えるようにするのは、SynoCommunityサイトのトップページに書いてあるとおりで、ごく簡単。あとは、通常通りパッケージマネージャーから ffmpeg をインストール。
- インストールした ffmpeg がどのパスに入ったのか行方不明になったが、、
/volume1/@appstore/ffmpeg/bin/ffmpeg
にいた。
$ /volume1/@appstore/ffmpeg/bin/ffmpeg ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers built with gcc 4.9.3 (crosstool-NG 1.20.0) 20150311 (prerelease)
$ /volume1/@appstore/ffmpeg/bin/ffmpeg -i https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8 -t 10 a.mp3 ... [hls,applehttp @ 0x1d28f90] Opening 'https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-20190730T172718-01-162/870.ts' for reading [hls,applehttp @ 0x1d28f90] Opening 'https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-20190730T172718-01-162/871.ts' for reading Input #0, hls,applehttp, from 'https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8': Duration: N/A, start: 35366.160411, bitrate: N/A Program 0 Metadata: variant_bitrate : 0 Stream #0:0: Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp Metadata: variant_bitrate : 0 Stream mapping: Stream #0:0 -> #0:0 (aac (native) -> mp3 (libmp3lame)) Press [q] to stop, [?] for help Output #0, mp3, to 'a.mp3': Metadata: TSSE : Lavf58.20.100 Stream #0:0: Audio: mp3 (libmp3lame), 48000 Hz, stereo, fltp Metadata: variant_bitrate : 0 encoder : Lavc58.35.100 libmp3lame size= 157kB time=00:00:10.00 bitrate= 128.5kbits/s speed=3.08x video:0kB audio:157kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.147653%
- というわけで、ひとまずは mp3 に落とせて、再生できることまでは確認。あとは、番組スケジュールにあわせて、決まった曜日の決まった時間から、決まった秒数を録音すればいい。(NHK、Akamai 使ってるんですな)
- まあ、 cron だよなと思い、 crontab を実行すると not found. おお。。落ち着いて見てみると、 /etc/crontab は存在していて、 crond も動いているようなので、system wide なのはどうかという気もしつつ、気にせず /etc/crontab に直接書くことに。
- 妻からのオーダーは、「エンジョイシンプルイングリッシュ」と「ラジオ英会話」の2つ。放送時間は、、
- エンジョイシンプルイングリッシュ: 月~金曜日 午前9:10~9:15
- ラジオ英会話: 月~金曜日 午前6:45~7:00
- cron の設定
- 月から金は 1-5 (Sunが0、7 なので)。
- 起動時間は、番組開始の1分前くらいか、と最初は思ったが、試してみると30秒くらい遅れている。例えば、9:10 開始の番組なら9:10 + 30秒くらいに開始してる。
- 5分番組は 300 sec だが後ろに1分のbuffer入れることにして、6分で 360 sec か。30秒くらいでいいのかもだけれど、crontab に小数点かけないようなので(細かくやるのなら ffmpeg 側でトリミングはできそう)。
- 保存場所は適当なとこ。今回は /var/services/music/NHK/
- Boxと連携させて、上記に保存すると自動的にBox側に同期されるようにして、スマホの Box アプリから聞けるようにしている。
$ cat /etc/crontab MAILTO="" PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin #minute hour mday month wday who command ... 10 9 * * 1-5 root /var/services/homes/kenishi8/radiru.sh 360 EnjoySimpleEnglish 45 6 * * 1-5 root /var/services/homes/kenishi8/radiru.sh 960 RadioEIKAIWA
crontab から呼んでいるシェルスクリプト。いろいろと決め打ちで。
$ cat radiru.sh #!/bin/bash DATE=`date '+%Y%m%d'` R2='https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8' OUT='/var/services/music/NHK' if [ $# -ne 2 ]; then echo "Usage: $0 [duration in sec] [program name]" exit 1 fi /volume1/@appstore/ffmpeg/bin/ffmpeg -y -i $R2 -t $1 $OUT/$2_$DATE.mp3
Crond の設定ファイル(crontab)をリロード。
$ sudo synoservice --reload crond $ sudo synoservice --status crond Service [crond] status=[enable] required upstart job: [crond] is start. =======================================
Cronの時間を変えてテストすると、
$ ls -lh /var/services/music/NHK/ total 6.5M -rwxrwxrwx+ 1 root root 6.5M Sep 7 15:54 EnjoySimpleEnglish_20190907.mp3
まあ、取れていそう。ただ、ファイルサイズが随分と大きいのと、iTunes で再生してみると、録音したはずの時間よりも長い時間が表示される?? 再生してみると、実際は再生の最後のほうで飛ぶので、iTunes の表示上の問題(かファイルの問題)のようだが、なんか変。
Encode/MP3 – FFmpeg でサンプリングレートを指定すればいいという情報があったので、変えてみる。どうせAMラジオなんで、-q:a 6
という低めのビットレート指定で試すと、無事 iTunes の表示問題も解消。
/volume1/@appstore/ffmpeg/bin/ffmpeg -y -i $R2 -q:a 6 -t $1 $OUT/$2_$DATE.mp3
あとは、mp3 のタイトルなどのメタデータですかね。 ffmpegを使ったメタデータの追加・変更 - 脳内メモ++ とか FFmpeg Metadata - MultimediaWiki とか参考に、とりあえずタイトルとか適当にいくつか設定するようにしたのが以下。
TITLE=$2_$DATE ARTIST=NHK ALBUM=$2 GENRE=Radio /volume1/@appstore/ffmpeg/bin/ffmpeg -y -i $R2 -q:a 6 -metadata title=$TITLE -metadata artist=$ARTIST -metadata album=$ALBUM -metadata genre=$GENRE -t $1 $OUT/$2_$DATE.mp3
ファイルサイズもぐっと小さくなった。
$ ls -lh /var/services/music/NHK/ total 3.4M -rwxrwxrwx+ 1 root root 3.4M Sep 7 16:52 EnjoySimpleEnglish_20190907.mp3
あとは、前後のバッファーの調整だろうか。ffmpeg のオプション、-ss や -to, -t あたりを組み合わせてもう少し調整はできそう。(参考 ffmpeg で指定時間でカットするまとめ | ニコラボ)
追記。 2022.02 末ごろに URL が変更されていた。 https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8 となっている箇所は https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8 と置き換えを。シェルスクリプトのところだけ置換済み。
USB無線子機 WLI-UC-GNM2 を Ubuntu 17.04 で使う
古いデスクトップPC(Pentium4 3.40GHz)に Lubuntu 17.04 を入れて、息子にあげていたが、やはりインターネットにつなぎたいとのこと。とりあえずイーサネットケーブルを延ばしてつなげてあげていたが、ケーブルが邪魔ということで、無線化を検討。実家に落ちていた Buffalo の WLI-UC-GNM2 という 11n の小さいUSBのWIFIアダプタを使うことにした。
以下そこでハマったことなどのメモ。試したのは Lubuntu 17.04 だが、Ubuntu 17.04 でも同じはず。
1.ひとまずUSBポートにさしてみる。
-> SSID がすぐに一覧表示されて、パスワード入力してつながるかと思いきや、つながらない。。
2.Google に聞きつつ、少し調べてみる。
$ lsusb
Bus 001 Device 005: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
・・・
製品名含めて、認識されているみたい。Ralink RT3070 というのがドライバーらしい。
RT3070 というのをキーワードにして、検索。ヒットしたのは、どれも古い記事だったり、Mediatek (Ralinkのドライバーの製造元?) のサイトでドライバーをダウンロードしてソースコードをいじって、make && make install するようなものが多い。一応ダウンロードしてみてみるも、かなり古いファイルで対象がカーネルが 2系なので、4系のUbuntu 17.04 で動くとは思えない。。
$ ifconfig
...
wlx106f3f32e1b2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
...
wlx106f3f32e1b2 というのが eth0 みたいなのと同じインタフェース名(長いな・・)。
$ dmesg
・・・
[ 580.412597] rt2800usb 1-7:1.0 wlx106f3f32e1b2: renamed from wlan0
[ 580.664638] IPv6: ADDRCONF(NETDEV_UP): wlx106f3f32e1b2: link is not ready
[ 617.020490] ieee80211 phy1: rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'
[ 617.094985] ieee80211 phy1: rt2x00lib_request_firmware: Info - Firmware detected - version: 0.36
[ 617.508160] IPv6: ADDRCONF(NETDEV_UP): wlx106f3f32e1b2: link is not ready
[ 617.729908] IPv6: ADDRCONF(NETDEV_UP): wlx106f3f32e1b2: link is not ready
[ 618.599832] IPv6: ADDRCONF(NETDEV_UP): wlx106f3f32e1b2: link is not ready
[ 619.523811] IPv6: ADDRCONF(NETDEV_UP): wlx106f3f32e1b2: link is not ready
[ 621.563603] wlx106f3f32e1b2: Trigger new scan to find an IBSS to join
[ 624.737827] wlx106f3f32e1b2: Trigger new scan to find an IBSS to join
[ 626.581246] wlx106f3f32e1b2: Creating new IBSS network, BSSID 62:0a:0a:44:c6:f6
[ 626.628698] IPv6: ADDRCONF(NETDEV_CHANGE): wlx106f3f32e1b2: link becomes ready
[ 626.965547] nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
[ 628.623999] IPv6: ADDRCONF(NETDEV_UP): wlx106f3f32e1b2: link is not ready
[ 629.483903] IPv6: ADDRCONF(NETDEV_UP): wlx106f3f32e1b2: link is not ready
[ 630.359909] IPv6: ADDRCONF(NETDEV_UP): wlx106f3f32e1b2: link is not ready
[ 631.308392] IPv6: ADDRCONF(NETDEV_UP): wlx106f3f32e1b2: link is not ready
[ 633.339306] wlx106f3f32e1b2: Trigger new scan to find an IBSS to join
[ 636.457202] wlx106f3f32e1b2: Trigger new scan to find an IBSS to join
[ 638.356810] wlx106f3f32e1b2: Creating new IBSS network, BSSID 8e:c2:a9:ed:d5:d0
・・・
dmesg をみると、 IPv6 系のエラーは一旦無視するとして、BSSID をころころ変えているのが見える。上の例だと、 BSSID 62:0a:0a:44:c6:f6 からBSSID 8e:c2:a9:ed:d5:d0。なんだこりゃ。。
とりあえず、おかしそうな動きをしていることはわかったが、どうすればいいのか不明なので、 Google に質問(笑)。
3. みつかった!
古い記事は不要なので、17.04 とかもキーワードに入れつつ調査したら、以下の記事が。。
i tried to install my Ralink RT3070 wireless driver but i got an error!
https://askubuntu.com/questions/928838/i-tried-to-install-my-ralink-rt3070-wireless-driver-but-i-got-an-error/928926
上記の answer に17.04 系にはRT3070をサポートしているrt2800usbドライバーにバグのあることが示唆。。なんと。。
Ubuntu 17.04/17.10: New feature in NetworkManager stops several WiFi adapters from working (MAC Address Randomization issue)
https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/1681513
該当のバグである上記記事を読むと、NetworkManager の新しいプライバシー機能の影響で、 一部の USB WIFI adapter が動かなくなっている、とのこと。この新しい機能は WIFI につなぐ際に毎回 random MAC アドレスをOS側に伝えるとか。これによって、まちなかのWIFIとかを何度も使う時でも、誰がつないでいるのか特定されづらくする、と。ふむふむ。ダウンサイドは今回のような一部のWIFIアダプターが、MACアドレスを何度も変更されようとすることで、挙動がおかしくなるとかで、結果的にWIFIにつなげられなくなる、と。
で、対処方法は、Jesse という方が #1 で書いているとおりで、
(1)
/etc/NetworkManager/NetworkManager.conf をエディタで開いて、以下の2行を末尾に追記。
[device]
wifi.scan-rand-mac-address=no
(ランダムMACを無効化)
(2) NetworkManager サービスのリブート。
$ sudo service network-manager restart
これだけではだめだったので、「WIFIを有効にする」のチェックを外してから、再度入れたら、ついにつながった。
(この部分は単に、一回OSごとリブートでも同じなはず。)
$ ifconfig
...
wlx106f3f32e1b2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.5 netmask 255.255.255.0 broadcast 192.168.10.255
...
$ ping www.google.com
PING www.google.com (172.217.26.100) 56(84) bytes of data.
64 bytes from kix05s01-in-f4.1e100.net (172.217.26.100): icmp_seq=1 ttl=50 time=15.6 ms
64 bytes from kix05s01-in-f4.1e100.net (172.217.26.100): icmp_seq=2 ttl=50 time=15.7 ms
^C
--- www.google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 15.663/15.727/15.792/0.141 ms
OK! つながった。
以上。