Нарисуйте озвученные данные поверх исходных данных из звукового файла в Matlab - PullRequest
0 голосов
/ 24 февраля 2019

Наша программа берет звуковой файл, делит его на кадры и находит вокализованные невокализованные кадры, используя нулевую частоту пересечения и кратковременную энергию.В какой-то момент алгоритм находит все идентификаторы вокализованных кадров.Мы хотим создать хорошее графическое представление для вокализованных кадров, но нам не удается пометить вокализованные кадры поверх исходных данных с использованием графика.Теперь нам удается только показывать вокализованные кадры без невокализованных (в начале графика):

Теперь это выглядит так

Но мы хотим сделать что-то вроде этого(сделано с графическим редактором), чтобы вы могли видеть озвученные кадры на исходном графике данных):

Мы хотим, чтобы изображение выглядело так

Код:

close all; clear all;

% read sound 
[data, fs] = audioread('shee_mono.wav');
% normalize data
data = data / abs(max(data));

f_d = 0.025

%[frames, ~] = vec2frames( data, Nw, Ns, 'rows', @hamming, false); 
frames = framing(data, fs, f_d);
ZCR_values_per_frame = ZCR(frames, f_d, fs, data);
f_energy_vector =  STECalc(frames);

ste_threshold = 0.01;
  
zcr_threshold = mean(ZCR_values_per_frame); %take average ZCR as threshold

voiced_id = find_voiced_id(ZCR_values_per_frame, f_energy_vector, zcr_threshold, ste_threshold);

unvoiced_id = reshape(1:size(frames), 1, []); %create vector filled with numbers 1...96 in order
unvoiced_id = setdiff(unvoiced_id, voiced_id); %change vector to be every frame that is unvoiced

fr_unvoiced = frames(unvoiced_id,:); 
data_unvoiced = reshape(fr_unvoiced',1,[]);

fr_voiced = frames(voiced_id,:); 
data_voiced = reshape(fr_voiced',1,[]);

figure
plot(data); hold on;
%plot(data_unvoiced, 'b'); 
%plot(data_voiced, 'g');
sound(data_voiced, fs);
title ("Blue - original data, green - voiced areas after unvoiced deleted");
[ voiced_timing, unvoiced_timing ] = return_voiced_unvoiced_timings(voiced_id, unvoiced_id, f_d, frames);

PS Извините, если есть ошибки.Английский не мой родной язык

Код в репозитории Github

1 Ответ

0 голосов
/ 24 февраля 2019

Что вы можете сделать, это сделать вектор времени, tv, основанный на частоте выборки и количестве выборок:

tv = (0:numel(data)-1)/fs; 

Затем вы можете использовать voiced_id (это содержит индексызвуковые сегменты, которые вы хотите получить (просматривая репозиторий Github), чтобы получить вектор времени, который соответствует временным меткам данных, которые вы хотите:

tv_voice = tv(voiced_id); 

Затем построите график, используя вектор времени в качестве значений x:

plot(tv,data, 'b');
plot(tv_voice, data_voiced, 'g');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...