bit sized

Just another WordPress.com weblog

9月 2007のアーカイブ

Podcast × 速聴 – Podcastを速聴してみる(新刊JP)

コメントなし

Podcast に登録している番組の数が増えてきたというのと、以前ちょっと興味を引かれた速聴なるものを試したいと思い、「じゃあ、Podcastを速聴してみよう」と企ててみました。

速聴については、簡単に言えば

「普通に話しているスピードの3-4倍以上で話を聞くと、普段の言語処理を行う際には使用されない脳の部分が活性化され、記憶力などの脳力向上に役立つ」

というものです。

どうやって、Podcastを3-4倍速で聞こうか?という部分ですが

  1. Podcast再生時にipodの再生速度を変更する機能を使用する
  2. Podcastに登録される前に、mp3の音声データを編集しておく(3-4倍速に変換しておく)

という2種類の方法が考えられると思いますが、1の方法では

  • せいぜい20%くらいの速度変換しかできない
  • オーディオブックしか再生速度を変えられない

という事で、自宅にある余っているLinux+ Apacheを使用して自分用のフィードに変換(mp3 + rssを編集)して、それをPodcastに登録する事にしました(下図)

最近個人的によく聞く、新刊JPで配信している新刊のダイジェスト(火木土更新)での例。

  1. rssファイルを新刊JPのサイトから取得
  2. 1のファイルをparseして、各エントリのmp3ファイルをダウンロードする。
  3. ダウンロードしたmp3を3-4倍速に変換。
  4. 変換済みのmp3ファイルのパスを、1のrssファイルでの各エントリの ファイルとして書き換える
  5. 変換済みのmp3ファイル+編集済みのrssファイルをapacheのディレクトリに配置する。
  6. iTuneから、5のurlを指定してpodcastを登録する

RapidPodcast2

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

投稿者: t4ku

9月 28, 2007 12:02 am

Programming, Uncategorized への投稿

タグ: , ,