NHKの語学講座を録音する(2021年版)

なぜか3月になると,来年度こそNHKの語学講座で英語をものにしよう!というやる気が起きるものです。

 昔はカセットテープに録音するしかなかったわけで,タイマー録音も簡単ではなく,録音するにもリアルタイムに放送を聞きながら,というのが普通だったでしょうか。再生も,ダイアログだけリピート再生しながらシャドーイング,なんてことは不可能でしたね。

 今は,放送を音声ファイル化すれば,区間リピートのできるアプリで,ダイアログだけとか,練習のところだけとかを何度もリピートして,トレーニングできます。便利になったものです。(当方今年50歳)

 かつても,放送をPCで自動で録音するってのを試みたことがあり,備忘録的にこのブログにも書いていましたが,そういうのはすっかり忘れてて,また一からトライしました。結果,昔やった方法よりスマートで,複数講座を録音するのに,1日に何度も自動で電源オン,シャットダウンを繰り返えせて,省エネの自動化ができたので,ご紹介します。

事前に用意するもの

cron

自動で録音するのにジョブスケジューラのcronを使います。私はarch linuxですが,cronを実装したパッケージにいくつかあるようです。どれがいいのか今ひとつ分かりませんが,とりあえず一番上にあったcronieパッケージをインストールしました。忘れずに,サービスを有効化・開始しておきましょう。新しいPCでスケジュールを設定しようとして,cronieのインストールが必要なのはcrontab -e コマンドを実行してみて,そんなファイルやディレクトリはないですって言われたのですぐわかりました。しかし,が,sudo systemctl enabel cronieをやっとかないと使えないのに気づくのに2日かかりました。

cronのarch wiki

rtcwake

自動でPCを起動するのに使います。最初っから入っていたと思います。

コマンドの使い方はここ辺りを参照してください。

rtcwake - 指定時間になったらスリープ/休止状態/電源OFFから自動的に復帰 - 憩いの場【Linux】

ffmpeg

これは,あとからインストールした記憶ですが,依存関係としてインストールしてますね。audacityか,firefoxあたりと一緒にインストールされたっぽです。

onedrive

録音したあと,onedriveにアップロードするのに使います。なぜOneDriveなのか? 最初はDropboxを使っていたのですが,私がデスクトップ環境を使っていなくて,OpenboxのオートスタートでDropboxのアプリを起動させていたのですが,これが自動起動に時折失敗して,ローカルで録音に成功しても,クラウドにアップロードされないことがままあったためです。OneDriveだと,コマンドラインツールで確実にクラウドにアップロードできるので,OneDriveを使うことにしました。

OneDrivetとの同期ツールは,ディストロによってはパッケージがあるようです。archのAURには,放棄されてアップデートされていないskilionさんのソースを使うのと,skilionさんのフォークで現在もアップデートされているabrauneggさんのソースを使うのと2つあるので,abrauneggさんの方をインストールしましょう。メンテナー二人,AUR上で喧嘩しています(笑)。コマンドの使い方が2つで違うようなので,ご注意ください。abrauneggさんのGitのページはこちら。

GitHub - abraunegg/onedrive: OneDrive Client for Linux

archはAURからビルド,インストールしてください。

Ubuntuリポジトリが用意してありますね。

sudo add-apt-repository ppa:yann1ck/onedrive
sudo apt-get update
sudo apt install onedrive

インストールが終わったら,ターミナルでonedriveとだけコマンドを入力して実行します。するとURLが表示されるので,そのURLをウェブブラウザで開きます。OneDriveのログイン画面が出てくるので,IDとパスワードを入力してログインします。正しくログインできたら,真っ白な何も表示されないページにリダイレクトされるので,リダイレクトされたURLをコピーして,ターミナルに入力したら,初期設定は完了です。

私が録音する講座

私は,

  • 中高生の基礎英語 in English
  • ラジオ英会話
  • ラジオビジネス英語
  • 高校生から始める「現代英語」

の4講座を聞くという挑戦的な計画を立てました。

高校生から始める「現代英語」の放送は木,金のみなので,月,火,水が6時半から2講座と9時15分から1講座,木,金はそれに加えて午後10時の1講座と,合計3回,自動でPCを起動させて録音し,音声ファイルをonedriveにアップロードしてシャットダウンという作業をPCにやらせます。私は,onedriveからファイルをスマホにダウンロードして,アプリで繰り返し聞くだけです。

自動でPCを起動する

オートログイン

システムにログインしないと,いくらジョブをスケジューリングしても実行されないので,パスワードを入力せずにログインできるようにディスプレーマネージャを設定しておきます。

スケジュールの記述の仕方

cronでジョブをスケジューリングするには,crontab -e とコマンドを入力して,起動したエディタでスケジュールを編集していきます。archの場合,エディタはviを起動させようとしますが,ヘタレでviが使えない私は,export EDITOR=nanoをまず実行して,からcrontab -eを実行して,nanoで編集しています。

cronの書き方は

分 時 日 月 曜日 コマンド

とスペースで区切って記述します。ワイルドカードの*が使えます。

0 * * * * コマンド

だと1年365日毎時0分にコマンドが実行されます。

曜日は,0が日曜日で,6が土曜日です。

rootでのスケジュールが必要

自動でPCの電源を入れるためにrtcwakeコマンドを使いますが,rtcwakeはrootでないと実行できません。crontab -eで編集できるのは,ログインしているユーザでのスケジューリングなので,一般ユーザの状態でcrontab -eを実行しても,rtcwakeコマンドはエラーとなって実行されません。なので,rtcwakeコマンドのスケジューリングは,スーパーユーザになって,crontab -eを実行して行います。suコマンドを実行して,プロンプトが#になった状態でcrontab -eを実行します。

rtcwakeの使い方

rtcwake -m モード -t 起動時間

モードでnoと指定すると,単純な電源オンです。

起動時間は,1970年1月1日午前0時からの経過秒数(UNIX時間)で指定しますが,そんな秒数は人間では計算できませんので,dateコマンドに計算させます。フォーマットを+%sとしてUNIX時間を指定し,-dオプションで日時を指定します。

rtcwake -m no -t $(date +%s -d "時刻")

この時刻の表現がかなり柔軟な記述ができます。楽ちんです。

具体例

私のスーパーユーザでのcrontabの記述です。

放送の5分前に起動して,放送開始時に次の起動時間を指定するrtcwakeコマンドを実行し,放送終了10分後にシャットダウンするように記述しています。shutdownはrootでなくてもいいわけですが,わかりやすいようにこちらの記述。

ハマったのが,%をエスケープしないと行けなかったこと。これを解明するのに数ヶ月かかりました・・・。

30 6 * * 1,2,3,4,5 /usr/sbin/rtcwake -m no -t $(date +\%s -d "today 9:10")
10 7 * * 1,2,3,4,5 shutdown -h now
15 9 * * 1,2,3 /usr/sbin/rtcwake -m no -t $(date +\%s -d "tomorrow 6:25")
15 9 * * 4,5 /usr/sbin/rtcwake -m no -t $(date +\%s -d "today 21:55")

40 9 * * 4,5 shutdown -h now

0 22 * * 4 /usr/sbin/rtcwake -m no -t $(date +\%s -d "tomorrow 6:25")

0 22 * * 5 /usr/sbin/rtcwake -m no -t $(date +\%s -d "sunday 19:55")

25 22 * * 4,5 shutdown -h now

0 20 * * 0 /usr/sbin/rtcwake -m no -t $(date +\%s -d "tomorrow 6:25")
10 0 * * 1 shutdown -h now

多分,todayはいらんと思います。

rtcwakeの絶対パスが指定してあるのは,なかなかcronでrtcwakeを実行させられないときにググった情報によって絶対パスをしてしてみた名残です。多分コマンド名だけで行けるはず。

流れを見ていくと

  1. 月-金の午前6時25分に起動(基礎英語3とラジオ英会話用)
  2. 6時30分に,当日の午前9時10分に起動するようにrtcwakeコマンドを実行
  3. ラジオ英会話が終わって10分後の7:10にシャットダウン
  4. 9時10分に起動(ビジネス英語用)
  5. 9時15分に,月-水は,次の日の午前6時25分に起動するようにrtcwakeコマンドを実行(→1.)
  6. 9時15分に,木,金は,当日の21時55分に起動するようにrtcwakeコマンドを実行
  7. 木,金の21時55分に起動(高校生から始める現代英語用)
  8. 木の22時に,次の日の午前6時25分に起動するようにrtcwakeコマンドを実行(→1.)
  9. 金の22時に,日曜日の午後7時55分に起動するようにrtcwakeコマンドを実行
  10. 日曜日の午後7時55分に起動(American Top 40用)
  11. 日曜日の午後8時に,月曜日の午前6時25分に起動するようにrtcwakeコマンドを実行(→1.)

すみません。洋楽が好きで,日曜日の午後8時から,カナダのラジオ局が流しているAT40も録音しているので,こんな複雑なスケジューリングになっています。

cronでスケジュールした以外で手動で起動すると,rtcwakeコマンドで設定した次の起動予定は消えてしまうので,忘れずに手動で次の起動時刻を設定する必要があります。ですので,

sudo rtcwake -m no -t $(date +%s -d "次の起動時刻")

を実行しましょう。rootで実行するのにsudo付きで,%のエスケープはいりません。

さてと,これで,電源のオンオフが自動でできるようになりました。次は録音です。

ffmpegで録音

ffmpegの使い方は簡単です。

ffpmeg -i 入力ソース -c:a 音声コーデック -t 録音時間 保存ファイル名

ストリーミングのアドレスは,らじる★らじるでラジオ第2を実際に再生させながら,開発者ツールのネットワークタブを見るとわかります。今のところ,基礎英語3の場合,これで録音できています。

これを,自分のアカウントのcrontabに書き込みます。自分のアカウントでログインして,ターミナルのプロンプトが$の状態でcrontab -eを実行して,録音のスケジュールを記述しましょう。

29 6 * * 1,2,3,4,5 ffmpeg -i 'https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8' -c:a copy -t 0:17:00 /tmp/basic_english3.aac

コーデックはcopyとして,オリジナルをそのまま指定,録音時間は,放送開始の1分前から17分間としました。余裕を前後1分を見たつもりでしたが,どうも30秒遅れくらいでストリーミングされているようなので,放送開始ちょうどの時間から16分間からでもよさそうです。

録音中,ffmpegが何度もストレージにアクセスするので,SSDが劣化しそうで嫌だったので,/tmpディレクトリに保存するようにしています。コーデックはaacだったので,拡張子もaacにします。

OneDriveへアップロード

放送終了後5分後に/tmpに保存した音声ファイルをOneDriveに保存します。さくっと短時間で同期を終了させたいので,選択したフォルダだけ同期できるように,OneDriveの下にNHKディレクトリを作り,そこにコピー(移動)します。

50 6 * * 1,2,3,4,5 mv /tmp/basic_english3.aac ~/OneDrive/NHK/basic_english3_$(date +\%F).aac

ファイルをNHKフォルダに移動させる際に日付を入れるようにしています。

そして,その1分後にOneDriveのクラウドにアップロードです。

51 6 * * 1,2,3,4,5 onedrive --synchronize --single-directory 'NHK' --upload-only --no-remote-delete

--single-directory 'NHK' でNHKディレクトリだけの同期

--upload-onlyオプションでローカルからクラウドへの一方通行の同期

--no-remote-deleteオプションで,ローカルにないクラウド上のファイルを削除しないよう指定

これで,~/OneDrive/NHKに新たに保存したファイルだけがクラウドにアップされます。

 

あとは,スマホのOneDriveアプリからアクセスするだけです!!