exponenta event banner

увеличение

Увеличение аудиоданных

Описание

пример

data = augment(aug,audioIn) возвращает таблицу, содержащую дополненные аудиоданные и информацию о примененном дополнении.

пример

data = augment(aug,audioIn,fs) задает частоту дискретизации входного звукового сигнала.

Примеры

свернуть все

Считывайте звуковой сигнал и слушайте его.

[audioIn,fs] = audioread("Counting-16-44p1-mono-15secs.wav");
sound(audioIn,fs)

Создание audioDataAugmenter объект, применяющий растягивание времени, контроль громкости и сдвиг времени в каскаде. Примените каждое из дополнений с вероятностью 80%. Набор NumAugmentations кому 5 для вывода пяти независимо увеличенных сигналов. Чтобы пропустить смещение основного тона и добавление шума для каждого увеличения, установите соответствующие вероятности на 0. Определите диапазоны параметров для каждого соответствующего алгоритма увеличения.

augmenter = audioDataAugmenter( ...
    "AugmentationMode","sequential", ...
    "NumAugmentations",5, ...
    ...
    "TimeStretchProbability",0.8, ...
    "SpeedupFactorRange", [1.3,1.4], ...
    ...
    "PitchShiftProbability",0, ...
    ...
    "VolumeControlProbability",0.8, ...
    "VolumeGainRange",[-5,5], ...
    ...
    "AddNoiseProbability",0, ...
    ...
    "TimeShiftProbability",0.8, ...
    "TimeShiftRange", [-500e-3,500e-3])
augmenter = 
  audioDataAugmenter with properties:

               AugmentationMode: "sequential"
    AugmentationParameterSource: 'random'
               NumAugmentations: 5
         TimeStretchProbability: 0.8000
             SpeedupFactorRange: [1.3000 1.4000]
          PitchShiftProbability: 0
       VolumeControlProbability: 0.8000
                VolumeGainRange: [-5 5]
            AddNoiseProbability: 0
           TimeShiftProbability: 0.8000
                 TimeShiftRange: [-0.5000 0.5000]

Звонить augment на аудио для создания 5 дополнений. Дополненный звук возвращается в таблице с переменными Audio и AugmentationInfo. Количество строк в таблице определяется NumAugmentations.

data = augment(augmenter,audioIn,fs)
data=5×2 table
          Audio          AugmentationInfo
    _________________    ________________

    {685056x1 double}      [1x1 struct]  
    {685056x1 double}      [1x1 struct]  
    {505183x1 double}      [1x1 struct]  
    {685056x1 double}      [1x1 struct]  
    {490728x1 double}      [1x1 struct]  

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

augmentationToInspect = 4;
data.AugmentationInfo(augmentationToInspect)
ans = struct with fields:
    SpeedupFactor: 1
       VolumeGain: 4.3399
        TimeShift: 0.4502

Прислушайтесь к дополнению, которое вы проверяете. Постройте график временного представления исходного и дополненного сигналов.

augmentation = data.Audio{augmentationToInspect};
sound(augmentation,fs)

t = (0:(numel(audioIn)-1))/fs;
taug = (0:(numel(augmentation)-1))/fs;
plot(t,audioIn,taug,augmentation)
legend("Original Audio","Augmented Audio")
ylabel("Amplitude")
xlabel("Time (s)")

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Audio, Augmented Audio.

Считывайте звуковой сигнал и слушайте его.

[audioIn,fs] = audioread("Counting-16-44p1-mono-15secs.wav");
sound(audioIn,fs)

Создание audioDataAugmenter объект, применяющий растягивание времени, смещение основного тона и искажение шума в каскаде. Укажите коэффициенты ускорения растяжения во времени как 0.9, 1.1, и 1.2. Укажите смещение шага в полутонах как -2, -1, 1, и 2. Укажите SNR с повреждением шума как 10 дБ и 15 дБ.

augmenter = audioDataAugmenter( ...
    "AugmentationMode","sequential", ...
    "AugmentationParameterSource","specify", ...
    "SpeedupFactor",[0.9,1.1,1.2], ...
    "ApplyTimeStretch",true, ...
    "ApplyPitchShift",true, ...
    "SemitoneShift",[-2,-1,1,2], ...
    "SNR",[10,15], ...
    "ApplyVolumeControl",false, ...
    "ApplyTimeShift",false)
augmenter = 
  audioDataAugmenter with properties:

               AugmentationMode: "sequential"
    AugmentationParameterSource: "specify"
               ApplyTimeStretch: 1
                  SpeedupFactor: [0.9000 1.1000 1.2000]
                ApplyPitchShift: 1
                  SemitoneShift: [-2 -1 1 2]
             ApplyVolumeControl: 0
                  ApplyAddNoise: 1
                            SNR: [10 15]
                 ApplyTimeShift: 0

Звонить augment на аудио для создания 24 дополнений. Дополнения представляют собой каждую комбинацию заданных параметров увеличения (3 × 4 × 2 = 24).

data = augment(augmenter,audioIn,fs)
data=24×2 table
          Audio          AugmentationInfo
    _________________    ________________

    {761243x1 double}      [1x1 struct]  
    {622888x1 double}      [1x1 struct]  
    {571263x1 double}      [1x1 struct]  
    {761243x1 double}      [1x1 struct]  
    {622888x1 double}      [1x1 struct]  
    {571263x1 double}      [1x1 struct]  
    {761243x1 double}      [1x1 struct]  
    {622888x1 double}      [1x1 struct]  
    {571263x1 double}      [1x1 struct]  
    {761243x1 double}      [1x1 struct]  
    {622888x1 double}      [1x1 struct]  
    {571263x1 double}      [1x1 struct]  
    {761243x1 double}      [1x1 struct]  
    {622888x1 double}      [1x1 struct]  
    {571263x1 double}      [1x1 struct]  
    {761243x1 double}      [1x1 struct]  
      ⋮

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

augmentationToInspect = 1;
data.AugmentationInfo(augmentationToInspect)
ans = struct with fields:
    SpeedupFactor: 0.9000
    SemitoneShift: -2
              SNR: 10

Прислушайтесь к дополнению, которое вы проверяете. Постройте график представления во временной области исходного и дополненного сигналов.

augmentation = data.Audio{augmentationToInspect};
sound(augmentation,fs)

t = (0:(numel(audioIn)-1))/fs;
taug = (0:(numel(augmentation)-1))/fs;
plot(t,audioIn,taug,augmentation)
legend("Original Audio","Augmented Audio")
ylabel("Amplitude")
xlabel("Time (s)")

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Audio, Augmented Audio.

Считывайте звуковой сигнал и слушайте его.

[audioIn,fs] = audioread("Counting-16-44p1-mono-15secs.wav");

Создание audioDataAugmenter объект, применяющий искажение шума и сдвиг времени в параллельных ветвях. Для ветви повреждения шума случайным образом примените шум с SNR в диапазоне 0 от дБ до 20 дБ. Для ветви сдвига времени случайным образом применить сдвиг времени в диапазоне -300 мс в 300 г-жа применяет увеличение 2 раза для каждой ветви, для 4 общих дополнений.

augmenter = audioDataAugmenter( ...
    "AugmentationMode","independent", ...
    "AugmentationParameterSource","random", ...
    "NumAugmentations",2, ...
    "ApplyTimeStretch",false, ...
    "ApplyPitchShift",false, ...
    "ApplyVolumeControl",false, ...
    "SNRRange",[0,20], ...
    "TimeShiftRange",[-300e-3,300e-3])
augmenter = 
  audioDataAugmenter with properties:

               AugmentationMode: "independent"
    AugmentationParameterSource: "random"
               NumAugmentations: 2
               ApplyTimeStretch: 0
                ApplyPitchShift: 0
             ApplyVolumeControl: 0
                  ApplyAddNoise: 1
                       SNRRange: [0 20]
                 ApplyTimeShift: 1
                 TimeShiftRange: [-0.3000 0.3000]

Звонить augment на аудио для создания 3 дополнений.

data = augment(augmenter,audioIn,fs);
  

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

augmentationToInspect = 4;
data.AugmentationInfo{augmentationToInspect}
ans = struct with fields:
    TimeShift: 0.0016

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

augmentation = data.Audio{augmentationToInspect};
sound(augmentation,fs)

t = (0:(numel(audioIn)-1))/fs;
taug = (0:(numel(augmentation)-1))/fs;
plot(t,audioIn,taug,augmentation)
legend("Original Audio","Augmented Audio")
ylabel("Amplitude")
xlabel("Time (s)")

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Audio, Augmented Audio.

Считывайте звуковой сигнал и слушайте его.

[audioIn,fs] = audioread("Counting-16-44p1-mono-15secs.wav");

Создание audioDataAugmenter объект, применяющий контроль громкости, повреждение шума и сдвиг времени в параллельных ветвях.

augmenter = audioDataAugmenter( ...
    "AugmentationMode","independent", ...
    "AugmentationParameterSource","specify", ...
    "ApplyTimeStretch",false, ...
    "ApplyPitchShift",false, ...
    "VolumeGain",2, ...
    "SNR",0, ...
    "TimeShift",2)
augmenter = 
  audioDataAugmenter with properties:

               AugmentationMode: "independent"
    AugmentationParameterSource: "specify"
               ApplyTimeStretch: 0
                ApplyPitchShift: 0
             ApplyVolumeControl: 1
                     VolumeGain: 2
                  ApplyAddNoise: 1
                            SNR: 0
                 ApplyTimeShift: 1
                      TimeShift: 2

Звонить augment на аудио для создания 3 дополнений.

data = augment(augmenter,audioIn,fs)
data=3×2 table
          Audio          AugmentationInfo
    _________________    ________________

    {685056x1 double}      {1x1 struct}  
    {685056x1 double}      {1x1 struct}  
    {685056x1 double}      {1x1 struct}  

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

augmentationToInspect = 3;
data.AugmentationInfo{augmentationToInspect}
ans = struct with fields:
    TimeShift: 2

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

augmentation = data.Audio{augmentationToInspect};
sound(augmentation,fs)

t = (0:(numel(audioIn)-1))/fs;
taug = (0:(numel(augmentation)-1))/fs;
plot(t,audioIn,taug,augmentation)
legend("Original Audio","Augmented Audio")
ylabel("Amplitude")
xlabel("Time (s)")

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Audio, Augmented Audio.

audioDataAugmenter поддерживает несколько рабочих процессов для расширения хранилища данных, включая:

  • Автономное увеличение

  • Увеличение с помощью массивов tall

  • Увеличение с помощью хранилищ данных преобразования

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

folder = fullfile(matlabroot,"toolbox","audio","samples");
ADS = audioDatastore(folder)
ADS = 
  audioDatastore with properties:

                       Files: {
                              ' ...\matlab\toolbox\audio\samples\Ambiance-16-44p1-mono-12secs.wav';
                              ' ...\matlab\toolbox\audio\samples\AudioArray-16-16-4channels-20secs.wav';
                              ' ...\toolbox\audio\samples\ChurchImpulseResponse-16-44p1-mono-5secs.wav'
                               ... and 26 more
                              }
    AlternateFileSystemRoots: {}
              OutputDataType: 'double'
                      Labels: {}

numFilesInDataset = numel(ADS.Files)
numFilesInDataset = 29

Создание audioDataAugmenter применяется случайное последовательное увеличение. Набор NumAugmentations кому 2.

aug = audioDataAugmenter('NumAugmentations',2)
aug = 
  audioDataAugmenter with properties:

               AugmentationMode: 'sequential'
    AugmentationParameterSource: 'random'
               NumAugmentations: 2
         TimeStretchProbability: 0.5000
             SpeedupFactorRange: [0.8000 1.2000]
          PitchShiftProbability: 0.5000
             SemitoneShiftRange: [-2 2]
       VolumeControlProbability: 0.5000
                VolumeGainRange: [-3 3]
            AddNoiseProbability: 0.5000
                       SNRRange: [0 10]
           TimeShiftProbability: 0.5000
                 TimeShiftRange: [-0.0050 0.0050]

Автономное увеличение

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

while hasdata(ADS)
    [audioIn,info] = read(ADS);
    
    data = augment(aug,audioIn,info.SampleRate);
    
    [~,fn] = fileparts(info.FileName);
    for i = 1:size(data,1)
        augmentedAudio = data.Audio{i};
        
        % If augmentation caused an audio signal to have values outside of -1 and 1, 
        % normalize the audio signal to avoid clipping when writing.
        if max(abs(augmentedAudio),[],'all')>1
            augmentedAudio = augmentedAudio/max(abs(augmentedAudio),[],'all');
        end
        
        audiowrite(sprintf('%s_aug%d.wav',fn,i),augmentedAudio,info.SampleRate)
    end
end

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

augmentedADS = audioDatastore(pwd)
augmentedADS = 
  audioDatastore with properties:

                       Files: {
                              ' ...\Examples\audio-ex28074079\Ambiance-16-44p1-mono-12secs_aug1.wav';
                              ' ...\Examples\audio-ex28074079\Ambiance-16-44p1-mono-12secs_aug2.wav';
                              ' ...\Examples\audio-ex28074079\AudioArray-16-16-4channels-20secs_aug1.wav'
                               ... and 55 more
                              }
    AlternateFileSystemRoots: {}
              OutputDataType: 'double'
                      Labels: {}

numFilesInAugmentedDataset = numel(augmentedADS.Files)
numFilesInAugmentedDataset = 58

Увеличение с помощью массивов Tal

При увеличении набора данных с использованием массивов tall входные данные в augmenter должны выбираться с согласованной скоростью. Поднабор исходного набора аудиоданных включает только файлы с частотой дискретизации 44,1 кГц. Большинство наборов данных уже очищено, чтобы иметь согласованную частоту выборки.

keepFile = cellfun(@(x)contains(x,'44p1'),ADS.Files);
ads44p1 = subset(ADS,keepFile);
fs = 44.1e3;

Преобразование хранилища аудиоданных в массив высокого уровня. tall массивы вычисляются только при явном запросе с использованием gather. MATLAB ® автоматически оптимизирует вычисления в очереди, минимизируя количество проходов через данные. При наличии Toolbox™ параллельных вычислений можно распределить вычисления по нескольким машинам. Аудиоданные представлены в виде массива ячеек M-by-1 высокого уровня, где М - количество файлов в хранилище аудиоданных.

adsTall = tall(ads44p1)
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

adsTall =

  M×1 tall cell array

    { 539648×1 double}
    { 227497×1 double}
    {   8000×1 double}
    { 685056×1 double}
    { 882688×2 double}
    {1115760×2 double}
    { 505200×2 double}
    {3195904×2 double}
        :         :
        :         :

Определение cellfun функция, так что увеличение применяется к каждой ячейке высокого массива. Звонить gather для вычисления массива высокого уровня.

augTall = cellfun(@(x)augment(aug,x,fs),adsTall,"UniformOutput",false);
augmentedDataset = gather(augTall)
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 1: Completed in 1 min 34 sec
Evaluation completed in 1 min 34 sec
augmentedDataset=12×1 cell array
    {2×2 table}
    {2×2 table}
    {2×2 table}
    {2×2 table}
    {2×2 table}
    {2×2 table}
    {2×2 table}
    {2×2 table}
    {2×2 table}
    {2×2 table}
    {2×2 table}
    {2×2 table}

Расширенный набор данных возвращается в виде массива ячеек numFiles-by-1, где numFiles - количество файлов в хранилище данных. Каждый элемент массива ячеек является таблицей numAugmentationsPerFile-by-2, где numAugmentationPerFile - количество дополнений, возвращаемых на файл.

numFiles = numel(augmentedDataset)
numFiles = 12
numAugmentationsPerFile = size(augmentedDataset{1},1)
numAugmentationsPerFile = 2

Увеличение с помощью хранилища данных преобразования

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

transformADS = transform(ADS,@(x,info)augment(aug,x,info),'IncludeInfo',true)
transformADS = 
  TransformedDatastore with properties:

    UnderlyingDatastore: [1×1 audioDatastore]
             Transforms: {@(x,info)augment(aug,x,info)}
            IncludeInfo: 1

Звонить read для возврата дополненного первого файла из хранилища данных преобразования.

augmentedRead = read(transformADS)
augmentedRead=2×2 table
          Audio          AugmentationInfo
    _________________    ________________

    {539648×1 double}      [1×1 struct]  
    {586683×1 double}      [1×1 struct]  

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

свернуть все

audioDataAugmenter объект.

Звуковой вход, определяемый как вектор столбца или матрица независимых каналов (столбцов).

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

Частота дискретизации в Гц, заданная как положительный скаляр. Допустимый диапазон fs зависит от свойств audioDataAugmenter объект.

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

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

свернуть все

Дополненная информация о звуке и дополнении, возвращаемая в виде двух столбцов table. Первый столбец содержит дополненный звуковой сигнал. Во втором столбце содержится информация о применяемых методах увеличения. Количество строк в data соответствует количеству выходных усиленных сигналов. Количество выходных усиленных сигналов зависит от значений свойств объекта.

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