Podcast × 速聴 – Podcastを速聴してみる(新刊JP)
Podcast に登録している番組の数が増えてきたというのと、以前ちょっと興味を引かれた速聴なるものを試したいと思い、「じゃあ、Podcastを速聴してみよう」と企ててみました。
速聴については、簡単に言えば
「普通に話しているスピードの3-4倍以上で話を聞くと、普段の言語処理を行う際には使用されない脳の部分が活性化され、記憶力などの脳力向上に役立つ」
というものです。
どうやって、Podcastを3-4倍速で聞こうか?という部分ですが
- Podcast再生時にipodの再生速度を変更する機能を使用する
- Podcastに登録される前に、mp3の音声データを編集しておく(3-4倍速に変換しておく)
という2種類の方法が考えられると思いますが、1の方法では
- せいぜい20%くらいの速度変換しかできない
- オーディオブックしか再生速度を変えられない
という事で、自宅にある余っているLinux+ Apacheを使用して自分用のフィードに変換(mp3 + rssを編集)して、それをPodcastに登録する事にしました(下図)
最近個人的によく聞く、新刊JPで配信している新刊のダイジェスト(火木土更新)での例。
- rssファイルを新刊JPのサイトから取得
- 1のファイルをparseして、各エントリのmp3ファイルをダウンロードする。
- ダウンロードしたmp3を3-4倍速に変換。
- 変換済みのmp3ファイルのパスを、1のrssファイルでの各エントリの ファイルとして書き換える
- 変換済みのmp3ファイル+編集済みのrssファイルをapacheのディレクトリに配置する。
- iTuneから、5のurlを指定してpodcastを登録する
Linuxマシンの方で必要なものは下記ですが、sox以外はデフォルトで使用できるのではないでしょうか?
- ruby
- 本体
- ライブラリ
- rexml
- open-uri
- Linuxコマンド
- wget
- sox (mp3編集ツール)
処理としては、上記のツールをつなぎ合わせているだけのようなものなので、
シェルでもできとおもいますが、勉強も兼ねてRubyで書いてみました。
あとは、更新日にあわせてCronに登録しておけばよいでしょう
#!/usr/bin/ruby require 'open-uri' require 'rexml/document' # global variables $feed_org = "http://www.sinkan.jp/rss.xml" #新刊JPダイジェストのRSS $data_dir = "/var/www/xxx/xxx/" #Linuxのhttpdディレクトリ $data_dir_url = "htttp://hostname/xxx/xxx/" #↑のurl $username = "username" #新刊JPのユーザー名(メールアドレス) $password = "password" #パスワード class Feed def initialize(feed_path) @feed_path = feed_path @rss_file_name = @feed_path.split(/\//)[-1] @feed_local = $data_dir + @rss_file_name doc = REXML::Document.new(open(@feed_path).read) @rss_root = doc.root @feed_items = Array.new @rss_root.elements.to_a("/rss/channel/item").each { |i| @feed_items.push( FeedItem.new(i)) } end def comp_feed_entry(org_idx,stretch_rate) @feed_items[org_idx].stretch_rate = stretch_rate @feed_items[org_idx].download_mp3($username,$password) @feed_items[org_idx].time_stretch end def comp_all(stretch_rate) for i in 0..@feed_items.size - 1 comp_feed_entry(i,stretch_rate) end @rss_root.elements["/rss/channel/title"].text = "[" + stretch_rate.to_s + " ]" + @rss_root.elements["/rss/channel/title"].text + "_" end def save_feed local_doc = File.open(@feed_local,"w") @rss_root.write local_doc end end class FeedItem def initialize(rss_node,stretch_rate = "") @rss_node = rss_node @stretch_rate = stretch_rate # rss node mapping @title = @rss_node.elements['title'] @mp3_path = @rss_node.elements['enclosure'].attributes['url'] @mp3_name = @mp3_path.split(/\//)[-1] end def time_stretch puts @stretch_rate stretched_mp3_name = @mp3_name.sub(/(.+?)\.(.+)/) {|m| $1 + "_" + @stretch_ rate.to_s + "." + $2 } stretched_mp3_path = $data_dir + stretched_mp3_name command_line ="sox " + @mp3_path + " " +stretched_mp3_path + " stretch " + @stretch_rate.to_s puts command_line system(command_line) @title.text = "[" + @stretch_rate.to_s + "]" + @title.text @rss_node.elements['enclosure'].attributes['url'] = $data_dir_url + stretche d_mp3_name end def download_mp3(un = "",pw = "") if File.exist?($data_dir + @mp3_name) then File.unlink($data_dir + @mp3_name) end if un != "" || pw != "" then command_line = "wget -P " + $data_dir + " --user=" + un + " --password=" + pw + " " + @mp3_path else command_line = "wget -P " + $data_dir + @mp3_path end system(command_line) @mp3_path = $data_dir + @mp3_name end attr_accessor :rss_node attr_accessor :title attr_accessor :stretch_rate end fd = Feed.new($feed_org) fd.comp_all(0.3) fd.save_feed
