- 2024/12 — MIT-лицензия, GigaAM-v2 (улучшение качества распознавания речи на 15% и 12% WER для CTC и RNN-T моделей), поддержка экспорта в ONNX
- 2024/05 — GigaAM-RNNT (улучшение WER на -19%), распознавание речи на длинных аудиозаписях с помощью внешей VAD-модели
- 2024/04 — Релиз GigaAM: GigaAM-CTC (Лучшая открытая модель для распознавания речи на русском языке), GigaAM-Emo
GigaAM (Giga Acoustic Model) - семейство акустических моделей для обработки звучащей речи на русском языке. Среди решаемых задач - задачи распознавания речи, распознавания эмоций и извлечения эмбеддингов из аудио. Модели построены на основе архитектуры Conformer с использованием методов self-supervised learning (wav2vec2-подход для GigaAM-v1 и HuBERT-подход для GigaAM-v2).
Модели GigaAM с отрывом являются лучшими по качеству моделями в открытом доступе для соответствующих задач.
Репозиторий включает:
- GigaAM: фундаментальная акустическая модель, обученная на большом объеме неразмеченных русскоязычных аудиозаписей.
- GigaAM-CTC и GigaAM-RNNT: модели, дообученные на задачу автоматического распознавания речи.
- GigaAM-Emo: модель, дообученная на задачу распознавания эмоций.
- Python ≥ 3.8
- установленный и добавленный в PATH ffmpeg
- Скачивание репозитория:
git clone https://github.com/salute-developers/GigaAM.git
cd GigaAM
- Установка пакета:
pip install -e .
- Проверка установленного пакета:
import gigaam
model = gigaam.load_model("ctc")
print(model)
GigaAM (Giga Acoustic Model) — фундаментальная акустическая модель, основанная на Conformer-энкодере (около 240M параметров) и обученная на 50 тысячах часов разнообразных русскоязычных данных.
Доступны 2 версии модели, отличающиеся алгоритмом предобучения:
- GigaAM-v1 была обучена на основе подхода wav2vec2. Версия модели для использования -
v1_ssl
. - GigaAM-v2 была обучена на основе подхода HuBERT и позволила улучшить качество распознавания речи. Версия модели для использования -
v2_ssl
илиssl
.
Больше информации про обучение GigaAM-v1 можно найти в нашей статье на Хабре.
import gigaam
model = gigaam.load_model('ssl') # Options: "ssl", "v1_ssl"
embedding, _ = model.embed_audio(audio_path)
Мы дообучали GigaAM энкодер для задачи распознавания речи с двумя разными декодерами:
- Модели GigaAM-CTC были дообучены с CTC функцией потерь.
- Модели GigaAM-RNNT была дообучена с RNN-T функцией потерь.
Мы проводили дообучения моделей с обеих версий GigaAM: v1
и v2
, таким образом для каждой из GigaAM-CTC и GigaAM-RNNT моделей доступны 2 версии: v1
и v2
.
dataset | size, hours | weight |
---|---|---|
Golos | 1227 | 0.6 |
SOVA | 369 | 0.2 |
Russian Common Voice | 207 | 0.1 |
Russian LibriSpeech | 93 | 0.1 |
Model | Parameters | Golos Crowd | Golos Farfield | OpenSTT YouTube | OpenSTT Phone Calls | OpenSTT Audiobooks | Mozilla Common Voice 12 | Mozilla Common Voice 19 | Russian LibriSpeech |
---|---|---|---|---|---|---|---|---|---|
Whisper-large-v3 | 1.5B | 13.9 | 16.6 | 18.0 | 28.0 | 14.4 | 5.7 | 5.5 | 9.5 |
NVIDIA FastConformer | 115M | 2.2 | 6.6 | 21.2 | 30.0 | 13.9 | 2.7 | 5.7 | 11.3 |
GigaAM-CTC-v1 | 242M | 3.0 | 5.7 | 16.0 | 23.2 | 12.5 | 2.0 | 10.5 | 7.5 |
GigaAM-RNNT-v1 | 243M | 2.3 | 5.0 | 14.0 | 21.7 | 11.7 | 1.9 | 9.9 | 7.7 |
GigaAM-CTC-v2 | 242M | 2.5 | 4.3 | 14.1 | 21.1 | 10.7 | 2.1 | 3.1 | 5.5 |
GigaAM-RNNT-v2 | 243M | 2.2 | 3.9 | 13.3 | 20.0 | 10.2 | 1.8 | 2.7 | 5.5 |
import gigaam
model_name = "rnnt" # Options: "v2_ctc" or "ctc", "v2_rnnt" or "rnnt", "v1_ctc", "v1_rnnt"
model = gigaam.load_model(model_name)
transcription = model.transcribe(audio_path)
-
Установите зависимости для внешней VAD-модели (pyannote.audio library):
pip install gigaam[longform]
-
- Сгенерируйте Hugging Face API token
- Примите условия для получения доступа к контенту pyannote/voice-activity-detection
- Примите условия для получения доступа к контенту pyannote/segmentation
-
Используйте метод
model.transcribe_longform
:import os import gigaam os.environ["HF_TOKEN"] = "<HF_TOKEN>" model = gigaam.load_model("ctc") recognition_result = model.transcribe_longform("long_example.wav") for utterance in recognition_result: transcription = utterance["transcription"] start, end = utterance["boundaries"] print(f"[{gigaam.format_time(start)} - {gigaam.format_time(end)}]: {transcription}")
- Экспортируйте модель в onnx-формат с помощью метода
model.to_onnx
:onnx_dir = "onnx" model_type = "rnnt" # or "ctc" model = gigaam.load_model( model_type, fp16_encoder=False, # only fp32 tensors use_flash=False, # disable flash attention ) model.to_onnx(dir_path=onnx_dir)
- Используйте полученную модель для транскрибации:
from gigaam.onnx_utils import load_onnx_sessions, transcribe_sample sessions = load_onnx_sessions(onnx_dir, model_type) transcribe_sample("example.wav", model_type, sessions)
Все приведенные примеры также могут быть найдены в jupyter-ноутбуке inference_example.ipynb.
GigaAM-Emo — акустическая модель для определения эмоций. Мы доучивали GigaAM на датасете Dusha.
В таблице ниже приведены метрики качества открытых моделей на датасете Dusha:
Crowd | Podcast | |||||
---|---|---|---|---|---|---|
Unweighted Accuracy | Weighted Accuracy | Macro F1-score | Unweighted Accuracy | Weighted Accuracy | Macro F1-score | |
DUSHA baseline (MobileNetV2 + Self-Attention) |
0.83 | 0.76 | 0.77 | 0.89 | 0.53 | 0.54 |
АБК (TIM-Net) | 0.84 | 0.77 | 0.78 | 0.90 | 0.50 | 0.55 |
GigaAM-Emo | 0.90 | 0.87 | 0.84 | 0.90 | 0.76 | 0.67 |
import gigaam
model = gigaam.load_model('emo')
emotion2prob: Dict[str, int] = model.get_probs("example.wav")
print(", ".join([f"{emotion}: {prob:.3f}" for emotion, prob in emotion2prob.items()]))
Код и веса моделей семества GigaAM доступны для использования с MIT-лицензией.