Почему FLAC — идеальный аудиоформат для речевых приложений на базе ИИ
Недавно я создал Prosody Coach — инструмент командной строки на Python, который помогает людям, для которых английский не является родным, улучшить свое произношение. Приложение записывает вашу речь, анализирует ее с помощью научных алгоритмов (Praat) и предоставляет коучинг на основе AI через API Google Gemini.
Одно из первых решений, которое мне пришлось принять, касалось выбора формата аудио. Я работал с MP3 и WAV, но ни один из них не подходил для этого сценария. После некоторых исследований я остановился на FLAC, и это оказалось идеальным выбором.
Проблема с распространенными аудиоформатами
Позвольте мне объяснить, почему обычные «подозреваемые» не сработали.
MP3 встречается повсеместно. Он компактный, совместим со всем и отлично подходит для прослушивания музыки в машине. Но MP3 — это формат с потерями. Он отбрасывает аудиоданные для достижения сжатия. Для анализа речи это проблема. Когда вы измеряете изменения высоты тона до конкретных частот в Гц или анализируете паттерны слогового тайминга, вам нужны все данные без изменений.
WAV — полная противоположность. Он совершенно несжатый, что означает идеальное качество. Но размеры файлов огромны. 30-секундная запись с частотой 16 кГц в моно режиме занимает около 1 МБ в формате WAV. Это быстро накапливается, когда вы храните несколько записей для отслеживания прогресса, и неэффективно для отправки в облачные API.
Почему FLAC подходит для речевых приложений
FLAC (Free Lossless Audio Codec) находит золотую середину. Он без потерь, как WAV, что означает идеальную точность звука. Но он использует алгоритмы сжатия, которые уменьшают размер файлов на 50–60% без потери каких-либо данных.
Вот как это работает: FLAC использует предиктивное кодирование. Он анализирует закономерности в аудиосигнале и сохраняет разницу с предсказанными значениями, а не исходные сэмплы. Когда вы распаковываете файл FLAC, вы получаете в точности исходный звук. Бит в бит.
Для Prosody Coach это означает:
- Точный анализ высоты тона: Алгоритмы Praat, измеряющие высоту тона (диапазон 75–500 Гц), получают чистые, несжатые данные
- Точные измерения времени: Обнаружение слогов и анализ ритма (расчеты nPVI) зависят от точных данных волновой формы
- Меньше места для хранения: Пользовательские записи занимают примерно вдвое меньше места по сравнению с WAV
- Совместимость с API: API Gemini от Google нативно принимает FLAC с MIME-типом
audio/flac
Реализация в Prosody Coach
Аудиоконвейер в Prosody Coach работает следующим образом:
- Запись с микрофона с частотой дискретизации 16 кГц (оптимально для речи)
- Захват в формате float32 для гибкости обработки
- Обрезание тишины в начале и конце
- Сохранение в формате FLAC для хранения
- Для анализа AI преобразование в FLAC, закодированный в base64, и отправка в Gemini
Код для сохранения записи выглядит примерно так:
import soundfile as sf
def save_recording(audio_data, sample_rate, filepath):
sf.write(filepath, audio_data, sample_rate, format='FLAC')
А для отправки в API Gemini:
import base64
import io
def prepare_audio_for_api(audio_data, sample_rate):
buffer = io.BytesIO()
sf.write(buffer, audio_data, sample_rate, format='FLAC')
buffer.seek(0)
return base64.b64encode(buffer.read()).decode('utf-8')
Библиотека soundfile обрабатывает кодирование FLAC, а полученная строка base64 отправляется напрямую в Gemini с MIME-типом audio/flac.
Потоковая передача в реальном времени: другая история
Одно интересное исключение: для сеансов обратной связи в реальном времени с использованием Live API Gemini я использую необработанный PCM вместо FLAC. Потоковая передача в реальном времени требует минимальной задержки, а кодирование/декодирование FLAC для каждого 100-миллисекундного аудиофрагмента добавило бы ненужные накладные расходы.
Для потоковой передачи аудио преобразуется в 16-битный PCM:
import numpy as np
def convert_to_pcm(audio_float32):
# Преобразование float32 [-1.0, 1.0] в int16 [-32768, 32767]
return (audio_float32 * 32767).astype(np.int16).tobytes()
Таким образом, выбор формата зависит от контекста: FLAC для хранения и пакетного анализа, PCM для потоковой передачи в реальном времени.
Когда следует использовать FLAC
Основываясь на моем опыте создания Prosody Coach, FLAC имеет смысл, когда:
- Вам необходимо сохранить качество звука для анализа или обработки
- Место для хранения имеет значение, но вы не можете пожертвовать точностью
- Вы отправляете аудио в API, которые поддерживают FLAC (сервисы Google AI это делают)
- Вам нужен открытый формат без патентов
FLAC может быть не лучшим выбором, если размер файла является основным фактором (используйте формат с потерями) или если вам необходимо кодирование в реальном времени с минимальной задержкой (используйте PCM).