Отменить регистрацию наклеек
Загрузите Берлинскую базу данных эмоциональной речи [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"));Имена файлов представляют собой коды, обозначающие идентификатор говорящего, текст, слова, эмоции и версию. Веб-сайт содержит ключ для интерпретации кода и дополнительную информацию о ораторах, такую как пол и возраст. Создание таблицы с переменными 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;
Считывайте сигнал из хранилища данных и прослушивайте его. Отображение идентификатора громкоговорителя и эмоций звукового сигнала.
[audioIn,audioInfo] = read(ads); fs = audioInfo.SampleRate; sound(audioIn,fs) audioInfo.Label
ans=1×2 table
Speaker Emotion
_______ _________
03 Happiness
Разбейте хранилище данных на обучающий набор и тестовый набор. Назначьте два динамика для тестового аппарата, а оставшиеся - для обучающего аппарата.
testSpeakerIdx = ads.Labels.Speaker=="12" | ads.Labels.Speaker=="13"; adsTrain = subset(ads,~testSpeakerIdx); adsTest = subset(ads,testSpeakerIdx);
Считывайте все обучающие и тестовые аудиоданные в массивы ячеек. Если ваши данные могут поместиться в память, обучение обычно происходит быстрее для ввода массивов ячеек в систему i-vector, а не в хранилища данных.
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-vector.
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-vector в приложении multilabel closed set можно использовать identify и создать матрицу путаницы. Матрица путаницы позволяет определить, какие эмоции неправильно идентифицированы, а какие неправильно. Использовать вспомогательную функцию plotConfusion для отображения результатов.
trueLabels = testLabels; predictedLabels = trueLabels; scorer ="css"; for ii = 1:numel(testSet) tableOut = identify(emotionRecognizer,testSet{ii},scorer); 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-vector с помощью обновленных меток. Переучивать экстрактор не нужно.
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(testSet) tableOut = identify(emotionRecognizer,testSet{ii},scorer); 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(testSet) tableOut = identify(emotionRecognizer,testSet{ii},scorer); 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] Буркхардт, Ф., А. Паешке, М. Рольфес, В. Ф. Сендлмайер и Б. Вайс, «База данных немецкой эмоциональной речи». В Proceedings Interspeech 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.