PythonでWAVファイルの書き込み(soundfile.write)

Python で WAVファイルを書き込むには soundfile.write 関数を使います。

パラメータ

soundfile.write の主なパラメータは以下です。返り値はないです。

soundfile.write(file, data, samplerate, subtype=None)
表:soundfile.writeのパラメータ
パラメータ名 データ型 概要
file str 出力WAVファイル名
data array_like 書き込むデータ
samplerate int サンプリングレート
subtype str データ形式

主な使用例

モノラルデータの書き込み

モノラルのWAVデータを書きこむソースコードは以下です。

import numpy as np
import soundfile as sf

samplerate = 48000    # サンプリングレート
freq = 1000           # 正弦波の周波数
n = np.arange(samplerate*2)  # サンプリング番号
data = np.sin(2.0*np.pi*freq*n/samplerate) # 正弦波作成
sf.write("out1.wav", data, samplerate, subtype="PCM_24") # 書き込み

上記のようにファイル名、データ、サンプリングレート、データ形式を与えることでWAVファイルを作成できます。

データ型がfloatの場合、data の値は-1.0~1.0の範囲に収める必要があり、その範囲に収まらないデータはクリップされます

データ型がintの場合は、そのデータ型の範囲に収めればよいです。(int16の場合、-32768~32767)

データ形式については「3.2 データ形式の種類」で後述します。

作成される正弦波のデータは以下です(データはMP3に変換しています)。

作成したモノラルデータ

ステレオデータの書き込み

ステレオのWAVデータを書き込むソースコードは以下です。

import numpy as np
import soundfile as sf

samplerate = 48000   # サンプリングレート
freq = 1000          # 正弦波の周波数
n = np.arange(samplerate*2)  # サンプリング番号
data = np.zeros((samplerate*2,2), dtype=float)  
data[:,0] = np.sin(2.0*np.pi*freq*n/samplerate)          # 正弦波作成
data[:,1] = np.sin(np.random.rand(samplerate*2)*2-1.0)   # 白色雑音作成
sf.write("out2.wav", data, samplerate, subtype="PCM_24") # 書き込み

ステレオの場合、 data[ : , 0] に左チャネルのデータ、data[ : , 1] に右チャネルのデータを格納します。

作成したステレオデータ

おまけ

書き込めるオーディオファイル

soundfile.write はWAVファイル以外も書きこめます。書き込めるデータフォーマットは以下のリンクに記載があります。

■対応するデータフォーマット一覧
http://www.mega-nerd.com/libsndfile/#Features

一応、sf.available_formats()で対応するオーディオファイルの一覧は確認できます。

import soundfile as sf
print(sf.available_formats())
#{'AIFF': 'AIFF (Apple/SGI)', 'AU': 'AU (Sun/NeXT)', 
# ・・・
#'XI': 'XI (FastTracker 2)'}

データ形式の種類

パラメータ subtype で使えるものは sf.available_subtypes で確認できます。

import soundfile as sf
print(sf.available_subtypes('WAV'))
#{'PCM_16': 'Signed 16 bit PCM', 'PCM_24': 'Signed 24 bit PCM', 
# ・・・
#'GSM 6.10', 'G721_32': '32kbs G721 ADPCM'}

その他のパラメータ

endian
RAW ファイルを書きこむ場合、エンディアンを指定する場合に使用。

format
書き込むファイルのフォーマットを選択するパラメータ。引数が与えられない場合、拡張子でファイルフォーマットを判断します。

closefd
ファイルディスクリプタを閉じるか否かのパラメータ。

おわりに

本記事では、WAVファイルを書き込む関数 soundfile.write について紹介しました。WAVファイルを書き込む場合はぜひ使っていただきたいと思います。

■参考文献
[1] Bastian Bechtold.“python-soundfile”. Read the Docs. 2015.
https://python-soundfile.readthedocs.io/en/0.11.0/, (参照2024-02-24)