Не зарегистрируйте метки
Загрузите Берлинскую Базу данных Эмоциональной Речи [1]. База данных содержит 535 произнесения, на котором говорят 10 агентов, предназначенных, чтобы передать одну из следующих эмоций: гнев, скука, отвращение, беспокойство/страх, счастье, печаль, или нейтральный. Эмоции являются независимым текстом.
url = "http://emodb.bilderbar.info/download/download.zip"; downloadFolder = tempdir; datasetFolder = fullfile(downloadFolder,"Emo-DB"); if ~exist(datasetFolder,'dir') disp('Downloading Emo-DB (40.5 MB) ...') unzip(url,datasetFolder) end
Создайте audioDatastore
это указывает на звуковые файлы.
ads = audioDatastore(fullfile(datasetFolder,"wav"));
Имена файлов являются кодами, указывающими на ID динамика, текст, на котором говорят, эмоция и версия. Веб-сайт содержит ключ для интерпретации кода и дополнительной информации о динамиках, таких как пол и возраст. Составьте таблицу с переменными Speaker
и Emotion
. Декодируйте имена файлов в таблицу.
filepaths = ads.Files; emotionCodes = cellfun(@(x)x(end-5),filepaths,'UniformOutput',false); emotions = replace(emotionCodes,{'W','L','E','A','F','T','N'}, ... {'Anger','Boredom','Disgust','Anxiety','Happiness','Sadness','Neutral'}); speakerCodes = cellfun(@(x)x(end-10:end-9),filepaths,'UniformOutput',false); labelTable = table(categorical(speakerCodes),categorical(emotions),'VariableNames',{'Speaker','Emotion'}); summary(labelTable)
Variables: Speaker: 535×1 categorical Values: 03 49 08 58 09 43 10 38 11 55 12 35 13 61 14 69 15 56 16 71 Emotion: 535×1 categorical Values: Anger 127 Anxiety 69 Boredom 81 Disgust 46 Happiness 71 Neutral 79 Sadness 62
labelTable
находится в том же порядке как файлы в audioDatastore
. Установите Labels
свойство audioDatastore
к labelTable
.
ads.Labels = labelTable;
Считайте сигнал из datastore и слушайте его. Отобразите ID динамика и эмоцию звукового сигнала.
[audioIn,audioInfo] = read(ads); fs = audioInfo.SampleRate; sound(audioIn,fs) audioInfo.Label
ans=1×2 table
Speaker Emotion
_______ _________
03 Happiness
Разделите datastore в набор обучающих данных и набор тестов. Присвойте два динамика набору тестов и остающееся к набору обучающих данных.
testSpeakerIdx = ads.Labels.Speaker=="12" | ads.Labels.Speaker=="13"; adsTrain = subset(ads,~testSpeakerIdx); adsTest = subset(ads,testSpeakerIdx);
Считайте все обучение и тестирующий аудиоданные в массивы ячеек. Если ваши данные могут уместиться в памяти, обучение обычно быстрее, чтобы ввести массивы ячеек к системе i-вектора, а не хранилищам данных.
trainSet = readall(adsTrain); trainLabels = adsTrain.Labels.Emotion; testSet = readall(adsTest); testLabels = adsTest.Labels.Emotion;
Создайте систему i-вектора, которая не применяет речевое обнаружение. Когда DetectSpeech
установлен в true
(значение по умолчанию), только области обнаруженной речи используются, чтобы обучить систему i-вектора. Когда DetectSpeech
установлен в false
, целое входное аудио используется, чтобы обучить систему i-вектора. Полноценность применения речевого обнаружения зависит от ввода данных к системе.
emotionRecognizer = ivectorSystem('SampleRate',fs,'DetectSpeech',false)
emotionRecognizer = ivectorSystem with properties: InputType: 'audio' SampleRate: 16000 DetectSpeech: 0 EnrolledLabels: [0×2 table]
Вызовите trainExtractor
использование набора обучающих данных.
trainExtractor(emotionRecognizer,trainSet, ... 'UBMNumComponents',256, ... 'UBMNumIterations',5, ... ... 'TVSRank',128, ... 'TVSNumIterations',2);
Calculating standardization factors .....done. Training universal background model ........done. Training total variability space .....done. i-vector extractor training complete.
Вызовите trainClassifier
использование набора обучающих данных.
trainClassifier(emotionRecognizer,trainSet,trainLabels, ... 'NumEigenvectors',64, ... ... 'PLDANumDimensions',64, ... 'PLDANumIterations',10);
Extracting i-vectors ...done. Training projection matrix .....done. Training PLDA model .............done. i-vector classifier training complete.
Зарегистрируйте учебные метки в систему i-вектора.
enroll(emotionRecognizer,trainSet,trainLabels)
Extracting i-vectors ...done. Enrolling i-vectors ..........done. Enrollment complete.
Можно использовать detectionErrorTradeoff
как быстрая проверка работоспособности на эффективности системы классификации замкнутого множества мультиметки. Однако detectionErrorTradeoff
предоставляет информацию, более подходящую для проблем классификации двоичных файлов открытого набора, например, задач верификации динамика.
detectionErrorTradeoff(emotionRecognizer,testSet,testLabels)
Extracting i-vectors ...done. Scoring i-vector pairs ...done. Detection error tradeoff evaluation complete.
Для более подробного представления эффективности системы i-вектора в приложении замкнутого множества мультиметки можно использовать identify
функционируйте и создайте матрицу беспорядка. Матрица беспорядка позволяет вам идентифицировать, какие эмоции не распознаны и что они не распознаны как. Используйте функцию поддержки plotConfusion
отобразить результаты.
trueLabels = testLabels; predictedLabels = trueLabels; scorer = "css"; for ii = 1:numel (набор тестов) tableOut = идентифицируют (emotionRecognizer, набор тестов {ii}, маркер); predictedLabels (ii) = tableOut.Label (1); end plotConfusion (trueLabels, predictedLabels)
Вызовите info
смотреть как emotionRecognizer
был обучен и оценен.
info(emotionRecognizer)
i-vector system input Input feature vector length: 60 Input data type: double trainExtractor Train signals: 439 UBMNumComponents: 256 UBMNumIterations: 5 TVSRank: 128 TVSNumIterations: 2 trainClassifier Train signals: 439 Train labels: Anger (103), Anxiety (56) ... and 5 more NumEigenvectors: 64 PLDANumDimensions: 64 PLDANumIterations: 10 detectionErrorTradeoff Evaluation signals: 96 Evaluation labels: Anger (24), Anxiety (13) ... and 5 more
Затем измените систему i-вектора, чтобы распознать эмоции положительными, нейтральными, или отрицательными. Обновите метки, чтобы только включать категории, отрицательные, положительные, и категориальные.
trainLabelsSentiment = trainLabels; trainLabelsSentiment(ismember(trainLabels,categorical(["Anger","Anxiety","Boredom","Sadness","Disgust"]))) = categorical("Negative"); trainLabelsSentiment(ismember(trainLabels,categorical("Happiness"))) = categorical("Postive"); trainLabelsSentiment = removecats(trainLabelsSentiment); testLabelsSentiment = testLabels; testLabelsSentiment(ismember(testLabels,categorical(["Anger","Anxiety","Boredom","Sadness","Disgust"]))) = categorical("Negative"); testLabelsSentiment(ismember(testLabels,categorical("Happiness"))) = categorical("Postive"); testLabelsSentiment = removecats(testLabelsSentiment);
Переобучите системный классификатор i-вектора с помощью обновленных меток. Вы не должны переобучать экстрактор.
trainClassifier(emotionRecognizer,trainSet,trainLabelsSentiment, ... 'NumEigenvectors',64, ... ... 'PLDANumDimensions',64, ... 'PLDANumIterations',10);
Extracting i-vectors ...done. Training projection matrix .....done. Training PLDA model .............done. i-vector classifier training complete.
Зарегистрируйте учебные метки в систему и затем постройте матрицу беспорядка для набора тестов.
enroll(emotionRecognizer,trainSet,trainLabelsSentiment)
Extracting i-vectors ...done. Enrolling i-vectors ......done. Enrollment complete.
trueLabels = testLabelsSentiment; predictedLabels = trueLabels; scorer = "css"; for ii = 1:numel (набор тестов) tableOut = идентифицируют (emotionRecognizer, набор тестов {ii}, маркер); predictedLabels (ii) = tableOut.Label (1); end plotConfusion (trueLabels, predictedLabels)
Система i-вектора не требует, чтобы метки раньше обучали классификатор быть равным зарегистрированным меткам.
Не зарегистрируйте метки чувства от системы и затем зарегистрируйте исходные категории эмоции в системе. Анализируйте эффективность классификации системы.
unenroll(emotionRecognizer) enroll(emotionRecognizer,trainSet,trainLabels)
Extracting i-vectors ...done. Enrolling i-vectors ..........done. Enrollment complete.
trueLabels = testLabels; predictedLabels = trueLabels; scorer = "css"; for ii = 1:numel (набор тестов) tableOut = идентифицируют (emotionRecognizer, набор тестов {ii}, маркер); predictedLabels (ii) = tableOut.Label (1); end plotConfusion (trueLabels, predictedLabels)
Вспомогательные Функции
function plotConfusion(trueLabels,predictedLabels) uniqueLabels = unique(trueLabels); cm = zeros(numel(uniqueLabels)); for ii = 1:numel(uniqueLabels) for jj = 1:numel(uniqueLabels) cm(ii,jj) = sum((trueLabels==uniqueLabels(ii)) & (predictedLabels==uniqueLabels(jj))); end end heatmap(uniqueLabels,uniqueLabels,cm) colorbar off ylabel('True Labels') xlabel('Predicted Labels') accuracy = mean(trueLabels==predictedLabels); title(sprintf("Accuracy = %0.2f %%",accuracy*100)) end
Ссылки
[1] Burkhardt, F., А. Пэешк, М. Рольфес, В.Ф. Сендлмайер и Б. Вайс, "База данных немецкой эмоциональной речи". В межречи 2005 продолжений. Лиссабон, Португалия: международная речевая коммуникационная ассоциация, 2005.
ivs
— система i-вектораivectorSystem
объектсистема i-вектора в виде объекта типа ivectorSystem
.
labels
— Метки классификацииМетки классификации, используемые системой i-вектора в виде одного из них:
Категориальный массив
Массив ячеек из символьных векторов
Массив строк
Типы данных: categorical
| cell
| string
detectionErrorTradeoff
| enroll
| identify
| info
| ivector
| ivectorSystem
| release
| trainClassifier
| trainExtractor
| verify
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.