AniMUL-v1: Использование 30B модели для классификации животных по аудио | 2026 | AiManual
AiManual Logo Ai / Manual.
02 Фев 2026 Гайд

AniMUL-v1: 30 миллиардов параметров для распознавания животных по голосу. Полный гайд

Пошаговый туториал по работе с AniMUL-v1 — 30-миллиардной моделью для биоакустики. Установка, запуск, API, HuggingFace демо. Актуально на февраль 2026.

Зачем экологам 30-миллиардная нейросеть? Или как AniMUL-v1 меняет правила игры

Представь: ты стоишь в лесу в три часа ночи. Записываешь звуки. В аудио - десятки видов птиц, насекомых, млекопитающих. Шум ветра, треск веток, далекие машины. Через пять минут у тебя должен быть полный список всех видов в радиусе километра. Раньше это было фантастикой. Сейчас - рабочая задача для AniMUL-v1.

AniMUL-v1 (Animal Multimodal Understanding and Learning) - модель на 30 миллиардов параметров, дообученная на Qwen3-Omni-30B. Специализация: классификация видов животных по аудиозаписям. Точность на тестовых датасетах Earth Species Project достигает 94.7% для 1200+ видов. Выпущена в январе 2026.

Почему именно 30 миллиардов? Потому что разница между криком рыжей вечерницы (летучая мышь) и средиземноморской нетопыри (тоже летучая мышь) - это не разница между "мяу" и "гав". Это спектрограммы, где отличия измеряются герцами и миллисекундами. Мелкие модели здесь спотыкаются. AniMUL-v1 - нет.

Что внутри черного ящика: архитектура и тренировка

База - Qwen3-Omni-30B, последняя версия на февраль 2026. Почему Omni? Потому что кроме аудио, модель понимает контекст: географическое положение, время суток, сезон. Крик лисы в январе в Сибири и в июле в Испании - это разные поведенческие паттерны. AniMUL-v1 это учитывает.

Компонент Значение Зачем нужно
Базовая модель Qwen3-Omni-30B (2026 release) Мультимодальность, контекстное понимание
Датасет Earth Species Project + 12 нишевых коллекций 1200+ видов, 2.3 млн аудиосэмплов
Аудиоэнкодер Модифицированный Whisper-3 encoder Извлечение features из raw audio
Хардвер для обучения 8× NVIDIA B200 30B параметров иначе не обучить
Контекстное окно До 60 секунд аудио Анализ длинных поведенческих последовательностей

Тренировали на аудио-текстовых парах. Не просто "птица поет", а "самец зяблика (Fringilla coelebs) исполняет территориальную песню в период размножения, записано в мае 2025, Шотландия". Контекст - это все.

💡
Если интересно, как устроены современные аудиомодели вообще, посмотри статью про Qwen3-ASR - там похожая архитектура, но для речи. Или сравнение Whisper и Wav2Vec2 для понимания разницы в подходах.

Шаг 1: Быстрый старт через HuggingFace демо (5 минут)

Не хочешь ничего устанавливать? Есть живое демо. Иди на HuggingFace Spaces, ищи "AniMUL-v1-demo". Загружай аудиофайл (MP3, WAV, FLAC, до 60 секунд). Через 10-20 секунд получаешь JSON с видами, confidence scores и временными метками.

Демо работает на A100, но очередь может быть. Для production или больших объемов данных - локальная установка. И не загружай файлы по 10 минут - обрежет до первых 60 секунд.

1 Установка Python окружения

Работает на Python 3.10+. Ниже - будут проблемы с torch. Создаем виртуальное окружение и ставим зависимости:

# Создаем и активируем venv
python -m venv animul_env
source animul_env/bin/activate  # Linux/Mac
# animul_env\Scripts\activate   # Windows

# Устанавливаем torch с CUDA 12.4 (актуально на февраль 2026)
pip install torch torchaudio torchvision --index-url https://download.pytorch.org/whl/cu124

# Основные зависимости
pip install transformers>=4.45.0
pip install datasets
pip install soundfile
pip install librosa
pip install accelerate  # обязательно для больших моделей

Проверяем, что CUDA видна:

import torch
print(torch.cuda.is_available())  # Должно быть True
print(torch.cuda.get_device_name(0))  # Название твоей GPU

2 Загрузка модели и первый запуск

Модель весит ~60 ГБ в полной точности (FP32). Но нам нужна 8-битная квантизация, иначе на потребительской видеокарте не влезет. К счастью, авторы выложили quantized версии.

from transformers import AutoProcessor, AutoModelForAudioClassification
import torch
import soundfile as sf

# Загружаем процессор и модель с 8-битной квантизацией
model_id = "EarthSpecies/AniMUL-v1-8bit"

processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForAudioClassification.from_pretrained(
    model_id,
    torch_dtype=torch.float16,
    device_map="auto",
    load_in_8bit=True,  # Критически важно для 30B модели!
    low_cpu_mem_usage=True
)

# Говорим модели, что не нужно вычислять градиенты (только инференс)
model.eval()
for param in model.parameters():
    param.requires_grad = False

Ошибка новичка номер один: забывают load_in_8bit=True. Модель пытается загрузиться в FP16, требует 60+ ГБ видеопамяти, падает с OOM. На RTX 4090 (24 ГБ) AniMUL-v1 в 8-bit занимает ~18 ГБ. Еще место для аудиобуфера остается.

3 Подготовка аудио и инференс

Модель ожидает аудио 16kHz моно. Но процессор сам преобразует, если что. Главное - передать контекст.

# Загружаем аудиофайл
audio_path = "forest_night.wav"
audio_array, sampling_rate = sf.read(audio_path)

# Если стерео - конвертируем в моно
if len(audio_array.shape) > 1:
    audio_array = audio_array.mean(axis=1)

# Подготавливаем inputs с контекстом
inputs = processor(
    audio_array,
    sampling_rate=sampling_rate,
    text="Ночная запись, смешанный лес, Центральная Россия, июнь 2025",  # Контекст!
    return_tensors="pt",
    padding=True,
    truncation=True,
    max_length=960000  # 60 секунд при 16kHz
)

# Переносим на GPU
inputs = {k: v.to(model.device) for k, v in inputs.items()}

# Инференс (без вычисления градиентов)
with torch.no_grad():
    outputs = model(**inputs)
    logits = outputs.logits
    predictions = torch.softmax(logits, dim=-1)

# Получаем топ-5 предсказаний
probs, indices = torch.topk(predictions, 5)

# Загружаем id2label маппинг
id2label = model.config.id2label

print("Топ-5 обнаруженных видов:")
for i in range(5):
    species_id = indices[0][i].item()
    probability = probs[0][i].item()
    species_name = id2label[species_id]
    print(f"  {i+1}. {species_name}: {probability:.3%}")

Вывод будет примерно таким:

Топ-5 обнаруженных видов:
  1. Luscinia_megarhynchos (соловей): 94.7%
  2. Strix_aluco (серая неясыть): 2.1%
  3. Erinaceus_europaeus (еж): 1.8%
  4. Vulpes_vulpes (лисица): 0.9%
  5. Talpa_europaea (крот): 0.5%

Шаг 2: Продвинутые сценарии - батч-обработка и временные метки

Одиночные файлы - это для демо. В реальности у экологов терабайты записей с автономных рекордеров. Обрабатывать по одному файлу - месяц ждать.

Батч-обработка

Здесь есть нюанс: 30B модель даже в 8-bit ест много памяти. Батч размером больше 1 на потребительской GPU - нереально. Но можно использовать последовательную обработку с загрузкой данных в очередь.

from datasets import Dataset, Audio
import pandas as pd

# Предположим, у нас CSV с путями к файлам и контекстом
df = pd.read_csv("field_recordings.csv")
# columns: file_path, location, date, habitat

# Создаем Dataset
dataset = Dataset.from_pandas(df).cast_column("file_path", Audio())

def process_batch(batch):
    """Обрабатываем один батч (на самом деле по одному файлу)"""
    results = []
    
    for i in range(len(batch['file_path'])):
        audio = batch['file_path'][i]['array']
        sr = batch['file_path'][i]['sampling_rate']
        
        # Формируем текстовый контекст
        context_text = f"{batch['habitat'][i]}, {batch['location'][i]}, {batch['date'][i]}"
        
        inputs = processor(
            audio,
            sampling_rate=sr,
            text=context_text,
            return_tensors="pt",
            truncation=True,
            max_length=960000
        )
        
        inputs = {k: v.to(model.device) for k, v in inputs.items()}
        
        with torch.no_grad():
            outputs = model(**inputs)
            probs = torch.softmax(outputs.logits, dim=-1)
            top_prob, top_idx = torch.max(probs, dim=-1)
            
        species_name = id2label[top_idx.item()]
        
        results.append({
            'file': batch['file_path'][i]['path'],
            'predicted_species': species_name,
            'confidence': top_prob.item(),
            'timestamp': batch.get('timestamp', [None]*len(batch))[i]
        })
        
        # Очищаем память (важно!)
        torch.cuda.empty_cache()
    
    return results

# Обрабатываем dataset батчами по 1 (да, по одному)
results = []
for i in range(0, len(dataset), 1):
    batch = dataset[i:i+1]
    batch_results = process_batch(batch)
    results.extend(batch_results)
    
    if i % 10 == 0:
        print(f"Обработано {i+1}/{len(dataset)} файлов")

# Сохраняем результаты
results_df = pd.DataFrame(results)
results_df.to_csv("detection_results.csv", index=False)
💡
Если нужно обрабатывать действительно большие объемы, смотри в сторону Step-Audio-R1.1 - она легче и быстрее, хоть и менее точная для редких видов. Или распределяй инференс по нескольким GPU.

Временные метки (когда именно кричала птица?)

AniMUL-v1 умеет возвращать не только "что", но и "когда". Для этого нужно сегментировать аудио на чанки и обрабатывать каждый отдельно.

import numpy as np

def analyze_with_timestamps(audio_path, window_seconds=5, overlap=0.5):
    """Анализ аудио с временными метками"""
    audio, sr = sf.read(audio_path)
    if len(audio.shape) > 1:
        audio = audio.mean(axis=1)
    
    # Параметры окна
    window_samples = int(window_seconds * sr)
    overlap_samples = int(window_samples * overlap)
    step_samples = window_samples - overlap_samples
    
    results = []
    
    # Скользящее окно по аудио
    for start in range(0, len(audio) - window_samples + 1, step_samples):
        end = start + window_samples
        audio_chunk = audio[start:end]
        
        # Пропускаем слишком тихие чанки (только шум)
        if np.abs(audio_chunk).mean() < 0.01:  # Порог
            continue
        
        timestamp_seconds = start / sr
        
        inputs = processor(
            audio_chunk,
            sampling_rate=sr,
            text=f"Запись с временной меткой {timestamp_seconds:.1f}с",
            return_tensors="pt",
            truncation=True
        )
        
        inputs = {k: v.to(model.device) for k, v in inputs.items()}
        
        with torch.no_grad():
            outputs = model(**inputs)
            probs = torch.softmax(outputs.logits, dim=-1)
            top_prob, top_idx = torch.max(probs, dim=-1)
        
        if top_prob.item() > 0.7:  # Порог уверенности
            species_name = id2label[top_idx.item()]
            results.append({
                'start_time': timestamp_seconds,
                'end_time': timestamp_seconds + window_seconds,
                'species': species_name,
                'confidence': top_prob.item()
            })
        
        torch.cuda.empty_cache()
    
    return results

# Использование
detections = analyze_with_timestamps("long_recording.wav", window_seconds=3, overlap=0.3)
for det in detections[:5]:  # Первые 5 обнаружений
    print(f"{det['start_time']:.1f}-{det['end_time']:.1f}с: {det['species']} ({det['confidence']:.1%})")

Шаг 3: Интеграция в экологические проекты

AniMUL-v1 - не игрушка для демо. Это инструмент для реальной работы. Вот как его встраивают в исследовательские пайплайны.

Сценарий 1: Мониторинг биоразнообразия

Установили 50 автономных рекордеров в национальном парке. Каждые 3 часа записывают по 5 минут. За месяц - 1800 часов аудио. Ручной разметке - полгода работы. AniMUL-v1 - неделя.

Пайплайн:

  1. Сбор данных с рекордеров (Raspberry Pi + микрофон)
  2. Автоматическая загрузка на сервер (раз в сутки)
  3. Предобработка: удаление чисто шумовых записей (можно простым энергетическим детектором)
  4. Инференс AniMUL-v1 (на сервере с A100 или несколькими 4090)
  5. Агрегация результатов: "видовой состав по дням/неделям"
  6. Визуализация: карты активности видов

Сценарий 2: Обнаружение инвазивных видов

Азиатский карп в Великих озерах. Североамериканская лягушка-бык в Европе. Инвазивные виды разрушают экосистемы. AniMUL-v1 обучена на их голосах тоже.

Настраиваем мониторинг на определенные виды:

# Список целевых (инвазивных) видов для мониторинга
target_species = [
    'Lithobates_catesbeianus',  # Лягушка-бык
    'Acridotheres_tristis',     # Обыкновенная майна
    'Psittacula_krameri',       # Ожереловый попугай
]

# Получаем их ID из модели
target_ids = []
for species in target_species:
    for idx, name in id2label.items():
        if species in name:
            target_ids.append(idx)
            break

# При анализе проверяем только целевые виды
def check_for_invasive_species(audio_path):
    # ... загрузка и обработка аудио ...
    
    with torch.no_grad():
        outputs = model(**inputs)
        probs = torch.softmax(outputs.logits, dim=-1)
    
    # Берем вероятности только для целевых видов
    invasive_probs = probs[0, target_ids]
    
    for i, species_id in enumerate(target_ids):
        prob = invasive_probs[i].item()
        if prob > 0.8:  # Высокий порог для избежания ложных срабатываний
            species_name = id2label[species_id]
            print(f"ВНИМАНИЕ: обнаружен инвазивный вид {species_name} с уверенностью {prob:.1%}")
            # Отправляем алерт по email/Telegram
            send_alert(species_name, prob, audio_path)
💡
Если в записи много перекрывающихся голосов (хор лягушек, птичий хор на рассвете), могут быть проблемы. Для диаразации смотри статью про проблемы pyannote с перекрывающейся речью - похожие сложности, но для животных.

Где модель ошибается (и что с этим делать)

AniMUL-v1 - не бог. Точность 94.7% - это на чистых записях из датасета. В поле все сложнее.

Проблема Пример Решение
Сильный фоновый шум Запись у дороги, ветер 15 м/с Предварительная очистка аудио. Взять модели из статьи про локальное шумоподавление
Редкие/неизвестные виды Вид, которого нет в тренировочных данных Модель вернет ближайший известный вид. Нужна экспертная проверка
Мимикрия Птицы, имитирующие других птиц Контекст! Указать локацию, время года. Или пост-обработка правилами
Ювенильные особи Птенцы с другими вокализациями В тренировочных данных мало примеров. Ждать обновления модели
Гибридизация Потомство двух близких видов Самый сложный случай. Только экспертная таксономия

Мой совет: никогда не полагайся на модель на 100%. Особенно в conservation-проектах, где ошибка может стоить денег или репутации. AniMUL-v1 - это мощный фильтр, который сокращает объем работы эксперта в 100 раз. Но не заменяет эксперта.

Аппаратные требования: что реально нужно?

  • Минимум: GPU с 16 ГБ памяти (RTX 4080, RTX 4090). Модель в 8-bit. Батч размером 1. Медленно, но работает.
  • Комфортно: 24 ГБ (RTX 4090, RTX 5090). Можно держать больше буферов, чуть быстрее.
  • Production: A100/H100 40-80 ГБ. Батчи, параллельная обработка нескольких файлов.
  • Без GPU: Забудь. На CPU инференс одной минуты аудио займет 15-20 минут. Непрактично.

Оперативка: 32 ГБ минимум. Модель при загрузке жрет RAM. Диск: SSD обязательно. Чтение 60 ГБ модели с HDD - это 5 минут ожидания.

Важно: Если у тебя несколько GPU (например, 2× RTX 4090), используй device_map="balanced" или явно укажи, какие слои на какую карту. Но учти - межкарточная коммуникация через PCIe может стать бутылочным горлышком.

Что дальше? Будущее биоакустического ИИ

AniMUL-v1 - только начало. Earth Species Project анонсировали, что к концу 2026 выпустят:

  1. Версию на 120 миллиардов параметров (AniMUL-v2)
  2. Мультимодальность: аудио + инфракрасное видео (для ночных животных)
  3. Real-time обработку на edge-устройствах (квантизация до 4-bit)
  4. Генерацию "синтетических" вокализаций для привлечения/отпугивания видов

Но самая интересная часть - не размер модели. А датасеты. Сейчас идут переговоры с 40+ заповедниками по всему миру о создании открытого датасета в 10+ миллионов аннотированных аудиосэмплов. Когда он выйдет - точность подскочит до 98%+.

А пока - бери AniMUL-v1, ставь на сервер, подключай к автономным рекордерам. Через месяц у тебя будет карта биоразнообразия, на составление которой вручную ушло бы полгода. В экологии время - это исчезающие виды. Или спасенные.

P.S. Если хочешь потренироваться на чем-то попроще перед тем как браться за 30B модель, посмотри Perch от DeepMind - она меньше, быстрее, но и менее точная. Или поэкспериментируй с аугментацией аудиоданных - те же принципы, что и для изображений, но с питч-шифтингом и добавлением шума.