unenroll

Не зарегистрируйте метки

    Описание

    пример

    unenroll(ivs) не регистрирует все метки и соответствующие i-векторы от системы i-вектора ivs.

    unenroll(ivs,labels) не регистрирует заданные метки и соответствующие i-векторы от системы i-вектора ivs.

    Примеры

    свернуть все

    Загрузите Берлинскую Базу данных Эмоциональной Речи [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 использование набора обучающих данных.

    rng default
    trainExtractor(emotionRecognizer,trainSet, ...
        'UBMNumComponents',256, ...
        'UBMNumIterations',5, ...
        ...
        'TVSRank',128, ...
        'TVSNumIterations',5);
    Calculating standardization factors .....done.
    Training universal background model ........done.
    Training total variability space ........done.
    i-vector extractor training complete.
    

    Вызовите trainClassifier использование набора обучающих данных.

    rng default
    trainClassifier(emotionRecognizer,trainSet,trainLabels, ...
        'NumEigenvectors',32, ...
        ...
        'PLDANumDimensions',16, ...
        '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 = "plda";
    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: 5
    
    trainClassifier
      Train signals: 439
      Train labels: Anger (103), Anxiety (56) ... and 5 more
      NumEigenvectors: 32
      PLDANumDimensions: 16
      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-вектора с помощью обновленных меток. Вы не должны переобучать экстрактор.

    rng default
    trainClassifier(emotionRecognizer,trainSet,trainLabelsSentiment, ...
        'NumEigenvectors',32, ...
        ...
        'PLDANumDimensions',16, ...
        '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 = "plda";
    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 = "plda";
    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),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.

    Входные параметры

    свернуть все

    система i-вектора в виде объекта типа ivectorSystem.

    Метки классификации, используемые системой i-вектора в виде одного из них:

    • Категориальный массив

    • Массив ячеек из символьных векторов

    • Массив строк

    Типы данных: categorical | cell | string

    Введенный в R2021a