本日はPython枠です。
Unityやその他ツールなどで開発するために近年では生成AIなどで音源を創ることができるようになりましたが、ハッシュ値で名前を付けて.mp3の形式で大量の音源を処理したいという状況がありました。
今回はBlenderを使用して外部のツール等を使用せずに音源を一括変換してきます。
〇環境
・Windows11PC
・Blender4.5
※Pythonなどで音源データを処理するためにはffmpegが必要です。
〇コード
import os
import hashlib
import subprocess
import sys
# --- 環境に合わせて書き換えてください)---
# 1. 処理したい.wavファイルが保存されているディレクトリのパス
target_dir = r"C:\path to your wav_files"
# 2. FFmpeg実行ファイルのパス(Cドライブ直下にffmpegが存在している場合)
ffmpeg_path = r"C:\ffmpeg\bin\ffmpeg.exe"
# 3. 変換後の.mp3ファイルを保存するディレクトリ
output_dir = r"C:\path\to\your\output_mp3s"
# --- 設定 ---
def get_file_sha256(file_path):
sha256_hash = hashlib.sha256()
try:
with open(file_path, "rb") as f:
# 4KBごとにファイルを読み込んでハッシュを更新
for byte_block in iter(lambda: f.read(4096), b""):
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
except IOError as e:
print(f"Error: ファイルが読み込めませんでした {file_path}: {e}", file=sys.stderr)
return None
except Exception as e:
print(f"Error: ハッシュ計算中にエラーが発生しました {file_path}: {e}", file=sys.stderr)
return None
def convert_wav_to_mp3(wav_path, mp3_path):
"""
FFmpegを使って.wavを.mp3に変換します。
"""
# FFmpegに渡すコマンドリストを作成
command = [
ffmpeg_path,
"-i", wav_path, # 入力ファイル
"-n", # 注意: 同名ファイルが既にあれば上書きしない (エラーにもしない)
"-q:a", "0", # 可変ビットレート(VBR)で最高品質 (0〜9で指定)
mp3_path # 出力ファイル
]
print(f"変換中: {os.path.basename(wav_path)} -> {os.path.basename(mp3_path)}")
try:
# FFMpegを実行
# check=True: コマンドがエラー(リターンコード0以外)なら例外を発生
# capture_output=True: 標準出力と標準エラーを取得
# text=True: 出力をテキストとしてデコード
result = subprocess.run(command, capture_output=True, text=True, check=True, encoding='utf-8')
# print(f"FFmpeg STDOUT: {result.stdout}") # 詳細ログが必要ならコメント解除
if result.stderr:
# FFmpegは進捗情報などをstderrに出すことがあるため、エラーとは限らない
print(f"FFmpeg Info: {result.stderr.strip()}")
print(f"変換成功: {os.path.basename(mp3_path)}")
return True
except FileNotFoundError:
print(f"Error: FFMpeg が見つかりません '{ffmpeg_path}'.", file=sys.stderr)
print("スクリプト内の 'ffmpeg_path' の設定を確認してください。", file=sys.stderr)
return False
except subprocess.CalledProcessError as e:
# FFmpegがエラーコードを返した場合
print(f"Error: {wav_path} の変換中にFFmpegがエラーを返しました。", file=sys.stderr)
print(f"FFmpeg STDERR: {e.stderr}", file=sys.stderr)
return False
except Exception as e:
print(f"Error: 予期せぬエラーが発生しました: {e}", file=sys.stderr)
return False
def process_wav_files():
"""
指定されたディレクトリ内の.wavファイルを処理するメイン関数
"""
# --- 実行前チェック ---
if target_dir == r"C:\path\to\your\wav_files" or \
output_dir == r"C:\path\to\your\output_mp3s":
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", file=sys.stderr)
print("!! 注意: 'target_dir' または 'output_dir' が変更されていません。 !!", file=sys.stderr)
print("!! スクリプト上部の「ユーザー設定」を実際のパスに書き換えてください。 !!", file=sys.stderr)
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", file=sys.stderr)
return
if not os.path.exists(ffmpeg_path):
print(f"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", file=sys.stderr)
print(f"!! 注意: 'ffmpeg_path' が見つかりません。 !!", file=sys.stderr)
print(f"!! パスを確認してください: {ffmpeg_path} !!", file=sys.stderr)
print(f"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", file=sys.stderr)
return
if not os.path.isdir(target_dir):
print(f"Error: 'target_dir' が有効なディレクトリではありません: {target_dir}", file=sys.stderr)
return
# 出力ディレクトリが存在しない場合は作成する
if not os.path.exists(output_dir):
try:
os.makedirs(output_dir)
print(f"作成しました: {output_dir}")
except OSError as e:
print(f"Error: 出力ディレクトリの作成に失敗しました {output_dir}: {e}", file=sys.stderr)
return
print(f"処理を開始します...")
print(f"入力元: {target_dir}")
print(f"出力先: {output_dir}")
print("---")
processed_count = 0
skipped_count = 0
# ディレクトリ内のファイルをループ
for filename in os.listdir(target_dir):
# .wav ファイル (大文字小文字問わず) のみを対象
if filename.lower().endswith(".wav"):
original_wav_path = os.path.join(target_dir, filename)
# 1. ファイルのハッシュ値を計算
file_hash = get_file_sha256(original_wav_path)
if file_hash:
# 2. 新しいファイル名(ハッシュ値.mp3)を決定
new_mp3_filename = f"{file_hash}.mp3"
new_mp3_path = os.path.join(output_dir, new_mp3_filename)
# 3. 変換実行 (既に同名ファイルが存在しないか確認)
if not os.path.exists(new_mp3_path):
if convert_wav_to_mp3(original_wav_path, new_mp3_path):
processed_count += 1
else:
print(f"スキップ (出力ファイルが既に存在): {new_mp3_filename}")
skipped_count += 1
else:
print(f"ハッシュ計算失敗 (スキップ): {filename}")
skipped_count += 1
else:
# .wav 以外は無視
pass
print("---")
print(f"処理が完了しました。")
print(f"変換成功: {processed_count} 件")
print(f"スキップ: {skipped_count} 件")
# --- メイン処理の実行 ---
if __name__ == "__main__":
process_wav_files()
〇使い方
①Blenderを起動し上部Scriptingタブを開き先ほどのPythonコードを入力します。

②上部の設定を自身の環境に合わせて書き換えます。
# 1. 処理したい.wavファイルが保存されているディレクトリのパス target_dir = r"C:\path to your wav_files" # 2. FFmpeg実行ファイルのパス(Cドライブ直下にffmpegが存在している場合) ffmpeg_path = r"C:\ffmpeg\bin\ffmpeg.exe" # 3. 変換後の.mp3ファイルを保存するディレクトリ output_dir = r"C:\path\to\your\output_mp3s"

この指定したフォルダにwavファイルがある条件で処理を実行します。

これによって指定した出力パスにハッシュ値名で.mp3ファイルが出力されます。

ハッシュ値は被ることが無いデータなので、同姓同名がないのが良いのですが一つ一つ人力でリネームは大変なのでこういったときにBlenderのPython環境は役に立ちます。
本日は以上です。