wave --- WAV ファイルの読み書き

ソースコード: Lib/wave.py


The wave module provides a convenient interface to the Waveform Audio "WAVE" (or "WAV") file format. Only uncompressed PCM encoded wave files are supported.

バージョン 3.12 で変更: 拡張形式が KSDATAFORMAT_SUBTYPE_PCM の場合に、WAVE_FORMAT_EXTENSIBLE ヘッダに対応するようになりました。

wave モジュールは以下の関数と例外を定義しています:

wave.open(file, mode=None)

If file is a string, open the file by that name, otherwise treat it as a file-like object. mode can be:

'rb'

読み出しのみのモード。

'wb'

書き込みのみのモード。

WAVファイルに対して読み込み/書き込み両方のモードで開くことはできないことに注意して下さい。

mode が 'rb' の場合 Wave_read オブジェクトを返し、 'wb' の場合 Wave_write オブジェクトを返します。 mode が省略されていて、 file-like オブジェクトが file として渡されると、 file.mode が mode のデフォルト値として使われます。

ファイルライクオブジェクトを渡した場合、wave オブジェクトの close() メソッドを呼び出しても、そのファイルオブジェクトは閉じません。 ファイルオブジェクトを閉じるのは呼び出し側の責任です。

open() 関数は with 文で使えます。 with ブロックが終了すると、Wave_read.close() または Wave_write.close() メソッドが呼び出されます。

バージョン 3.4 で変更: シーク不能なファイルのサポートが追加されました。

exception wave.Error

WAVの仕様を犯したり、実装の欠陥に遭遇して何か実行不可能となった時に発生するエラー。

Wave_read オブジェクト

class wave.Wave_read

WAV ファイルを読み込みます。

open() によって返される Wave_read オブジェクトには、以下のメソッドがあります:

close()

wave が開いたストリームであればそのストリームを閉じ、インスタンスを使用不能にします。 オブジェクトの回収時に自動的に呼び出されます。

getnchannels()

オーディオチャンネル数(モノラルなら 1 、ステレオなら 2 )を返します。

getsampwidth()

サンプルサイズをバイト数で返します。

getframerate()

サンプリングレートを返します。

getnframes()

オーディオフレーム数を返します。

getcomptype()

圧縮形式を返します( 'NONE' だけがサポートされている形式です)。

getcompname()

getcomptype() を人に判読可能な形にしたものです。通常、 'NONE' に対して 'not compressed' が返されます。

getparams()

get*() メソッドの戻り値に相当する、namedtuple() の (nchannels, sampwidth, framerate, nframes, comptype, compname) を返します。

readframes(n)

最大 n 個のオーディオフレームを読み込んで、 bytes オブジェクトとして返します。

rewind()

ファイルのポインタをオーディオストリームの先頭に戻します。

The following two methods are defined for compatibility with the old aifc module, and don't do anything interesting.

getmarkers()

Returns None.

バージョン 3.13 で非推奨、バージョン 3.15 で削除予定: The method only existed for compatibility with the aifc module which has been removed in Python 3.13.

getmark(id)

Raise an error.

バージョン 3.13 で非推奨、バージョン 3.15 で削除予定: The method only existed for compatibility with the aifc module which has been removed in Python 3.13.

以下の 2 つのメソッドが扱う「位置」は互いに互換性がありますが、それ以外の点では実装依存です。

setpos(pos)

ファイルのポインタを指定した位置に設定します。

tell()

ファイルの現在のポインタ位置を返します。

Wave_write オブジェクト

class wave.Wave_write

WAV ファイルを書き込みます。

open() が返す Wave_write オブジェクトです。

シーク可能な出力ストリームでは、実際に書き込まれたフレーム数を反映するように wave ヘッダが自動更新されます。 シーク不能なストリームでは、最初のフレームデータを書き込む時点で nframes の値が正確でなければなりません。 正確な nframes を設定する方法は 2 つあります。 1 つは、close() を呼び出すまでに書き込むフレーム数を指定して setnframes() または setparams() を呼び出し、 その後 writeframesraw() でフレームデータを書き込む方法です。 もう 1 つは、書き込むすべてのフレームデータを指定して writeframes() を呼び出す方法です。 後者では、writeframes() がフレームデータを書き込む前にデータ内のフレーム数を計算し、それに合わせて nframes を設定します。

バージョン 3.4 で変更: シーク不能なファイルのサポートが追加されました。

Wave_write オブジェクトには以下のメソッドがあります:

close()

nframes が正しい値になるようにし、wave が開いたファイルであればそのファイルを閉じます。 このメソッドはオブジェクトの回収時に呼び出されます。 出力ストリームがシーク不能で、nframes が実際に書き込まれたフレーム数と一致しなければ、例外を送出します。

setnchannels(n)

チャンネル数を設定します。

getnchannels()

チャンネル数を返します。

setsampwidth(n)

サンプルサイズを n バイトに設定します。

getsampwidth()

サンプルサイズをバイト単位で返します。

setframerate(n)

サンプリングレートを n に設定します。

バージョン 3.2 で変更: 整数ではない値がこのメソッドに入力された場合は、直近の整数に丸められます。

getframerate()

サンプリングレートを返します。

setnframes(n)

フレーム数を n に設定します。もし実際に書き込まれたフレームの数と異なるなら、これは後で変更されます (出力ストリームがシーク不能なら、更新しようとした時にエラーが起きます)。

getnframes()

これまでに書き込んだオーディオフレーム数を返します。

setcomptype(type, name)

圧縮形式とその記述を設定します。現在のところ、非圧縮を示す圧縮形式 NONE だけがサポートされています。

getcomptype()

圧縮形式 ('NONE') を返します。

getcompname()

人が読める形の圧縮形式名を返します。

setparams(tuple)

The tuple should be (nchannels, sampwidth, framerate, nframes, comptype, compname), with values valid for the set*() methods. Sets all parameters.

getparams()

現在の出力パラメータを格納した namedtuple() の (nchannels, sampwidth, framerate, nframes, comptype, compname) を返します。

tell()

ファイルの中の現在位置を返します。 Wave_read.tell() と Wave_read.setpos() メソッドでお断りしたことがこのメソッドにも当てはまります。

writeframesraw(data)

nframes の修正なしにオーディオフレームを書き込みます。

バージョン 3.4 で変更: どのような bytes-like object も使用できるようになりました。

writeframes(data)

オーディオフレームを書き込み、nframes が正しい値になるようにします。 出力ストリームがシーク不能で、data の書き込み後の総フレーム数が事前に設定した nframes と一致しない場合は、エラーを送出します。

バージョン 3.4 で変更: どのような bytes-like object も使用できるようになりました。

writeframes() や writeframesraw() メソッドを呼び出したあとで、どんなパラメータを設定しようとしても不正となることに注意して下さい。そうすると wave.Error を発生します。