exponenta event banner

detectSpeech

Обнаружение границ речи в аудиосигнале

Описание

пример

idx = detectSpeech(audioIn,fs) возвращает индексы audioIn которые соответствуют границам речевых сигналов.

пример

idx = detectSpeech(audioIn,fs,Name,Value) указывает параметры, использующие один или несколько Name,Value аргументы пары.

Пример: detectSpeech(audioIn,fs,'Window',hann(512,'periodic'),'OverlapLength',256) обнаруживает речь с помощью 512-точечного периодического окна Ханна с 256-точечным перекрытием.

пример

[idx,thresholds] = detectSpeech(___) также возвращает пороговые значения, используемые для вычисления границ речи.

пример

detectSpeech(___) без выходных аргументов отображает график обнаруженных речевых областей во входном сигнале.

Примеры

свернуть все

Считывание звукового сигнала. Срежьте звуковой сигнал до 20 секунд.

[audioIn,fs] = audioread('Rainbow-16-8-mono-114secs.wav');
audioIn = audioIn(1:20*fs);

Звонить detectSpeech. Укажите отсутствие выходных аргументов для отображения графика обнаруженных речевых областей.

detectSpeech(audioIn,fs);

Figure contains an axes. The axes with title Detected Speech contains 37 objects of type line, constantline, patch.

detectSpeech функция использует алгоритм пороговой обработки, основанный на энергии и спектральном разбросе на кадр анализа. Вы можете изменить Window, OverlapLength, и MergeDistance для точной настройки алгоритма для конкретных потребностей.

windowDuration = 0.074; % seconds
numWindowSamples = round(windowDuration*fs);
win = hamming(numWindowSamples,'periodic');

percentOverlap = 35;
overlap = round(numWindowSamples*percentOverlap/100);

mergeDuration = 0.44;
mergeDist = round(mergeDuration*fs);

detectSpeech(audioIn,fs,"Window",win,"OverlapLength",overlap,"MergeDistance",mergeDist)

Figure contains an axes. The axes with title Detected Speech contains 19 objects of type line, constantline, patch.

Чтение в аудиофайле, содержащем речь. Разделение звукового сигнала на первую половину и вторую половину.

[audioIn,fs] = audioread('Counting-16-44p1-mono-15secs.wav');
firstHalf = audioIn(1:floor(numel(audioIn)/2));
secondHalf = audioIn(numel(firstHalf):end);

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

[speechIndices,thresholds] = detectSpeech(firstHalf,fs);

Звонить detectSpeech на второй половине без выходных аргументов для построения графиков областей обнаруженной речи. Укажите пороговые значения, определенные из предыдущего вызова detectSpeech.

detectSpeech(secondHalf,fs,'Thresholds',thresholds)

Работа с большими наборами данных

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

url = 'https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz';

downloadFolder = tempdir;
datasetFolder = fullfile(downloadFolder,'google_speech');

if ~exist(datasetFolder,'dir')
    disp('Downloading data set (1.9 GB) ...')
    untar(url,datasetFolder)
end

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

ads = audioDatastore(datasetFolder,'IncludeSubfolders',true,'LabelSource','foldernames');

Для целей данного примера уменьшите набор данных на 95%.

ads = splitEachLabel(ads,0.05,'Exclude','_background_noise');

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

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

Вычислите средние пороги по набору данных обучения.

thresholds = zeros(numel(adsTrain.Files),2);
for ii = 1:numel(adsTrain.Files)
    [audioIn,adsInfo] = read(adsTrain);
    [~,thresholds(ii,:)] = detectSpeech(audioIn,adsInfo.SampleRate);
end
thresholdAverage = mean(thresholds,1);

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

[audioIn,adsInfo] = read(adsTest);
detectSpeech(audioIn,adsInfo.SampleRate,'Thresholds',thresholdAverage);

[audioIn,adsInfo] = read(adsTest);
detectSpeech(audioIn,adsInfo.SampleRate,'Thresholds',thresholdAverage);

[audioIn,adsInfo] = read(adsTest);
detectSpeech(audioIn,adsInfo.SampleRate,'Thresholds',thresholdAverage);

Ссылки

[1] Надзиратель, Пит. «Речевые команды: открытый набор данных для распознавания речи одного слова». Распространяется компанией TensorFlow. Лицензия Creative Commons Attribution 4.0.

Прочитайте аудиофайл и прослушайте его. Постройте график spectrogram.

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

sound(audioIn,fs)

spectrogram(audioIn,hann(1024,'periodic'),512,1024,fs,'yaxis')

Figure contains an axes. The axes contains an object of type image.

Для приложений машинного обучения часто требуется извлекать функции из звукового сигнала. Позвоните в spectralEntropy функция на аудиосигнале, затем постройте график histogram для отображения распределения спектральной энтропии.

entropy = spectralEntropy(audioIn,fs);

numBins = 40;
histogram(entropy,numBins,'Normalization','probability')
title('Spectral Entropy of Audio Signal')

Figure contains an axes. The axes with title Spectral Entropy of Audio Signal contains an object of type histogram.

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

speechIndices = detectSpeech(audioIn,fs);
speechSignal = [];
for ii = 1:size(speechIndices,1)
    speechSignal = [speechSignal;audioIn(speechIndices(ii,1):speechIndices(ii,2))];
end

Прослушайте речевой сигнал и постройте график спектрограммы.

sound(speechSignal,fs)

spectrogram(speechSignal,hann(1024,'periodic'),512,1024,fs,'yaxis')

Figure contains an axes. The axes contains an object of type image.

Позвоните в spectralEntropy функция на речевом сигнале, а затем график histogram для отображения распределения спектральной энтропии.

entropy = spectralEntropy(speechSignal,fs);

histogram(entropy,numBins,'Normalization','probability')
title('Spectral Entropy of Speech Signal')

Figure contains an axes. The axes with title Spectral Entropy of Speech Signal contains an object of type histogram.

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

свернуть все

Звуковой вход, заданный как вектор столбца.

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

Частота дискретизации в Гц, заданная как скаляр.

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

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: detectSpeech(audioIn,fs,'MergeDistance',100)

«Окно, примененное во временной области, указанное как разделенная запятыми пара, состоящая из»Windowи реальный вектор. Число элементов в векторе должно находиться в диапазоне [2, size(audioIn,1)]. Число элементов в векторе также должно быть больше OverlapLength.

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

Число выборок, перекрывающихся между соседними окнами, указанное как пара, разделенная запятыми, состоящая из 'OverlapLength'и целое число в диапазоне [0, size(Window,1)).

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

Число выборок для объединения положительных решений обнаружения речи, указанных как разделенная запятыми пара, состоящая из 'MergeDistanceи неотрицательный скаляр.

Примечание

Разрешение для обнаружения речи задается длиной транзитного участка, где длина транзитного участка равна numel(Window) − OverlapLength.

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

Пороговые значения для решения, указанные как разделенная запятыми пара, состоящая из 'Thresholdsи двухэлементный вектор.

  • Если не указать Thresholds, detectSpeech функция выводит пороговые значения с использованием гистограмм элементов, вычисленных по текущему входному кадру.

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

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

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

свернуть все

Начальный и конечный индексы речевых областей, возвращаемые в виде матрицы N-by-2. N соответствует количеству обнаруженных отдельных речевых областей. Первый столбец соответствует начальным индексам речевых областей, а второй столбец соответствует конечным индексам речевых областей.

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

Пороговые значения, используемые для принятия решения, возвращаются как двухэлементный вектор. Пороговые значения находятся в порядке [Порог энергии, Порог спектрального расширения].

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

Алгоритмы

detectSpeech алгоритм основан на [1], хотя и модифицирован таким образом, что статистика к порогу представляет собой кратковременную энергию и спектральный разброс, вместо кратковременной энергии и спектрального центроида. Диаграмма и шаги обеспечивают общий обзор алгоритма. Для получения более подробной информации см. [1].

Sequence of stages in algorithm.

  1. Аудиосигнал преобразуется в частотно-временное представление с использованием указанного Window и OverlapLength.

  2. Для каждого кадра вычисляют кратковременную энергию и спектральный разброс. Спектральный разброс вычисляется в соответствии с spectralSpread.

  3. Гистограммы создаются как для распределения кратковременной энергии, так и для распределения спектрального разброса.

  4. Для каждой гистограммы порог определяется согласно T = W × M1 + M2W + 1, где M1 и M2 являются первым и вторым локальными максимумами соответственно. W имеет значение5.

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

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

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

  8. Области, объявленные как речевые, объединяются, если расстояние между ними меньше MergeDistance.

Ссылки

[1] Джаннакопулос, Теодорос. «Метод удаления молчания и сегментации речевых сигналов, реализованный в MATLAB» (Университет Афин, Афины, 2009).

Расширенные возможности

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2020a