반응형

WAV 파일 또는 MP3 파일을 일정 길이(단위 초)의 WAV 파일로 분할하는 코드입니다.



2023. 10. 20  최초작성

2024. 3. 16



import os
import librosa
import soundfile as sf

def split_and_save(wav_path, output_dir, segment_length=30):

    """
    - wav_path : 로드할 WAV 파일 또는 MP3 파일의 경로
    - output_dir : WAV 파일들을 저장할 디렉토리 경로
    - segment_length : 분할할 세그먼트의 길이 (초 단위, 기본값은 30초)
    """

    # 출력 디렉토리가 존재하지 않으면 생성
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # WAV 파일 또는 MP3 파일 로드합니다.  sr을 None으로 하면 원본 샘플링 레이트를 사용한다는 의미입니다.
    #
    # 리턴값 :
    # y는 오디오의 시계열 데이터가 저장되어 있는 넘파이 배열입니다.
    # sr은 로드된 오디오 파일에 포함된 총 샘플 수를 나타냅니다.
    y, sr = librosa.load(wav_path, sr=None)

    # 샘플의 총 길이 계산
    total_samples = len(y)

    # 전체 오디오를 segment_length 초 단위로 나눈 각 세그먼트의 샘플 수 계산
    segment_samples = segment_length * sr 

    # 지정된 길이 segment_samples로 분할하여 WAV 파일로 저장
    for start_sample in range(0, total_samples, segment_samples):
        end_sample = start_sample + segment_samples
        output_path = f"{output_dir}/segment_{start_sample // segment_samples}.wav"

        # 여기서는 segment로 분할된 오디오 데이터를 WAV 파일로 저장한다.
        sf.write(output_path, y[start_sample:end_sample], sr)


# 사용 예:
wav_path = "input_file.wav"
output_dir = "output_directory"
split_and_save(wav_path, output_dir)



반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts