Base64 を WAV にデコードする手順
- Base64 を Base64 または data URI に貼り付けます。
data:audio/wav;base64,やdata:audio/x-wav;base64,の接頭辞が付いたままでもかまいません。 - プレーヤーで再生します。再生時間 に長さが分と秒で表示されます。
- 16進ダンプを表示 を押すと先頭 512 バイトが表示されます。どこを見ればよいかは次のセクションで説明します。
- ファイルをダウンロード を押して .wav を保存します。
デコードと再生はブラウザ内で行われます。このページは Cloudflare のページビュー計測以外にネットワーク経由でデータを送信できないため、音声の録音データは端末から出ません。
16進ダンプで WAV ヘッダーを読む
WAV ファイルは 12 バイトの RIFF ヘッダーで始まり、通常はその直後に音声の形式を記述する fmt チャンクが続きます。16進ダンプでは、次の位置を見れば中身がわかります。
| オフセット(16進) | バイト数 | フィールド | 例: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 バイト)は 96,044 バイトの WAV になり、UklGR で始まって、ここでもどのプレーヤーでも再生できます。結果が速すぎる、遅すぎる、ノイズのように聞こえる場合は、サンプルレートかサンプル形式が間違っています。ほかの一般的なレートを試すか、API が 8 ビットの µ-law を送っていないか確認してください。詳しくは Python での Base64 をご覧ください。
WAV ページに別の形式を貼り付けた場合
データが別の音声形式なら、ツールがその形式名を表示します。「これは WAV ではなく MP3 のようです。」という表示とともに .mp3 としてダウンロード ボタンが現れ、プレーヤーもそのまま使えます。WAV ファイルは大きいため、ドキュメントには WAV と書かれていても、API やアプリが容量削減のために MP3 や Opus に切り替えていることがよくあります。サイズの違いと 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 で変換してください。