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.

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

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

percentOverlap = 35;
перекрытие = округлое (numWindowSamples * percentOverlap/100);

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

detectSpeech (audioIn, fs,"Window", выигрывайте,"OverlapLength", перекрытие,"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

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

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, размер (Window,1)).

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

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

Примечание

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

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

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

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

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

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

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

свернуть все

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

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

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

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

Алгоритмы

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

Sequence of stages in algorithm.

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

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

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

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

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

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

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

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

Ссылки

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

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

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

.
Введенный в R2020a