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

В этом сообщении блога мы рассмотрим, как создать простую систему обнаружения речевых эмоций с помощью Python. Мы будем использовать библиотеку с открытым исходным кодом под названием librosa для извлечения признаков из речевых сигналов, а затем использовать методы машинного обучения для классификации эмоций.

Во-первых, нам нужно установить необходимые библиотеки:

!pip install librosa
!pip install soundfile
!pip install numpy
!pip install sklearn

Далее нам нужно импортировать необходимые библиотеки:

import librosa
import soundfile
import numpy as np
import sklearn
import os

Мы будем использовать набор данных RAVDESS, общедоступный набор данных записей речи, который включает восемь эмоций: нейтральные, спокойные, счастливые, грустные, злые, испуганные, отвращение и удивление. Мы будем использовать первые две секунды каждой записи речи и извлекать кепстральные коэффициенты частоты Mel (MFCC) в качестве признаков.

emotions = {
    '01': 'neutral',
    '02': 'calm',
    '03': 'happy',
    '04': 'sad',
    '05': 'angry',
    '06': 'fearful',
    '07': 'disgust',
    '08': 'surprised'
}
def extract_feature(file_name):
    with soundfile.SoundFile(file_name) as sound_file:
        X = sound_file.read(dtype="float32")
        sample_rate = sound_file.samplerate
        mfccs = librosa.feature.mfcc(X, sr=sample_rate, n_mfcc=13)
        return mfccs
def load_data(test_size=0.2):
    X, y = [], []
    for file in os.listdir("data/"):
        if file.endswith(".wav"):
            emotion = emotions[file.split("-")[2]]
            feature = extract_feature("data/" + file)
            X.append(feature.T)
            y.append(emotion)
    return sklearn.model_selection.train_test_split(np.array(X), y, test_size=test_size, random_state=42)
    
X_train, X_test, y_train, y_test = load_data(test_size=0.25)

Мы будем использовать классификатор машины опорных векторов (SVM) для классификации эмоций. Мы будем использовать библиотеку scikit-learn для обучения классификатора.

from sklearn.svm import SVC

model = SVC(kernel='rbf', probability=True)
model.fit(X_train.reshape(len(X_train), -1), y_train)

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

filename = 'data/03-01-01-01-01-01-01.wav'
feature = extract_feature(filename).T
result = model.predict(feature.reshape(1, -1))[0]
print(f"Emotion detected: {result}")

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

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