「りも」トップページへ
TIPS index へ

ラジオサーバーを作ろう

Dec.08.2000

Linux サーバーにオートでラジオを録音させようという試みの記録。


・ ラジオサーバーとは

そのものズバリ 「ラジオサーバー」 という名前の商品があります。ICE で有名なソフィアシステムズという ところの商品です。
液晶モニターを備えたデジタルガジェットで、AM/FMラジオをデジタルで 予約録音しHDDに蓄えていくという装置です。
主にラジオ講座などの連続物を自動的に収録、蓄積しナレッジベースを 構成するという目的だそうです。
私的にはなんでかこれが気になっていて WEBでニュースを見たのを克明に 覚えていたりします。 もちろん、庶民としてはラジオ講座とかは念頭になく、 娯楽としてのラジオを聞くための道具として心ひかれたわけです :-)
AMラジオだとサンプルレートは低くて済みますから、うんと落として MP3 形式に圧縮したりすると 60分番組一年分52話が CD-R 一枚に 収まってしまったりします。最近のHDDは10GB単位ですから、そこに どれくらいストアしておけるかと想像すると結構ではありませんか? 大量にデータが集まるというのはそれはそれでデータベースとなり えるかもしれません。
最近はテレビのHDD録画とタイムシフト再生が流行りですが、それが 行なえるくらいマシンスペックが上がったということでもあります。 では、音声だけならどうか。そりゃもうほいほい楽々と扱えますよね。 んじゃ今度は扱うだけでなく楽々と蓄積してみましょうか。

・ ほんじゃ作ってみましょうか

「ラジオサーバー」(商品のほう) ほどカッコイイアイテムでなくても、定期的に PC でラジオを録音し 蓄積していくという部分は簡単に実現できそうですよね。もう単純に PC のサウンドカードにラジオをつないで録音するだけですから。
で、私の部屋には24時間稼働しているお部屋内サーバーがあって 当然(?) Linux で動いています。丁度良いや、こいつに定期的にラジオを 録音して貰おう、と思ったのが今回の始まりでもあったりします。
というわけで作戦概要は、Linuxサーバーにサウンドカードを付け、 その Line IN にラジオを接続、定時になったら自動的に放送を録音し HDDに蓄積するシステムの作成となります。
時間になったら自動的に放送を録音するのですが、そのために 接続するラジオもサーバーと同じく24時間稼働させます。 もちろんチューニングは変わりませんから一局オンリーの収録でしか ありません。 実はかなーーりローテクで庶民的な日曜工作だったり。 :-)

・ 実地調査

私個人が今ラジオサーバーを立てて録音したいと思っているのは実は 「文化放送」だったりします。(理由は聞くな(笑)
私は今関東在住なのですが、それでも文化放送を聞くのは四苦八苦 します。まあ知っている人は知っていると思いますが、 なんでかというと他の放送局に比べ出力が小さい局なんですね。 おまけに大陸(韓国だったかな?)に同じ周波数(!)の局があり、 日本海側では受信しようにも混信してしまうそうで、なにかと辛い局で あります。
で、もうひとつ拝聴を困難にしている理由として私の部屋にびっしりと ある機器のノイズがあります。今回ターゲットにする Linux サーバーも そのノイズ元だというのが多分にジレンマ〜。
単純に PC にラジオをつなぐだけでなくそれらノイズとの格闘が予想される わけですが、まさかそれがメインになろうとは…。

てなわけで実地調査。ラジオをつけたまま部屋内の機器の電源を入り切りし どれが一番ノイズを発しているかの調査。サーバーは大したこと無くて そのわきにあるメインマシンであるデスクトップ機がバリバリのノイズを 発していた。泣きそう。
ラジオを持って部屋内をうろうろ歩きまわったり、アパートの周囲をぐるぐる 歩いたりして受信状況を調べる。ふむ、こんなもんか。

・ 収録用のラジオ

サーバーだけでなくラジオも24時間つけっぱなしという情けないシステム なので、乾電池駆動でなくコンセントから電源が取れるタイプが必要と なります。まあ、日曜工作ということであまりお金をかけるのは本意では ないことからそこそこのお値段のラジオを買ってきました。
「ICF-810V(ソニー)」 これ
八百屋や床屋においてあって常に TBS とかを流していそうな質実剛健(?)な 型ですね。BCL ラジオではないので性能はふつーです。

・ ノイズとの戦いその1

買ってきたラジオを手にまた部屋の中をうろうろ。取り敢えず部屋内で コンピューター群から最も離れた位置に置くことに決定。 まあ、よりノイズの低いポジションと言うことで。
んが、問題発生。コンセントからのAC電源をつないだとたんにノイズ増加。 コンセントからノイズを拾っているわけですな。予測できた事態とはいえ これは回避不能。気休めにノイズキャンセラー付の電源タップを買ってきて つないでみるもあんま効果無し。まあ、多少のノイズはしょうがないやねと あきらめムード。

・ PCに繋ぎましょう

PC とラジオはサウンドカードと音声ケーブルで繋ぎます。当たり前というか なんというか。当然のことながら Linux サーバーにはサウンドカードが 刺さっていてそれが稼働していることが必須条件です。この部分に関しては ハードウェアに因りますので他に説明を譲ります。
ラジオはオーディオ用のチューナーユニットってわけはないので音声出力は イヤホン端子しかありません。出力Ωが心配ではありますがあまり気に せずにそのままライン入力につないでしまいましょう :-)
なにか適当なミキサープログラムをいじって、ライン入力がちゃんと なされていることを確認します。

・ ノイズとの戦いその2

PC とラジオを接続したところで問題発生!!
音声ケーブルをラジオに繋いだとたん物凄いノイズが発生しほとんど放送が 聞こえなくなってしまいました。PC のスピーカーからはノイズのみが聞こえて きます。要するにどんなにサーバーから離しても音声ケーブルのGNDを通じて ダイレクトにノイズがやってくるわけです。
これには途方にくれました…。
他のAV機器(テレビやビデオ)を間に挟んでも GND は繋がっているので結果は 必ず同じでした。こうなったらカパー(導線)で直接繋がないという手段を 取るしかありません…。FMトランスミッターで音声を飛ばすか…。
そんな時にお店で見つけたのがパナソニックの これ 。 音声を赤外線で伝送し、おにぎり型のスピーカーで受信する IR トランスミッターです。夜とか大きな音が出せないときに離れた場所の テレビとかを楽しむためのものらしいです。他社からも幾つか同等の商品が 発売されています。
これで間接的に繋ぐことで、GND を断ち切りノイズを貰わないという作戦。
これが大成功。ばっちり期待通りの音を録ることが出来るようになりました。 ノイズ自体は完全に無くなったわけではないですけれども聞く分には なんとか、といったレベルにまで低減させることができました。

最終的な機材配置は以下のような感じです。 野郎の部屋を覗いても嬉しくないでしょうが (^^;

・ 録音プログラム構成

目指すラジオの環境をハードウェアがそろったところで、今度はソフトウェアの 設計に入ります。
ソフトウェア部分といっても、時間が来たらサウンドカードの Line IN から 音声を取り込むというだけのことですけれども。これをモデル化すると以下の 動作に別れます。

  1. 音声を wave ファイルにキャプチャーする
  2. 保存のために圧縮
  3. 録音リストにしたがって定時起動
  4. 収録した音声を整理する
取りあえず前半二つと後半二つをそれぞれにまとめたいと思います。

・ 録音プログラム構成

音声を取り込んで、MP3等に圧縮する部分です。
既存のレコーダーソフトを使って行えば済むことなんで適当なソフトを 探して使います。探す際に、必要な機能として

がそろっていることを確認しましょう。
そんなこんなで私が見つけたのは yarec-0.65 というソフト。 まあ、同等の機能を持つものはいくつかあるので何を使用しても良いでしょう。 その後のエンコードを考えて出力フォーマットは気にした方が良いと思います。
それと、保存するのにファイルサイズが小さい方が良いので任意の音声形式への エンコーダーを用意します。これはいろいろありますので目的に応じて 入手可能なものを選択すると良いでしょう。今回は mp3 と RealAudio への 変換を組み入れています。
それらを組み合わせて簡単なシェルスクリプトとしてまとめます。 サフィックス(ファイル名の先頭になる)と録音時間を引数として与えると、 その時間分録音した後エンコードするシェルスクリプトとしました。

シェルスクリプト参考

耳障りなノイズを低減するため 3000Hz のローパスフィルターをかけている のがコツです。エンコーダー側にローパスフィルターが存在しない場合、 sox なり ecasound なりのフィルターソフトを咬ませてみましょう、

・ タイマー起動プログラム

指定時間分を録音できるコマンドは用意できましたので、次はこれを バッチリ指定した時間に起動するプログラムを組みます。
まずはタイマー予約する番組表をファイルとして用意します。
単なるサンプルだから中身は気にしないように
このリストを読み込んで期待通りの動作をするプログラムを作成しましょう。

時間監視ですが基本的には cron を利用します。それだときっかり定時の起動 なのでリストが柔軟に変わったときの対処が困難ですので、cron はきっかけに して細かい調整をプログラムが担当します。具体的には cron によって 15分毎に 起動し、録音リストを調べ開始まで15分未満の番組があったら録音待機に 移ります。最も開始に近い放送が 15分以上先の未来だった場合さっくりと 終了し、次に起こされるのを待ちます。
録音終了後ファイルをサフィックス名毎のディレクトリに分別する作業も このプログラムに含めました。クラス構造から考えるとここに組み込むのは イマイチな気もするのですが、まあ適当に。

以上の作業をするプログラムをさくさくさくっと ruby で記述したものが これです。
タイマー録音プログラム

こういう小ネタは ruby や perl に限りますね :-)

・ おわりに

とまあ今回は技術情報ではなく、日曜工作的記録として残してみました。
大した作業ではないんですけど、これはこれで楽しんで Linux を使っている という、そんな姿として皆様の目に映るといいなと思います。
プログラムはあまり参考にはなりません。むしろ皆様の手でより良い物 (作った本人が使いやすい形)を作っていただければ幸です。


rero2@yuumu.org