AI로 게임 배경음악·효과음 만들기 — ACE-Step·AudioGen 음원 툴을 클로드 코드로 직접 만들어 RPG에 넣기 (AI RPG 7편)
지난 6편 마지막에 여쭤봤죠. 다음엔 배경음악을 AI에게 부탁해 볼까, 아니면 전투씬을 만들어 볼까. 이번 편은 소리입니다. 지금까지 만든 RPG는 마을도, 실내맵도, 필드맵도 있는데 아무 소리도 안 나는 게임이었거든요.
오늘은 AI로 게임 배경음악(BGM)과 효과음(SFX) 을 만들어서 게임에 직접 넣어 보겠습니다. 목표는 세 가지입니다.
- 잠긴 문에 효과음 넣기
- 마을 맵에 배경음악 루프 넣기
- 필드맵에 세 곡을 이어서 재생하는 플레이리스트 넣기

클로드 코드로 AI 음원 생성 툴부터 직접 만들기
먼저 AI 음원을 생성하고 편집할 수 있는 저작툴을 만들었습니다. 이것도 클로드 코드를 이용한 바이브 코딩으로요. 이름은 Audio Repair Editor. 생성만이 아니라 나중에 끊기는 구간을 고치는 데까지 쓸 거라 이렇게 붙였습니다.
생성 방식은 Stable Diffusion 같은 이미지 생성 AI와 거의 같습니다. 프롬프트를 쓰고, 옵션(모델, 길이, 네거티브 프롬프트, LoRA 등)을 지정한 다음, 음원 생성 모델에 요청하면 됩니다.

음악 생성 모델 고르기 — 가요·미디·효과음은 모델이 다르다
여기서 하나 알아둘 게 있습니다. 모델마다 잘하는 음원 종류가 다릅니다. 어떤 모델은 가요 음원에, 어떤 모델은 미디 음원에, 또 어떤 모델은 효과음에 적합합니다. 이미지 모델이 실사·애니·픽셀아트에 따라 갈리는 것과 비슷하죠.
배경음악은 가요 음원에 적합한 ACE-Step이라는 모델에 요청했습니다. 넣은 프롬프트는 이렇습니다:
solo piano, 50 bpm, major key, bright, midi, simple melody, retro RPG, Dragon Quest
길이는 60초로 지정했습니다. 레트로 RPG 마을에서 흘러나올 것 같은, 드래곤 퀘스트 느낌의 단순한 피아노 멜로디를 노렸습니다. 다만 생성하는 데 시간이 꽤 걸립니다. 배경음악은 나중에 들어보기로 하고, 그동안 효과음부터 만들어 보겠습니다.
AudioGen으로 게임 효과음 만들기 — 잠긴 문 소리
제일 간단한 것부터. 문이 잠겨 있을 때 나는 효과음입니다.
효과음 탭을 선택하고 프롬프트를 넣었습니다. 효과음은 Meta가 만든 AudioGen이라는 효과음 전용 모델을 사용했습니다. 효과음 설명은 영문으로 넣는 게 권장이에요. 실제로 넣은 프롬프트는 이렇습니다:
door knock then loud long descending buzzer, classic wrong answer buzzer,
low frequency rejection beep, game show fail sound after knock
노크하고 나서 “땡!” 하는 퀴즈쇼 오답 버저 느낌을 주문했습니다. 길이는 2초.

몇 개를 뽑아서 들어보고 그중 제일 적합한 걸 골랐습니다. 게임에는 이렇게 넣었어요. 대화 노드에 sound 필드를 하나 추가하고, DialogUI가 노드를 표시할 때 자동으로 재생하게 했습니다.
// door_locked.json
"start": {
"text": "문이 잠겨 있어서 들어갈 수 없다.",
"sound": "/assets/audio/effetcs/repaired_676cff1a.wav"
}

이전엔 잠긴 문에 다가가도 텍스트만 떠서 반응이 밋밋했는데, 이제 문 앞에서 Enter를 누르면 효과음과 함께 메시지가 나옵니다.
마을 배경음악 루프 — 같은 곡이면 끊김 없이 유지
다음은 마을 BGM입니다. 아까 그 툴로 마을 배경음악도 만들어서 게임에서 재생시켰습니다. 마을 1번 맵과 2번 맵이 같은 BGM을 공유하도록 map.json에 bgm 필드를 넣었어요.
// map.json (마을 1·2번 공통)
"meta": {
"bgm": "/assets/audio/musics/마을.wav",
}
// AudioManager.playBGM() — 같은 곡이면 유지
if (_src === src && _audio && !_audio.paused) return;
포인트는 스마트 유지입니다. 마을 1번에서 2번으로 넘어갈 때 같은 곡이면 처음부터 다시 틀지 않고 그대로 이어서 재생합니다. 그리고 BGM이 없는 맵(집 안 같은)으로 들어가면 자동으로 음악이 멈춥니다.

필드맵 BGM 플레이리스트 — 세 곡을 이어서 재생
필드맵은 넓어서 한 곡만 반복하면 금방 질립니다. 그래서 세 곡을 순서대로 재생하고, 끝나면 처음부터 반복하게 했습니다.
// map.json (필드맵)
"bgmPlaylist": [
"/assets/audio/musics/field1.wav",
"/assets/audio/musics/field2.wav",
"/assets/audio/musics/field3.wav"
]
// AudioManager — ended 이벤트로 다음 곡 자동 연결
audio.addEventListener('ended', _playNext, { once: true });

AI 음원의 끊기는 구간, AI로 보정하기
그사이 처음에 ACE-Step으로 요청했던 배경음악이 다 만들어졌습니다. 들어보니 나쁘지 않은데, AI 음원의 한계상 살짝 끊기는 느낌이 드는 구간이 있었습니다.
그런 곳을 찾아서 고치는 것도 AI를 이용합니다. 툴에서 문제 구간을 드래그로 선택하고 그 부분만 다시 생성하게 하는 방식이에요. 이게 툴 이름이 “Repair” Editor인 이유입니다. 당연히 수정하는 데에도 시간이 걸립니다.

수정된 음원을 들어봤는데… 솔직히 저는 막귀라서 크게 변한 건지 잘 모르겠습니다. 위아래 파형을 비교해 보면 바뀐 건 분명한데요. 영상에서 직접 비교해 들어보세요.

배경음악이 들어간 RPG 플레이
이제 음악이 들어간 상태로 게임을 플레이해 봅시다. 마을을 걸으면 배경음악이 흐르다가, 집 안으로 들어가면 멈춥니다. 다시 밖으로 나가면 재생되고요.


촌장님 집에 들어가도 마찬가지로 멈추고, 밖으로 나오면 다시 재생됩니다. 이제 아예 마을 밖으로 나가서 필드맵을 돌아다녀 봅시다. 광활한 필드맵을 돌아다니면 세 곡이 연이어서 흘러나옵니다.

정리 — AI로 게임 사운드 만들기에서 배운 것

- 음원 생성 툴: 클로드 코드로 바이브 코딩해서 직접 만들었다. 사용법은 이미지 생성 AI와 같다(프롬프트 + 옵션).
- 모델 선택: 배경음악은 ACE-Step, 효과음은 Meta AudioGen. 음원 종류에 맞는 모델을 골라야 한다.
- 효과음(SFX): 대화 노드에
sound필드 → 잠긴 문 효과음 자동 재생. - 마을 BGM:
map.json의bgm필드 → 루프 재생, 같은 곡이면 끊김 없이 유지, BGM 없는 맵에선 자동 정지. - 필드 플레이리스트:
bgmPlaylist배열 → 순차 재생 후 자동 반복. - AI 음원 보정: 끊기는 구간은 그 부분만 AI로 다시 생성. 시간은 걸린다. 효과는… 막귀라 판단 보류.
시리즈 흐름
- 1편: SDXL Turbo로 맵, SAM v3로 지형 마스크. 캐릭터는 실패
- 2편: Gemini(Nano Banana Pro)로 캐릭터 일관성 해결. API 비용 문제
- 3편: 로컬 OpenPose + Canny 파이프라인, 뒷모습만 Gemini 하이브리드
- 4편: LoRA 학습 + SAM3 데이터 증강 + 리터치 자동화. GPU 병목
- 5편: Excalibur.js로 맵 이동 구현 + 시청자 추천 PixelLab 발견
- 6편: Gemini API로 실내맵, Tilewise로 필드맵 타일과 오토타일 경계 처리
- 7편(이번): AI 음원 툴 직접 제작, ACE-Step 배경음악 + AudioGen 효과음을 게임에 적용
다음 시간에는 어떤 걸 하면 좋을까요? 지난번에 같이 여쭤봤던 전투씬도 아직 남아 있습니다. 댓글로 남겨 주세요.
다음 영상에서 만나요.
Comments