Base64 转音频

粘贴来自语音合成接口响应、Data URI 或 JSON 数据的 Base64 音频。工具会识别格式,在浏览器中播放,并保存为音频文件。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 将 Base64 音频,或形如 data:audio/mpeg;base64,... 的 Data URI 粘贴到输入框中。
  2. 查看识别出的格式,在音频播放器中点击播放。
  3. 下载文件,扩展名会与识别出的格式相匹配,例如 .mp3 或 .wav。

解码语音合成接口的输出

以 JSON 格式响应的语音合成(TTS)服务无法在响应中直接放入二进制音频,只能先进行编码。以 Google Cloud Text-to-Speech 为例,它会把合成的语音按你指定的编码(例如 MP3 或 OGG Opus)放在名为 audioContent 的字段中,以 Base64 字符串返回。其他语音和聊天机器人接口则使用 audio、data 或 audio_base64 等字段。

在比较不同音色、语速或提示词时,把字段值粘贴到这里就能直接试听。只复制引号之间的字符串即可;先解析 JSON 再复制,可以避免带入引号或 \/ 等转义字符。

可识别的音频格式

格式根据解码后数据的开头字节来判断,所以即使 MIME 类型缺失或错误也没有影响:

格式文件签名Base64 开头
MP3ID3 标签或 MPEG 帧头SUQz,或通常为 //
WAVRIFF ... WAVEUklGR
OGG(Vorbis、Opus)OggST2dnUw
FLACfLaCZkxhQ
M4A(AAC)品牌为 M4A 的 ftyp 盒不固定(以长度字段开头)

原始 PCM:音频无法播放时

有些语音接口,尤其是实时和流式接口,返回的是没有文件头的原始 PCM 采样数据,常见规格为 16 位、单声道、16 kHz 或 24 kHz。电话语音流也常传输无文件头的 8 kHz μ-law 音频。缺少文件头时,字节本身无法说明自己是什么:格式无法识别,浏览器无法播放,本工具也无法猜出采样率和声道数。你仍然可以下载解码后的字节,但要想听到声音,需要按照接口文档中的参数为它加上 WAV 文件头:

# FFmpeg:16 位小端序,24 kHz,单声道
ffmpeg -f s16le -ar 24000 -ac 1 -i speech.pcm speech.wav

# Python
import base64, wave
with wave.open('speech.wav', 'wb') as w:
    w.setnchannels(1)
    w.setsampwidth(2)        # 16 位采样
    w.setframerate(24000)
    w.writeframes(base64.b64decode(pcm_base64))

如果声音太快、太慢或者像杂音,说明采样率、采样位数或字节序与数据不符。能正常播放后,如果还需要字符串形式,可以用 音频转 Base64 重新编码这个 WAV 文件。

常见问题

为什么工具无法播放我的音频?

要么数据是没有文件头的原始 PCM(见上文),要么你的浏览器不支持该编码格式。后一种情况下,下载的文件仍然是正确的,可以用 VLC 等播放器打开。

接口把音频分成很多段 Base64 发送,怎样合并?

先把每一段分别解码为字节,再按顺序拼接。直接拼接 Base64 字符串只有在除最后一段外每段都恰好编码了 3 的整数倍个字节时才可行,这一点通常无法保证。本工具一次只解码一个字符串,所以流式返回的分段需要在你自己的代码中合并。

解码后的音频和原始音频完全一样吗?

一样。Base64 是无损的,文件中的字节与编码前完全相同,音质和码率都不变。工具不会重新编码或转换音频。

可以粘贴 Data URI 吗?
可以。既可以粘贴完整的 data:audio/...;base64, 字符串,也可以粘贴不带前缀的纯 Base64。无论哪种方式,格式都会根据解码后的字节来识别。
我的音频会被发送到服务器吗?

不会。解码、格式识别和播放都在浏览器中完成。