Как конвертировать WAV в Base64
- Перетащите файл
.wavв поле или выберите его через диалог. - Прослушайте его в предпросмотре.
- Формат вывода стоит на Data URI. Для API выберите Чистый Base64 или JSON, чтобы получить ещё имя, MIME-тип и размер.
- Нажмите Скопировать результат. Записи длиннее нескольких секунд дают очень длинные строки; с ними удобнее Сохранить как .txt.
Сколько весит WAV в Base64
Несжатый PCM легко посчитать: байт в секунду = частота дискретизации × байт на сэмпл × число каналов. Добавьте стандартный заголовок в 44 байта и умножьте на 4/3 для Base64:
| Формат | 1 секунда | 10 секунд | 1 минута |
|---|---|---|---|
| 8 кГц, моно, 16 бит (телефония) | 21 392 симв. | 213 392 симв. | 1 280 060 симв. |
| 16 кГц, моно, 16 бит (речь) | 42 728 симв. | 426 728 симв. | 2 560 060 симв. |
| 44,1 кГц, моно, 16 бит | 117 660 симв. | 1 176 060 симв. | 7 056 060 симв. |
| 44,1 кГц, стерео, 16 бит (CD) | 235 260 симв. | 2 352 060 симв. | 14 112 060 симв. |
| 48 кГц, стерео, 16 бит | 256 060 симв. | 2 560 060 симв. | 15 360 060 симв. |
Некоторые приложения записывают в файл дополнительные чанки с метаданными, так что реальный размер может быть чуть больше.
WAV и API распознавания речи
Сервисы распознавания речи обычно принимают несжатый 16-битный PCM: он декодируется без потерь и не требует кодека. Если аудио идёт прямо в JSON-запросе, его кодируют в Base64 и рядом указывают кодировку, частоту дискретизации и число каналов. Эти значения должны совпадать с файлом. Запись 44,1 кГц стерео, объявленная как 16 кГц моно, даёт бессмысленную расшифровку или ошибку.
Речевые модели обычно работают с 16 кГц моно или ниже. Если перед кодированием перевести стереозапись CD-качества в 16 кГц моно, запрос станет примерно в пять с половиной раз меньше, и на качестве распознавания это обычно не сказывается. Сделайте это в аудиоредакторе или консольным конвертером; эта страница кодирует файл как есть.
Если длинная запись даже так не помещается в лимит на встроенные данные, такие сервисы обычно принимают ссылку на файл в хранилище, и тогда Base64 не нужен вовсе.
Создать WAV и закодировать его в Python
Стандартной библиотеки хватает, чтобы записать WAV и закодировать его, что удобно для тестовых данных. Код ниже создаёт писк длиной 200 мс на 880 Гц:
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. О файлах и потоках подробнее в статье Base64 в Python.
Обратное преобразование
Base64 в WAV воспроизводит строку Base64 с WAV и сохраняет её как файл. Чтобы уменьшить аудио для веба, лучше взять сжатый формат; сравнение размеров есть на странице MP3 в Base64.
Вопросы и ответы
Почему Base64 от WAV такой длинный?
WAV обычно хранит сырые PCM-сэмплы без сжатия. Секунда стерео в CD-качестве занимает 176 400 байт звука, или 235 260 символов Base64 вместе с заголовком. Перевод в моно и снижение частоты дискретизации сильно укорачивают строку.
Правильно audio/wav или audio/x-wav?
В ходу оба, и браузеры воспроизводят любой. Обычно используют audio/wav; некоторые старые системы присылают audio/x-wav или audio/wave. Инструмент берёт тот тип, который сообщает ваш браузер.
Что значат первые символы WAV в Base64?
С UklGR начинается заголовок контейнера RIFF, тот же, что у WebP и AVI. Метка WAVE видна как XQVZF на позициях с 12 по 16, а Zm10 сразу за ней означает чанк fmt .