voiceActivityDetector

Обнаружьте присутствие речи в звуковом сигнале

Описание

voiceActivityDetector Система object™ обнаруживает присутствие речи в аудио сегменте. Можно также использовать voiceActivityDetector Системный объект, чтобы вывести оценку шумового отклонения на интервал частоты.

Обнаружить присутствие речи:

  1. Создайте voiceActivityDetector объект и набор его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты?.

Создание

Описание

VAD = voiceActivityDetector создает Системный объект, VAD, это обнаруживает присутствие речи независимо через каждый входной канал.

VAD = voiceActivityDetector(Name,Value) наборы каждое свойство Name к заданному Value. Незаданные свойства имеют значения по умолчанию.

Пример: VAD = voiceActivityDetector('InputDomain','Frequency') создает Системный объект, VAD, это принимает вход частотного диапазона.

Свойства

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

Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и release функция разблокировала их.

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты.

Область входного сигнала в виде 'Time' или 'Frequency'.

Настраиваемый: нет

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

Длина БПФ в виде положительной скалярной величины. Значением по умолчанию является [], что означает что FFTLength равно количеству строк входа.

Настраиваемый: нет

Зависимости

Чтобы включить это свойство, установите InputDomain на 'Time'.

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

Функция окна временного интервала, примененная прежде, чем вычислить преобразование Фурье дискретного времени (DTFT) в виде 'Hann', 'Rectangular', 'Flat Top', 'Hamming', 'Chebyshev', или 'Kaiser'.

Функция окна создана с использованием алгоритмы следующих функций:

Настраиваемый: нет

Зависимости

Чтобы включить это свойство, установите InputDomain на 'Time'.

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

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

Настраиваемый: нет

Зависимости

Чтобы включить это свойство, установите InputDomain на 'Time' и окно к 'Chebyshev' или 'Kaiser'.

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

Вероятность перехода от системы координат тишины к системе координат речи в виде скаляра в области значений [0,1].

Настраиваемый: да

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

Вероятность перехода от системы координат речи в системе координат тишины в виде скаляра в области значений [0,1].

Настраиваемый: да

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

Использование

Описание

пример

[probability,noiseEstimate] = VAD(audioIn) применяет речевой детектор действия на вход, audioIn, и возвращает вероятность, что речь присутствует. Это также возвращает предполагаемую шумовую дисперсию на интервал частоты.

Входные параметры

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

Аудиовход к речевому детектору действия в виде скаляра, вектора или матрицы. Если audioIn матрица, столбцы обработаны как независимые звуковые каналы.

Размер аудиовхода заблокирован после первого вызова voiceActivityDetector объект. Изменить размер audioIn, вызвать release на объекте.

Если InputDomain установлен в 'Time', audioIn должно быть с действительным знаком. Если InputDomain установлен в 'Frequency', audioIn может быть с действительным знаком или с комплексным знаком.

Типы данных: single | double
Поддержка комплексного числа: Да

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

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

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

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

Оценка шумового отклонения на интервал частоты, возвращенный как вектор-столбец или матрица с одинаковым числом столбцов как audioIn.

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

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

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

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

cloneСоздайте объект дублированной системы
isLockedОпределите, используется ли Системный объект
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта
stepЗапустите алгоритм Системного объекта

Примеры

свернуть все

Используйте voiceActivityDetector по умолчанию Система object™, чтобы обнаружить присутствие речи в сигнале передачи потокового аудио.

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

fileReader = dsp.AudioFileReader('Counting-16-44p1-mono-15secs.wav');
fs = fileReader.SampleRate;
fileReader.SamplesPerFrame = ceil(10e-3*fs);

Создайте voiceActivityDetector по умолчанию Системный объект, чтобы обнаружить присутствие речи в звуковом файле.

VAD = voiceActivityDetector;

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

scope = timescope( ...
    'NumInputPorts',2, ...
    'SampleRate',fs, ...
    'TimeSpanSource','Property','TimeSpan',3, ...
    'BufferLength',3*fs, ...
    'YLimits',[-1.5 1.5], ...
    'TimeSpanOverrunAction','Scroll', ...
    'ShowLegend',true, ...
    'ChannelNames',{'Audio','Probability of speech presence'});
deviceWriter = audioDeviceWriter('SampleRate',fs);

В цикле аудиопотока:

  1. Читайте из звукового файла.

  2. Вычислите вероятность речевого присутствия.

  3. Визуализируйте звуковой сигнал и речевую вероятность присутствия.

  4. Проигрывайте звуковой сигнал через свою звуковую карту.

while ~isDone(fileReader)
    audioIn = fileReader();
    probability = VAD(audioIn);
    scope(audioIn,probability*ones(fileReader.SamplesPerFrame,1))
    deviceWriter(audioIn);
end

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

Создайте dsp.AudioFileReader Система object™, чтобы считать речевой файл.

afr = dsp.AudioFileReader('Counting-16-44p1-mono-15secs.wav');
fs = afr.SampleRate;

Разделите аудио на блоки в системы координат на 20 мс с 75%-м перекрытием между последовательными системами координат. Преобразуйте время системы координат в секундах к выборкам. Определите размер транзитного участка (шаг новых выборок). В читателе звукового файла, набор выборки на систему координат к размеру транзитного участка. Создайте dsp.AsyncBuffer по умолчанию объект справиться с наложением между аудио системами координат.

frameSize = ceil(20e-3*fs);
overlapSize = ceil(0.75*frameSize);
hopSize = frameSize - overlapSize;
afr.SamplesPerFrame = hopSize;

inputBuffer = dsp.AsyncBuffer('Capacity',frameSize);

Создайте voiceActivityDetector Системный объект. Задайте длину БПФ 1 024.

VAD = voiceActivityDetector('FFTLength',1024);

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

scope = timescope('NumInputPorts',2, ...
    'SampleRate',fs, ...
    'TimeSpanSource','Property','TimeSpan',3, ...
    'BufferLength',3*fs, ...
    'YLimits',[-1.5,1.5], ...
    'TimeSpanOverrunAction','Scroll', ...
    'ShowLegend',true, ...
    'ChannelNames',{'Audio','Probability of speech presence'});

player = audioDeviceWriter('SampleRate',fs);

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

pHold = ones(hopSize,1);

В цикле аудиопотока:

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

  2. Считайте систему координат из буфера с заданным перекрытием от предыдущей системы координат.

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

  4. Установите последний элемент вектора вероятности к новому решению вероятности. Визуализируйте аудио и речевую вероятность присутствия с помощью осциллографа времени.

  5. Проигрывайте аудио через свою звуковую карту.

  6. Установите вектор вероятности на новый результат для графического вывода в следующем цикле.

while ~isDone(afr)
    x = afr();
    n = write(inputBuffer,x);

    overlappedInput = read(inputBuffer,frameSize,overlapSize);

    p = VAD(overlappedInput);

    pHold(end) = p;
    scope(x,pHold)

    player(x);

    pHold(:) = p;
end

Выпустите player если аудио закончило вопроизводить.

release(player)

Много методов извлечения признаков работают с частотным диапазоном. Преобразование звукового сигнала к частотному диапазону только однажды эффективно. В этом примере вы преобразуете сигнал передачи потокового аудио в частотный диапазон и канал, которые сигнализируют в речевой детектор действия. Если речь присутствует, функции mel-частоты cepstral коэффициентов (MFCC) извлечены из сигнала частотного диапазона использование cepstralFeatureExtractor System object™.

Создайте dsp.AudioFileReader Системный объект, чтобы читать из звукового файла.

fileReader = dsp.AudioFileReader('Counting-16-44p1-mono-15secs.wav');
fs = fileReader.SampleRate;

Обработайте аудио в системах координат на 30 мс с транзитным участком на 10 мс. Создайте dsp.AsyncBuffer по умолчанию объект управлять перекрытием между аудио системами координат.

samplesPerFrame = ceil(0.03*fs);
samplesPerHop = ceil(0.01*fs);
samplesPerOverlap = samplesPerFrame - samplesPerHop;

fileReader.SamplesPerFrame = samplesPerHop;
buffer = dsp.AsyncBuffer;

Создайте voiceActivityDetector Системный объект и cepstralFeatureExtractor Системный объект. Укажите, что они действуют в частотном диапазоне. Создайте dsp.SignalSink регистрировать извлеченные функции cepstral.

VAD = voiceActivityDetector('InputDomain','Frequency');
cepFeatures = cepstralFeatureExtractor('InputDomain','Frequency','SampleRate',fs,'LogEnergy','Replace');
sink = dsp.SignalSink;

В цикле аудиопотока:

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

  2. Считайте систему координат из buffer с заданным перекрытием от предыдущей системы координат.

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

  4. Если система координат при анализе имеет вероятность речи, больше, чем 0,75, извлечение cepstral функции, и регистрируйте функции с помощью приемника сигнала. Если система координат при анализе имеет вероятность речи меньше чем 0,75, запишите вектор из NaNs к приемнику.

threshold = 0.75;
nanVector = nan(1,13);
while ~isDone(fileReader)
    audioIn = fileReader();
    write(buffer,audioIn);
    
    overlappedAudio = read(buffer,samplesPerFrame,samplesPerOverlap);
    X = fft(overlappedAudio,2048);
    
    probabilityOfSpeech = VAD(X);
    if probabilityOfSpeech > threshold
        xFeatures = cepFeatures(X);
        sink(xFeatures')
    else
        sink(nanVector)
    end
end

Визуализируйте cepstral коэффициенты в зависимости от времени.

timeVector = linspace(0,15,size(sink.Buffer,1));
plot(timeVector,sink.Buffer)
xlabel('Time (s)')
ylabel('MFCC Amplitude')
legend('Log-Energy','c1','c2','c3','c4','c5','c6','c7','c8','c9','c10','c11','c12')

Создайте dsp.AudioFileReader возразите, чтобы читать в покадровом аудио.

fileReader = dsp.AudioFileReader('singing-a-major.ogg');

Создайте voiceActivityDetector объект обнаружить присутствие речи в передаче потокового аудио.

VAD = voiceActivityDetector;

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

f0 = [];
while ~isDone(fileReader)
    x = fileReader();
    
    if VAD(x) > 0.99
        decision = pitch(x,fileReader.SampleRate, ...
            "WindowLength",size(x,1), ...
            "OverlapLength",0, ...
            "Range",[200,340]);
    else
        decision = NaN;
    end
    f0 = [f0;decision];
end

Стройте обнаруженный контур подачи в зависимости от времени.

t = linspace(0,(length(f0)*fileReader.SamplesPerFrame)/fileReader.SampleRate,length(f0));
plot(t,f0)
ylabel('Fundamental Frequency (Hz)')
xlabel('Time (s)')
grid on

Алгоритмы

voiceActivityDetector реализует алгоритм, описанный в [1].

Если InputDomain задан как 'Time', входной сигнал является оконным и затем конвертированным к частотному диапазону согласно Window, SidelobeAttenuation, и FFTLength свойства. Если InputDomain задан как частота, вход принят, чтобы быть оконным преобразованием Фурье дискретного времени (DTFT) звукового сигнала. Сигнал затем преобразован в домен питания. Шумовое отклонение оценивается согласно [2]. Следующий и предшествующий ОСШ оценивается согласно формуле Минимальной среднеквадратичной погрешности (MMSE), описанной в [3]. Логарифмический тест отношения правдоподобия и Скрытая модель Маркова (HMM) - базирующаяся схема похмелья определяет вероятность, что текущая система координат содержит речь, согласно [1].

Ссылки

[1] Зон, Jongseo., Нэм Су Ким и Вонюн Сун. "Статистическое основанное на модели речевое обнаружение действия". Обработка сигналов обозначает буквами IEEE. Издание 6, № 1, 1999.

[2] Мартин, R. "Шумовая Степень Спектральная Оценка Плотности На основе Оптимального Сглаживания и Минимальной Статистики". Транзакции IEEE о Речи и Обработке аудиоданных. Издание 9, № 5, 2001, стр 504–512.

[3] Эфраим, Y. и Д. Мала. "Речевое Улучшение Используя Минимальное Короткое время Среднеквадратичной погрешности Спектральное Амплитудное Средство оценки". Транзакции IEEE на Акустике, Речи и Обработке сигналов. Издание 32, № 6, 1984, стр 1109–1121.

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

Введенный в R2018a