SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

2009-03-12(Thu) この小ささが、既にしゃべりだしとったんじゃッ!!

  別に記事をブツけるつもりはなかったのだが、奇遇なタイミングで「新・iPod shuffle」が発表された。

  なんでも「世界初、あなたに話しかけるミュージックプレイヤー。」であり「この小ささが、しゃべりだす。」んだそうだ。なるほど、ディスプレイのないshuffleの弱点を声で補うワケね。

  しかし、オイラの手元では……

  画像の説明

  「この小ささが、既にしゃべりだしとったんじゃッ!!」

  ……多少の仕様の差はあれど。

  ちょっと前、ラジオをバラして裏のコネクタ経由でUSBから給電できるようにしたのだが、実は、1ヶ月ほど前から、NHKラジオの語学番組を自動録音し(あくまで私用に)Podcast配信するスクリプトを稼働していたのである。

  その際、ディスプレイのないmp3プレイヤの弱点を「声で補う」ために、曲の冒頭に番組名をナレーションするという機能も実装していたのである。もちろん、オイラの肉声ではなく、Linuxに載っている「festival」という音声合成エンジンを使った人工音声で、である。

  スクリプトは以下の通り。cron起動したら、ラジオを録音し、冒頭にナレーションを入れて、mp3に変換、rssとHTMLを生成して、プロバイダにアップロードする、までを行う。

#!/usr/bin/env ruby
 
require 'time'
 
now = Time.now
sdate = now.strftime('%Y-%m-%d')
 
#-------------------------------------------------------------------------------
#
#	録音
#
time = 900
wavdir = 'wav/'
mp3dir = 'mp3/'
pname = 'rec_' + sdate
vname = 'voice_' + sdate		# ナレーション一時ファイル名
talk = now.strftime('%A %B %d. N.H.K. radio english conversation program.')		# ナレーションの内容
 
system('amixer -c 0 sset Capture,0 50%,50%')
system("arecord -D hw:0,0 -t wav -f cd -d #{time} #{wavdir}#{pname}.wav")		# ラジオを録音
system("sox #{wavdir}#{pname}.wav -r 16000 -c 1 #{wavdir}#{pname}_low.wav")
system("echo '#{talk}' | text2wave -o #{wavdir}#{vname}.wav")					# ナレーションの発声 → wav
system("sox #{wavdir}#{vname}.wav #{wavdir}#{pname}_low.wav -t wav - | lame -h - #{mp3dir}#{pname}.mp3")
 
#-------------------------------------------------------------------------------
#
#	rss 作成
#
mp3file = pname + '.mp3'
title = sprintf("%d年%2d月%2d日(%s)の放送", now.year, now.month, now.day, \
		['日', '月', '火', '水', '木', '金', '土'][now.wday])
author = '遠山 顕, Katie Adler, & Jerry Davidson'
subtitle = ['no-subtitle']
summary = ['no-summary']
open('item_source.txt') {|fh|
	fh.each {|l|
		if(l =~ /^summary([0-9]+):([-0-9]+):(.+)/)
			summary[$1.to_i] = $3 if($2 >= sdate)
		elsif(l =~ /^subtitle([0-9]+):([-0-9]+):(.+)/)
			subtitle[$1.to_i] = $3 if($2 >= sdate)
		end
	}
}
url = "http://homepage.example.com/mypage/program1/#{mp3dir}#{mp3file}"
length = File.stat(mp3dir + mp3file).size
pubDate = now.rfc2822
duration = (`mpg321 -t #{mp3dir}#{mp3file} 2>&1` =~ /\[([0-9:]+)\] Decoding/) ? $1 : '15:00'
 
open('item.rss', 'w') {|fh|
	fh.write <<ITEM
	<item>
		<title>#{title}</title>
		<itunes:author>#{author}</itunes:author>
		<itunes:subtitle>#{subtitle.join(' &#12316; ')}</itunes:subtitle>
		<itunes:summary>#{summary.join(' &#12316; ')}</itunes:summary>
		<enclosure url="#{url}" length="#{length}" type="audio/mpeg" />
		<guid>#{url}</guid>
		<pubDate>#{pubDate}</pubDate>
		<itunes:duration>#{duration}</itunes:duration>
		<itunes:keywords>english, conversation</itunes:keywords>
	</item>
ITEM
}
 
system('cat head.rss > rec.rss')
system('cat item.rss >> items.rss')
system('cat items.rss >> rec.rss')
system('cat tail.rss >> rec.rss')
 
#-------------------------------------------------------------------------------
#
#	HTML 作成
#
open('item.html', 'w') {|fh|
	fh.write <<ITEM
	<A href='#{url}'>#{title}</A><BR>
ITEM
}
 
system('cat head.html > index.html')
system('cat item.html >> items.html')
system('cat items.html >> index.html')
system('cat tail.html >> index.html')
 
#-------------------------------------------------------------------------------
#
#	FTP
#
open('ftp.scr', 'w', 0600) {|fh|
	fh.write <<ITEM
open ftp.example.com
user username password
bin
cd homepage
cd program1
put rec.rss
put index.html
put #{mp3dir}#{mp3file}
quit
ITEM
}
 
system('ftp -n < ftp.scr')

  上記で実装した音声ナレーションの効果は絶大で、容易に目的の日付の番組にたどりつけるようになった。つーわけで「世界初、あなたに話しかけるミュージックプレイヤー。」は「Appleの新・iPod shuffle」ではなく、正真正銘「私の手元のZEN stone(¥1,980)」なのであった。うふん。

  しっかし、この「新・iPod shuffle」だが、コストダウンのためだろうが、本体およびリモコンのボタンは最小限であり「リモコン中央のボタンを長押しすると、ボイスオーバーで曲名とアーティスト名を案内。中央ボタン1回クリックで再生/一時停止、2回で次の曲を再生、3回クリックで前の曲を再生」などという極端な操作仕様になっているのには驚いた。なんと、音量調節以外の操作は単一のボタンで行う仕様になっているように思える。これはいくらなんでもダメすぎでは?

  先日から新たに「ZEN stone」を使い始めて、一番気になったのが「元祖・iPod shuffle」との微妙な違いであった。ZENでは「前曲/次曲」の操作数がバッファリングされない。3曲先に進めたいとき、連続3回押しても効かないのだ。また「早送り/早戻し」の操作フィーリングも違う。送り中の音声が短く、速度が遅く、ボタンを離してもオーバランするのだ。正直、これは作り込みの違いであり、この点に関しては、さすがはApple、なんだと思っていた。

  しかし、今回のshuffleでは、これらを軽ぅ〜く捨てているように思える。私がすばらしいと思っていた操作フィーリングを、彼らはまったく大事には思っていなかったらしい。がちょーん。

  試しにN810をmp3プレイヤとして使ってみた時に思ったのは「タッチパネルはアカン」という事実であった。通勤途中などで歩きながら曲を聴く場合、多少の手探り(耳探り?)がまどろっこしくても「メクラで操作するほうがラク」なのである。オイラは今までshuffleしか使ったことなかったから、表示画面で選べるのは便利だろうと思いこんでいたが、歩きながらでは不便なこと極まりなかった。だから、安さ以外の意味も込めて、敢えてZEN stoneを選択したのだ。

  そういう意味で、操作フィーリングの変更は残念だ。まぁ、ボイスオーバ機能を使うには、新しいiTunesが必須であり、Windows環境を捨てたオイラには関係ない話なんだけども。

  しかし、ボイスオーバがあるなら、ここはぜひ、演歌のナレーションをカブせられるようにしてはどうかと思う。あの、歌番組の司会者なんかが、前奏の時間をイッパイに使って、なめらかな口調で盛り上げるセリフをいうやつだ。

  「♪〜♪〜この業界。時の移ろいはやくとも。走ってきました先頭を。今度もヒットを狙います。買ってください新シャッフル。思いを込めて歌います。お聴きください『林檎の春』。では、どうぞ。♪〜♪〜ぎぃいぃんのぉ、りぃんごぉに、想いをこぉめぇてぇ〜♪チャラララッチャ……」