«Эмоции скрыты не в словах, а между ними — в голосе.»
Мультимодальное распознавание эмоций в речи через attention-fusion аудио и текстовых эмбеддингов
О проекте · Архитектура · Данные · Результаты · Быстрый старт
Мультимодальная система распознавания эмоций говорящего, комбинирующая аудио-эмбеддинги (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
| Speaker | Start | End | Duration | Text |
|---|---|---|---|---|
| speaker1 | 00:00:00.000 | 00:00:02.190 | 2.19s | машинист поезда номер 11 |
| эмоция | — | — | — | neutral |
Каждый сегмент речи сопровождается меткой эмоции в следующей строке.
| Метрика | Значение |
|---|---|
| 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 обеих модальностей |
| Параметр | Значение |
|---|---|
| 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 и выполните ячейки последовательно:
- Загрузка данных — чтение WAV + CSV, сегментация по таймкодам
- Извлечение эмбеддингов — Wav2Vec2 (аудио) + BERT (текст)
- Attention fusion — объединение модальностей
- Обучение — RoBERTa classifier через HuggingFace Trainer
- Оценка — 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 — свободно используйте, форкайте, дорабатывайте.