ラジオサーバーをつくろう 〜 録音編 〜

新しいラジオサーバーというか録音システムを作りたくて、制作を始めたというのがここまでのお話。
では、どんなものを作りたいと思ったのかというところから。

AMラジオをアナログで細々と録音するにはそんなにスペックが必要でもない。PCM録音で言うと 11025Hz 16bit mono といったあたりで十分なのです。そのビットレートで24時間丸一日録音したとすると 1GBちょっとになるのですな。
一昔前ならともかく、今時のコンピュータだと「どうということはない」数字。
そこで、富豪アーキテクトが発動するわけですな。
これまでエアチェックというと「何時から何時まで」と番組を狙い時間を決めてその間だけ録音していたわけです。ラジオサーバーはその「何時から何時まで」録音を自動化するためのシステム。これの問題は何かというと、スポーツ中継による延長に対応できない、ということと特別番組編成に弱いということ。別な言い方をすると、特別な状況に対応できず、録り逃したものは完全にあきらめるしかないということでもある。
これを富豪アーキテクトにかけると「じゃあ、24時間丸々録音すれば良いじゃん」という事になる。
「何時から何時まで」を録音するのではなく、全てを録音しておき「何時から何時まで」の部分を切り出すことでエアーチェックするというシステムを考えた。もし、時間移動があったとしても元の24時間の方から切り出し直せばいいだけだし、やっぱりあれが聞きたかったという要求にも1日以内であれば対応できる。

じゃあやってみようかー、と思ってもこの「24時間ノンストップで切れ目無く録音し続ける」といった部分が案外難しい。サーバーとしてコマンドラインから録音コントロールしたいという要求も相まって自作するしかなくなる。

今回録音サーバーとしてたてるマシンはまたMacOSX、別にLinuxでも良いんだけれどもUNIX系としてはMacOSXも嫌いじゃないので。
で、MacOSX で録音をするソフトを作ろうと思ったらCoreAudioにアクセスする必要がある。これがちと手間。
CoreAudioのAPIに関する資料を眺めていたらPortAudioなるクロスプラットフォームAPIが存在することを知った。これは、各OSの Audio API をマネージして録音・再生程度のアプリであれば簡単かつポータブルに書けるというもの。
今回作成する録音ソフトをこれで作れば MacOSX だけでなく Linux ややろうと思えば Windows でも使えるようになるだろう。よし、採用。

c言語で簡単なコマンドを二つ作成。silent_record と addwavheader。
silent_record はPortAudioを用いて、ただひたすらに録音しHDDに波形をストアするだけのプログラム。パスを指定しながら起動すると、時計をみつつ15分毎に 1つの波形ファイルを出力する。24時間では96ファイルできる計算。この波形ファイルはヘッダーが付いていない純粋な波形データだけなので、cat とかで単純に結合してやれば切れ目のない音声ファイルとなる。30分番組なら2つを、60分番組なら4つを結合させれば良い。
ちなみに silent_record は起動させたら終了しないブロックコマンドなので、バックグラウンドで動作させるなどして裏で動かしてやる。最初は daemon にしようとしたんだけれども、fork したチャイルドプロセスでは CoreAudio にアクセスできなかったのであきらめた。なんかセキュリティかなんかの都合みたい。
silent_record が録音をするデバイスは PortAudio のデバイスリストの中で録音可能かつ一番IDが大きいデバイスとなっている。制限事項。細かいところはソースコードいじってくれ。

波形ファイルだけだとその後の取り回しが悪いので、riffヘッダーを付与しwav形式のファイルを生成するのが addwavheader。特に説明することもなし。

録音中も他の作業ができることを目指して軽く作っていたら、本当に軽かった。どうせなら、起動時に立ち上がる様にして、バックグラウンドで常に動いている様にしたい。
MacOSXのサービス起動手順は Linux とかで一般的な rc 方式ではなく、SystemStarter なる仕組みによる。
詳細はWEBで探してみて欲しい(といって逃げる)。
用意するのは、プロセスの起動手順を記したスクリプトと、そのプロパティファイル。
今回の silent_record を SilentRecord という名前でサービス化し起動するには、/System/Library/StartupItems/ に SilentRecord/ というディレクトリを作成し、その中に SilentRecord という同名の起動スクリプトと StartupParameters.plist を置く。

/System/Library/StartupItems/SilentRecord/SilentRecord

#!/bin/sh
##
# Start Silent Record
##
. /etc/rc.common

StartService() {
if [ "${SILENTRECORD:=-NO-}" = "-YES-" ]; then
ConsoleMessage "Starting SilentRecord"
/usr/local/bin/silent_record /Users/Shared/RadioServer/record &
fi
}

StopService() {
killall -9 silent_record
}

RestartService() {
killall -9 silent_record
/usr/local/bin/silent_record /Users/rerofumi/Works/portaudio/silentrecord/stream &
}

RunService "$1"

/System/Library/StartupItems/SilentRecord/StartupParameters.plist (old format)

{
Description = "Radio Server silent recorder";
Provides = ("SilentRecord");
Requires = ("Disks");
OrderPreference = "Last";
Messages =
{
start = "Starting Silent Record";
stop = "Stopping Silent Record";
};
}

これらを設置した後、/etc/hostconfig に

SILENTRECORD=-NO-

を追加する。
ここを -YES- にすると、OS起動時に silent_record も起動する。-NO-ならば起動しない。

これで MacOSX での自動起動と、裏での録音が可能となった。
この状態では、どんどん録音ファイルが増えて行きいつかはHDDを食いつぶしてしまうので注意。
それを避けるため、一日一回 cron で録音ファイルの整理と番組の切り出し作業を行うスクリプトを実行するようにしたい。そのスクリプトについてはまた次回。
今回はどんどん録音しちゃうよーといったところまでに。

silent_record と addwavheader のソースコード。Makefile は適当に環境あわせるように。
PottAudio は別に用意しておくこと。
silentrecord_071225.zip

いつもだとソースコードの利用や改変はご自由にという所ですが、今回は制限をかけるのです。
利用者が silent_audio の存在と動作を把握している場合のみ、マシンにインストール可能。他者が使うマシンや、共有マシンには入れてはならない、としておく。
なんでかというと、存在に気がつきにくい状態で録音をするプログラムだから。マイクからの音をこっそり録音するスパイウェア用途には絶対に使ってはならない。
プロセスとしては丸見えだけれども、知らない人は気がつかないと思う。




You can follow any responses to this entry through the RSS 2.0 feed. You can skip to the end and leave a response. Pinging is currently not allowed.

Leave a Reply