NHK語学講座のらじる★らじる聴き逃しサービスを取得するRubyスクリプトradirudegogaku.rb(2020/4/2暫定版)
ごあいさつ
こんにちは。gogakuondemand.rb 作者の @riocampos です。ご無沙汰しております、というか gogakuondemand.rb をほとんど放置していて申し訳ありませんでした。
NHKゴガクでの語学番組ストリーミング配信がとうとう終了
NHKゴガクにて長らく独自配信を続けてきた語学番組のストリーミング配信がとうとう終わり、らじる★らじるの聴き逃しサービスに統合されました。なので gogakuondemand.rb は使えなくなりました 使えなくなったと思いましたが設定ファイル pref.rb の「school_year」を「2020」に変更したらダウンロード出来てることに4/6気付いた…*1(ただし現時点では「基礎英語0」だけはNHKゴガクに残ってますけど…どうなるんでしょうね 4/6時点では、2020年度もNHKゴガクでやるっぽい)。
らじる★らじる聴き逃しサービスからの取得
ということで対応スクリプトを作りました。しかしまだ不完全版でして、UI というか gogakuondemand.rb のような
"ラジオ英会話" => true,
のような設定ファイルがまだ作れてません。気長に開発してると年度始め第1週(というか昨年度最終週)のストリーミングが取得出来なくなっちゃうので、暫定版として公開しました。特に「レベルアップ 中国語」と「レベルアップ ハングル講座」は2019年度で終了してしまったのに、最終週だけらじる★らじる聴き逃しサービスでの公開なのよね(何を考えてんだ NHK、と思ってしまう)*2。
脱線しました。で、設定ファイル方式のほうが便利だとは思うので、今月中には改善しようと思っています。
(おまじないとしての)お断り
- このスクリプトの動作は保証されません。Mac にて開発していますので Windows での動作はよく分かりません。が、gogakuondemand.rb が動作していた環境であれば動作するはずです。
- このスクリプトで取得したストリーミング配信ファイルは私用にのみご利用ください。他の方が取得可能となる公開サイトへのアップロードなど著作権法違反行為は禁止します。
- 本スクリプトの著作権は放棄しておりません。有償アプリケーション作成の基礎にすることは絶対にやめてください。
必要環境
環境設定などについては以前の NHK語学講座のラジオ番組ストリーミングを取得するRubyスクリプトgogakuondemand.rb(v1804_1 2018/5/5更新版) - 別館 子子子子子子(ねこのここねこ)はてブロ部 などを参考にしてください。
スクリプトのダウンロードファイル
zip ファイルの中には radirudegogaku0.rb
一つだけ入っています。なにせ暫定版なので…。なので名前も radirudegogaku0.rb ですw
使い方
各語学番組にはそれぞれ ID が割り振られています。その ID は各番組サイトの URL で分かります。例えば
であればサイトの URL の末尾 0916_01
が ID です。radirudegogaku.rb では、この ID によりダウンロード番組を指定します。「ラジオ英会話」をダウンロードする場合は
$ ruby radirudegogaku0.rb 0916_01
とします。今日の時点でこのスクリプトを実行すると
$ ruby radirudegogaku0.rb 0916_01 1 1【ラジオ英会話(0916_01)】のダウンロードを開始します。 ラジオ英会話~ハートでつかめ!英語の極意~「Lesson236」_2020_03_23.m4a [##################################################] 903 / 903 秒完了 ラジオ英会話~ハートでつかめ!英語の極意~「Lesson237」_2020_03_24.m4a [##################################################] 903 / 903 秒完了 ラジオ英会話~ハートでつかめ!英語の極意~「Lesson238」_2020_03_25.m4a [##################################################] 903 / 903 秒完了 ラジオ英会話~ハートでつかめ!英語の極意~「Lesson239」_2020_03_26.m4a [##################################################] 903 / 903 秒完了 ラジオ英会話~ハートでつかめ!英語の極意~「Lesson240」_2020_03_27.m4a [##################################################] 903 / 903 秒完了 作業終了
となります。命令の次の行の「1」というのは「1つ目の番組の取得先指定ファイル(録音ファイルではない)を取得出来ました」という意味合いです。
複数の番組を指定する場合には、半角スペースで区切ってください。つまり「ラジオ英会話(ID: 0916_01)」と「遠山顕の英会話楽習(ID: 4794_01)」をダウンロードしたい場合には下のようにします。上で「ラジオ英会話」を取得済みなのでこのようになります。
$ ruby radirudegogaku0.rb 0916_01 4794_01 1 2 1【ラジオ英会話(0916_01)】のダウンロードを開始します。 更新はありません。 2【遠山顕の英会話楽習(4794_01)】のダウンロードを開始します。 遠山顕の英会話楽習「3月Dialog7」_2020_03_23.m4a [##################################################] 900 / 900 秒完了 遠山顕の英会話楽習「3月Dialog8」_2020_03_24.m4a [##################################################] 900 / 900 秒完了 遠山顕の英会話楽習「3月Review7・8」_2020_03_25.m4a [##################################################] 903 / 903 秒完了 作業終了
書き忘れていましたが、ダウンロードしたストリーミングファイルはスクリプトと同じフォルダに、それぞれの番組別に保存されます。
各語学番組のID
番組名 | ID |
---|---|
基礎英語1 | 0677_01 |
基礎英語2 | 0694_01 |
基礎英語3 | 0959_01 |
ラジオ英会話 | 0916_01 |
ボキャブライダー | 4121_01 |
エンジョイ・シンプル・イングリッシュ | 3064_01 |
英会話タイムトライアル | 2331_01 |
高校生からはじめる「現代英語」 | 4407_01 |
遠山顕の英会話楽習 | 4794_01 |
入門ビジネス英語 | 0914_01 |
実践ビジネス英語 | 0917_01 |
世界へ発信!ニュースで英語術 | 4812_01 |
まいにち中国語 | 0915_01 |
おもてなしの中国語 (2020年度上期で終了) |
4393_01 |
ステップアップ中国語 | 6581_01 |
レベルアップ 中国語 (2019年度で終了) |
2334_01 |
まいにちハングル講座 | 0951_01 |
おもてなしのハングル | 4795_01 |
レベルアップ ハングル講座 (2019年度で終了) |
2335_01 |
まいにちイタリア語 入門編 | 0946_01 |
まいにちイタリア語 応用編 | 4411_01 |
まいにちドイツ語 入門編 | 0943_01 |
まいにちドイツ語 応用編 | 4410_01 |
まいにちフランス語 入門編 | 0953_01 |
まいにちフランス語 応用編 | 4412_01 |
まいにちスペイン語 入門編 | 0948_01 |
まいにちスペイン語 中級編 (2019年度下半期は応用編でした) |
4413_01 |
まいにちロシア語 入門編 | 0956_01 |
まいにちロシア語 応用編 | 4414_01 |
アラビア語講座 | 0937_01 |
ポルトガル語入門 (2020年度上期で終了) |
1893_01 |
ポルトガル語 ステップアップ | 2769_01 |
基礎英語0は…どうなるんでしょうね。とりあえずNHKゴガクでの公開が続くのであれば gogakuondemand.rb でダウンロードできます。残念ながら現在の gogakuondemand.rb そのままではダウンロード出来ませんでした。更新予定です。
ファイルフォーマット
m4a(aac)のみです。mp3 希望の方は各々で直してください。 4/6追記:この後に動作しない mp3 変更方法を書いてしまっていました。申し訳ありません。オプション指定にて mp3 も選択出来るよう更新します。
スクリプトソース
このスクリプトに関して、ライセンスとかはよく知らないですが、ひとまず、利用や紹介をする場合には、この4/2分へのリンク
NHK語学講座のらじる★らじる聴き逃しサービスを取得するRubyスクリプトradirudegogaku.rb(2020/4/2暫定版) - 別館 子子子子子子(ねこのここねこ)はてブロ部
を貼ってください。
投げ銭
このスクリプトが役立ったときには、Amazonギフト券をお送り頂ければありがたいです。 メールアドレスは「riocampos22あっとまーくgmail.com」です。 よろしくお願いします。(お送り頂いた方、本当にありがとうございます。)
質問や希望を出される方へ
私も使ってるスクリプトなので、今後NHK側が行った変更には対応していくするつもりです。機能要望はOKですが、実現可能かどうかは私の開発能力に掛かっていますw基本的にはノーサポートであると理解してください。
そして、自分で環境構築が出来る方にしかサポートできません。「私でも出来るでしょうか?」「Rubyってなに?」「コマンドってなに?」という方は利用を諦めてください。
なお、質問などはここのコメント欄よりも @riocampos に送ってもらうほうが即応できると思います。DM もオープンにしてあります。
Have Fun! And Let's Learning!
私のように録音ファイルを取得するだけで満足せず、ちゃんと語学学習しましょうね☆
Watirを使う際にChromeDriverを自動的にインストールさせるrubygem webdrivers
自動化したいよね
ChromeDriver は Chrome のバージョンと合わせておく必要があり、合わないとエラーが出ます。しかし Chrome はしょっちゅう更新されていきますし、しかもタイミングによっては(なぜか)ChromeDriver のほうが先に更新されてしまって結果としてバージョンずれが生じてしまうこともあります。ChromeDriver を使いたいときは Selenium や Watir などで自動ブラウジングがしたいのであって、ChromeDriver のバージョンなどという些末な問題にとらわれて時間が取られるなんてイヤですよね。
(以前に ChromeDriver を手動で入れたときの記事:WatirでHeadless Chromeを使うまでのメモ - 別館 子子子子子子(ねこのここねこ)はてブロ部 つまり Homebrew で入れてました。)
Chrome に合った ChromeDriver を自動的にインストールさせる rubygem として chromedriver-helper gem があったのですが、2019年3月末で期限切れになり、別の gem である webdrivers gem が新しく提供されています。
webdrivers gem の紹介記事:サポートが終了したchromedriver-helperからwebdrivers gemに移行する手順 - Qiita
使い方
Watir 利用時の webdrivers gem の使い方ですが、Gemfile を使っている場合には
gem "webdrivers" gem 'watir'
そしてスクリプト本体で
require 'webdrivers/chromedriver' require 'watir'
と宣言しましょう。require 'webdrivers/chromedriver'
なのは、この gem が ChromeDriver 以外もインストールできるためです。しかし他のドライバを入れる必要は無いので ChromeDriver に限定しておきましょう。
なお heroku で headless Chrome と共に使う場合には Heroku buildpack google chrome の手順を確認しましょう。
Watir関係記事
引用したいWebサイトのURLとタイトルをはてな記法にするbookmarkletを改善した
未だにはてな記法が好き
この別館では Markdown で書いてますが本館では未だはてな記法を使っている @riocampos です。だって十年以上はてな記法ではてなダイアリー書いてきたんだし。 で、引用したいサイトのURLとタイトルを取るブックマークレット(旧版)
javascript:window.prompt('','['+%20location.href%20+':title='+%20document.title%20+']');void(0);
を使っておりました。
面倒なタイトルが時々ある
「面倒な」というのは、タイトルのなかに「|(パイプ)」が入っているサイト。はてな記法では「|」が表組みを意味するので、これが入っているとレイアウトが崩れてしまうのです。
いつも書いている「見にいきたい展覧会リスト」のサイトでは、基本的に表組みにリンクを入れているので「|」が入ると表が思いっきり崩れてしまうので、手動で直しておりました。
でもそれって馬鹿げてる。だって正規表現で見つけられるような問題をいちいち手で直してるんだし。なので改善したかったのだけど JavaScript が苦手なので手を付けられずにいました。
が、思い立って今日改善してみました。
ブックマークレットを改善
javascript:void(function(d,w){t=d.title;tr=t.replace(/[ ]*\|[ ]*/g,'%EF%BD%9C');w.prompt('','['+%20location.href%20+':title='+%20tr%20+']')})(document,window);
つまり「|(パイプ)」及びその前後の空白を「%EF%BD%9C(全角のパイプ|)」に置き換えています。
今後は安心
これでいちいち「|」を手動置換するよう気遣ったり、投稿した後にレイアウト崩れに気付いて修正し直したりするストレスから解放される、はずw
HT Recorderの録音ファイルのCompressはどの程度の圧縮か
iPhoneを録音機器として用いるのに必需品となるアプリHT Recorder
iPhone をしばしば録音機器として用いている @riocampos です。といっても音楽のためではなく、会議や講演会などの記録用として使用しています。もちろん Apple 提供のアプリである「ボイスメモ」もあるのですが、私はずーっと HT Recorder を使用しています。というのは、iPhone を使い始めた頃*1にいろいろ試した結果として HT Recorder を使い始め、それからずっと使ってるわけです。特に講演会などのホールでの録音だと、録音レベルが低くなりがちなのですが、 HT Recorder であればそのような心配もなく(ある程度)充分な音量とクリアな音質で聞き返すことができるのです。
開発者サイト:HT Recorder | Applied Voices LLC
App Store リンク:「HT Professional Recorder」をApp Storeで
現時点での価格は1200円*2であり、気軽に買える値段ではありません。ですがそれだけの価値があるアプリです。弱点は使い勝手がさほど良くないこと。でも音質には換えられません。
録音形式はWAVファイル
さて。 HT Recorder の録音形式は昔から変わらず WAV ファイルです。コンピュータでの音楽ファイルとして基本となるファイル形式ですので安心なのですが、いかんせんファイルサイズがとても大きくなります。とはいえモノラルなので20MB/10分ぐらいですが。
なので、録音したまま iPhone に保存したままにしておくと、iPhone の容量をとっても食います。対策としてはもちろん Mac/PC へ iTunes を使って移動させるのが一番です。ただ、聞き直したい場合にはやはり iPhone に残しておく必要があります。
で。HT Recorder には Compress という機能があります。名称通り圧縮機能です。というかやたらデカイWAV形式からm4a形式に変換するだけなんですけどね。圧縮するとファイルサイズ表示の右側に「!」が付きます。なお、復元するための Expand 機能もあります。
どの程度の音質のm4aにしてるのかな?
Compress した後の状況を今回確認してみたので記録しておきます。
FFprobe を使って確認した結果
- 今年8/31に HT Recorder を使って某所で録音した WAV ファイル(185MB)を FFProbe で確認しました。
PCM録音で 16KHz、ビットレートは 256kbit/s なので音声用としてはまあまあなのでは(音楽用のアプリじゃないですから)。
Input #0, wav, from '/Users/riocampos/Downloads/HT/Rec_Aug 31, 2019 13_52_01.WAV': Duration: 01:36:20.30, bitrate: 256 kb/s Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 16000 Hz, 1 channels, s16, 256 kb/s
- HT Recorder の Compress で圧縮させた m4a ファイル(18.0MB)を同じく FFProbe で確認しました。WAV に比べてファイルサイズが1/10ぐらいになってます。
ビットレートは 24kbit/s。
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/riocampos/Downloads/Rec_Aug 31, 2019 13_52_01.m4a': Duration: 01:36:20.61, start: 0.132000, bitrate: 24 kb/s Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 16000 Hz, mono, fltp, 24 kb/s (default)
- FFmpeg で何もオプションを付けずに WAV から m4a に変換しました。ファイルサイズは 50.4MB、1/4よりも大きいので、さほど圧縮できた気分になりませんね。
ビットレートは 69kbit/s。HT Recorder の設定より3倍くらい高め。
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/riocampos/Downloads/HT/Rec_Aug 31, 2019 13_52_01.m4a': Duration: 01:36:20.37, start: 0.000000, bitrate: 69 kb/s Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 16000 Hz, mono, fltp, 69 kb/s (default)
- FFmpeg でビットレートを 24kbit/s に指定して変換しました。つまり
ffmpeg -i file.WAV -ab 24k file.m4a
としたわけです。その結果、Compress とほぼ同程度の 17.8MB にまで抑えられました。
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/riocampos/Downloads/HT/Rec_Aug 31, 2019 13_52_01__24k.m4a': Duration: 01:36:20.37, start: 0.000000, bitrate: 24 kb/s Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 16000 Hz, mono, fltp, 24 kb/s (default)
結論:ビットレート 24kbit/s 設定でファイルサイズが 1/10
音質が違うかどうかはあとで確認します(いま聞けない状況なのでw)
*1:iPhone 3GS のころw
*2:昔でも1000円前後してたはず
はてなブログにpdfをobjectタグで埋め込む
原三溪展@横浜美術館の出品リスト(の魚拓)を埋め込む。
<object type="application/pdf" width="600" height="800" data="PDF_URL"></object>
iOS 内蔵ブラウザ( Safari ベース)ではプレビューとしてしか表示されない。のでページがめくれないのが残念。
.oO(ところで。HTML5では(4にあったような)空タグを避ける <ほにゃらら /> 的な記法は無くなったのかねえ)
参考
ffmpegやffprobeの出力にコピーライトやライブラリ情報を含ませない
-hide_banner
オプションを追加すればおk。
$ ffmpeg -hide_banner ... $ ffprobe -hide_banner ...
典拠
-hide_banner
Suppress printing banner.
All FFmpeg tools will normally show a copyright notice, build options and library versions. This option can be used to suppress printing this information.
aliasしておけばいいんじゃね
~/.bashrc
に書いておきましょう。私は ffprobe にだけ設定しました。
alias ffmpeg='ffmpeg -hide_banner' alias ffprobe='ffprobe -hide_banner'
Rubyで末尾に=が付くメソッドは「属性参照」と呼ぶらしい(英語だとAssignment Methods)
のコメントを書いたときに Ruby のリファレンスマニュアルを見直していました。Ruby 的にはどうやら「属性参照」と呼ぶらしいです(仮称のようにも感じますが)。ちなみに英語マニュアルだと Assignment Methods (代入メソッド)でした1。
代入
例:
foo.bar = baz文法:
式`.'識別子 '=' 式(中略)
属性参照
式1 `.' 識別子 '=' 式2
式 1
を評価して得られるオブジェクトに対して、識別子=
というメソッドを、式 2
を引数にして呼び出します。例:
class C def foo @foo end def foo=( v ) @foo = v end end c = C.new c.foo = 5 # c.foo=( 5 ) のように変換される p c.foo # => 5属性は
Module#attr
を使って同じように定義できます。例:
class C attr :foo, true end c = C.new c.foo = 5 # c.foo=( 5 ) のように変換される p c.foo # => 5