Skip to content

Siesher/Embeddings

Repository files navigation

Embeddings Banner

🎭 Embeddings

«Эмоции скрыты не в словах, а между ними — в голосе.»

Мультимодальное распознавание эмоций в речи через attention-fusion аудио и текстовых эмбеддингов

Python 3.8+ Wav2Vec2 BERT RoBERTa License: MIT

О проекте · Архитектура · Данные · Результаты · Быстрый старт


✦ О проекте

Мультимодальная система распознавания эмоций говорящего, комбинирующая аудио-эмбеддинги (Wav2Vec2) и текстовые эмбеддинги (BERT) через механизм внимания. Обучена на размеченных данных русскоязычной железнодорожной диспетчерской связи.

Три модальности сравниваются:

  • Audio-only — только аудио-признаки
  • Text-only — только текстовые признаки
  • Combined — attention-fusion обеих модальностей
Ключевые особенности Описание
🎙️ Audio embeddings Wav2Vec2 (Facebook, pre-trained on LibriSpeech 960h)
📝 Text embeddings BERT (last_hidden_state, 768-dim)
🔀 Attention fusion Learned attention weights для взвешивания модальностей
🎯 Classification RoBERTa-base через HuggingFace Trainer
📊 92 аудиозаписи Размеченные фрагменты диспетчерской связи

✦ Архитектура

 ┌──────────────────────┐     ┌──────────────────────┐
 │   Audio Input (WAV)  │     │   Text Input (CSV)   │
 └──────────┬───────────┘     └──────────┬───────────┘
            ▼                            ▼
 ┌──────────────────────┐     ┌──────────────────────┐
 │   Wav2Vec2ForCTC     │     │   BERT Tokenizer     │
 │   (facebook/960h)    │     │   + BertModel         │
 └──────────┬───────────┘     └──────────┬───────────┘
            │                            │
            ▼                            ▼
 ┌──────────────────────┐     ┌──────────────────────┐
 │   Attention Pooling  │     │   Attention Pooling  │
 │   Linear → Softmax   │     │   Linear → Softmax   │
 └──────────┬───────────┘     └──────────┬───────────┘
            │                            │
            └───────────┬────────────────┘
                        ▼
             ┌──────────────────────┐
             │   Concatenate        │
             │   + Linear → 768-dim │
             └──────────┬───────────┘
                        ▼
             ┌──────────────────────┐
             │   RoBERTa Classifier │
             │   (num_labels = N)   │
             └──────────┬───────────┘
                        ▼
                   Emotion Label

✦ Данные

Датасет

92 размеченных аудиозаписи русскоязычной железнодорожной диспетчерской связи:

Разметка Сухацкий - Щеглов/
├── wav/                     # 92 аудиофайла (16 kHz, WAV)
│   ├── 1.wav ... 92.wav
├── csv/                     # 92 файла разметки + ноутбук
│   ├── 1.csv ... 92.csv
└── eaf/                     # 17 пар ELAN-аннотаций
    ├── *.eaf                #   ELAN Annotation Format
    └── *.pfsx               #   Praat scripts

Формат разметки (CSV)

Speaker Start End Duration Text
speaker1 00:00:00.000 00:00:02.190 2.19s машинист поезда номер 11
эмоция neutral

Каждый сегмент речи сопровождается меткой эмоции в следующей строке.


✦ Результаты

Метрики (Combined model, epoch 3)

Метрика Значение
Accuracy 61.04%
F1 (weighted) 0.463
Precision (weighted) 0.373
Recall (weighted) 0.610
Eval loss 1.543

Сравнение модальностей

Модальность Описание
Audio-only Только Wav2Vec2 эмбеддинги
Text-only Только BERT эмбеддинги
Combined Attention-fusion обеих модальностей

✦ Training Config

Параметр Значение
Epochs 10
Batch size (train) 16
Batch size (eval) 64
Warmup steps 500
Weight decay 0.01
Embedding dim 768
Train/Test split 80/20 (seed=42)

✦ Структура проекта

Embeddings/
├── Embedding.ipynb                    # Основной ноутбук
├── evaluation_results.csv             # Финальные метрики
├── Разметка Сухацкий - Щеглов/       # Данные
│   ├── wav/                           #   92 аудиофайла
│   ├── csv/                           #   92 файла разметки
│   └── eaf/                           #   ELAN-аннотации
├── figures/
│   └── banner.svg
├── .gitignore
└── README.md

✦ Быстрый старт

Требования

  • Python 3.8+ · GPU с CUDA (рекомендуется)

Установка

git clone https://github.com/Siesher/Embeddings.git
cd Embeddings
pip install torch transformers librosa pandas numpy scikit-learn

Запуск

Откройте Embedding.ipynb и выполните ячейки последовательно:

  1. Загрузка данных — чтение WAV + CSV, сегментация по таймкодам
  2. Извлечение эмбеддингов — Wav2Vec2 (аудио) + BERT (текст)
  3. Attention fusion — объединение модальностей
  4. Обучение — RoBERTa classifier через HuggingFace Trainer
  5. Оценка — accuracy, F1, precision, recall

✦ Технологии

Layer Stack
Audio Wav2Vec2ForCTC (facebook/wav2vec2-base-960h) · librosa
Text BERT (bert-base-uncased) · HuggingFace Tokenizers
Fusion Attention pooling (Linear + Softmax) · Concatenation
Classifier RoBERTa-base (SequenceClassification)
Training HuggingFace Trainer · PyTorch
Metrics scikit-learn (accuracy, F1, precision, recall)

✦ Лицензия

MIT License — свободно используйте, форкайте, дорабатывайте.


Сухацкий Максим · МГТУ им. Н.Э. Баумана (Калужский филиал) · 2024

GitHub


About

📐 Experiments with text & vector embeddings

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors