以下の内容はhttps://redhologerbera.hatenablog.com/entry/2025/12/28/231914より取得しました。


BlenderPyhonを用いて.mp3音源をハッシュ値名で変換する。

本日はPython枠です。

Unityやその他ツールなどで開発するために近年では生成AIなどで音源を創ることができるようになりましたが、ハッシュ値で名前を付けて.mp3の形式で大量の音源を処理したいという状況がありました。

今回はBlenderを使用して外部のツール等を使用せずに音源を一括変換してきます。

〇環境

・Windows11PC

ffmpeg

・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ファイルが出力されます。

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

本日は以上です。




以上の内容はhttps://redhologerbera.hatenablog.com/entry/2025/12/28/231914より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14