exponenta event banner

не зарегистрироваться

Отменить регистрацию наклеек

    Описание

    пример

    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"));

    Имена файлов представляют собой коды, обозначающие идентификатор говорящего, текст, слова, эмоции и версию. Веб-сайт содержит ключ для интерпретации кода и дополнительную информацию о ораторах, такую как пол и возраст. Создание таблицы с переменными 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 год.

    Входные аргументы

    свернуть все

    i-векторная система, указанная как объект типа ivectorSystem.

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

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

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

    • Строковый массив

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

    Представлен в R2021a