시킨 것과 한 것
사장님이 한 말
맞았을 때 나는 소리 같은 게임 효과음을 AI 로 만들 수 있게 해 줘.
그래서 제가 한 일
- Stable Audio Open과 MMAudio를 라이선스 문제로 제외하고 MOSS-SoundEffect v2.0을 골랐다.
- 변환 코드 저장소의 의존성 오류와 모델 카드 예제 불일치를 확인하고 설치했다.
- 무음 문제를 해결하기 위해 생성 창을 넓히고 시작점을 찾아 자르는 로직을 적용해 48개 중 43개를 성공시켰다.
- 기계로 파일의 길이, 크기, 높낮이를 점검해 사장님이 고를 수 있도록 정리했다.
사장님이 직접 하신 일원하는 소리를 말로 적고, 만들어진 변형 중에 귀로 고르기
후보를 이렇게 골랐다
Stable Audio Open은 허깅페이스 로그인과 약관 동의가 필요해서 뺐다. MMAudio는 가중치가 비상업(CC-BY-NC)이라는 웹 검색 결과를 보고 뺐다(직접 확인은 안 했다). MOSS-SoundEffect v2.0은 카드에 Apache-2.0, 로그인 필요 없음, 맥용(MLX) 변환본이 있다.
남이 만든 변환 코드를 깔기 전에 읽었다
변환 저장소는 개인 작품(별 1개, 마지막 갱신 2026-06-15)이고 PyPI에는 없고 깃허브에만 있다. 받아서 코드를 읽었다: 패키지 본체 약 1,590줄, 외부 통신은 모델 받기뿐, 명령 실행·삭제 코드는 없었다. 업데이트하면 다시 읽어야 한다.
따라 해 보는 명령
| 명령 (그대로 복사) |
|---|
설치 1uv venv --python 3.12 .venv |
설치 2git clone --depth 1 https://github.com/xocialize/moss-soundeffect-mlx |
설치 3uv pip install --python .venv/bin/python -e moss-soundeffect-mlx mlx-lm ftfy regex tqdm |
소리 만들기 (파이썬)pipe = MossSoundEffectPipeline.from_pretrained(snapshot_download("mlx-community/MOSS-SoundEffect-v2.0-4bit")); audio = pipe(prompt="a big explosion with debris and deep rumble", seconds=3, num_inference_steps=50, cfg_scale=4.0, seed=0) |
설치하다 연달아 난 오류
저장소의 의존 꾸러미 목록이 불완전해서, 그냥 설치하면 오류가 연달아 난다.
| 증상 | 오류 원문 | 해결 |
|---|---|---|
| 그냥 설치하고 실행 | ModuleNotFoundError: No module named 'mlx_lm' | mlx-lm 을 같이 설치 |
| 그다음 실행 | ModuleNotFoundError: No module named 'ftfy' | ftfy regex tqdm 을 같이 설치 (명령 표의 설치 3) |
모델 카드 예제는 from_pretrained("mlx-community/…")로 쓰여 있지만 코드를 읽어 보니 폴더 경로만 받는다(이 경로로 실행해 보진 않았고 코드로만 확인). 그래서 받은 폴더를 snapshot_download로 넘겼다.
맞았을 때 나는 소리 12종을 뽑았다
사장님이 한국어 목소리를 들어 보고 기계 목소리 같다고 해서 목소리는 빼고, 맞았을 때 나는 소리 같은 효과음에 쓰기로 했다. 해외판을 같이 내므로 말·글자가 섞인 소리는 만들지 않는다(프롬프트에 no voice).
12종 x 4변형 = 48개를 358초에 만들었다(개당 평균 7.4초, 20단계, 모델 안 최대 12.18GB). 무음이나 잘린 소리를 자동으로 걸러 43개가 남았고, 종류마다 2개 이상 남았다.
| 소리 | 영어 설명 | 성공한 변형 |
|---|---|---|
| 칼이 갑옷에 맞는 소리 | a sword strikes metal armor, short sharp metallic clang impact | 4/4 |
| 주먹으로 때리는 소리 | a heavy punch impact, short dull thud with bass | 3/4 |
| 내가 맞았을 때 | a short dull thump when the player takes damage, soft low impact, no voice | 3/4 |
| 화살이 맞는 소리 | an arrow hits a wooden target, quick sharp thwack | 4/4 |
| 마법이 맞는 소리 | a magic spell energy burst hits the target, bright zap and boom | 4/4 |
| 치명타 | a critical hit, very heavy impact with a short echo | 3/4 |
| 방패로 막는 소리 | a sword blocked by a metal shield, clang with a short ring | 4/4 |
| 몬스터를 잡았을 때 | a small monster defeated, soft pop and sparkle | 2/4 |
| 동전 줍는 소리 | a bright coin pickup chime, short sparkle, retro game | 4/4 |
| 레벨 업 | a level up jingle, bright ascending chime, short | 4/4 |
| 버튼 누르는 소리 | a soft button click tap, short clean UI sound | 4/4 |
| 성문이 맞는 소리 | a wooden gate takes damage, crunchy wood crack and thud | 4/4 |
짧은 소리를 그대로 요청했더니 무음이 나왔다
처음엔 0.4~1.2초를 요청해 바로 잘랐더니 36개 중 6개가 완전 무음이었다. 이 모델은 30초 분량을 만들고 앞부분만 자르는데, 소리가 뒤에서 시작할 때가 있다(화살 소리는 4초 창에서 약 2초에 시작).
그래서 넉넉한 창(요청 길이+3초, 최소 4초)으로 만들고, 소리가 시작하는 곳을 찾아 앞의 빈 구간을 잘라 요청한 길이만 남기게 고쳤다(시간은 창 길이와 상관없다). 성공이 30/36에서 43/48로 늘었다. 창 끝에서 시작해 0.16초만 남은 소리도 실패로 거른다.
같은 설명도 변형마다 크게 달랐다(칼 소리 높낮이 중심 4,808~7,742Hz). 기계는 고장 난 파일만 거르고, 마음에 드는 걸 고르는 건 사람 귀 몫이다.
속도: 단계를 줄이면 빨라진다
| 단계 수 | 효과음 한 개 걸린 시간 |
|---|---|
| 10단계 | 5.9초 |
| 20단계 | 9.6초 |
| 50단계(기본) | 19.5초 |
소리 길이는 시간에 영향이 없다(늘 30초 분량을 계산해 앞부분만 쓴다). 모델 안 최대 메모리 12.2GB(모델 카드가 적은 값과 같았다).
소리는 귀로 못 들었다
파일 점검만 했다. 아래는 처음에 만든 긴 소리 4종의 수치이고, 맞았을 때 소리 묶음도 같은 방식으로 점검했다(수치는 파일로 저장해 뒀다).
| 소리 | 길이 | 소리 크기 | 높낮이 중심 | 모양 |
|---|---|---|---|---|
| 폭발 | 3.0초 | 0.63 (큼) | 1,568Hz (낮음) | 끝까지 큰 소리 |
| 칼 휘두르는 소리 | 1.5초 | 0.11 | 4,937Hz (높음) | 앞 절반만 소리, 뒤는 무음 |
| 동전 줍는 소리 | 1.5초 | 0.25 | 5,430Hz (매우 높음) | 점점 작아짐 |
| 문 삐걱 | 3.0초 | 0.07 (작음) | 3,556Hz | 점점 작아짐 |
우리 앱 소리는 코드로 합성하는 방침이라 이 소리는 시안·영상용이다. 앱에 직접 넣을지는 사장님이 정한다.