はじめに
とあるコストを見積もるために、S3に保存しているWAV形式の音声ファイルの長さを調べる必要があたったので作成したスクリプトを紹介します
パッケージのインストール
音声データの処理にpython-soundfileを使用しています。python-soundfileを使用するにはlibsndfile
が必要なため、適宜インストールください。
Ubuntuの場合は以下でインストール可能です。
sudo apt-get install -y libsndfile1
pip install boto3 soundfile
スクリプト
S3から順番にWAFファイルを取得して、長さ = 総サンプル数 / サンプリングレート
で計算しています。
ファイル数が多いとS3の通信料が高額になるため気をつけましょう。
import csv
import io
import boto3
import soundfile as sf
s3_client = boto3.client("s3")
BUCKET_NAME = "your bucket name"
PREFIX = "your directory prefix"
def main():
result = []
paginator = s3_client.get_paginator("list_objects_v2")
for page in paginator.paginate(Bucket=BUCKET_NAME, Prefix=PREFIX):
for content in page["Contents"]:
key = content["Key"]
# 音声ファイルの長さを検索
response = s3_client.get_object(Bucket=BUCKET_NAME, Key=key)
audio_data = io.BytesIO(response["Body"].read())
with sf.SoundFile(audio_data) as f:
duration = len(f) / f.samplerate
result.append({"key": key, "size": content["Size"], "duration": duration})
with open("result.csv", "w") as f:
writer = csv.DictWriter(f, fieldnames=result[0].keys())
writer.writeheader()
for row in result:
writer.writerow(row)
if __name__ == "__main__":
main()