WAV を Base64 に変換する方法
.wavファイルをボックスにドロップするか、ファイル選択で選びます。- プレビューで再生します。
- 出力形式 は Data URI に設定されています。API 用には プレーン Base64 を、ファイル名、MIME タイプ、サイズも含めるなら JSON を選びます。
- 出力をコピー を押します。数秒を超える録音は長い文字列になるので、.txt で保存 のほうが扱いやすいでしょう。
Base64 の WAV の大きさ
非圧縮の PCM は簡単に計算できます。サンプリングレート × 1 サンプルのバイト数 × チャンネル数が 1 秒あたりのバイト数です。標準の 44 バイトのヘッダーを足し、Base64 にするために 4/3 を掛けます。
| 形式 | 1 秒 | 10 秒 | 1 分 |
|---|---|---|---|
| 8 kHz、モノラル、16 ビット(電話) | 21,392 文字 | 213,392 文字 | 1,280,060 文字 |
| 16 kHz、モノラル、16 ビット(音声) | 42,728 文字 | 426,728 文字 | 2,560,060 文字 |
| 44.1 kHz、モノラル、16 ビット | 117,660 文字 | 1,176,060 文字 | 7,056,060 文字 |
| 44.1 kHz、ステレオ、16 ビット(CD) | 235,260 文字 | 2,352,060 文字 | 14,112,060 文字 |
| 48 kHz、ステレオ、16 ビット | 256,060 文字 | 2,560,060 文字 | 15,360,060 文字 |
アプリによっては録音したファイルにメタデータの追加チャンクが含まれるので、実際のサイズはわずかに大きくなることがあります。
WAV と音声認識 API
音声認識サービスは、非圧縮の 16 ビット PCM をよく受け付けます。劣化なくデコードでき、コーデックが不要だからです。JSON リクエストに音声をインラインで入れる場合は Base64 にし、エンコード方式、サンプリングレート、チャンネル数を示すフィールドを添えます。これらの値はファイルと一致していなければなりません。44.1 kHz ステレオの録音を 16 kHz モノラルと申告すると、意味不明な文字起こし結果になるかエラーになります。
音声認識モデルは通常 16 kHz モノラル以下で動作します。CD 品質のステレオ録音をエンコード前に 16 kHz モノラルに変換すると、リクエストは約 5.5 分の 1 になり、たいていは認識精度も落ちません。変換はオーディオエディターかコマンドラインの変換ツールで行ってください。このページはファイルをそのままエンコードします。
長い録音でインラインの上限にまだ収まらない場合、こうしたサービスはたいていストレージ上のファイルへのリンクも受け付けるので、Base64 をまったく使わずに済みます。
Python で WAV を生成してエンコードする
標準ライブラリだけで WAV を書き出してエンコードでき、テスト用データを作るのに便利です。次のコードは 880 Hz、200 ミリ秒のビープ音を作ります。
import base64, io, math, struct, wave
rate = 8000
samples = b"".join(
struct.pack("<h", int(12000 * math.sin(2 * math.pi * 880 * i / rate)))
for i in range(rate // 5)
)
buf = io.BytesIO()
with wave.open(buf, "wb") as w:
w.setnchannels(1)
w.setsampwidth(2)
w.setframerate(rate)
w.writeframes(samples)
uri = "data:audio/wav;base64," + base64.b64encode(buf.getvalue()).decode()
ファイルは 3,244 バイト、data URI は 4,350 文字で、data:audio/wav;base64,UklGRqQMAABXQVZF で始まります。ファイルとストリームについては Python での Base64 で詳しく解説しています。
元に戻す
Base64 を WAV に では、Base64 の WAV 文字列を再生し、ファイルとして保存できます。Web 用に音声を小さくするなら、圧縮形式を使ってください。サイズの比較は MP3 を Base64 に を参照してください。
よくある質問
WAV の Base64 がこんなに長いのはなぜですか?
WAV は通常、生の PCM サンプルを圧縮せずに保存しているからです。CD 品質のステレオ 1 秒は音声データだけで 176,400 バイト、ヘッダーを含めた Base64 では 235,260 文字になります。モノラルにして低いサンプリングレートに変換すれば、大幅に減らせます。
audio/wav と audio/x-wav のどちらですか?
どちらも使われており、ブラウザはどちらでも再生します。一般的なのは audio/wav で、古いシステムの中には audio/x-wav や audio/wave を送るものもあります。このツールはブラウザが報告するタイプを使います。
Base64 にした WAV の先頭の文字は何を意味しますか?
UklGR は RIFF コンテナのヘッダーで、WebP や AVI と共通です。WAVE タグは 12~16 文字目に XQVZF として現れ、その直後の Zm10 は fmt チャンクです。