Python
 Computer >> コンピューター >  >> プログラミング >> Python

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などのライブラリとの組み合わせも検討するとよいでしょう。

  1. Pythonで複数のファイル名を一括変更する方法【os.rename()活用】

    Python3では、rename()メソッドを使うことで、ファイルやディレクトリの名前を簡単に変更できます。このメソッドは標準ライブラリのosモジュールに含まれており、追加のインストールなしですぐに利用可能です。 os.rename() の基本構文 os.rename(src, dst) 各引数の意味は以下のとおりです。 src: 名前を変更したい元のファイル(またはディレクトリ)のパス dst: 変更後の新しい名前を含むパス それでは、複数の画像ファイルが入ったフォルダを例に、一括でファイル名を変更する方法を見ていきましょう。ここでは、次のような画像フォルダを使用します。 入力(変更前の

  2. PythonのopenpyxlモジュールでExcelファイルを読み書きする方法【初心者向け完全ガイド】

    Pythonには、Excelファイル(.xlsx)を操作するためのopenpyxlという便利なモジュールが用意されています。このモジュールを使えば、Excelファイルの新規作成、データの書き込み・読み取り、シートの追加や管理など、さまざまな操作をプログラムから自動的に行うことができます。 本記事では、openpyxlの基本的な使い方を、実際に動作するサンプルコードとともに順番に解説していきます。 openpyxlのインストール方法 openpyxlは標準ライブラリではないため、まずインストールが必要です。コマンドプロンプト(またはターミナル)で以下のコマンドを実行してください。 pip ins