使用方法
- 將 Base64 音訊,或形如 data:audio/mpeg;base64,... 的 Data URI 貼上到輸入框中。
- 檢視識別出的格式,在音訊播放器中點選播放。
- 下載檔案,副檔名會與識別出的格式相匹配,例如 .mp3 或 .wav。
解碼語音合成介面的輸出
以 JSON 格式響應的語音合成(TTS)服務無法在響應中直接放入二進位音訊,只能先進行編碼。以 Google Cloud Text-to-Speech 為例,它會把合成的語音按你指定的編碼(例如 MP3 或 OGG Opus)放在名為 audioContent 的欄位中,以 Base64 字串返回。其他語音和聊天機器人介面則使用 audio、data 或 audio_base64 等欄位。
在比較不同音色、語速或提示詞時,把欄位值貼上到這裡就能直接試聽。只複製引號之間的字串即可;先解析 JSON 再複製,可以避免帶入引號或 \/ 等跳脫字元。
可識別的音訊格式
格式根據解碼後資料的開頭位元組來判斷,所以即使 MIME 型別缺失或錯誤也沒有影響:
| 格式 | 檔案簽名 | Base64 開頭 |
|---|---|---|
| MP3 | ID3 標籤或 MPEG 幀頭 | SUQz,或通常為 // |
| WAV | RIFF ... WAVE | UklGR |
| OGG(Vorbis、Opus) | OggS | T2dnUw |
| FLAC | fLaC | ZkxhQ |
| 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。無論哪種方式,格式都會根據解碼後的位元組來識別。我的音訊會被髮送到伺服器嗎?
不會。解碼、格式識別和播放都在瀏覽器中完成。