Отменить регистрацию меток
Загрузите Берлинскую базу данных эмоциональной речи [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;
Считайте сигнал от datastore и слушайте его. Отобразите идентификатор динамика и эмоции аудиосигнала.
[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 (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-векторной системы с помощью обновленных меток. Вам не нужно переобучать экстрактор.
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] Burkhardt, F., A. Paeschke, M. Rolfes, W.F. Sendlmeier, and B. Weiss, «A Database of Немецкая эмоциональная речь». В Proceedings Interspeech 2005. Лиссабон, Португалия: Международная ассоциация речевых коммуникаций, 2005 год.
ivs
- i-векторная системаivectorSystem
объектi-векторная система, заданная как объект типа ivectorSystem
.
labels
- Классификационные меткиКлассификационные метки, используемые i-векторной системой, заданные как одно из следующего:
Категориальный массив
Массив ячеек из векторов символов
A строковых массивов
Типы данных: categorical
| cell
| string
detectionErrorTradeoff
| enroll
| identify
| info
| ivector
| ivectorSystem
| release
| trainClassifier
| trainExtractor
| verify
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.