Как ответить
На вход модели Whisper подаётся аудиосигнал, который предварительно преобразуется в логарифмическую мел-спектрограмму. Это стандартное представление звука для задач распознавания речи, которое сжимает информацию, сохраняя ключевые частотные характеристики.
Конкретно процесс выглядит так:
- Исходный аудиопоток ресемплируется до 16 кГц (моно). Это фиксированная частота дискретизации, которую ожидает модель. Если аудио записано с 44,1 кГц, Whisper его передискретизирует.
- Из сигнала извлекается мел-спектрограмма с окном в 25 мс и шагом 10 мс. Используется 80 мел-фильтров — это стандартный размер для speech-моделей.
- Полученная спектрограмма подаётся на вход энкодеру — это 2D-тензор размером (80, T), где T — количество временных шагов. Для 30 секунд аудио T ≈ 3000.
- Модель не принимает сырой waveform. В отличие от Wave2Vec 2.0, где вход — сырой сигнал, Whisper работает именно с частотным представлением.
- Входные данные не нормализуются по громкости — модель сама учится игнорировать амплитудные вариации. Но на практике тихие записи дают шумную спектрограмму, из-за чего падает точность.
Ещё важный момент: Whisper не использует голосовую активность (VAD) на входе. Модель ожидает, что аудио уже обрезано до релевантного фрагмента. Если подать 10 минут тишины, модель потратит вычислительные ресурсы на обработку шума, хотя могла бы работать быстрее.
В коде это выглядит так:
import whisper
model = whisper.load_model("base")
audio = whisper.load_audio("speech.mp3")
audio = whisper.pad_or_trim(audio) # обрезает/дополняет до 30 секунд
mel = whisper.log_mel_spectrogram(audio) # (80, 3000)
# Дальше mel подаётся в модель
result = model.transcribe("speech.mp3") # под капотом делает то же самоеЕсли аудио длиннее 30 секунд, Whisper разбивает его на окна по 30 секунд с перекрытием, обрабатывает каждое окно отдельно, а потом склеивает результаты. Это важная деталь: модель не умеет обрабатывать произвольную длину сразу, только фиксированные 30-секундные чанки.