使い方
- Base64 の音声データ、または data:audio/mpeg;base64,... のような data URI を入力欄に貼り付けます。
- 判別された形式を確認し、オーディオプレーヤーの再生ボタンを押します。
- ファイルを「ダウンロード」します。.mp3 や .wav など、判別された形式に合った拡張子が付きます。
音声合成 API の出力をデコードする
JSON で応答する音声合成(Text-to-Speech)サービスは、レスポンスにバイナリの音声をそのまま入れられないため、エンコードして返します。たとえば Google Cloud Text-to-Speech は、MP3 や OGG Opus など指定したエンコード形式の音声を、audioContent というフィールドに Base64 文字列として返します。ほかの音声 API やチャットボット API では、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:音声が再生されない場合
一部の音声 API、特にリアルタイム型やストリーミング型のものは、ファイルヘッダーのない生の PCM サンプルを送ってきます。多くは 16 kHz または 24 kHz の 16 ビット・モノラルです。電話系のストリームも同様に、ヘッダーのない 8 kHz の μ-law 音声を送ります。ヘッダーがないと、バイト列の中身を示す情報が何もありません。形式は判別できず、ブラウザはデータを再生できず、このツールもサンプリングレートやチャンネル数を推測できません。デコードしたバイト列をダウンロードすることはできますが、聞くためには API ドキュメントに記載されたパラメーターを使って 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 などのメディアプレーヤーで開けます。
API から音声が多数の Base64 チャンクに分かれて送られてきます。どうやって結合すればよいですか?
各チャンクをバイト列にデコードし、順番につなげてください。先に Base64 文字列同士を連結する方法は、最後以外のすべてのチャンクが 3 の倍数のバイト数をエンコードしている場合にしか機能せず、通常はそれを前提にできません。このツールは一度に 1 つの文字列しかデコードしないため、ストリーミングで受け取ったチャンクはご自身のコードで結合してください。
デコードした音声は元の音声とまったく同じですか?
はい。Base64 は可逆なので、ファイルにはエンコードされたバイト列がそのまま含まれ、音質やビットレートも同じです。このツールは音声の再エンコードや変換を行いません。
data URI を貼り付けられますか?
data:audio/...;base64, の文字列全体を貼り付けても、プレフィックスのない Base64 だけを貼り付けてもかまいません。どちらの場合も、形式はデコードしたバイト列から判別されます。音声はサーバーに送信されますか?
いいえ。デコード、形式の判別、再生はすべてブラウザ内で行われます。