Base64를 WAV로 디코딩하는 방법
- Base64 또는 data URI에 Base64를 붙여넣으세요.
data:audio/wav;base64,나data:audio/x-wav;base64,접두사가 붙어 있어도 됩니다. - 플레이어에서 재생하세요. 재생 시간에 길이가 분과 초로 표시됩니다.
- hex 덤프 표시를 누르면 처음 512바이트가 보입니다. 무엇을 봐야 하는지는 다음 섹션에서 설명합니다.
- 파일 다운로드를 눌러 .wav를 저장하세요.
디코딩과 재생은 브라우저에서 이루어집니다. 페이지에는 Cloudflare 조회수 집계 외에 네트워크로 데이터를 보낼 권한이 없으므로 음성 녹음은 기기에 그대로 남습니다.
hex 덤프에서 WAV 헤더 읽기
WAV 파일은 12바이트 RIFF 헤더로 시작하고, 보통 바로 뒤에 오디오를 설명하는 fmt 청크가 옵니다. hex 덤프에서 다음 위치를 보면 어떤 파일인지 알 수 있습니다.
| 오프셋 (hex) | 바이트 | 필드 | 예: 16 kHz 모노 PCM |
|---|---|---|---|
00 | 4 | RIFF | 52 49 46 46 |
08 | 4 | WAVE | 57 41 56 45 |
14 | 2 | 포맷 코드 | 01 00 |
16 | 2 | 채널 수 | 01 00 (모노) |
18 | 4 | 샘플 레이트 | 80 3e 00 00 (16,000) |
22 | 2 | 샘플당 비트 수 | 10 00 (16) |
모든 숫자는 리틀 엔디언이므로 80 3e 00 00은 0x3e80, 즉 16,000입니다. 브라우저가 파일을 재생할 수 있는지는 포맷 코드가 결정합니다.
| 포맷 코드 | 코덱 | Chrome에서 재생 |
|---|---|---|
01 00 | PCM | 예 |
03 00 | 32비트 부동소수점 | 예 |
06 00, 07 00 | A-law, µ-law (전화) | 예 |
02 00, 11 00 | Microsoft ADPCM, IMA ADPCM | 아니요 |
31 00 | GSM 6.10 | 아니요 |
fe ff | Extensible: 실제 코덱은 청크 뒷부분에 지정되며 대개 PCM | PCM이면 예 |
PCM은 모든 브라우저가 재생하지만 다른 코덱의 지원은 브라우저마다 다르므로, 청취자가 쓰는 브라우저에서 테스트하세요. 브라우저가 파일을 디코딩하지 못하면 “이 브라우저는 이 WAV 파일을 재생할 수 없습니다.” 안내가 나타나고 재생 시간에 해당 없음이 표시됩니다. 그래도 다운로드한 파일은 올바르며, VLC 같은 데스크톱 플레이어는 이 코덱을 모두 처리합니다.
길이도 헤더에서 계산할 수 있습니다. 재생 시간은 data 청크의 크기를 샘플 레이트 × 채널 수 × 샘플당 바이트 수로 나눈 값입니다. 16 kHz 모노 16비트 오디오 2초는 샘플 64,000바이트에 최소 44바이트의 헤더가 더해집니다.
헤더 없는 원시 PCM
음성 API는 RIFF 헤더 없이 16 kHz나 24 kHz의 16비트 PCM 샘플만 돌려주는 경우가 많습니다. 이런 바이트에는 시그니처가 없어서 도구는 “WAV 형식으로 보이지 않습니다(감지됨: 바이너리)“라고 표시하며, .wav 확장자로 저장해도 어떤 플레이어에서도 재생되지 않습니다. API 문서에 나온 샘플 레이트, 채널 수, 샘플 크기로 헤더를 씌우세요.
import base64, wave
with open("speech.b64") as f:
pcm = base64.b64decode(f.read())
with wave.open("speech.wav", "wb") as w:
w.setnchannels(1)
w.setsampwidth(2)
w.setframerate(24000)
w.writeframes(pcm)
setsampwidth(2)는 16비트 샘플이라는 뜻입니다. 24 kHz 모노 오디오 2초, 즉 PCM 96,000바이트는 UklGR로 시작하는 96,044바이트 WAV가 되며 여기서도, 어떤 플레이어에서도 재생됩니다. 결과가 너무 빠르거나 느리거나 잡음처럼 들리면 샘플 레이트나 샘플 형식이 틀린 것입니다. 다른 흔한 샘플 레이트를 시도하거나 API가 8비트 µ-law를 보내는지 확인하세요. 자세한 내용은 Python에서 Base64에 있습니다.
WAV 페이지에 들어온 다른 형식
데이터가 다른 오디오 형식이면 도구가 그 이름을 알려 줍니다. WAV가 아니라 MP3로 보인다는 안내와 함께 .mp3(으)로 다운로드 버튼이 나타나며, 플레이어는 그대로 작동합니다. WAV 파일은 크기 때문에 API와 앱이 용량을 아끼려고 MP3나 Opus로 바꾸는 경우가 많은데, 문서에는 여전히 WAV라고 적혀 있곤 합니다. 크기 차이와 WAV 파일 인코딩은 WAV를 Base64로를, 모든 오디오 형식은 Base64를 오디오로를 참고하세요.
자주 묻는 질문
Base64를 WAV 파일로 변환하려면 어떻게 하나요?
위에 Base64를 붙여넣고 파일 다운로드를 누르면 오디오가 decoded.wav로 저장됩니다. 저장하기 전에 플레이어에서 재생해 원하는 내용인지 확인하세요.
WAV여야 하는 Base64인데 도구가 바이너리라고 합니다. 왜 그런가요?
WAV 파일은 RIFF(Base64로 UklGR)로 시작합니다. 이것이 없다면 여러 음성 API가 돌려주는 원시 PCM 샘플일 가능성이 높습니다. 이 페이지에 나온 방법대로 API 문서의 샘플 레이트를 넣어 헤더를 추가하세요.
어떤 WAV는 재생되고 어떤 WAV는 재생되지 않는 이유는 무엇인가요?
WAV는 컨테이너이고 코덱은 헤더 안의 숫자로 지정됩니다. 일반 PCM은 어디서나 재생되지만, 오래된 전화 시스템과 음성 사서함에서 흔한 ADPCM과 GSM은 대개 브라우저에서 재생되지 않습니다. ffmpeg -i in.wav -c:a pcm_s16le out.wav로 변환하세요.