次のWAVファイルの情報をPythonで取得したいですか?
- チャンネル数
- サンプルサイズ
- サンプリングレート(サンプリング周波数)
- フレームレート
- 再生時間
それなら、この記事があなたの助けとなるでしょう。
この記事を読めば、これ以上は検索をする必要はありません。
結論を言うと、waveモジュールを使います。
本記事の内容
- waveモジュールとは?
- WAVファイルの情報を取得する
- 最初に標準ライブラリを確認する
それでは、上記に沿って解説していきます。
waveモジュールとは?
waveモジュールは、Pythonの標準ライブラリです。
そのため、ライブラリを別途インストールする必要はありません。
waveモジュールの機能は、大きく以下の二つ。
- WAVファイルの読み込み
- WAVファイルの書き込み
これらの機能が、標準ライブラリで可能なのです。
Pythonは、やっぱり便利です。
そして、waveモジュールの使い方は公式をご覧ください。
wave — WAVファイルの読み書き
https://docs.python.org/ja/3.9/library/wave.html
見ればわかるレベルの関数が、用意されています。
以上、waveモジュールについて説明しました。
次は、実際にWAVファイルの情報を取得していきましょう。
WAVファイルの情報を取得する
まずは、WAVファイルを用意しましょう。
そのファイルを「test.wav」とします。
「test.wav」の情報を表示するサンプルコードは、以下。
import wave FILE_PATH = "test.wav" # 読み込みモードでWAVファイルを開く with wave.open(FILE_PATH, 'rb') as wr: # 情報取得 ch = wr.getnchannels() width = wr.getsampwidth() fr = wr.getframerate() fn = wr.getnframes() # 表示 print("チャンネル: ", ch) print("サンプルサイズ: ", width) print("サンプリングレート: ", fr) print("フレームレート: ", fn) print("再生時間: ", 1.0 * fn / fr)
上記を実行すると、以下のような結果が表示されます。
チャンネル: 1 サンプルサイズ: 2 サンプリングレート: 22050 フレームレート: 1347877 再生時間: 61.12820861678004
再生時間は、ピンポイントで取得する関数がありません。
そのため、サンプリングレートとフレームレートをもとに算出しています。
以上、waveモジュールを用いてWAVファイルの情報を取得しました。
最後は、標準ライブラリを確認することの重要性について説明します。
最初に標準ライブラリを確認する
今回、私自身が無駄に時間と費やしました。
waveモジュールにたどり着くまでにです。
「WAVファイルの情報を取得する」
このことが標準ライブラリで可能とは、思いもしませんでした。
別途ライブラリをインストールする必要があると思い込んでいたのです。
そして、実際に世の中には私と同じように思う人たちがたくさんいます。
- Scipy
- Pydub(AudioSegment)
調べた限りでは、上記のライブラリをインストールしているケースがありました。
正確には、Pydubは内部でAudioSegmentを利用するライブラリです。
Pydubを紹介している記事が、結構ありました。
このPydubは、導入自体が結構大がかりです。
Pydubのインストールには、FFmpegのインストールが必要となります。
がっつりと音声処理をするなら、Pydubをインストールすることに問題はありません。
でも、「WAVファイルの情報を取得する」程度でPydubのインストールは無駄です。
この場合、処理速度が遅いというデメリットもあります。
(実際に検証して確認済)
そりゃ、標準でPythonに組み込まれているwaveモジュールの方が速いですよね。
処理速度に関してなら、Scipyはそれほど遅いとは感じません。
ただ、取得できるデータが人間に優しくありません。
サンプリングレート以外は、数字の羅列が意味不明です。
以上のことより、幸せの青い鳥が頭に浮かびました。
欲しい機能(モノ)を求めてライブラリを探し求めました。
その過程では、いろいろと便利なライブラリを見つけました。
でも、waveモジュールが最も欲しいモノだったということです。
それは、もともとPythonに組み込まれていました。
今後の教訓にしたいと思います。