exponenta event banner

ivectorSystem

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

    Описание

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

    Создание

    Описание

    пример

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

    пример

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

    Свойства

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

    Тип ввода, указанный как 'audio' или 'features'.

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

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

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

      • Один audioDatastore объект или signalDatastore объект, который указывает на набор данных монозвуковых сигналов.

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

    • 'features' - i-вектор принимает предварительно извлеченные звуковые характеристики в качестве входных данных.

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

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

      • A TransformedDatastore объект с нижележащим audioDatastore или signalDatastore чей read имеет вывод, как описано в предыдущем маркере.

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

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

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

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

    Примечание

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

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

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

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

    Примечание

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

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

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

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

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

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

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

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

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

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

    trainExtractorЭкстрактор i-вектора поезда
    trainClassifierКлассификатор i-вектора поезда
    enrollРегистрация наклеек
    unenrollОтменить регистрацию наклеек
    detectionErrorTradeoffОценка бинарной системы классификации
    verifyПроверить метку
    identifyИдентификация метки
    ivectorИзвлечь i-вектор
    infoВернуться к конфигурации обучения и информации о данных
    releaseРазрешить изменение значений свойств и входных характеристик

    Примеры

    свернуть все

    Используйте базу данных отслеживания основного тона Грацского технологического университета (PTDB-TUG) [1]. Набор данных состоит из 20 англоязычных носителей, читающих 2342 фонетически насыщенных предложения из корпуса 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. Укажите 128 компонентов универсальной фоновой модели (UBM) и 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-vector вызовите 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 с помощью звукового сигнала и указать идентификатор громкоговорителя, бомбардир и порог для бомбардира. 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
    

    Снова вызовите проверку громкоговорителя. На этот раз укажите неверный идентификатор громкоговорителя.

    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 [1]. Набор данных содержит записи мужских и женских предметов, говорящих словами и цифрами. Вспомогательная функция в этом примере загружает набор данных, преобразует необработанные файлы в FLAC и возвращает два audioDatastore объекты, содержащие учебный набор и тестовый набор. По умолчанию набор данных сокращается так, что пример выполняется быстро. Полный набор данных можно использовать путем установки ReduceDataset в значение false.

    [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 Изобретение относится к медицине и может быть использовано для выделения кепстральных коэффициентов гамматона (GTCC), дельты GTCC, дельты-дельты GTCC и шага из периодических окон Ганна 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 
    
    

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

    [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.
    
    

    Создайте два каталога в текущей папке: train и test. Извлеките элементы из наборов данных обучения и тестирования и запишите их в соответствующие каталоги в виде файлов 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\','\'));

    Создайте хранилище данных преобразования из хранилищ данных сигнала, чтобы изолировать и использовать только нужные функции. Можно использовать выходные данные из 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)
        features = read(tdsTest);
        tableOut = identify(soundClassifier,features,scorer,'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);

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

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

    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] Верма, Nishal K., et al. «Интеллектуальный мониторинг состояния с использованием акустических сигналов для воздушных компрессоров». Сделки 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"));

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

    Создание наборов обучения и проверки

    Загрузите набор данных свободной речевой цифры (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)));

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

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

    Оценка традиционной производительности внутреннего сервера i-vector

    Создайте 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.
    

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

    trueLabels = adsValidation.Labels;
    predictedLabels = trueLabels;
    
    reset(adsValidation)
    
    scorer = "plda";
    for ii = 1:numel(trueLabels)
        
        audioIn = read(adsValidation);
        
        to = identify(wordRecognizer,audioIn,scorer);
        
        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.199.0361.

    [2] Кенни, Патрик и др. «Совместный факторный анализ в сравнении с собственными каналами при распознавании говорящих». IEEE Transactions on Audio, Speech and Language Processing, vol. 15, no. 4, May 2007, pp. 1435-47. DOI.org (Crossref), doi:10.1109/TASL.2006.881693.

    [3] Кенни, П., и др. «Исследование межговорящей изменчивости в проверке говорящих». Транзакции IEEE по обработке звука, речи и языка, том 16, № 5, июль 2008, стр. 980-88. DOI.org (Crossref), doi:10.1109/TASL.2008.925147.

    [4] Dehak, Najim, et al. «Внешний факторный анализ для проверки динамика». Транзакции IEEE по обработке аудио, речи и языка, том 19, № 4, май 2011, стр. 788-98. DOI.org (Crossref), doi:10.1109/TASL.2010.2064307.

    [5] Матейка, Павел, Ондрей Глембек, Фабио Кастальдо, М.Дж. Алам, Олдрич Плчот, Патрик Кенни, Лукас Бургет и Ян Черноки. 2011 Международная конференция IEEE по акустике, речи и обработке сигналов (ICASSSP), 2011. https://doi.org/10.1109/icassp.2011.5947436.

    [6] Снайдер, Дэвид, и др. Международная конференция IEEE 2018 по акустике, обработке речи и сигналов (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, Эхсан, и др. Международная конференция IEEE 2014 по акустике, речи и обработке сигналов (ICASSP), IEEE, 2014, стр. 4052-56. DOI.org (Crossref), doi:10.1109/ICASSP.2014.6854363.

    [9] Дехак, Наджим, Реда Дехак, Джеймс Р. Гласс, Дуглас А. Рейнольдс и Патрик Кенни. «Оценка косинусного подобия без методов нормализации баллов». Одиссея (2010).

    [10] Верма, Пулкит и Прадип К. Дас. «I-векторы в приложениях обработки речи: опрос». Международный журнал речевых технологий, том 18, № 4, декабрь 2015 года, стр. 529-46. DOI.org (Crossref), doi: 10.1007/s10772-015-9295-3.

    [11] Д. Гарсия-Ромеро и К. Эспи-Уилсон, «Анализ нормализации длины I-вектора в системах распознавания говорящих». Interspeech, 2011, стр. 249-252.

    [12] Кенни, Патрик. «Байесовская проверка спикера с тяжелохвостыми приорами». Одиссея 2010 - Семинар по распознаванию спикеров и языков, Брно, Чехия, 2010.

    [13] Сизов, Александр, Конг Айк Ли и Томи Киннунен. «Унификация вероятностных вариантов линейного дискриминантного анализа при биометрической проверке подлинности». Лекции по компьютерной науке Структурное, синтаксическое и статистическое распознавание образов, 2014, 464-75. https://doi.org/10.1007/978-3-662-44415-3_47.

    [14] Раджан, Падманабхан, Антон Афанасьев, Вилле Хаутамяки, Томи Киннунен. 2014. «От одного к нескольким I-векторам регистрации: практические варианты оценки PLDA для проверки говорящего». Цифровая обработка сигналов 31 (август): 93-101. https://doi.org/10.1016/j.dsp.2014.05.001.

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