Base64 を音声に変換

音声合成 API のレスポンス、data URI、JSON ペイロードに含まれる Base64 音声を貼り付けてください。形式を判別してブラウザで再生し、音声ファイルとして保存できます。

すべてブラウザ内で処理され、データはアップロードされません。

使い方

  1. Base64 の音声データ、または data:audio/mpeg;base64,... のような data URI を入力欄に貼り付けます。
  2. 判別された形式を確認し、オーディオプレーヤーの再生ボタンを押します。
  3. ファイルを「ダウンロード」します。.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 の先頭
MP3ID3 タグまたは MPEG フレームヘッダーSUQz、または多くの場合 //
WAVRIFF ... WAVEUklGR
OGG(Vorbis、Opus)OggST2dnUw
FLACfLaCZkxhQ
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 だけを貼り付けてもかまいません。どちらの場合も、形式はデコードしたバイト列から判別されます。
音声はサーバーに送信されますか?

いいえ。デコード、形式の判別、再生はすべてブラウザ内で行われます。