[Python] wavファイルの長さ(再生時間)を取得する方法

Pythonでwavファイルの長さ(再生時間)を取得するには、waveモジュールやpydubライブラリを使用する方法があります。

waveモジュールを使う場合、ファイルを開き、サンプルレートとフレーム数を取得し、再生時間を計算します。

また、pydubを使うと、AudioSegmentクラスduration_secondsプロパティで簡単に取得できます。

この記事でわかること
  • wavファイルの再生時間を取得する方法
  • waveモジュールの基本的な使い方
  • pydubライブラリの活用法
  • 複数ファイルの処理方法
  • 再生時間をCSVに出力する方法

目次から探す

wavファイルの基本情報とPythonでの扱い方

wavファイルとは?

wavファイル(Waveform Audio File Format)は、音声データを保存するためのファイル形式の一つです。

主に以下の特徴があります。

  • 非圧縮: 音質が高く、データがそのまま保存されるため、音質劣化がありません。
  • 拡張性: メタデータを含むことができ、音声の情報を追加できます。
  • 互換性: 多くのプラットフォームやアプリケーションでサポートされています。

Pythonでwavファイルを扱うためのライブラリ

Pythonでは、wavファイルを扱うためにいくつかのライブラリが利用できます。

以下は代表的なライブラリです。

スクロールできます
ライブラリ名概要
wave標準ライブラリで、基本的なwavファイルの読み書きが可能
pydub音声処理を簡単に行えるライブラリで、wavファイルの操作もサポート
scipy科学計算ライブラリで、音声データの読み込みが可能

wavファイルのメタデータと再生時間の関係

wavファイルには、音声データの他にメタデータが含まれています。

メタデータには、以下の情報が含まれます。

  • サンプルレート: 1秒間に何回音声がサンプリングされるかを示す値(Hz)
  • ビット深度: 音声のダイナミックレンジを示す値(例:16ビット、24ビット)
  • チャンネル数: モノラル(1チャンネル)またはステレオ(2チャンネル)

再生時間は、サンプルレートとフレーム数から計算できます。

具体的には、以下の式で求められます。

\[\text{再生時間(秒)} = \frac{\text{フレーム数}}{\text{サンプルレート}}\]

サンプルレートとフレーム数の基礎知識

  • サンプルレート: 音声の品質を決定する重要な要素で、一般的な値は以下の通りです。
  • 44.1 kHz: CD音質
  • 48 kHz: 映像音声用
  • 96 kHz: 高音質録音用
  • フレーム数: wavファイルに含まれる音声データの総フレーム数で、音声の長さを決定します。

フレーム数は、サンプルレートと再生時間から計算できます。

例えば、サンプルレートが44.1 kHzで再生時間が10秒の場合、フレーム数は以下のように計算されます。

\[\text{フレーム数} = \text{サンプルレート} \times \text{再生時間} = 44100 \times 10 = 441000\]

waveモジュールを使ったwavファイルの再生時間取得

waveモジュールの基本的な使い方

Pythonの標準ライブラリであるwaveモジュールを使用すると、wavファイルの読み書きが簡単に行えます。

waveモジュールを使うことで、音声データのフレーム数やサンプルレートなどの情報を取得できます。

基本的な流れは以下の通りです。

  1. wavファイルをオープンする。
  2. 必要な情報を取得する。
  3. ファイルをクローズする。

サンプルレートとフレーム数の取得方法

waveモジュールを使用して、wavファイルのサンプルレートとフレーム数を取得するには、以下のメソッドを使用します。

  • getframerate(): サンプルレートを取得
  • getnframes(): フレーム数を取得

これらのメソッドを使うことで、音声データの基本的な情報を簡単に取得できます。

再生時間の計算方法

再生時間は、サンプルレートとフレーム数を用いて計算できます。

具体的な計算式は以下の通りです。

\[\text{再生時間(秒)} = \frac{\text{フレーム数}}{\text{サンプルレート}}\]

この式を用いることで、wavファイルの再生時間を簡単に求めることができます。

実際のコード例

以下は、waveモジュールを使用してwavファイルの再生時間を取得するサンプルコードです。

import wave
# wavファイルをオープン
with wave.open('sample.wav', 'rb') as wav_file:
    # サンプルレートを取得
    sample_rate = wav_file.getframerate()
    # フレーム数を取得
    num_frames = wav_file.getnframes()
    
    # 再生時間を計算
    duration = num_frames / sample_rate
# 結果を表示
print(f"サンプルレート: {sample_rate} Hz")
print(f"フレーム数: {num_frames}")
print(f"再生時間: {duration:.2f} 秒")
サンプルレート: 44100 Hz
フレーム数: 441000
再生時間: 10.00 秒

waveモジュールの制限と注意点

waveモジュールにはいくつかの制限があります。

以下の点に注意してください。

  • ファイル形式: waveモジュールはwavファイル専用で、他の音声形式には対応していません。
  • エラーハンドリング: ファイルが存在しない場合や、無効なwavファイルの場合はエラーが発生します。

適切なエラーハンドリングを行うことが重要です。

  • メタデータの取得: waveモジュールでは、音声データのメタデータ(アーティスト名やアルバム名など)を取得することはできません。

音声データのみに焦点を当てています。

pydubライブラリを使った簡単な再生時間取得

pydubライブラリのインストール方法

pydubライブラリは、音声処理を簡単に行うための強力なライブラリです。

インストールは、以下のコマンドを使用して行います。

pip install pydub

また、pydubを使用するためには、FFmpegまたはlibavが必要です。

ただ使うだけならプログラムと同じフォルダ(カレントディレクトリ)に配置するだけで構いません。

これらをインストールすることで、さまざまな音声形式を扱うことができます。

FFmpegのインストール方法は、公式サイトを参照してください。

AudioSegmentクラスの基本的な使い方

pydubライブラリの中心となるクラスがAudioSegmentです。

このクラスを使用することで、音声ファイルを簡単に読み込み、操作することができます。

基本的な使い方は以下の通りです。

  1. AudioSegment.from_file()メソッドを使用して音声ファイルを読み込む。
  2. 読み込んだ音声データに対して、さまざまな操作を行うことができる。

duration_secondsプロパティで再生時間を取得する方法

AudioSegmentクラスには、duration_secondsというプロパティがあり、音声データの再生時間を秒単位で取得できます。

このプロパティを使用することで、簡単に再生時間を取得することができます。

実際のコード例

以下は、pydubライブラリを使用してwavファイルの再生時間を取得するサンプルコードです。

from pydub import AudioSegment
# wavファイルを読み込む
audio = AudioSegment.from_file('sample.wav')
# 再生時間を取得
duration = audio.duration_seconds
# 結果を表示
print(f"再生時間: {duration:.2f} 秒")
再生時間: 10.00 秒

pydubの利点と制限

pydubライブラリには多くの利点がありますが、いくつかの制限も存在します。

以下にまとめました。

スクロールできます
利点制限
簡単なインターフェースで音声処理が可能FFmpegまたはlibavが必要
多様な音声形式に対応大きなファイルを扱う際にメモリを多く消費することがある
音声の編集や変換が容易リアルタイム処理には向かない

pydubは、音声処理を簡単に行いたい場合に非常に便利なライブラリですが、使用する際にはその制限を理解しておくことが重要です。

scipy.io.wavfileを使った再生時間の取得

scipy.io.wavfileのインストールと基本的な使い方

scipyライブラリは、科学計算やデータ処理に広く使用されるライブラリで、その中のio.wavfileモジュールを使用することで、wavファイルの読み込みが可能です。

scipyライブラリをインストールするには、以下のコマンドを使用します。

pip install scipy

基本的な使い方は、scipy.io.wavfile.read()メソッドを使用してwavファイルを読み込み、サンプルレートと音声データを取得することです。

サンプルレートとデータの取得方法

scipy.io.wavfile.read()メソッドを使用すると、wavファイルのサンプルレートと音声データを同時に取得できます。

以下のように、戻り値はサンプルレートとデータのタプルです。

from scipy.io import wavfile
# wavファイルを読み込む
sample_rate, data = wavfile.read('sample.wav')

再生時間の計算方法

再生時間は、サンプルレートとデータのフレーム数を用いて計算できます。

具体的な計算式は以下の通りです。

\[\text{再生時間(秒)} = \frac{\text{フレーム数}}{\text{サンプルレート}}\]

ここで、フレーム数は音声データの長さを示します。

dataの形状を確認することで、フレーム数を取得できます。

実際のコード例

以下は、scipy.io.wavfileを使用してwavファイルの再生時間を取得するサンプルコードです。

from scipy.io import wavfile
# wavファイルを読み込む
sample_rate, data = wavfile.read('sample.wav')
# フレーム数を取得
num_frames = data.shape[0]
# 再生時間を計算
duration = num_frames / sample_rate
# 結果を表示
print(f"サンプルレート: {sample_rate} Hz")
print(f"フレーム数: {num_frames}")
print(f"再生時間: {duration:.2f} 秒")
サンプルレート: 44100 Hz
フレーム数: 441000
再生時間: 10.00 秒

scipy.io.wavfileの利点と制限

scipy.io.wavfileモジュールには多くの利点がありますが、いくつかの制限も存在します。

以下にまとめました。

スクロールできます
利点制限
簡単にwavファイルを読み込むことができるwavファイル専用で、他の音声形式には対応していない
NumPy配列として音声データを取得できるため、数値計算が容易大きなファイルを扱う際にメモリを多く消費することがある
サンプルレートとデータを同時に取得できるエラーハンドリングが自動では行われないため、注意が必要

scipy.io.wavfileは、科学計算やデータ処理を行う際に非常に便利なツールですが、その制限を理解して適切に使用することが重要です。

応用例:複数のwavファイルの再生時間を一括取得

複数ファイルの処理を行うための基本的な流れ

複数のwavファイルの再生時間を一括で取得するための基本的な流れは以下の通りです。

  1. 処理したいwavファイルのリストを作成する。
  2. 各ファイルに対して、再生時間を取得する処理を行う。
  3. 取得した再生時間をリストに保存する。
  4. 必要に応じて、合計や平均を計算する。

waveモジュールを使った一括処理の例

以下は、waveモジュールを使用して複数のwavファイルの再生時間を一括で取得するサンプルコードです。

import wave
import os
# 処理するwavファイルのリスト
wav_files = ['file1.wav', 'file2.wav', 'file3.wav']
# 再生時間を保存するリスト
durations = []
# 各ファイルの再生時間を取得
for file in wav_files:
    with wave.open(file, 'rb') as wav_file:
        sample_rate = wav_file.getframerate()
        num_frames = wav_file.getnframes()
        duration = num_frames / sample_rate
        durations.append(duration)
# 結果を表示
for file, duration in zip(wav_files, durations):
    print(f"{file}: {duration:.2f} 秒")
file1.wav: 10.00 秒
file2.wav: 8.50 秒
file3.wav: 12.30 秒

pydubを使った一括処理の例

次に、pydubライブラリを使用して複数のwavファイルの再生時間を一括で取得するサンプルコードです。

from pydub import AudioSegment
# 処理するwavファイルのリスト
wav_files = ['file1.wav', 'file2.wav', 'file3.wav']
# 再生時間を保存するリスト
durations = []
# 各ファイルの再生時間を取得
for file in wav_files:
    audio = AudioSegment.from_file(file)
    duration = audio.duration_seconds
    durations.append(duration)
# 結果を表示
for file, duration in zip(wav_files, durations):
    print(f"{file}: {duration:.2f} 秒")
file1.wav: 10.00 秒
file2.wav: 8.50 秒
file3.wav: 12.30 秒

再生時間の合計を計算する方法

取得した再生時間の合計を計算するには、sum()関数を使用します。

以下のように実装できます。

total_duration = sum(durations)
print(f"合計再生時間: {total_duration:.2f} 秒")
合計再生時間: 30.80 秒

再生時間の平均を計算する方法

再生時間の平均を計算するには、合計をファイル数で割ります。

以下のように実装できます。

average_duration = total_duration / len(durations)
print(f"平均再生時間: {average_duration:.2f} 秒")
平均再生時間: 10.27 秒

このように、複数のwavファイルの再生時間を一括で取得し、合計や平均を計算することができます。

これにより、音声データの管理や分析が効率的に行えます。

応用例:wavファイルの再生時間をGUIで表示する

tkinterを使った簡単なGUIの作成

Pythonのtkinterライブラリを使用して、簡単なGUIアプリケーションを作成します。

tkinterはPythonに標準で搭載されているGUIライブラリで、ウィンドウやボタン、ラベルなどのウィジェットを簡単に作成できます。

以下は、基本的なウィンドウを作成するコードです。

import tkinter as tk
# メインウィンドウの作成
root = tk.Tk()
root.title("WAVファイルの再生時間表示")
root.geometry("300x200")
# メインループの開始
root.mainloop()

ファイル選択ダイアログの実装

次に、ファイル選択ダイアログを実装します。

tkinterfiledialogモジュールを使用して、ユーザーがwavファイルを選択できるようにします。

以下のコードを追加します。

from tkinter import filedialog
def select_file():
    file_path = filedialog.askopenfilename(filetypes=[("WAV files", "*.wav")])
    if file_path:
        display_duration(file_path)
# ボタンの作成
select_button = tk.Button(root, text="WAVファイルを選択", command=select_file)
select_button.pack(pady=20)

再生時間を表示するラベルの作成

再生時間を表示するためのラベルを作成します。

ラベルは、選択したファイルの再生時間を表示するために使用します。

以下のコードを追加します。

# 再生時間表示用のラベル
duration_label = tk.Label(root, text="再生時間: ", font=("Arial", 12))
duration_label.pack(pady=20)

waveモジュールを使った再生時間の取得と表示

waveモジュールを使用して、選択したwavファイルの再生時間を取得し、ラベルに表示します。

以下の関数を追加します。

import wave
def display_duration(file_path):
    with wave.open(file_path, 'rb') as wav_file:
        sample_rate = wav_file.getframerate()
        num_frames = wav_file.getnframes()
        duration = num_frames / sample_rate
        duration_label.config(text=f"再生時間: {duration:.2f} 秒")

pydubを使った再生時間の取得と表示

pydubライブラリを使用して再生時間を取得する場合の関数も追加します。

以下のように実装できます。

from pydub import AudioSegment
def display_duration_pydub(file_path):
    audio = AudioSegment.from_file(file_path)
    duration = audio.duration_seconds
    duration_label.config(text=f"再生時間: {duration:.2f} 秒")

この場合、select_file関数内でdisplay_duration_pydubを呼び出すように変更することができます。

完全なコード例

以下は、上記のすべての要素を組み合わせた完全なコード例です。

import tkinter as tk
from tkinter import filedialog
import wave
from pydub import AudioSegment
def select_file():
    file_path = filedialog.askopenfilename(filetypes=[("WAV files", "*.wav")])
    if file_path:
        display_duration(file_path)
def display_duration(file_path):
    with wave.open(file_path, 'rb') as wav_file:
        sample_rate = wav_file.getframerate()
        num_frames = wav_file.getnframes()
        duration = num_frames / sample_rate
        duration_label.config(text=f"再生時間: {duration:.2f} 秒")
# メインウィンドウの作成
root = tk.Tk()
root.title("WAVファイルの再生時間表示")
root.geometry("300x200")
# ボタンの作成
select_button = tk.Button(root, text="WAVファイルを選択", command=select_file)
select_button.pack(pady=20)
# 再生時間表示用のラベル
duration_label = tk.Label(root, text="再生時間: ", font=("Arial", 12))
duration_label.pack(pady=20)
# メインループの開始
root.mainloop()

このコードを実行すると、ユーザーはwavファイルを選択し、その再生時間がGUI上に表示されます。

waveモジュールを使用した例を示しましたが、pydubを使用する場合も同様の方法で実装できます。

応用例:wavファイルの再生時間をCSVに出力する

CSVファイルの基本的な操作方法

CSV(Comma-Separated Values)ファイルは、データをカンマで区切って保存するシンプルなテキストファイル形式です。

Pythonでは、csvモジュールを使用してCSVファイルの読み書きが簡単に行えます。

基本的な操作は以下の通りです。

  1. csv.writer()を使用してCSVファイルに書き込む。
  2. csv.reader()を使用してCSVファイルからデータを読み込む。

以下は、CSVファイルにデータを書き込む基本的な例です。

import csv
# 書き込むデータ
data = [["ファイル名", "再生時間"]]
data.append(["sample.wav", 10.0])
# CSVファイルに書き込む
with open('output.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(data)

waveモジュールを使った再生時間の取得とCSV出力

waveモジュールを使用してwavファイルの再生時間を取得し、CSVファイルに出力する方法を示します。

以下のコードは、指定したwavファイルの再生時間をCSVに書き込む例です。

import wave
import csv
# 処理するwavファイルのリスト
wav_files = ['file1.wav', 'file2.wav', 'file3.wav']
# CSVファイルに書き込むデータ
data = [["ファイル名", "再生時間"]]
# 各ファイルの再生時間を取得
for file in wav_files:
    with wave.open(file, 'rb') as wav_file:
        sample_rate = wav_file.getframerate()
        num_frames = wav_file.getnframes()
        duration = num_frames / sample_rate
        data.append([file, duration])
# CSVファイルに書き込む
with open('wave_durations.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(data)

pydubを使った再生時間の取得とCSV出力

次に、pydubライブラリを使用してwavファイルの再生時間を取得し、CSVファイルに出力する方法を示します。

以下のコードは、指定したwavファイルの再生時間をCSVに書き込む例です。

from pydub import AudioSegment
import csv
# 処理するwavファイルのリスト
wav_files = ['file1.wav', 'file2.wav', 'file3.wav']
# CSVファイルに書き込むデータ
data = [["ファイル名", "再生時間"]]
# 各ファイルの再生時間を取得
for file in wav_files:
    audio = AudioSegment.from_file(file)
    duration = audio.duration_seconds
    data.append([file, duration])
# CSVファイルに書き込む
with open('pydub_wave_durations.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(data)

複数ファイルの再生時間をCSVにまとめる方法

複数のwavファイルの再生時間を取得し、1つのCSVファイルにまとめる方法は、上記のwaveモジュールやpydubを使用した例を組み合わせることで実現できます。

以下は、両方の方法を使用して再生時間を取得し、1つのCSVファイルにまとめる例です。

import wave
from pydub import AudioSegment
import csv
# 処理するwavファイルのリスト
wav_files = ['file1.wav', 'file2.wav', 'file3.wav']
# CSVファイルに書き込むデータ
data = [["ファイル名", "再生時間 (wave)", "再生時間 (pydub)"]]
# 各ファイルの再生時間を取得
for file in wav_files:
    # waveモジュールを使用して再生時間を取得
    with wave.open(file, 'rb') as wav_file:
        sample_rate = wav_file.getframerate()
        num_frames = wav_file.getnframes()
        duration_wave = num_frames / sample_rate
    # pydubを使用して再生時間を取得
    audio = AudioSegment.from_file(file)
    duration_pydub = audio.duration_seconds
    # データを追加
    data.append([file, duration_wave, duration_pydub])
# CSVファイルに書き込む
with open('combined_wave_durations.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(data)

このコードを実行すると、指定したwavファイルの再生時間がwaveモジュールとpydubの両方を使用して取得され、1つのCSVファイルにまとめられます。

これにより、異なる方法で取得した再生時間を比較することができます。

よくある質問

waveモジュールとpydubのどちらを使うべき?

waveモジュールとpydubはそれぞれ異なる利点があります。

waveモジュールはPythonの標準ライブラリであり、特にwavファイルの基本的な操作に特化しています。

軽量で依存関係が少ないため、シンプルな用途には最適です。

一方、pydubは音声処理のための高機能なライブラリで、wavファイル以外の多くの音声形式にも対応しています。

音声の編集や変換を行いたい場合はpydubを選ぶと良いでしょう。

用途に応じて使い分けることが重要です。

wavファイル以外のオーディオ形式でも同じ方法で再生時間を取得できる?

waveモジュールはwavファイル専用のため、他のオーディオ形式(例:mp3、flacなど)には対応していません。

しかし、pydubを使用すれば、mp3やflacなどの他のオーディオ形式でも再生時間を取得できます。

pydubはFFmpegやlibavをバックエンドに使用しているため、さまざまな音声形式を扱うことが可能です。

したがって、異なる形式の音声ファイルを扱う場合はpydubを使用することをお勧めします。

再生時間が正しく取得できない場合の対処法は?

再生時間が正しく取得できない場合、以下の点を確認してください。

  • ファイル形式の確認: 使用しているライブラリが対応しているファイル形式であるか確認します。

waveモジュールはwavファイル専用ですが、pydubは多くの形式に対応しています。

  • ファイルの破損: 音声ファイルが破損している場合、正しい情報が取得できないことがあります。

別の音声ファイルで試してみてください。

  • エラーハンドリング: ファイルを開く際にエラーが発生している可能性があります。

try-except文を使用してエラーハンドリングを行い、エラーメッセージを確認してください。

  • ライブラリのバージョン: 使用しているライブラリのバージョンが古い場合、バグや互換性の問題が発生することがあります。

最新のバージョンにアップデートしてみてください。

これらの点を確認することで、再生時間が正しく取得できない問題を解決できる可能性があります。

まとめ

この記事では、Pythonを使用してwavファイルの再生時間を取得する方法について詳しく解説しました。

具体的には、waveモジュールやpydubライブラリを利用した再生時間の取得方法、さらに複数のwavファイルの再生時間を一括で取得し、CSVファイルに出力する方法についても触れました。

これらの知識を活用することで、音声データの管理や分析がより効率的に行えるようになるでしょう。

ぜひ、実際にコードを試してみて、音声ファイルの処理に役立ててください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す