Python標準モジュールのみ14行でwavファイルを指定時間毎に分割する方法
本記事の主旨
Python標準モジュールであるwaveモジュールのみのインポートで、wavファイルを指定時間毎に分割する簡単なコード2つとその解説について記す。
本記事の目的
本記事の目的を以下に記す。
- Python標準モジュールのみでwavファイルを指定時間毎に分割する簡単なコード2つについて記すこと
本記事の背景
インターネット上でも生成AIでも、Python標準モジュールのみを用いて簡単にwavファイルを指定時間毎に分割する方法がない。
よって、本記事でコードとその解説を記す。
実装
以下にソースを記す。
空行を抜いて14行である。
解説
1行目、「import wave」で、waveモジュールのみをインポートする。
3行目、「FILE_S = 1.0 # 分割後ファイル秒数[s]」で、分割後ファイル秒数を指定する。
ここでは、分割後ファイル秒数が小数でも、指定できるようにしている。
例として、分割後ファイル秒数を100[ms]で指定する場合は、0.1と指定すればよい。
5行目、「with wave.open("Ha_AMM01.wav", 'rb') as rwf:」で、今回は「Ha_AMM01.wav」というファイルを分割するために開く。
6行目、「wwf_n_frames = int(FILE_S * rwf.getframerate()) # 書き込み後ファイルフレーム数を、指定した分割後ファイル秒数間での上限フレーム数に指定。」で、wwf_n_framesに指定した分割後ファイル秒数間での上限フレーム数を計算し設定する。
ここで、「rwf.getframerate()」は、分割したいファイルのフレームレートを取得する関数である。
7~10行目、「rwf.getnframes()」を「wwf_n_frames」で割り切れるか否かで、ループ回数に1を足すか足さないかを決めている。
ここで、「rwf.getnframes()」は、分割したいファイルの全フレーム数を取得する関数である。
そのため、「rwf.getnframes() // wwf_n_frames」は、(全フレーム数)/(分割後ファイル上限フレーム数)の小数点以下切り捨ての値となる。
よって、小数点以下が0でない場合は、この値が分割ファイル数よりも1小さいため1を足す。
11行目、「for i in range(n_loop):」で、iが0から分割ファイル数分ループを回す。
12行目、「rwf.setpos(i * wwf_n_frames) # 今回ファイルを切り出す開始地点に移動」で、今回ファイルを切り出す開始地点に移動する。
ここで、「rwf.setpos()」は、指定したフレームを開始地点とする関数である。
13行目、「with wave.open("Ha_AMM01_" + str(i) + ".wav", 'wb') as wwf:」で、分割するためのループ内で「Ha_AMM01_(分割ファイル番号).wav」というファイルを分割ファイルとして書き込むために開く。
14行目、「wwf.setparams(rwf.getparams())」で、分割したいファイルのパラメータをそのまま分割後のファイルに入れる。
ここで、「rwf.getparams()」は、ファイルのパラメータをタプル型で取得する関数である。
ここで、「wwf.setparams()」は、ファイルのパラメータをタプル型で設定する関数である。
15行目、「wwf.writeframes(rwf.readframes(wwf_n_frames))」で、今回切り出す個所を書き込む。
ここで、「rwf.readframes()」は、ファイルのデータをbytes型で取得する関数である。
このとき、ファイルのデータは「rwf.setpos()」で移動した開始地点から読みだされる。
ここで、「wwf.writeframes()」は、ファイルのデータをbytes型で設定する関数である。
結果
ここで用いているHa_AMM01.wavは、鳥類音声データベースの奄美大島のヒヨドリの個体番号1である。
結果としては、以下のように分割される。
ファイル分割後それぞれのファイル
実行すると、以下のようにエクスプローラー上で見える。

ファイル分割後それぞれの音声波形
Audacityで波形を確認すると、以下のようになった。

ファイルがしっかり分割されていることが、見て取れる。
まとめ
- Python標準モジュールのみでwavファイルを指定時間毎に分割するコードは、空行を抜いて14行で書ける。
広告
日本野鳥の会会長監修の、音声QRコード付き野鳥図鑑。












ディスカッション
コメント一覧
まだ、コメントがありません