MP3のビットレートは、規格(厳密には第三者による拡張)では下限が8kbpsである。
$ lame --longhelp
で詳細なヘルプが出るが、その末尾に
==================
MPEG-1 layer III sample frequencies (kHz): 32 48 44.1
bitrates (kbps): 32 40 48 56 64 80 96 112 128 160 192 224 256 320
MPEG-2 layer III sample frequencies (kHz): 16 24 22.05
bitrates (kbps): 8 16 24 32 40 48 56 64 80 96 112 128 144 160
MPEG-2.5 layer III sample frequencies (kHz): 8 12 11.025
bitrates (kbps): 8 16 24 32 40 48 56 64
==================
と、可能な出力サンプリング周波数とビットレートが表示される。
(オプションの --resample で指定できるサンプリング周波数、でもある)
検索をすると、いくつかの質問(Q&A)サイトで8kbps以下でエンコードできないかどうか、という質問がある。
需要が生むのか好奇心が生むのかは判らないが、ともかくも興味のある人は少なくないようだ。
しかし、前述のように「規格」の上では残念ながら8kbpsが限度である。
ところが、規格をいじらずとも実質8kbps以下を実現する方法はある。
音質はともかくも、だ。
原理は簡単である。
「予め音声を倍速度(2倍)にしたものをエンコードし、デコード〜再生時に半速度(1/2倍)にする」
アナログ時代のオーディオ技術者や愛好者なら、半速ダビングや倍速ダビングを一度はやった事があるのではないだろうか。
デジタルでも、それを簡単に出来る。
必要なものは、ソースとなるオーディオファイル(.wavとか)、MP3エンコーダーの「lame」、そして音声処理のコマンドツール「SoX」(Sound eXchange 以下sox) のみである。
大抵のLinuxディストリビューションならインストールされているか、入ってなくてもリポジトリにあるだろう。
無くてもコンパイルは難しいものではない。
例えば、 CDでお馴染みの 44.1kHz,16bitステレオPCMの hoge.wav をソースとしよう。
まずは基本的なオプションで記述をし、オンザフライで試聴してみる。
$ sox -t wav hoge.wav -t wav - remix - speed 2 rate 8000 | lame -b 8 - - | play -t mp3 - speed 0.5
※playコマンドはsoxの別名。soxへのシンボリックリンクになっている。
ただし、soxがmp3関連のライブラリを使えるようコンパイルしていなければ、soxでmp3を扱う事は出来ない。
ディストリビューションによっては、特許等の問題でmp3関係のライブラリを意図的に使わないようにしている場合やmp3関係そのものを用意していない場合があるので、この点に注意されたい。
soxは「サウンド処理ツールのスイスアーミーナイフ」を自称する程、各種サウンドファイルを柔軟に加工できるコマンドツールである。
ここでは一旦モノラルにして速度を2倍にしサンプリング周波数も8kHzに変換、lameで8kbpsにエンコードしplayコマンドで再生している。各々標準入出力をパイプで繋ぎオンザフライ処理をしている。
8kbpsでエンコードしているが中身は倍速度なので、再生時に半速度とすることにより実質4kbps(!!)を実現している。
soxのspeedを4にし、playのspeedを0.25にすれば実質2kbpsだが・・・これはさすがに音声として認識ができそうになかった。
実際、このビットレートで音声信号を通せるようなコーデックは軍事用のものになる。そういうレベルの話だということだ。
ソースにもよるかと思うが、トークならとりあえず携帯電話の混雑時のようなもんだろうか。
ステレオでは情報量が多いため崩壊気味になるのでsoxでモノラルにしているが、lameのオプションでモノラルにしてもいい。
ファイル化は、最低限のオプションで記すと
$ sox -t wav hoge.wav -t wav - remix - speed 2 rate 8000 | lame -b 8 - hoge.mp3
再生は
$ play hoge.mp3 speed 0.5
となる。
※ザラザラ感がある場合は
$ play hoge.mp3 rate 48000 speed 0.5
とアップサンプリングしてみると良い。
実際にこの例題ではlameに入力されるデータが低ビットレートに最適化されていないので、かなり音質は良くない。よって、事前の処理が必要になる。
soxは各種のエフェクトも容易なので、結果に応じて色々と試してみると良いだろう。
一般的な電話の音響帯域は 300Hz〜3300Hz程度なので
$ sox -t wav hoge.wav -t wav - remix - highpass 300 lowpass 3300 speed 2 rate 8000 | lame -b 8 - - | play -t mp3 - rate 48000 speed 0.5
となる。
soxでモノラル化やサンプリング周波数の変更、ハイパス・ローパスフィルタやtreble,bassの調整なんかもできるので、加減してみてほしい。
lameのオプションもサンプリング周波数の指定等、色々あるので試してみよう。
さて問題は、一般相手の再生である。
sox及びplayコマンドは大変柔軟なコマンドで、数値で再生速度やピッチなどを細かに調整できる。
しかし、WindowsあたりのGUIなメディアプレイヤーには再生速度を自在に調整できる機構が無いものが大勢であり、ましてやポータブルプレイヤーでは機能を実装すらしていない。
将来、タグ情報等の拡張で再生速度の情報を格納出来、それを認識できるようなプレイヤーが出れば良いだろう。
ここまで、Linux/UNIX系コマンドシェルにおける利用方法を記した。
2013.5.31記載 2014.5.14一部訂正 2019.10.27表題修正