ivector

Извлеките i-вектор

    Описание

    пример

    w = ivector(ivs,data) i-векторы извлечений от входа data.

    w = ivector(___,'ApplyProjectionMatrix',TF) задает, применяться ли, матрица проекции определила использование trainClassifier.

    Примеры

    свернуть все

    Система i-вектора состоит из обучаемого фронтэнда, который изучает, как извлечь i-векторы на основе непомеченных данных и обучаемый бэкэнд, который изучает, как классифицировать i-векторы на основе маркированных данных. В этом примере вы применяете систему i-вектора к задаче распознавания слов. Во-первых, оцените точность системы i-вектора с помощью классификаторов, включенных в традиционную систему i-вектора: вероятностный линейный дискриминантный анализ (PLDA) и выигрыш подобия косинуса (CSS). Затем оцените точность системы, если вы заменяете классификатор на двунаправленную длинную краткосрочную сеть (BiLSTM) памяти или классификатор K - ближайших соседей.

    Создайте наборы обучения и валидации

    Загрузите Свободный разговорный набор данных цифры (FSDD) [1]. FSDD состоит из коротких звуковых файлов с разговорными цифрами (0-9).

    url = "https://ssd.mathworks.com/supportfiles/audio/FSDD.zip";
    downloadFolder = tempdir;
    datasetFolder = fullfile(downloadFolder,'FSDD');
    
    if ~exist(datasetFolder,'dir')
        fprintf('Downloading Free Spoken Digit Dataset ...\n')
        unzip(url,datasetFolder)
    end

    Создайте audioDatastore указать на записи. Получите частоту дискретизации набора данных.

    ads = audioDatastore(datasetFolder,'IncludeSubfolders',true);
    [~,adsInfo] = read(ads);
    fs = adsInfo.SampleRate;

    Первым элементом имен файлов является цифра, на которой говорят в файле. Получите первый элемент имен файлов, преобразуйте их в категориальный, и затем установите Labels свойство audioDatastore.

    [~,filenames] = cellfun(@(x)fileparts(x),ads.Files,'UniformOutput',false);
    ads.Labels = categorical(string(cellfun(@(x)x(1),filenames)));

    Чтобы разделить datastore в набор разработки и набор валидации, используйте splitEachLabel. Выделите 80% данных для разработки и остающиеся 20% для валидации.

    [adsTrain,adsValidation] = splitEachLabel(ads,0.8);

    Оцените Традиционную Эффективность Бэкэнда i-вектора

    Создайте систему i-вектора, которая ожидает аудиовход на уровне частоты дискретизации 8 кГц и не выполняет речевое обнаружение.

    wordRecognizer = ivectorSystem('DetectSpeech',false,"SampleRate",fs)
    wordRecognizer = 
      ivectorSystem with properties:
    
             InputType: 'audio'
            SampleRate: 8000
          DetectSpeech: 0
        EnrolledLabels: [0×2 table]
    
    

    Обучите экстрактор i-вектора с помощью данных в наборе обучающих данных.

    trainExtractor(wordRecognizer,adsTrain, ...
        "UBMNumComponents",512, ...
        "UBMNumIterations",5, ...
        ...
        "TVSRank",128, ...
        "TVSNumIterations",3);
    Calculating standardization factors ....done.
    Training universal background model ........done.
    Training total variability space ...done.
    i-vector extractor training complete.
    

    Обучите классификатор i-вектора с помощью данных в обучающем наборе данных и соответствующих метках.

    trainClassifier(wordRecognizer,adsTrain,adsTrain.Labels, ...
        "NumEigenvectors",16, ...
        ...
        "PLDANumDimensions",16, ...
        "PLDANumIterations",3);
    Extracting i-vectors ...done.
    Training projection matrix .....done.
    Training PLDA model ......done.
    i-vector classifier training complete.
    

    Зарегистрируйте метки в систему с помощью целого набора обучающих данных.

    enroll(wordRecognizer,adsTrain,adsTrain.Labels)
    Extracting i-vectors ...done.
    Enrolling i-vectors .............done.
    Enrollment complete.
    

    В цикле считайте аудио из datastore валидации, идентифицируйте наиболее вероятный подарок слова согласно заданному маркеру и сохраните предсказание для анализа.

    trueLabels = adsValidation.Labels;
    predictedLabels = trueLabels;
    
    reset(adsValidation)
    
    scorer = "plda";
    for ii = 1:numel (trueLabels)
        
        audioIn = читают (adsValidation);
        
        к = идентифицируют (wordRecognizer, audioIn, маркер);
        
        predictedLabels (ii) = to.Label (1);
        
    end

    Отобразите график беспорядка эффективности системы i-вектора на наборе валидации.

    figure('Units','normalized','Position',[0.2 0.2 0.5 0.5])
    confusionchart(trueLabels,predictedLabels, ...
        'ColumnSummary','column-normalized', ...
        'RowSummary','row-normalized', ...
        'Title',sprintf('Accuracy = %0.2f (%%)',100*mean(predictedLabels==trueLabels)))

    Оцените эффективность бэкэнда глубокого обучения

    Затем обучите полностью соединенную сеть с помощью i-векторов в качестве входа.

    ivectorsTrain = (ivector(wordRecognizer,adsTrain))';
    ivectorsValidation = (ivector(wordRecognizer,adsValidation))';

    Задайте полностью соединенную сеть.

    layers = [ ...
        featureInputLayer(size(ivectorsTrain,2),'Normalization',"none")
        fullyConnectedLayer(128)
        dropoutLayer(0.4)
        fullyConnectedLayer(256)
        dropoutLayer(0.4)
        fullyConnectedLayer(256)
        dropoutLayer(0.4)
        fullyConnectedLayer(128)
        dropoutLayer(0.4)
        fullyConnectedLayer(numel(unique(adsTrain.Labels)))
        softmaxLayer
        classificationLayer];

    Задайте учебные параметры.

    miniBatchSize = 256;
    validationFrequency = floor(numel(adsTrain.Labels)/miniBatchSize);
    options = trainingOptions("adam", ...
        "MaxEpochs",10, ...
        "MiniBatchSize",miniBatchSize, ...
        "Plots","training-progress", ...
        "Verbose",false, ...
        "Shuffle","every-epoch", ...
        "ValidationData",{ivectorsValidation,adsValidation.Labels}, ...
        "ValidationFrequency",validationFrequency);

    Обучите сеть.

    net = trainNetwork(ivectorsTrain,adsTrain.Labels,layers,options);

    Оцените эффективность бэкэнда глубокого обучения с помощью графика беспорядка.

    predictedLabels = classify(net,ivectorsValidation);
    trueLabels = adsValidation.Labels;
    
    figure('Units','normalized','Position',[0.2 0.2 0.5 0.5])
    confusionchart(trueLabels,predictedLabels, ...
        'ColumnSummary','column-normalized', ...
        'RowSummary','row-normalized', ...
        'Title',sprintf('Accuracy = %0.2f (%%)',100*mean(predictedLabels==trueLabels)))

    Оцените эффективность бэкэнда KNN

    Обучите и оцените i-векторы с бэкэндом k - ближайших соседей (KNN).

    Используйте fitcknn обучать модель KNN.

    classificationKNN = fitcknn(...
        ivectorsTrain, ...
        adsTrain.Labels, ...
        'Distance','Euclidean', ...
        'Exponent',[], ...
        'NumNeighbors',10, ...
        'DistanceWeight','SquaredInverse', ...
        'Standardize',true, ...
        'ClassNames',unique(adsTrain.Labels));

    Оцените бэкэнд KNN.

    predictedLabels = predict(classificationKNN,ivectorsValidation);
    trueLabels = adsValidation.Labels;
    
    figure('Units','normalized','Position',[0.2 0.2 0.5 0.5])
    confusionchart(trueLabels,predictedLabels, ...
        'ColumnSummary','column-normalized', ...
        'RowSummary','row-normalized', ...
        'Title',sprintf('Accuracy = %0.2f (%%)',100*mean(predictedLabels==trueLabels)))

    Ссылки

    [1] Якобовский. "Jakobovski/Free-Spoken-Digit-Dataset". GitHub, 30 мая 2019. https://github.com/Jakobovski/free-spoken-digit-dataset.

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

    свернуть все

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

    Данные, чтобы преобразовать в виде массива ячеек или как audioDatastore, signalDatastore, или TransformedDatastore объект.

    • Если InputType установлен в 'audio' когда система i-вектора будет создана, задайте data как один из них:

      • Вектор-столбец с базовым типом single или double.

      • Массив ячеек одноканальных звуковых сигналов, каждый заданный как вектор-столбец с базовым типом single или double.

      • audioDatastore возразите или signalDatastore возразите что точки против набора данных моно звуковых сигналов.

      • TransformedDatastore с базовым audioDatastore или signalDatastore это указывает на набор данных моно звуковых сигналов. Выход от вызовов до read от преобразования datastore должен быть моно звуковыми сигналами с базовым типом данных single или double.

    • Если InputType установлен в 'features' когда система i-вектора будет создана, задайте data как один из них:

      • Матрица A с базовым типом single или double. Матрица должна состоять из функций аудио, где количество функций (столбцы) заблокировано в первый раз trainExtractor называется и количество транзитных участков (строки) переменного размера. Количество входа функций в любых последующих вызовах любой из объектных функций должно быть равно количеству функций, использованных при вызове trainExtractor.

      • Массив ячеек матриц с базовым типом single или double. Матрицы должны состоять из функций аудио, где количество функций (столбцы) заблокировано в первый раз trainExtractor называется и количество транзитных участков (строки) переменного размера. Количество входа функций в любых последующих вызовах любой из объектных функций должно быть равно количеству функций, использованных при вызове trainExtractor.

      • TransformedDatastore объект с базовым audioDatastore или signalDatastore чей read функция вывела как описано в предыдущем маркере.

      • signalDatastore объект, чей read функция вывела как описано в первом маркере.

    Типы данных: cell | audioDatastore | signalDatastore

    Указывает, определили ли линейный дискриминантный анализ (LDA) и матрица проекции нормализации ковариации в классе (WCCN) использование trainClassifier применяется.

    • Если матрица проекции была обучена, то ApplyProjectionMatrix значения по умолчанию к true.

    • Если матрица проекции не была обучена, то ApplyProjectionMatrix значения по умолчанию к false и не может быть установлен в true.

    Типы данных: логический

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

    свернуть все

    Извлеченные i-векторы, возвращенные как вектор-столбец или матрица. Количество столбцов w равно количеству входных сигналов. Количество строк w размерность i-вектора.

    Введенный в R2021a