・Plamo-5.1とradiru_rec.py
自作の「らじる☆らじる」録音用スクリプト、毎日せっせと語学講座を録音してくれているのだけど、 そろそろサーバ類をPlamo-5.1な環境に移行しようかと思って、新しく組んだマシンで動かしてみた。
atコマンドで録音する機能は問題なく動いたのだけど、生成したmp3なデータファイルはノイズまみれで聞けたもんじゃない。 さて、何がどうなっているのだろう、、としばし追いかけてみた。
結論としては、mplayerで「らじる☆らじる」のサイトからデータをダウンロードしてくるところまでは問題ないものの、 それをlameでmp3に変換するところでエラーが起きているらしい。
改めて手動でWAVなファイルをMP3に変換しようとしてみると
$ lame test.pcm test.mp3 Unsupported data format: 0x0003
というエラーになってしまう。あれれ、、と思ってGoogleで調べてみると、 これはlame-3.8xではサポートしていない32ビットfloatなPCMデータを変換しようとした際のエラーらしい。
何故、WAV形式で保存したデータが32ビットfloatになっちゃうんだろう、と調べてみたところ、 Plamo-5.1ではffmpeg由来のlibavcodecで用が足りるだろうと、 Plamo-5.0では入れていたlibmpg123を外したのが原因だった模様。
このlibmpg123がリンクされていると、mplayerはWAV(PCM)形式のデータを本来の16ビットintな形式で保存するのだけど、 libavcodecを使うと32ビットfloatな形式がデフォルトになるらしい。
libmpg123を使うようにビルドしなおすことも考えたけど、-af format=s16le というオプションを指定すれば、 16ビットintな形式で保存してくれるようなので、とりあえず radiru_rec.py スクリプトで生成するシェルスクリプトに このオプションを指定するようにしてみたところ、無事 MP3 形式に変換することが可能になった。
ちなみに、lameを3.95あたりに更新すると、32ビットfloatなWAVファイルもちゃんと扱えるようになるものの、 rawなWAV(PCM)データを受ける際の -r オプションを指定すると、受け取ったデータは16ビットintな形式だと見なすようで、 同じ問題が発生する模様。
この手の組み合わせ依存の問題は、実際にその問題に直面しない限り、問題の存在自体に気付かないから厄介だなぁ。。