← strona główna

Analiza dźwięku w celu automatycznego generowania video

Przykłady analizy wielu nagrań na użytek wykonania online Polymorphii (rezultat video w przykładzie nr 19).

Kod poszukujący w nagraniach momentu wykonania finalnego akordu C-dur w Polymorphii Krzysztofa Pendereckiego (wykorzystuje nagłą ciszę przed akordem):

fd = '../dst-1/';
d = dir ([fd, '/*.mp3']);
blockLengthSeconds = .5;
wyniki = struct();
for f = 1 : length (d)
    fn = [d(f).folder, '/', d(f).name];
    disp ([num2str(f), ': ', fn]);  
end
for f = 1 : length (d)
    progress (f, length(d), [d(f).name, ' ']);  
    fn = [d(f).folder, '/', d(f).name];
    [x, fs] = audioread (fn);
    offset_ = 10;
    startTest = (offset_ + 9 * 60) * fs + 1;
    x = mean (x, 2);
    x2 = x (startTest:end, :);
    x2 = x2 / max (x2);
    t = length (x2) / fs;
    ma = miraudio(x2, fs); % funkcje pakietu MIR Toolbox
    mf = mirframe(ma); % podział sygnału na ramki
    mfd = mirgetdata(mf); 
    vol = rms (mfd, 1); % obliczenie głośności ramki (RMS)
    vol = vol / max (vol); % normalizacja
    meanVol = mean (vol);
    rms_sr = length (vol) / t;
    secondToFirstHalfRatios = [];
    blockLengthSamples = round(blockLengthSeconds * rms_sr);
    for k = 1 : length (vol) - 2 * blockLengthSamples               
        firstHalf = vol(k : k + blockLengthSamples);
        secondHalf = vol(k + blockLengthSamples : k + 2 * blockLengthSamples);
        normalizationFactor = mean (secondHalf) / meanVol;      
        secondToFirstHalfRatios (end + 1) = (mean (secondHalf) / mean (firstHalf)) * normalizationFactor;       
    end
    secondToFirstHalfRatios = secondToFirstHalfRatios / max (secondToFirstHalfRatios);
    [maxRatioValue, maxRatioIndex] = max (secondToFirstHalfRatios); % znalezienie największego kontrastu dynamicznego
    wyniki(f).kto = d(f).name;
    wyniki(f).co  = (maxRatioIndex + blockLengthSamples) / rms_sr + 1/rms_sr;
    wyniki(f).co = wyniki(f).co + offset_ ;
    if strcmp (wyniki(f).kto, 'dyrygent-1-audio.mp3')
        wyniki(f).co = 34;
    end
end
wynikiJSON = jsonencode (wyniki);
fid = fopen('cdurWyniki.json', 'w');
fwrite(fid, wynikiJSON , 'char');
fclose(fid);

Przykładowe wyniki analizy:

[{"kto":"altowka-1-audio.mp3","co":26.61901242571583},{"kto":"altowka-2-audio.mp3","co":26.474209774848983},{"kto":"altowka-3-audio.mp3","co":32.705640444129457},{"kto":"altowka-4-audio.mp3","co":37.577498696461831},{"kto":"altowka-5-audio.mp3","co":26.917402955393445},{"kto":"altowka-6-audio.mp3","co":31.951773641102008},{"kto":"altowka-7-audio.mp3","co":17.333873383291245},{"kto":"altowka-8-audio.mp3","co":35.224311688311687},{"kto":"dyrygent-1-audio.mp3","co":34},{"kto":"kontrabas-1-audio.mp3","co":34.774125854918012},{"kto":"kontrabas-2-audio.mp3","co":31.775332464146022},{"kto":"kontrabas-3-audio.mp3","co":31.844529513668821},{"kto":"kontrabas-4-audio.mp3","co":25.195281241778481},{"kto":"kontrabas-5-audio.mp3","co":31.593903274777702},{"kto":"kontrabas-6-audio.mp3","co":32.818909463046467},{"kto":"kontrabas-7-audio.mp3","co":29.169112419400054},{"kto":"kontrabas-8-audio.mp3","co":36.106365099534095},{"kto":"skrzypce-1-audio.mp3","co":23.038779062659312},{"kto":"skrzypce-10-audio.mp3","co":29.655322101495781},{"kto":"skrzypce-11-audio.mp3","co":27.703624316669959},{"kto":"skrzypce-12-audio.mp3","co":35.098849978383051},{"kto":"skrzypce-13-audio.mp3","co":41.267377950210147},{"kto":"skrzypce-14-audio.mp3","co":27.676384248808628},{"kto":"skrzypce-15-audio.mp3","co":27.796494357542851},{"kto":"skrzypce-16-audio.mp3","co":27.82224510875621},{"kto":"skrzypce-17-audio.mp3","co":29.719661340061677},{"kto":"skrzypce-18-audio.mp3","co":28.166797864225781},{"kto":"skrzypce-19-audio.mp3","co":36.404179471419795},{"kto":"skrzypce-2-audio.mp3","co":40.997981631550516},{"kto":"skrzypce-20-audio.mp3","co":27.1761107266436},{"kto":"skrzypce-21-audio.mp3","co":32.280853705555224},{"kto":"skrzypce-22-audio.mp3","co":28.475388716514445},{"kto":"skrzypce-23-audio.mp3","co":26.639085841694541},{"kto":"skrzypce-24-audio.mp3","co":27.366918142160639},{"kto":"skrzypce-3-audio.mp3","co":45.802705087798287},{"kto":"skrzypce-4-audio.mp3","co":26.047169924812032},{"kto":"skrzypce-5-audio.mp3","co":27.900271886895048},{"kto":"skrzypce-6-audio.mp3","co":27.79899259259259},{"kto":"skrzypce-7-audio.mp3","co":26.125157656804433},{"kto":"skrzypce-8-audio.mp3","co":31.377783466666667},{"kto":"skrzypce-9-audio.mp3","co":27.990139293812764},{"kto":"wiolonczela-1-audio.mp3","co":15.584760942760944},{"kto":"wiolonczela-2-audio.mp3","co":32.071111111111108},{"kto":"wiolonczela-3-audio.mp3","co":28.975326493028149},{"kto":"wiolonczela-4-audio.mp3","co":25.844731255265376},{"kto":"wiolonczela-5-audio.mp3","co":26.875029775844766},{"kto":"wiolonczela-6-audio.mp3","co":28.390839694656488},{"kto":"wiolonczela-7-audio.mp3","co":25.921732285314818},{"kto":"wiolonczela-8-audio.mp3","co":21.071557526546492}]

Przykłady wyników analizy ruchu wykonawców – bardziej aktywni wykonawcy otrzymywali większe „kafelki” w video:

Iga Murawska – kontrabas

Danuta Augustyn – skrzypce

Lokalizacja twarzy (w celu centralizacji obrazu wykonawcy)

Iga Murawska – kontrabas

Danuta Augustyn – skrzypce

Piotr Rachwał – skrzypce


Autorstwo programu komputerowego: Marcin Strzelecki