TOP > TOPICS(更新記事一覧) > MIT CREATIVE > 音源データ(WAV)に無音部分を挿入する方法~Pythonを使ったプログラムをご紹介
  • MIT CREATIVE
  • 2025.04.14

音源データ(WAV)に無音部分を挿入する方法~Pythonを使ったプログラムをご紹介

従来まで、ファイルカットしたwavデータに、無音の挿入を行う際は、無音挿入機能がある他社のアプリケーションを使用しておりました。従来の方法では、GUIの読み込みによって処理が遅かったり、フォルダ構成を複製してフォルダ毎に選択して出力する必要がありました。それに伴い私が、Pythonを使って無音を挿入するプログラムを作成したので、ご紹介します。

Pythonを使った無音の挿入

今回は、フォルダ構成が階層深くまで続いているデータに無音を挿入していきます。

無音挿入前のフォルダ

作成した無音挿入プログラムを起動します。

作成したプログラム

起動するとプロンプトが開き、無音を挿入するフォルダを選択するようウィンドウが開きます。

起動時のプロンプト画面
無音を挿入するフォルダの選択画面

プロンプト画面に戻り、データの先頭に0.2秒、末尾に0.5秒の無音を挿入するように入力して「return」キーを押します。

無音を挿入する長さを入力

すぐに出力が終わり、無音挿入が完了します。

無音挿入後のフォルダ

実際に無音が挿入されているか確認してみます。

無音挿入前のデータ
無音挿入後のデータ

無音が前後に挿入されていることが確認できます。当プログラムによりエディター業務の大幅な効率化を図ることができました。

無音部分の挿入のpythonコード

import os
import wave
from tkinter import Tk, filedialog
# ユーザーが入力する秒数の無音を作成
def create_silence(duration_ms, sample_width, sample_rate):
    num_frames = int((sample_rate * duration_ms) // 1000)  # ミリ秒 -> フレーム数
    silence = b'\0' * num_frames * sample_width  # フレーム数 * サンプル幅
    return silence
# WAVファイルに前後で異なる長さの無音を挿入
def add_silence_to_wav(input_file, output_file, silence_start_ms, silence_end_ms):
    with wave.open(input_file, 'rb') as in_wav:
        # 元ファイルプロパティ取得
        n_channels = in_wav.getnchannels()
        sample_width = in_wav.getsampwidth()
        sample_rate = in_wav.getframerate()
        n_frames = in_wav.getnframes()
        # 音声データを読み込み
        frames = in_wav.readframes(n_frames)
        # 無音を前後に追加
        silence_start = create_silence(silence_start_ms, sample_width, sample_rate)
        silence_end = create_silence(silence_end_ms, sample_width, sample_rate)
        new_frames = silence_start + frames + silence_end
        # 新しいWAVを作成
        with wave.open(output_file, 'wb') as out_wav:
            out_wav.setnchannels(n_channels)
            out_wav.setsampwidth(sample_width)
            out_wav.setframerate(sample_rate)
            out_wav.writeframes(new_frames)
# フォルダ内のWAVファイル全てに無音を挿入
def process_wav_files(input_folder, silence_start_sec, silence_end_sec):
    silence_start_ms = silence_start_sec * 1000  # 秒をミリ秒に変換
    silence_end_ms = silence_end_sec * 1000  # 秒をミリ秒に変換
    # 出力フォルダ生成
    folder_name = os.path.basename(input_folder)
    output_folder = os.path.join(os.path.dirname(input_folder), f"{folder_name}(空白後)")
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    # WAVファイルリスト取得
    files_to_process = []
    for root, _, files in os.walk(input_folder):
        for file in files:
            if file.endswith(".wav"):
                input_file = os.path.join(root, file)
                relative_path = os.path.relpath(root, input_folder)
                output_dir = os.path.join(output_folder, relative_path)
                output_file = os.path.join(output_dir, file)
                files_to_process.append((input_file, output_file, output_dir))
    total_files = len(files_to_process)
    print(f"処理対象のファイル数: {total_files}")
    # ファイル処理
    for idx, (input_file, output_file, output_dir) in enumerate(files_to_process):
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        add_silence_to_wav(input_file, output_file, silence_start_ms, silence_end_ms)
        print(f"[{idx + 1}/{total_files}] {input_file} -> {output_file}")
    print("全ての処理が完了しました!")
# メイン処理
def main():
    print("WAVファイルに無音を挿入するプログラム")
    # フォルダ選択ダイアログを表示
    root = Tk()
    root.withdraw()  # Tkinterウィンドウを非表示にする
    input_folder = filedialog.askdirectory(title="入力フォルダを選んでください")
    root.destroy()  # Tkinterのリソースを解放
    if not input_folder:
        print("入力フォルダが選択されませんでした。処理を終了します。")
        return
    try:
        # 挿入する無音の長さをユーザーに入力させる
        silence_start_sec = float(input("挿入する先頭無音の長さ(秒)を入力してください: ").strip())
        silence_end_sec = float(input("挿入する末尾無音の長さ(秒)を入力してください: ").strip())
        # 入力値確認
        if silence_start_sec < 0 or silence_end_sec < 0:
            print("無音の長さは0秒以上でなければなりません。処理を終了します。")
            return
        # WAVファイルの処理
        process_wav_files(input_folder, silence_start_sec, silence_end_sec)
    except ValueError:
        print("無音の長さは数値で入力してください。処理を終了します。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")
if __name__ == "__main__":
    main()

エディット作業のクオリティと効率化

エディターとして、クオリティの高い編集を追い求めることはもちろん、膨大な編集を行う中で可能な限りの効率化も重要になってきます。MIT STUDIOのエディターは、丁寧で確実なスタッフばかりです。私も効率の良い手順や、確認漏れのない手順を意識し、日々学んでおります。少しでも参考になりましたら幸いです。MIT STUDIOまでお問合せお待ちしております。

著者:宮崎翔也(エディター)

TOPICS一覧に戻る

topへ戻る