본문 바로가기
개발로그/Python

Pygame에서 나오는 모든 소리를 하나의 파일(wav)로 저장하는 방법

by 그리너리디밸로퍼 2025. 3. 10.

여러 소리를 동시에 나오게 하려다보니 pygame.mixer.Sound() 를 사용해야하고 , 다시 그 소리들을 하나의 파일로 저장해야할 때. 

오디오 출력을 캡처하여 파일로 저장해야한다고 함. 

 

오디오 출력을 캡처하기위한 sou

 

 

nddevice와 numpy를 활용해서 시스템 오디오 출력을 녹음해보자.  

 

필요한 라이브러리

pip install sounddevice numpy scipy pygame

 

 

예제코드 (단일채널을 사용하는 경우)

import pygame
import sounddevice as sd
import numpy as np
import scipy.io.wavfile as wav
import threading
import time

# 녹음 설정
SAMPLE_RATE = 44100  # 표준 샘플링 레이트 (CD 품질)
CHANNELS = 2  # 스테레오 녹음
DURATION = 10  # 녹음할 시간 (초)
OUTPUT_FILE = "output.wav"  # 저장할 파일 이름

# 🔹 pygame 초기화
pygame.mixer.init()

def play_audio():
    """pygame에서 오디오 재생"""
    pygame.mixer.music.load("example.mp3")  # 원하는 파일 경로
    pygame.mixer.music.play()
    print("🎵 오디오 재생 시작...")
    
    # 녹음 시간이 끝날 때까지 대기
    time.sleep(DURATION)
    pygame.mixer.music.stop()
    print("🎵 오디오 재생 종료")

def record_audio():
    """출력 오디오(스피커) 녹음"""
    print("🎙️ 녹음 시작...")
    recording = sd.rec(int(DURATION * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=CHANNELS, dtype="int16")
    sd.wait()  # 녹음이 끝날 때까지 대기
    wav.write(OUTPUT_FILE, SAMPLE_RATE, recording)
    print(f"✅ 녹음 완료! 파일 저장됨: {OUTPUT_FILE}")

# 🎵 오디오 재생 & 녹음 동시 실행 (스레드 사용)
play_thread = threading.Thread(target=play_audio)
record_thread = threading.Thread(target=record_audio)

play_thread.start()
record_thread.start()

play_thread.join()
record_thread.join()

 

 

예제코드 2 (여러개 채널을 사용하는 경우)

 

import pygame
import sounddevice as sd
import numpy as np
import scipy.io.wavfile as wav
import threading
import time

# 녹음 설정
SAMPLE_RATE = 44100
CHANNELS = 2
DURATION = 10
OUTPUT_FILE = "all_channels_output.wav"

pygame.mixer.init()

def play_multiple_sounds():
    """여러 개의 pygame.mixer.Sound를 동시에 재생"""
    sound1 = pygame.mixer.Sound("sound1.wav")
    sound2 = pygame.mixer.Sound("sound2.wav")

    sound1.play()
    sound2.play()
    print("🎵 여러 사운드 재생 중...")

    time.sleep(DURATION)  # 재생 시간 동안 대기
    pygame.mixer.stop()
    print("🎵 모든 사운드 종료!")

def record_audio():
    """출력 오디오 녹음"""
    print("🎙️ 녹음 시작...")
    recording = sd.rec(int(DURATION * SAMPLE_RATE), samplerate=SAMPLE_RATE, channels=CHANNELS, dtype="int16")
    sd.wait()
    wav.write(OUTPUT_FILE, SAMPLE_RATE, recording)
    print(f"✅ 녹음 완료! 저장됨: {OUTPUT_FILE}")

# 🎵 오디오 재생 & 녹음 동시 실행
play_thread = threading.Thread(target=play_multiple_sounds)
record_thread = threading.Thread(target=record_audio)

play_thread.start()
record_thread.start()

play_thread.join()
record_thread.join()

 

 

예제를 적고보니 sd.rec()가 전체 사운드를 녹음한다는 점은 다른게 없네 ㅋ.. 단순해서 굿.

728x90

댓글