PythonのwaveモジュールでWAVファイルを読み書きする方法を徹底解説
Python標準ライブラリのwaveモジュールは、音声ファイル形式「WAV」を扱うためのシンプルなインターフェースを提供します。このモジュールの関数を使えば、生(raw)形式のオーディオデータをファイルライクなオブジェクトへ書き込んだり、WAVファイルの各種属性情報を読み取ったりすることができます。
ファイルを開く方法は、組み込みのopen()関数と同様に「読み取り」または「書き込み」モードを指定しますが、ここではwaveモジュールが提供するopen()関数を使用します。
wave.open() の基本
wave.open()関数は、音声データの読み書きを行うためにファイルを開きます。引数は2つあり、1つ目がファイル名、2つ目がモードです。モードには、書き込み用の 'wb' または読み取り用の 'rb' を指定します。
obj = wave.open('sound.wav','wb')モードに 'rb' を指定すると Wave_read オブジェクトが、'wb' を指定すると Wave_write オブジェクトがそれぞれ返されます。
Wave_write オブジェクトの主なメソッド
| close() | waveモジュールで開いたファイルを閉じます。 |
| setnchannels() | チャンネル数を設定します(1=モノラル、2=ステレオ)。 |
| setsampwidth() | サンプル幅をnバイトに設定します(2バイト=16ビット)。 |
| setframerate() | フレームレート(サンプリング周波数)をnに設定します。 |
| setnframes() | フレーム数をnに設定します。 |
| setcomptype() | 圧縮タイプとその説明を設定します。現時点でサポートされているのはNONE(無圧縮)のみです。 |
| setparams() | (nchannels, sampwidth, framerate, nframes, comptype, compname) のタプルをまとめて受け取ります。 |
| tell() | ファイル内の現在位置を取得します。 |
| writeframesraw() | オーディオフレームをヘッダー補正なしで書き込みます。 |
| writeframes() | オーディオフレームを書き込み、ヘッダー情報が正しくなるよう調整します。 |
次のコードは、ランダムな16ビット符号付き整数値を99999フレーム分書き込んでWAVファイルを生成する例です。
import wave, struct, math, random
sampleRate = 44100.0 # ヘルツ
duration = 1.0 # 秒
frequency = 440.0 # ヘルツ
obj = wave.open('sound.wav','w')
obj.setnchannels(1) # モノラル
obj.setsampwidth(2)
obj.setframerate(sampleRate)
for i in range(99999):
value = random.randint(-32767, 32767)
data = struct.pack('<h', value)
obj.writeframesraw( data )
obj.close()なお、with文を使えば with wave.open('sound.wav', 'wb') as obj: のように記述でき、処理終了後のクローズ漏れを防げるため推奨されます。
Wave_read オブジェクトの主なメソッド
| close() | waveモジュールで開いたストリームを閉じます。 |
| getnchannels() | 音声チャンネル数を返します(1=モノラル、2=ステレオ)。 |
| getsampwidth() | サンプル幅をバイト単位で返します。 |
| getframerate() | サンプリング周波数を返します。 |
| getnframes() | オーディオフレーム数を返します。 |
| getcomptype() | 圧縮タイプを返します(サポートされるのは'NONE'のみ)。 |
| getparams() | (nchannels, sampwidth, framerate, nframes, comptype, compname) を持つnamedtupleを返します。各get*()メソッドの出力と同等です。 |
| readframes(n) | 最大nフレームのオーディオを読み取り、bytesオブジェクトとして返します。 |
| rewind() | ファイルポインタをオーディオストリームの先頭に戻します。 |
続いて、WAVファイルから各種パラメータを読み出して表示するコード例です。
import wave
obj = wave.open('sound.wav','r')
print("チャンネル数:", obj.getnchannels())
print("サンプル幅:", obj.getsampwidth())
print("フレームレート:", obj.getframerate())
print("フレーム数:", obj.getnframes())
print("パラメータ:", obj.getparams())
obj.close()実行結果
チャンネル数: 1 サンプル幅: 2 フレームレート: 44100 フレーム数: 99999 パラメータ: _wave_params(nchannels=1, sampwidth=2, framerate=44100, nframes=99999, comptype='NONE', compname='not compressed')
このように、waveモジュールを使えば追加の外部ライブラリをインストールすることなく、WAVファイルの生成・解析を手軽に行えます。より高度な音声処理が必要な場合は、NumPyやSciPy、soundfileなどのライブラリとの組み合わせも検討するとよいでしょう。
-
Pythonで複数のファイル名を一括変更する方法【os.rename()活用】
Python3では、rename()メソッドを使うことで、ファイルやディレクトリの名前を簡単に変更できます。このメソッドは標準ライブラリのosモジュールに含まれており、追加のインストールなしですぐに利用可能です。 os.rename() の基本構文 os.rename(src, dst) 各引数の意味は以下のとおりです。 src: 名前を変更したい元のファイル(またはディレクトリ)のパス dst: 変更後の新しい名前を含むパス それでは、複数の画像ファイルが入ったフォルダを例に、一括でファイル名を変更する方法を見ていきましょう。ここでは、次のような画像フォルダを使用します。 入力(変更前の
-
PythonのopenpyxlモジュールでExcelファイルを読み書きする方法【初心者向け完全ガイド】
Pythonには、Excelファイル(.xlsx)を操作するためのopenpyxlという便利なモジュールが用意されています。このモジュールを使えば、Excelファイルの新規作成、データの書き込み・読み取り、シートの追加や管理など、さまざまな操作をプログラムから自動的に行うことができます。 本記事では、openpyxlの基本的な使い方を、実際に動作するサンプルコードとともに順番に解説していきます。 openpyxlのインストール方法 openpyxlは標準ライブラリではないため、まずインストールが必要です。コマンドプロンプト(またはターミナル)で以下のコマンドを実行してください。 pip ins