言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

コマンドラインで音声を扱う。

LinuxCygwinコマンドライン上で音声を扱うツールについて書く。最近は Linux でさえもサウンド再生の為のかっこいいツールが沢山登場しているんだけど、設定を変更するのにマウス操作するのがかったるいし、様々な操作方法を覚えてられない。その辺コマンドラインならキーボードだけで操作できるしシェルの履歴に何をやったか残るので、特にプログラミングのお供に非常に都合が良い。また、ドキュメント性という意味でも、作業を文字列として正確に記録できるコマンドラインの方が遥かに優れているので、その使い方をメモ。

コマンド

まず必須なのが、sox http://sox.sourceforge.net/ です。これ一つで様々なファイルフォーマットの変換や再生が出来ます。cygwin でもコンパイルできますし、バイナリも用意されています。

再生

もっとも基本的なファイル形式は wav ファイルです。wav はほとんど raw (後述) と同じですが、raw はメタデータが無くなってしまって扱いにくいので raw の代わりに wav を使うと良いです。Linux では play コマンドを使います。play コマンドは sox の別名で、この名前で呼ばれると再生になります。残念ながら cygwinsox での再生は上手くいかないので、/dev/dsp にリダイレクトするのが簡単です。

$ play voice.wav # linux
$ cat voice.wav > /dev/dsp # cygwin

変換

sox を使うと様々なサウンド形式に変換する事が出来ます。変換前、変換後の順にファイル名を与えると、そのファイル名からファイル形式が決定されます。また、ファイル名の前にオプションを指定する事も出来ます。

$ sox voice.wav -r8000 voice8.wav # サンプルレートを 8000 Hz に変更
$ sox voice8.wav voice8.gsm # gsm 圧縮

play コマンドでは、変換出来るファイル形式ならそのまま再生も行う事が出来ます。

圧縮

Ogg Vorbis や Speex をインストールすると、それぞれ圧縮解凍を行うツールが付いてきます。

$ oggenc -b 8 -o voice8.ogg voice8.wav # 8kb/s くらいで ogg vorbis に変換
$ speexenc --bitrate=13000 voice8.wav voice8.spx # 13kb/s くらいで speex に変換

$ oggdec.exe -o voice8-ogg.wav voice8.ogg # ogg の解凍はこんな感じ
$ speexdec.exe voice8.spx voice8-spx.wav # speex の解凍はこんな感じ

speex は play で再生できないので、ogg123 や speexdec を使うと良いです。

$ speexdec voice.spx

raw データ

音声のプログラミングにおいて、よく生(raw)の音声データを使います。生の音声データとは、音声信号をそのまま加工せずに並べた物で、典型的には 16 bit リトルエンディアンのデータを左右のチャンネル交互に並べます (interleave と言う)。raw データを作成、テストするにも sox は非常に便利です。

$ sox voice.wav voice.raw # 何も変えずに raw にする。
$ play -r22050 -c1 -sw -fs voice.raw # 生なのでサンプルレートやチャンネル情報が必要。