如何将 Base64 解码为 WAV
- 把 Base64 粘贴到 Base64 或 data URI。带有
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 | 可扩展格式:真正的编码写在块的后面,通常是 PCM | PCM 能 |
所有浏览器都能播放 PCM,但对其他编码的支持各不相同,请在你的听众所用的浏览器中测试。浏览器无法解码文件时,会出现提示“你的浏览器无法播放此 WAV 文件。”,时长 显示“不适用”。下载的文件仍然是正确的,VLC 等桌面播放器能处理以上所有编码。
时长也可以从文件头算出来:时长等于 data 块的大小除以采样率 × 声道数 × 每个采样的字节数。两秒钟 16 kHz 单声道 16 位音频的采样数据是 64,000 字节,再加上至少 44 字节的文件头。
没有文件头的原始 PCM
语音类 API 经常以 16 或 24 kHz 的裸 16 位 PCM 采样返回音频,没有 RIFF 头。这些字节没有任何特征签名,所以工具会提示“这看起来不像 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 单声道音频有 96,000 字节的 PCM,加上文件头后成为 96,044 字节的 WAV,以 UklGR 开头,在这里和任何播放器中都能播放。如果结果听起来太快、太慢或像噪音,说明采样率或采样格式不对;试试其他常见采样率,或者检查 API 发送的是不是 8 位 µ-law。详见 Python 中的 Base64。
WAV 页面上的其他格式
如果数据是其他音频格式,工具会指出来:例如提示“这看起来是 MP3,而不是 WAV。”,并提供 下载为 .mp3 按钮,播放器照样可以播放。WAV 文件很大,因此 API 和应用常常改用 MP3 或 Opus 来节省空间,而文档里还写着 WAV。关于体积差异和 WAV 文件的编码,请参阅 WAV 转 Base64;所有音频格式请参阅 Base64 转音频。
常见问题
怎么把 Base64 转换成 WAV 文件?
把 Base64 粘贴到上方,然后点击 下载文件,音频会保存为 decoded.wav。建议先在播放器里试听一下,确认内容是你想要的。
我的 Base64 应该是 WAV,工具却显示二进制,为什么?
WAV 文件以 RIFF 开头(Base64 中为 UklGR)。没有这个开头,你拿到的多半是原始 PCM 采样,很多语音 API 返回的就是这种数据;按照本页的方法,用 API 文档中的采样率给它加上文件头即可。
为什么有的 WAV 能播放,有的不能?
WAV 是一种容器,编码由文件头中的一个数字表示。普通 PCM 在哪里都能播放;ADPCM 和 GSM 常见于老式电话和语音信箱系统,通常无法在浏览器中播放。可以用 ffmpeg -i in.wav -c:a pcm_s16le out.wav 转换。