ivectorSystem

Создайте систему i-вектора

    Описание

    i-векторы являются компактными статистическими представлениями идентичности, извлеченной из звуковых сигналов. ivectorSystem создает обучаемую систему i-вектора, чтобы извлечь i-векторы и выполнить задачи классификации, такие как распознавание динамика, динамик diarization и звуковая классификация. Можно также определить пороги для открытых поставивших задач и зарегистрировать метки в систему и для классификации открытых и для замкнутых множеств.

    Создание

    Описание

    пример

    ivs = ivectorSystem создает систему i-вектора по умолчанию. Можно обучить систему i-вектора извлекать i-векторы и выполнять задачи классификации.

    пример

    ivs = ivectorSystem(Name,Value) задает свойства не по умолчанию для ivs использование одного или нескольких аргументов значения имени.

    Свойства

    развернуть все

    Введите тип в виде 'audio' или 'features'.

    • 'audio' – Система i-вектора принимает моно звуковые сигналы как вход. Аудиоданные обрабатываются, чтобы извлечь 20 mel частот cepstral коэффициенты (MFCCs), дельта MFCCs и дельта дельты MFCCs для 60 коэффициентов на систему координат.

      Если InputType установлен в 'audio' когда система i-вектора создается, обучающие данные могут быть:

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

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

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

    • 'features' – I-вектор принимает предварительно извлеченные функции аудио, как введено.

      Если InputType установлен в 'features' когда система i-вектора создается, обучающие данные могут быть:

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

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

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

    Пример: ivs = ivectorSystem('InputType','audio')

    Типы данных: char | string

    Частота дискретизации аудиовхода в Гц в виде положительной скалярной величины.

    Примечание

    'SampleRate' свойство только применяется когда 'InputType' установлен в 'audio'.

    Пример: ivs = ivectorSystem('InputType','audio','SampleRate',48000)

    Типы данных: single | double

    Примените речевое обнаружение в виде true или false. С 'DetectSpeech' установите на true, системные извлечения i-вектора показывают только из областей, где речь обнаруживается.

    Примечание

    DetectSpeech свойство только применяется когда InputType установлен в 'audio'.

    ivectorSystem использует detectSpeech функция, чтобы обнаружить области речи.

    Пример: ivs = ivectorSystem('InputType','audio','DetectSpeech',true)

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

    Это свойство доступно только для чтения.

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

    • Использование enroll зарегистрировать новые метки или обновить существующие метки.

    • Использование unenroll удалить метки из системы.

    Типы данных: table

    Функции объекта

    trainExtractorОбучите экстрактор i-вектора
    trainClassifierОбучите классификатор i-вектора
    enrollЗарегистрируйте метки
    unenrollНе зарегистрируйте метки
    detectionErrorTradeoffОцените бинарную систему классификации
    verifyМетка Verify
    identifyМетка Identify
    ivectorИзвлеките i-вектор
    infoВозвратите учебную настройку и информацию о данных
    releaseПозвольте значения свойств и введите характеристики, чтобы измениться

    Примеры

    свернуть все

    Используйте Базу данных Отслеживания Тангажа из Технологического университета Граца (PTDB-TUG) [1]. Набор данных состоит из 20 английских носителей языка, читающих 2 342 фонетически богатых предложения из корпуса TIMIT. Загрузите и извлеките набор данных. В зависимости от вашей системы, загружая и извлекая набор данных может занять приблизительно 1,5 часа.

    url = 'https://www2.spsc.tugraz.at/databases/PTDB-TUG/SPEECH_DATA_ZIPPED.zip';
    downloadFolder = tempdir;
    datasetFolder = fullfile(downloadFolder,'PTDB-TUG');
    
    if ~exist(datasetFolder,'dir')
        disp('Downloading PTDB-TUG (3.9 G) ...')
        unzip(url,datasetFolder)
    end

    Создайте audioDatastore возразите что точки против набора данных. Набор данных был первоначально предназначен для использования в отслеживающем тангаж обучении и оценке и включает показания ларингографика и базовые решения тангажа. Используйте только исходные аудиозаписи.

    ads = audioDatastore([fullfile(datasetFolder,"SPEECH DATA","FEMALE","MIC"),fullfile(datasetFolder,"SPEECH DATA","MALE","MIC")], ...
                         'IncludeSubfolders',true, ...
                         'FileExtensions','.wav');

    Имена файлов содержат идентификаторы динамика. Декодируйте имена файлов, чтобы установить метки в audioDatastore объект.

    ads.Labels = extractBetween(ads.Files,'mic_','_');
    countEachLabel(ads)
    ans=20×2 table
        Label    Count
        _____    _____
    
         F01      236 
         F02      236 
         F03      236 
         F04      236 
         F05      236 
         F06      236 
         F07      236 
         F08      234 
         F09      236 
         F10      236 
         M01      236 
         M02      236 
         M03      236 
         M04      236 
         M05      236 
         M06      236 
          ⋮
    
    

    Считайте звуковой файл из набора данных, слушайте его и постройте его.

    [audioIn,audioInfo] = read(ads);
    fs = audioInfo.SampleRate;
    
    t = (0:size(audioIn,1)-1)/fs;
    sound(audioIn,fs)
    plot(t,audioIn)
    xlabel('Time (s)')
    ylabel('Amplitude')
    axis([0 t(end) -1 1])
    title('Sample Utterance from Data Set')

    Разделите audioDatastore объект в четыре: один для обучения, один для приема, один, чтобы оценить компромисс ошибки обнаружения, и один для тестирования. Набор обучающих данных содержит 16 динамиков. Прием, компромисс ошибки обнаружения и наборы тестов содержат другие четыре динамика.

    speakersToTest = categorical(["M01","M05","F01","F05"]);
    
    adsTrain = subset(ads,~ismember(ads.Labels,speakersToTest));
    
    ads = subset(ads,ismember(ads.Labels,speakersToTest));
    [adsEnroll,adsTest,adsDET] = splitEachLabel(ads,3,1);

    Отобразите распределения метки audioDatastore объекты.

    countEachLabel(adsTrain)
    ans=16×2 table
        Label    Count
        _____    _____
    
         F02      236 
         F03      236 
         F04      236 
         F06      236 
         F07      236 
         F08      234 
         F09      236 
         F10      236 
         M02      236 
         M03      236 
         M04      236 
         M06      236 
         M07      236 
         M08      236 
         M09      236 
         M10      236 
    
    
    countEachLabel(adsEnroll)
    ans=4×2 table
        Label    Count
        _____    _____
    
         F01       3  
         F05       3  
         M01       3  
         M05       3  
    
    
    countEachLabel(adsTest)
    ans=4×2 table
        Label    Count
        _____    _____
    
         F01       1  
         F05       1  
         M01       1  
         M05       1  
    
    
    countEachLabel(adsDET)
    ans=4×2 table
        Label    Count
        _____    _____
    
         F01      232 
         F05      232 
         M01      232 
         M05      232 
    
    

    Создайте систему i-вектора. По умолчанию система i-вектора принимает, что вход к системе является моно звуковыми сигналами.

    speakerVerification = ivectorSystem('SampleRate',fs)
    speakerVerification = 
      ivectorSystem with properties:
    
             InputType: 'audio'
            SampleRate: 48000
          DetectSpeech: 1
        EnrolledLabels: [0×2 table]
    
    

    Чтобы обучить экстрактор системы i-вектора, вызовите trainExtractor. Задайте количество компонентов универсальной фоновой модели (UBM) как 128 и количество итераций максимизации ожидания как 5. Задайте ранг общего пробела изменчивости (TVS) как 64 и количество итераций как 3.

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

    Чтобы обучить классификатор системы i-вектора, используйте trainClassifier. Чтобы уменьшать размерность i-векторов, задайте количество собственных векторов в матрице проекции как 16. Задайте количество размерностей в модели вероятностного линейного дискриминантного анализа (PLDA) как 16 и количество итераций как 3.

    trainClassifier(speakerVerification,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.
    

    Смотреть параметры раньше ранее обучало систему i-вектора, использовало info.

    info(speakerVerification)
    i-vector system input
      Input feature vector length: 60
      Input data type: double
    
    trainExtractor
      Train signals: 3774
      UBMNumComponents: 128
      UBMNumIterations: 5
      TVSRank: 64
      TVSNumIterations: 3
    
    trainClassifier
      Train signals: 3774
      Train labels: F02 (236), F03 (236) ... and 14 more
      NumEigenvectors: 16
      PLDANumDimensions: 16
      PLDANumIterations: 3
    

    Разделите набор приема.

    [adsEnrollPart1,adsEnrollPart2] = splitEachLabel(adsEnroll,1,2);

    Чтобы зарегистрировать докладчиков в системе i-вектора, вызовите enroll.

    enroll(speakerVerification,adsEnrollPart1,adsEnrollPart1.Labels)
    Extracting i-vectors ...done.
    Enrolling i-vectors .......done.
    Enrollment complete.
    

    Когда вы регистрируете докладчиков, EnrolledLabels только для чтения свойство обновляется с зарегистрированными метками и соответствующими i-векторами шаблона. Таблица также отслеживает количество сигналов, используемых, чтобы создать i-вектор шаблона. Обычно использование большего количества сигналов приводит к лучшему шаблону.

    speakerVerification.EnrolledLabels
    ans=4×2 table
                  ivector       NumSamples
               _____________    __________
    
        F01    {16×1 double}        1     
        F05    {16×1 double}        1     
        M01    {16×1 double}        1     
        M05    {16×1 double}        1     
    
    

    Зарегистрируйте вторую часть набора приема и затем просмотрите зарегистрированную таблицу меток снова. Шаблоны i-вектора и количество выборок обновляются.

    enroll(speakerVerification,adsEnrollPart2,adsEnrollPart2.Labels)
    Extracting i-vectors ...done.
    Enrolling i-vectors .......done.
    Enrollment complete.
    
    speakerVerification.EnrolledLabels
    ans=4×2 table
                  ivector       NumSamples
               _____________    __________
    
        F01    {16×1 double}        3     
        F05    {16×1 double}        3     
        M01    {16×1 double}        3     
        M05    {16×1 double}        3     
    
    

    Чтобы оценить систему i-вектора и определить порог решения для верификации динамика, вызовите detectionErrorTradeoff.

    [results, eerThreshold] = detectionErrorTradeoff(speakerVerification,adsDET,adsDET.Labels);
    Extracting i-vectors ...done.
    Scoring i-vector pairs ...done.
    Detection error tradeoff evaluation complete.
    

    Первый выход от detectionErrorTradeoff структура с двумя полями: CSS и PLDA. Каждое поле содержит таблицу. Каждая строка таблицы содержит возможный порог решения для задач верификации динамика, и соответствующий ложный сигнальный уровень (FAR) и ложный уровень отклонения (FRR). FAR и FRR определяются с помощью зарегистрированных марок докладчика и ввода данных к detectionErrorTradeoff функция.

    results
    results = struct with fields:
        PLDA: [1000×3 table]
         CSS: [1000×3 table]
    
    
    results.CSS
    ans=1000×3 table
        Threshold      FAR      FRR
        _________    _______    ___
    
         0.25324           1     0 
         0.25398     0.99964     0 
         0.25472     0.99964     0 
         0.25546     0.99928     0 
          0.2562     0.99928     0 
         0.25694     0.99928     0 
         0.25768     0.99928     0 
         0.25842     0.99928     0 
         0.25916     0.99928     0 
         0.25991     0.99928     0 
         0.26065     0.99928     0 
         0.26139     0.99928     0 
         0.26213     0.99928     0 
         0.26287     0.99928     0 
         0.26361     0.99928     0 
         0.26435     0.99928     0 
          ⋮
    
    
    results.PLDA
    ans=1000×3 table
        Threshold    FAR      FRR  
        _________    ___    _______
    
         -11.389      0     0.99892
         -11.124      0     0.99892
         -10.858      0     0.99892
         -10.593      0     0.99892
         -10.327      0     0.99892
         -10.061      0     0.99784
         -9.7958      0     0.99784
         -9.5303      0     0.99784
         -9.2647      0     0.99784
         -8.9991      0     0.99784
         -8.7335      0     0.99784
         -8.4679      0     0.99784
         -8.2023      0     0.99784
         -7.9367      0     0.99569
         -7.6712      0     0.99353
         -7.4056      0     0.99353
          ⋮
    
    

    Второй выход от detectionErrorTradeoff структура с двумя полями: CSS и PLDA. Соответствующее значение является порогом решения, который приводит к равному коэффициенту ошибок (когда FAR и FRR равны).

    eerThreshold
    eerThreshold = struct with fields:
        PLDA: 30.3075
         CSS: 0.8682
    
    

    В первый раз вы вызываете detectionErrorTradeoff, необходимо обеспечить данные и соответствующие метки, чтобы оценить. Впоследствии, можно получить ту же информацию или различный анализ с помощью тех же базовых данных, путем вызова detectionErrorTradeoff без данных и меток.

    Вызовите detectionErrorTradeoff во второй раз без аргументов данных или выходных аргументов, чтобы визуализировать компромисс ошибки обнаружения.

    detectionErrorTradeoff(speakerVerification)

    Вызовите detectionErrorTradeoff снова. На этот раз визуализируйте только компромисс ошибки обнаружения для маркера PLDA.

    detectionErrorTradeoff(speakerVerification,'Scorer',"plda")

    В зависимости от вашего приложения можно хотеть использовать порог, который взвешивает ошибочную стоимость ложного предупреждения выше или ниже, чем ошибочная стоимость ложного отклонения. Можно также использовать данные, которые не являются представительными для априорной вероятности динамика, присутствующего. Можно использовать minDCF параметр, чтобы задать пользовательские затраты и априорную вероятность. Вызовите detectionErrorTradeoff снова, на этот раз задайте стоимость ложного отклонения как 1, стоимость ложного принятия как 2, и априорная вероятность, что динамик присутствует как 0,1.

    costFR = 1;
    costFA = 2;
    priorProb = 0.1;
    detectionErrorTradeoff(speakerVerification,'Scorer',"plda",'minDCF',[costFR,costFA,priorProb])

    Вызовите detectionErrorTradeoff снова. На этот раз получите minDCF порог для маркера PLDA и параметров функции стоимости обнаружения.

    [~,minDCFThreshold] = detectionErrorTradeoff(speakerVerification,'Scorer',"plda",'minDCF',[costFR,costFA,priorProb])
    minDCFThreshold = 22.3400
    

    Протестируйте систему верификации динамика

    Считайте сигнал из набора тестов.

    adsTest = shuffle(adsTest);
    [audioIn,audioInfo] = read(adsTest);
    knownSpeakerID = audioInfo.Label
    knownSpeakerID = 1×1 cell array
        {'F01'}
    
    

    Чтобы выполнить верификацию динамика, вызовите verify со звуковым сигналом и задают ID динамика, маркер и порог для маркера. verify функция возвращает логическое значение, указывающее, принята ли идентичность динамика или отклонена, и счет, указывающий на подобие входного аудио и i-вектора шаблона, соответствующего зарегистрированной метке.

    [tf,score] = verify(speakerVerification,audioIn,knownSpeakerID,"plda",eerThreshold.PLDA);
    if tf
        fprintf('Success!\nSpeaker accepted.\nSimilarity score = %0.2f\n\n',score)
    else
        fprinf('Failure!\nSpeaker rejected.\nSimilarity score = %0.2f\n\n',score)
    end
    Success!
    Speaker accepted.
    Similarity score = 0.97
    

    Вызовите верификацию динамика снова. На этот раз задайте неправильный ID динамика.

    possibleSpeakers = speakerVerification.EnrolledLabels.Properties.RowNames;
    imposterIdx = find(~ismember(possibleSpeakers,knownSpeakerID));
    imposter = possibleSpeakers(imposterIdx(randperm(numel(imposterIdx),1)))
    imposter = 1×1 cell array
        {'M05'}
    
    
    [tf,score] = verify(speakerVerification,audioIn,imposter,"plda",eerThreshold.PLDA);
    if tf
        fprintf('Failure!\nSpeaker accepted.\nSimilarity score = %0.2f\n\n',score)
    else
        fprintf('Success!\nSpeaker rejected.\nSimilarity score = %0.2f\n\n',score)
    end
    Success!
    Speaker rejected.
    Similarity score = 0.48
    

    Ссылки

    [1] Обработка сигналов и Речевая Коммуникационная Лаборатория. https://www.spsc.tugraz.at/databases-and-tools/ptdb-tug-pitch-tracking-database-from-graz-university-of-technology.html. Полученный доступ 12 декабря 2019.

    Используйте Базу данных переписи (также известный как Базу данных AN4) от CMU Robust Speech Recognition Group [1]. Набор данных содержит записи участников эксперимента и участниц эксперимента, произносящих слова и числа. Функция помощника в этом примере загружает набор данных для вас и преобразует необработанные файлы в FLAC и возвращает два audioDatastore объекты, содержащие набор обучающих данных и набор тестов. По умолчанию набор данных уменьшается так, чтобы пример запустился быстро. Можно использовать полный набор данных установкой ReduceDataset ко лжи.

    [adsTrain,adsTest] = HelperAN4Download('ReduceDataset',true);

    Разделите набор тестовых данных в регистрируются и наборы тестов. Используйте два произнесения для приема и остающееся для набора тестов. Обычно, чем больше произнесения вы используете для приема, тем лучше эффективность системы. Однако наиболее практические применения ограничиваются маленьким набором произнесения приема.

    [adsEnroll,adsTest] = splitEachLabel(adsTest,2);

    Смотрите распределение динамиков в обучении, тесте, и зарегистрируйте наборы. Докладчики в наборе обучающих данных не перекрываются с динамиками в тесте и регистрируют наборы.

    summary(adsTrain.Labels)
         fejs      13 
         fmjd      13 
         fsrb      13 
         ftmj      13 
         fwxs      12 
         mcen      13 
         mrcb      13 
         msjm      13 
         msjr      13 
         msmn       9 
    
    summary(adsEnroll.Labels)
         fvap      2 
         marh      2 
    
    summary(adsTest.Labels)
         fvap      11 
         marh      11 
    

    Создайте систему i-вектора, которая принимает вход функции.

    fs = 16e3;
    iv = ivectorSystem('SampleRate',fs,'InputType','features');

    Создайте audioFeatureExtractor возразите, чтобы извлечь gammatone cepstral коэффициенты (GTCC), дельта GTCC, дельта дельты GTCC и тангаж из периодических окон Hann на 50 мс с перекрытием на 45 мс.

    afe = audioFeatureExtractor('gtcc',true,'gtccDelta',true,'gtccDeltaDelta',true,'pitch',true,'SampleRate',fs);
    afe.Window = hann(round(0.05*fs),'periodic');
    afe.OverlapLength = round(0.045*fs);
    afe
    afe = 
      audioFeatureExtractor with properties:
    
       Properties
                         Window: [800×1 double]
                  OverlapLength: 720
                     SampleRate: 16000
                      FFTLength: []
        SpectralDescriptorInput: 'linearSpectrum'
    
       Enabled Features
         gtcc, gtccDelta, gtccDeltaDelta, pitch
    
       Disabled Features
         linearSpectrum, melSpectrum, barkSpectrum, erbSpectrum, mfcc, mfccDelta
         mfccDeltaDelta, spectralCentroid, spectralCrest, spectralDecrease, spectralEntropy, spectralFlatness
         spectralFlux, spectralKurtosis, spectralRolloffPoint, spectralSkewness, spectralSlope, spectralSpread
         harmonicRatio
    
    
       To extract a feature, set the corresponding property to true.
       For example, obj.mfcc = true, adds mfcc to the list of enabled features.
    
    

    Создайте преобразованные хранилища данных путем добавления извлечения признаков в read функция adsTrain и adsEnroll.

    trainLabels = adsTrain.Labels;
    adsTrain = transform(adsTrain,@(x)extract(afe,x));
    enrollLabels = adsEnroll.Labels;
    adsEnroll = transform(adsEnroll,@(x)extract(afe,x));

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

    trainExtractor(iv,adsTrain, ...
        'UBMNumComponents',64, ...
        'UBMNumIterations',5, ...
        'TVSRank',32, ...
        'TVSNumIterations',3);
    Calculating standardization factors ....done.
    Training universal background model ........done.
    Training total variability space ...done.
    i-vector extractor training complete.
    
    trainClassifier(iv,adsTrain,trainLabels, ...
        'NumEigenvectors',16, ...
        ...
        "PLDANumDimensions",16, ...
        "PLDANumIterations",5);
    Extracting i-vectors ...done.
    Training projection matrix .....done.
    Training PLDA model ........done.
    i-vector classifier training complete.
    

    Зарегистрируйте докладчиков от набора приема.

    enroll(iv,adsEnroll,enrollLabels)
    Extracting i-vectors ...done.
    Enrolling i-vectors .....done.
    Enrollment complete.
    

    Оцените точность предсказания уровня файла на наборе тестов.

    numCorrect = 0;
    reset(adsTest)
    for index = 1:numel(adsTest.Files)
        features = extract(afe,read(adsTest));
        
        results = identify(iv,features,'plda');
        
        trueLabel = adsTest.Labels(index);
        predictedLabel = results.Label(1);
        isPredictionCorrect = trueLabel==predictedLabel;
        
        numCorrect = numCorrect + isPredictionCorrect;
    end
    fprintf('File Accuracy: %0.2f percent\n', 100*numCorrect/numel(adsTest.Files))
    File Accuracy: 100.00 percent
    

    Ссылки

    [1] "CMU Sphinx Group - Аудио Базы данных". http://www.speech.cs.cmu.edu/databases/an4/. Полученный доступ 19 декабря 2019.

    Загрузите и разархивируйте набор данных классификации звуков среды. Этот набор данных состоит из записей, помеченных как один из 10 различных аудио звуковых классов (ESC-10).

    url = 'http://ssd.mathworks.com/supportfiles/audio/ESC-10.zip';
    
    downloadFolder = tempdir;
    datasetFolder = fullfile(downloadFolder,'ESC-10');
    
    if ~exist(datasetFolder,'dir')
        disp('Downloading ESC-10 ...')
        unzip(url,downloadFolder)
    end

    Создайте audioDatastore объект управлять данными и разделить его в наборы обучения и валидации. Вызовите countEachLabel отобразить распределение звуковых классов и количество уникальных меток.

    ads = audioDatastore(datasetFolder,'IncludeSubfolders',true,'LabelSource','foldernames');
    countEachLabel(ads)
    ans=10×2 table
            Label         Count
        ______________    _____
    
        chainsaw           40  
        clock_tick         40  
        crackling_fire     40  
        crying_baby        40  
        dog                40  
        helicopter         40  
        rain               40  
        rooster            38  
        sea_waves          40  
        sneezing           40  
    
    

    Слушайте один из файлов.

    [audioIn,audioInfo] = read(ads);
    fs = audioInfo.SampleRate;
    sound(audioIn,fs)
    audioInfo.Label
    ans = categorical
         chainsaw 
    
    

    Разделите datastore в наборы обучающих данных и наборы тестов.

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

    Создайте audioFeatureExtractor извлекать все возможные функции из аудио.

    afe = audioFeatureExtractor('SampleRate',fs, ...
        'Window',hamming(round(0.03*fs),'periodic'), ...
        'OverlapLength',round(0.02*fs));
    params = info(afe,'all');
    params = structfun(@(x)true,params,'UniformOutput',false);
    set(afe,params);
    afe
    afe = 
      audioFeatureExtractor with properties:
    
       Properties
                         Window: [1323×1 double]
                  OverlapLength: 882
                     SampleRate: 44100
                      FFTLength: []
        SpectralDescriptorInput: 'linearSpectrum'
    
       Enabled Features
         linearSpectrum, melSpectrum, barkSpectrum, erbSpectrum, mfcc, mfccDelta
         mfccDeltaDelta, gtcc, gtccDelta, gtccDeltaDelta, spectralCentroid, spectralCrest
         spectralDecrease, spectralEntropy, spectralFlatness, spectralFlux, spectralKurtosis, spectralRolloffPoint
         spectralSkewness, spectralSlope, spectralSpread, pitch, harmonicRatio
    
       Disabled Features
         none
    
    
       To extract a feature, set the corresponding property to true.
       For example, obj.mfcc = true, adds mfcc to the list of enabled features.
    
    

    Создайте две директории в своей текущей папке: обучите и протестируйте. Извлеките функции из и обучение и наборы тестовых данных и запишите функции как файлы MAT к соответствующим директориям. Предварительное извлечение функций может сэкономить время, когда это необходимо, чтобы оценить различные комбинации функции или учебные настройки.

    mkdir('train')
    mkdir('test')
    
    outputType = ".mat";
    writeall(adsTrain,'train','WriteFcn',@(x,y,z)writeFeatures(x,y,z,afe))
    writeall(adsTest,'test','WriteFcn',@(x,y,z)writeFeatures(x,y,z,afe))

    Создайте хранилища данных сигнала, чтобы указать на функции аудио.

    sdsTrain = signalDatastore('train','IncludeSubfolders',true);
    sdsTest = signalDatastore('train','IncludeSubfolders',true);

    Создайте массивы метки, которые находятся в том же порядке как signalDatastore файлы.

    labelsTrain = categorical(extractBetween(sdsTrain.Files,'ESC-10\','\'));
    labelsTest = categorical(extractBetween(sdsTest.Files,'ESC-10\','\'));

    Создайте datastore преобразования из хранилищ данных сигнала, чтобы изолировать и использовать только желаемые функции. Можно использовать выход от info на audioFeatureExtractor сопоставлять ваши выбранные признаки с индексом в матрице функций. Можно экспериментировать с примером путем выбирания различных признаков.

    featureIndices = info(afe)
    featureIndices = struct with fields:
              linearSpectrum: [1×662 double]
                 melSpectrum: [663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694]
                barkSpectrum: [695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726]
                 erbSpectrum: [727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769]
                        mfcc: [770 771 772 773 774 775 776 777 778 779 780 781 782]
                   mfccDelta: [783 784 785 786 787 788 789 790 791 792 793 794 795]
              mfccDeltaDelta: [796 797 798 799 800 801 802 803 804 805 806 807 808]
                        gtcc: [809 810 811 812 813 814 815 816 817 818 819 820 821]
                   gtccDelta: [822 823 824 825 826 827 828 829 830 831 832 833 834]
              gtccDeltaDelta: [835 836 837 838 839 840 841 842 843 844 845 846 847]
            spectralCentroid: 848
               spectralCrest: 849
            spectralDecrease: 850
             spectralEntropy: 851
            spectralFlatness: 852
                spectralFlux: 853
            spectralKurtosis: 854
        spectralRolloffPoint: 855
            spectralSkewness: 856
               spectralSlope: 857
              spectralSpread: 858
                       pitch: 859
               harmonicRatio: 860
    
    
    idxToUse = [featureIndices.harmonicRatio, ...
        featureIndices.spectralRolloffPoint, ...
        featureIndices.spectralFlux, ...
        featureIndices.spectralSlope];
    tdsTrain = transform(sdsTrain,@(x)x(:,idxToUse));
    tdsTest = transform(sdsTest,@(x)x(:,idxToUse));

    Создайте систему i-вектора, которая принимает вход функции.

    soundClassifier = ivectorSystem("InputType",'features');

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

    trainExtractor(soundClassifier,tdsTrain,'UBMNumComponents',200,'TVSRank',150);
    Calculating standardization factors ....done.
    Training universal background model .....done.
    Training total variability space ...done.
    i-vector extractor training complete.
    
    trainClassifier(soundClassifier,tdsTrain,labelsTrain,'NumEigenvectors',50,'PLDANumDimensions',50)
    Extracting i-vectors ...done.
    Training projection matrix .....done.
    Training PLDA model ........done.
    i-vector classifier training complete.
    

    Зарегистрируйте метки от набора обучающих данных, чтобы создать шаблоны i-вектора для каждого из экологических звуков.

    enroll(soundClassifier,tdsTrain,labelsTrain)
    Extracting i-vectors ...done.
    Enrolling i-vectors .............done.
    Enrollment complete.
    

    Используйте identify функция на наборе тестов, чтобы возвратить выведенную метку системы.

    reset(tdsTest)
    inferredLabels = labelsTest;
    inferredLabels(:) = inferredLabels(1);
    scorer = "css";
    for ii = 1:numel (labelsTest)
        функции = читают (tdsTest);
        tableOut = идентифицируют (soundClassifier, функции, маркер,'NumCandidates',1);
        inferredLabels (ii) = tableOut.Label (1);
    end

    Создайте матрицу беспорядка, чтобы визуализировать эффективность на наборе тестов.

    uniqueLabels = unique(labelsTest);
    cm = zeros(numel(uniqueLabels));
    for ii = 1:numel(uniqueLabels)
        for jj = 1:numel(uniqueLabels)
            cm(ii,jj) = sum((labelsTest==uniqueLabels(ii)) & (inferredLabels==uniqueLabels(jj)));
        end
    end
    labelStrings = replace(string(uniqueLabels),"_"," ");
    heatmap(labelStrings,labelStrings,cm)
    colorbar off
    ylabel('True Labels')
    xlabel('Predicted Labels')
    accuracy = mean(inferredLabels==labelsTest);
    title(sprintf("Accuracy = %0.2f %%",accuracy*100))

    Выпустите систему i-вектора.

    release(soundClassifier)

    Вспомогательные Функции

    function writeFeatures(audioIn,info,~,afe)
        % Extract features
        features = extract(afe,audioIn);
    
        % Replace the file extension of the suggested output name with MAT.
        filename = strrep(info.SuggestedOutputName,".wav",'.mat');
    
        % Save the MFCC coefficients to the MAT file.
        save(filename,"features")
    end

    Загрузите и разархивируйте воздушный набор данных компрессора [1]. Этот набор данных состоит из записей от воздушных компрессоров в здоровом состоянии или одном из семи дефектных состояний.

    url = 'https://www.mathworks.com/supportfiles/audio/AirCompressorDataset/AirCompressorDataset.zip';
    downloadFolder = fullfile(tempdir,'aircompressordataset');
    datasetLocation = tempdir;
    
    if ~exist(fullfile(tempdir,'AirCompressorDataSet'),'dir')
        loc = websave(downloadFolder,url);
        unzip(loc,fullfile(tempdir,'AirCompressorDataSet'))
    end

    Создайте audioDatastore объект управлять данными и разделить его в наборы обучения и валидации.

    ads = audioDatastore(downloadFolder,'IncludeSubfolders',true,'LabelSource','foldernames');
    
    [adsTrain,adsTest] = splitEachLabel(ads,0.8,0.2);

    Считайте звуковой файл из datastore и сохраните частоту дискретизации. Слушайте звуковой сигнал и постройте сигнал во временном интервале.

    [x,fileInfo] = read(adsTrain);
    fs = fileInfo.SampleRate;
    
    sound(x,fs)
    
    t = (0:size(x,1)-1)/fs;
    plot(t,x)
    xlabel('Time (s)')
    title('State = ' + string(fileInfo.Label))
    axis tight

    Создайте систему i-вектора с DetectSpeech установите на false.

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

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

    trainExtractor(faultRecognizer,adsTrain)
    Calculating standardization factors ....done.
    Training universal background model .....done.
    Training total variability space ...done.
    i-vector extractor training complete.
    
    trainClassifier(faultRecognizer,adsTrain,adsTrain.Labels)
    Extracting i-vectors ...done.
    Training projection matrix .....done.
    Training PLDA model ........done.
    i-vector classifier training complete.
    

    Зарегистрируйте все метки от набора обучающих данных. Используйте свойство EnrolledLabels только для чтения просмотреть зарегистрированные метки и соответствующие шаблоны i-вектора.

    enroll(faultRecognizer,adsTrain,adsTrain.Labels)
    Extracting i-vectors ...done.
    Enrolling i-vectors ...........done.
    Enrollment complete.
    
    faultRecognizer.EnrolledLabels
    ans=8×2 table
                        ivector       NumSamples
                     _____________    __________
    
        Bearing      {16×1 double}       180    
        Flywheel     {16×1 double}       180    
        Healthy      {16×1 double}       180    
        LIV          {16×1 double}       180    
        LOV          {16×1 double}       180    
        NRV          {16×1 double}       180    
        Piston       {16×1 double}       180    
        Riderbelt    {16×1 double}       180    
    
    

    Используйте identify функция с маркером PLDA, чтобы предсказать условие машин в наборе тестов. identify функция возвращает таблицу возможных меток, отсортированных в порядке убывания доверия. Метрика доверия нормирована через количество возвращенных меток.

    [audioIn,audioInfo] = read(adsTest);
    trueLabel = audioInfo.Label
    trueLabel = categorical
         Bearing 
    
    
    predictedLabels = identify(faultRecognizer,audioIn,"plda")
    predictedLabels=8×2 table
          Label       Score  
        _________    ________
    
        Bearing       0.19328
        Flywheel      0.16975
        Piston         0.1468
        LIV           0.13167
        Riderbelt      0.1232
        LOV           0.10861
        NRV           0.10736
        Healthy      0.019328
    
    

    По умолчанию, identify функция возвращает все возможные марки кандидата и их соответствующие баллы. Используйте NumCandidates сокращать количество возвращенных кандидатов.

    results = identify(faultRecognizer,audioIn,"plda",'NumCandidates',3)
    results=3×2 table
         Label       Score 
        ________    _______
    
        Bearing     0.37912
        Flywheel    0.33295
        Piston      0.28794
    
    

    Ссылки

    [1] Verma, Нищел К., и др. “Интеллектуальный основанный на условии Контроль Используя Акустические Сигналы для Воздушных Компрессоров”. Транзакции IEEE на Надежности, издании 65, № 1, март 2016, стр 291–309. DOI.org (Crossref), doi:10.1109/TR.2015.2459684.

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

    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 (набор тестов)
        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: 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 (набор тестов)
        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 = "css";
    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));
    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-вектора состоит из обучаемого фронтэнда, который изучает, как извлечь 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.

    Ссылки

    [1] Рейнольдс, Дуглас А., и др. “Верификация динамика Используя Адаптированные смешанные гауссовские модели”. Цифровая обработка сигналов, издание 10, № 1-3, январь 2000, стр 19–41. DOI.org (Crossref), doi:10.1006/dspr.1999.0361.

    [2] Кенни, Патрик, и др. “Объединенный Факторный анализ По сравнению с Eigenchannels в Распознавании Динамика”. Транзакции IEEE на Аудио, Речи и Обработке Языка, издании 15, № 4, май 2007, стр 1435–47. DOI.org (Crossref), doi:10.1109/TASL.2006.881693.

    [3] Кенни, P., и др. “Исследование Изменчивости Междинамика в Верификации Динамика”. Транзакции IEEE на Аудио, Речи, и Обработке Языка, издании 16, № 5, июль 2008, стр 980–88. DOI.org (Crossref), doi:10.1109/TASL.2008.925147.

    [4] Dehak, Najim, и др. “Выйдите напрямую Факторный анализ для Верификации Динамика”. Транзакции IEEE на Аудио, Речи, и Обработке Языка, издании 19, № 4, май 2011, стр 788–98. DOI.org (Crossref), doi:10.1109/TASL.2010.2064307.

    [5] Matejka, Павел, Ondrej Glembek, Фабио Кастальдо, M.j. Алам, Oldrich Plchot, Патрик Кенни, Лукаш Бургет и Ян Серноки. “Full-Covariance UBM и PLDA с тяжелым хвостом в Верификации Динамика i-вектора”. 2 011 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP), 2011. https://doi.org/10.1109/icassp.2011.5947436.

    [6] Снайдер, Дэвид, и др. “X-векторы: Устойчивые Вложения DNN для Распознавания Динамика”. 2 018 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP), IEEE, 2018, стр 5329–33. DOI.org (Crossref), doi:10.1109/ICASSP.2018.8461375.

    [7] Обработка сигналов и Речевая Коммуникационная Лаборатория. Полученный доступ 12 декабря 2019. https://www.spsc.tugraz.at/databases-and-tools/ptdb-tug-pitch-tracking-database-from-graz-university-of-technology.html.

    [8] Variani, Эхсан, и др. “Глубокие нейронные сети для Маленькой Верификации Динамика Текстового Зависимого Места”. 2 014 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP), IEEE, 2014, стр 4052–56. DOI.org (Crossref), doi:10.1109/ICASSP.2014.6854363.

    [9] Dehak, Najim, Réda Dehak, Джеймс Р. Стекло, Дуглас А. Рейнольдс и Патрик Кенни. “Подобие косинуса, выигрывающее без методов нормализации счета”. Одиссея (2010).

    [10] Verma, Pulkit и Прэдип К. Дас. “I-векторы в Речевых Приложениях обработки: Обзор”. Международный журнал Речевой Технологии, издания 18, № 4, декабрь 2015, стр 529–46. DOI.org (Crossref), doi:10.1007/s10772-015-9295-3.

    [11] Д. Гарсия-Ромеро и К. замечать-Вильсон, “Анализ Нормализации I-длины-вектора в Системах Распознавания Динамика”. Межречь, 2011, стр 249–252.

    [12] Кенни, Патрик. "Байесова верификация динамика с уголовным прошлым с тяжелым хвостом". Одиссея 2010 - семинар распознавания динамика и языка, Брно, Чешская Республика, 2010.

    [13] Сизов, Александр, Кун Айк Ли и Томи Киннунен. “Объединяя Вероятностные Варианты Линейного дискриминантного анализа в Биометрической Аутентификации”. Читайте лекции Примечаниям в Информатике Структурное, Синтаксическое, и Статистическое Распознавание образов, 2014, 464–75. https://doi.org/10.1007/978-3-662-44415-3_47.

    [14] Раджан, Padmanabhan, Антон Афанасьев, Ville Hautamäki и Tomi Kinnunen. 2014. “От Одного до Нескольких I-векторов Приема: Практический PLDA Выигрыш Вариантов для Верификации Динамика”. Цифровая обработка сигналов 31 (август): 93–101. https://doi.org/10.1016/j.dsp.2014.05.001.

    Введенный в R2021a