/ Модель

Характеристики

Базовая модель
whisper-medium
Библиотека
pytorch
Опубликована
28 сен 2026

lingkodai-audio-lid-head

Классификация аудиоАудио → label

Классификатор аудио определяет, звучит ли в записи себуано, филиппинский или английский, чтобы направить её в подходящую модель распознавания речи.

0скачиваний за 30 дней0лайковвеса обновлены28 сен 2026

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

LingkodAI Audio LID Head — модель классификации аудио от LingkodAI для определения, на каком из трёх языков произнесён аудиофрагмент: себуано, филиппинский или английский. Она предназначена для маршрутизации аудиозаписей к подходящей модели распознавания речи Whisper в конвейере LingkodAI.

Модель использует замороженный аудиоэнкодер openai/whisper-medium и обученную поверх него классификационную голову: усредняет представления 50 временных фрагментов длительностью около 0,6 секунды, затем применяет пулинг с вниманием и трёхслойную MLP. Репозиторий содержит только веса классификационной головы; энкодер загружается отдельно. Для работы нужны исходные настройки разбиения на фрагменты, маскирования невалидных фрагментов и вычислений в fp32. Лицензия в предоставленных данных не указана.

Сценарии применения

  • определение языка в аудиозаписях на себуано, филиппинском или английском
  • маршрутизация речи к подходящей модели Whisper STT
  • предварительная сортировка многоязычных аудиоклипов перед транскрибацией

Ограничения

Классификатор поддерживает только себуано, филиппинский и английский. Для работы требуется отдельно загружаемый энкодер openai/whisper-medium и точное соблюдение настроек разбиения на фрагменты, маскирования и fp32.

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

LingkodAI Audio LID Head

Identifies whether a spoken clip is Cebuano, Filipino, or English, so the LingkodAI pipeline can route it to the appropriate Whisper STT model.

How it works

A small classifier head on top of the frozen openai/whisper-medium encoder. The encoder's output is averaged into 50 chunks (0.6 s each), and the head uses attention pooling plus a 3-layer MLP to predict the language.

Classes: 0 = ceb, 1 = fil, 2 = eng

Files

  • deeper_50chunks.pt: weights for the classifier head only. The whisper-medium encoder is loaded separately.

Usage

import numpy as np, torch, torch.nn as nn, librosa
from transformers import WhisperFeatureExtractor, WhisperModel
from huggingface_hub import hf_hub_download

LABELS = ("ceb", "fil", "eng")
device = "cuda" if torch.cuda.is_available() else "cpu"

def build_head():
    return nn.ModuleDict({
        "attn_fc1": nn.Linear(1024, 128),
        "attn_fc2": nn.Linear(128, 1),
        "clf_fc1":  nn.Linear(2048, 256),
        "clf_fc2":  nn.Linear(256, 128),
        "clf_fc3":  nn.Linear(128, 3),
    })

def head_forward(head, chunks, num_valid):
    scores = head["attn_fc2"](torch.tanh(head["attn_fc1"](chunks))).squeeze(-1)
    idx = torch.arange(chunks.shape[1], device=chunks.device).unsqueeze(0)
    scores = scores.masked_fill(idx >= num_valid.unsqueeze(1), float("-inf"))
    w = torch.softmax(scores, dim=1).unsqueeze(-1)
    mean = (chunks * w).sum(1)
    std = torch.sqrt((((chunks - mean.unsqueeze(1)) ** 2) * w).sum(1).clamp(min=1e-8))
    h = torch.relu(head["clf_fc1"](torch.cat([mean, std], 1)))
    h = torch.relu(head["clf_fc2"](h))
    return head["clf_fc3"](h)

# Load the frozen encoder (fp32) and the head
fe = WhisperFeatureExtractor.from_pretrained("openai/whisper-medium")
encoder = WhisperModel.from_pretrained("openai/whisper-medium", torch_dtype=torch.float32).encoder.to(device).eval()
head = build_head()
path = hf_hub_download("lingkodai/lingkodai-audio-lid-head", "deeper_50chunks.pt")
head.load_state_dict(torch.load(path, map_location=device, weights_only=True))
head = head.to(device).eval()

# Predict on a 16 kHz mono clip
audio, _ = librosa.load("clip.wav", sr=16000)
feats = fe(audio, sampling_rate=16000, return_tensors="pt").input_features.to(device)
with torch.no_grad():
    hidden = encoder(feats).last_hidden_state
    chunks = hidden.view(1, 50, 30, 1024).mean(dim=2)         # 50 chunks of 30 frames
    real_frames = min(int(np.round(len(audio) / 16000 * 50)), 1500)
    num_valid = torch.tensor([int(np.clip(np.ceil(real_frames / 30), 1, 50))], device=device)
    probs = torch.softmax(head_forward(head, chunks, num_valid), dim=1)[0]

print(LABELS[int(probs.argmax())], probs.tolist())

The chunking (50 × 30 frames), valid-chunk masking, and fp32 encoder must match these settings, since the head was trained under them.

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм · pytorch · audio-classification

Нельзя запустить

В репозитории нет config.json: не понять архитектуру модели.

Ревизия весов
f674fe8

0 моделей