プログラミングの芽

面白そうな技術を使って、楽しいことやりたい

【Python】フォルダ内のmp3ファイルを結合して書き出す

こんにちは

ふと、フォルダ内に複数入っているmp3ファイルを1つのファイルにまとめたくなったので、ついでにここに残しておきます。

今回の仕様は
・フォルダ内のmp3ファイル(以下sound)をn個分結合して書き出し
・soundはランダムに選ばれる
・soundごとにmミリ秒の無音をインターバルとして挿入
・l%の確率で別フォルダ内のmp3ファイルを選択

以下が実装です

import os
from pydub import AudioSegment
import random

AtariDir = "./音源/あたり" 
HazureDir = "./音源/はずれ"

# get mp3 path
def getFileList(dirName):
    fileList = os.listdir(dirName)
    for i in range(len(fileList)):
        fileList[i] = dirName + "/" + fileList[i]
    # reset seed
    random.seed()
    # shuffle
    random.shuffle(fileList) 
    return fileList

# Combine n songs at random
# m[ms] intervals
def combineSounds(n,m,l):
    interval = AudioSegment.silent(duration=m)
    concated_sound = interval 
    for i in range(n):
        # There is a l% chance that "Hazure" will be chosen.
        if random.randint(1, 100) >= l:
            concated_sound += AudioSegment.from_mp3(getFileList(AtariDir)[0])
            concated_sound += interval 
        else:
            concated_sound += AudioSegment.from_mp3(getFileList(HazureDir)[0])
            concated_sound += interval 
    concated_sound.export("result.mp3", format="mp3")

# run
combineSounds(n,m,l)

展望としては
・連続して同じ音源が選択されないようにする
・無音を本当の無音にするのではなく、音源内のホワイトノイズ自動検出して用いる(もしくは予め都合の良い無音ファイルを用意しておく)

余談ですが、Github Copilotのおかげで一度もググることなく作成できました。
私レベルだと調べてる時間のほうが多いので、非常に時間短縮ができました。