Cinelerra
je prost programski
paket za nelinearno več stezno montažo
avdia in videa v operacijskem sistemu Linux. Omogoča celostno urejanje,
kot tudi kompozicijo in posebne avdio in video učinke. S svojimi
lastnostmi se uvršča med zahtevnejše tovrstne
programe, saj podpira viskoresolucijski video (HDTV), večkanalni zvok,
YUV in RGB barvne prostore v 16 bitni natančnosti in plavajoči vejici,
obdelavo zvoka v dvojni natančnosti, upodabljanje v ozadju in uporabo
računalniških gruč za hitrejše upodabljanje
(renderfarms).
Kljub kvalitetam so nekateri deli programa nedodelani ali slabo
delujoči. Med drugim sta slabo izvedena vtičnika za kontrolo
višine zvoka (pitch) in za časovno raztezanje oziroma
krčenje brez spremembe višine. Trenutna kvaliteta izvedbe
teh vtičnikov je razvidna iz primerov.
Cilj
Cilj je kvalitetno izvesti
učinka spreminjanja višine zvoka (Pitch control) in
spreminjanja dolžine brez spreminjanja višine (Timestretch)
kot vtičnika za program Cinelerra.
Pogoji izvedbe so:
- delovanje kot domač (native)
vtičnik
- v realnočasovnem načinu
(Cinelerra pozna tudi nerealnočasovni
način)
- prenosljiva izvedba
V svetu prostega programja za ta namen že poznamo knjižnico
Soundtouch,
ki omenjeno funkcionalnost ponuja skozi enostaven API,
to knjižnico uporablja večina prostih programov namenjenih montaži
zvoka. Uporaba takšne knjižnice s stališča
seminarske naloge kot dela študijskega procesa DPS seveda ni
smiselna.
Možni
pristopi
Problema spreminjanja višine zvoka in raztezanja zvoka brez
spreminjanja višine sta tesno povezana.
V kolikor privzamemo, da je prevzorčenje zvočnega odseka že
rešen problem je razvidno, da lahko z univerzalnim
algoritmom za spreminjanje višine zvoka in prevzorčevalnikom
izvedemo spreminjanje dolžine brez spreminjanja višine
(sprememba tempa oziroma hitrosti govora). In obratno v kolikor lahko
spreminjamo dolžino brez spreminjanja
višine zvoka lahko skupaj s prevzorčevalnikom zlahka
izvedemo funkcijo spreminjanja višine.
Očitno lahko torej iz kvalitetne izvedbe enega izpeljemo izvedbo
drugega. Vprašanje je le kateri od obeh problemov je
izvedbeno enostavnejši in kvalitetnejši.
Seveda se izkaže, da je odgovor - kot vedno pri ohlapno definiranih
problemih: "odvisno od podatkov".
Najbolj popularni osnovni rešitvi problema sta dve:
PSOLA (Pitch Synchronous Overlap Add)[1], ki se izvaja v časovni domeni
in na drugi strani spreminjanje višine zvoka v frekvenčnem
spektru (rešitev imenovana tudi phase vocoder).
PSOLA (seštevanje prekrivkov skladno z osnovnim tonom)
Obdelava v časovnem spektru poteka tako, da glede na močno
fundamentalno frekvenco poskušamo na vsako periodo signala
postaviti okno, ki ima sredino poravnano z najvišjo točko
ter se razteza levo in desno dlje od osnovne periode. Frekvenco signala
nato dvignemo tako, da okna sestavimo bližje skupaj oziroma
znižamo tako, da jih razmaknemo, ob tem pa določena okna podvojimo
oziroma zavržemo, da ohranimo dolžino signala.
Ker se signal v kratkem času enega okvirja ne spremeni bistveno lahko z
pazljivo izbiro točk prekrivanja in izvedbo ustreznih mehkih prehodov
dosežemo učinek spreminjanja višine zvoka.
Tak pristop deluje dobro na monofoničnih signalih in
človeškem govoru, medtem, ko ima pri signalih z veliko
šuma težave, saj je iskanje fundamentalne frekvence
nezanesljivo. Enak problem se pojavi pri polifoničnih signalih.
Na drugi strani obstajajo metode, ki delujejo v frekvenčni domeni. Z
uporabo Fourierjeve transformacije se odsek zvoka iz časovne domene
pretvori v opis v frekvenčni domeni. V tej obliki ni težko ustrezno
premakniti vsake frekvenčne komponente in signal zopet pretvoriti v
časovno domeno. Seveda pa so detajli metode nekoliko bolj zapleteni,
saj se spopadamo v osnovi z dvema problemoma - delo v frekvenčnem
spektru ni natančno časovno locirano in na drugi strani diskretna
fourierjeva transformacija zaradi svoje diskretnosti povzroča
nepravilno določanje izvornih frekvenc. Omenjene učinke je mogoče z
nekaterimi tehnikami opisanimi kasneje omiliti.
Obstajajo še drugi algoritmi, ki so variacije zgornjih
pristopov ali pa uporabljajo še druge vrste transformacij.
Na žalost je večina algoritmov v komercialnih aplikacijah za obdelavo
zvoka poslovna skrivnost. Tako naj bi nekateri uspešno
uporabljali wavelet transformacijo (orodje Dirac), drugi pa za človeku
naravno prilagajanje tonske višine uporabljajo nevronske
mreže (MCFE - Multi Component Feature Extraction) ipd.
Odločitev
za frekvenčno domeno
V splošnem je metoda PSOLA kompleksnejša in
zahteva več pazljivega uravnavanja algoritmov, še posebno za
delo v realnem času - hevristika pri iskanju primernih oken ipd. Na
drugi strani je metoda v frekvenčnem prostoru nekoliko
enostavnejša, vendar zahteva dodatno procesiranje, da se
izognemo nekaterim neizogibnim lastnostim diskretne fourierjeve
transformacije.
Implementirana
metoda
Implementiral sem metodo spreminjanja višine tonov s pomočjo
pretvorbe v frekvenčni prostor. Najprej vhodni signal razdelim na
prekrivajoča okna (npr. 75% prekrivanje) relativno kratke dolžine (npr.
4096 vzorcev), nato na oknu apliciramo Hannovo okno in pretvorimo s
hitro fourierjevo transformacijo
v frekvenčni prostor, v zapisu v
frekvenčnem prostoru ustrezno premaknemo frekvence in izvedemo inverzno
fourierjevo transformacijo. Na izhodu nato še enkrat
uporabimo Hannovo okno in zopet z enako mero prekrivanja kot na vhodu
seštevamo zaporedno izračunana okna.
 |
| Shematski
prikaz postopka |
Seveda se bistvo implementacije skriva v njenih detajlih. Najprej se
posvetimo prekrivanju. Lastnost operacij v frekvenčnem spektru je, da
so slabo lokalizirane v časovnem. To pomeni, da bi brez uporabe
prekrivanja oken vsako okno tvorilo svoj neodvisen signal. Prva očitna
posledica tega bi bila diskontinuiteta faze na meji med vsakim oknom.
Prav tako pa bi se pokazale druge nezaželene spremembe v signalu. Oboje
omilimo tako, da enak del signala vzorčimo z večimi zaporednimi
okvirji, nato vsak okvir obdelamo kot smo povedali prej, nato pa
okvirje na koncu spet prekrivno združimo na mehak način - z uporabo
Hannovega okna[4]. Tako dobimo povečano časovno resolucijo, kljub temu,
da operacije skaliranja frekvenc opravimo v frekvenčnem prostoru, ki je
slabo časovno lokaliziran.
Pojavi se le problem učinkovitosti, za 50% prekrivanje med okvirji
potrebujemo dvakrat več procesiranj oken, za 75% že
štirikrat več in tako naprej. Število potrebnih
okvirjev se tako eksponentno veča z dolžino prekrivanja med njimi.
Glede na to, da je fourierjeva transformacija kljub uporabi
optimizirane knjižnice relativno počasna si lahko v realnočasovnih
pričakovanjih dela z Cinelerro zaenkrat privoščimo le
prekovzorčenja do stopnje 8.
Z prekovzorčenjem tako zmanjšamo nekatere artefakte, ki
nastanejo zaradi obdelave signala v frekvenčnem prostoru. Vendar pa
moramo prebroditi še eno nekoliko zapletenejšo
težavo.
Ker uporabljena fourierjeva transformacija deluje na diskretni osnovi
se pojavi problem v kolikor signal ne pade neposredno na frekvenco, ki
jo predstavlja vsak vzorec v diskrentem frekvenčnem prostoru, temveč
nekje na mejo dveh diskretnih frekvenc. V tem primeru se nam bo signal
v diskretnem frekvenčnem prostoru kazal kot množica šibkih
signalov okoli točke, kjer bi moral biti lociran v zveznem spektru. V
kolikor nad takšnim razmazanim signalom izvedemo povečavo
frekvence se izkaže, da končni signal v časovni domeni vsebuje
artefakte, ki dajejo občutek kot, da se je izvor zvoka premaknil daleč
od mikrofona.
 |
 |
| FFT
signala, ki pada neposredno na koš |
FFT
signala, ki pade med dva koša |
| Vir slik:
dspdimension.com |
S. M. Bernsee na
svoji spletni
strani dokumentira način kako
lahko z
dodatnim procesiranjem relativno natančno ugotovimo frekvence v
izvornem signalu in jih nato skaliramo brez povzročanja dodatnih
artefaktov v končnem signalu.
Bistvo metode leži v tem, da lahko iz opazovanja zamika faze
posameznega koša v diskretnem prostoru frekvenc, ko ga
gledamo skozi časovno napredujoče okvirje predvidevamo koliko je
resnična frekvenca signala oddaljena od središčne frekvence
diskretnega koša.
Na ta način lahko za vsak koš v diskretnem prostoru frekvenc
izračunamo verjetno resnično frekvenco, ki se pojavlja v izvornem
signalu. Nato frekvence skaliramo na enak način kot v osnovnem primeru,
vendar vodimo ločeno evidenco o fazi tako skaliranih frekvenc. S
spremljanjem in prilagajanjem faze poskrbimo, da so tudi skalirani
koši ustrezno naravnani na skalirano vrednost verjetne
resnične frekvence v izvornem signalu.
Metoda skaliranja frekvenc na ta način je opisana na spletni
strani
dspdimension.com.
Implementacija
vtičnikov
Cinelerrini vtičniki si medsebojno delijo infrastrukturo za izvajanje
operacij s pomočjo FFT. Na žalost se izkaže, da je ta infrastruktura
šibka - podpira le dvakratno prevzorčenje, prav tako ne
podpira apliciranja Hannovega oziroma kakega drugega okna pred oziroma
po transformaciji, poleg vsega pa je sama rutina FFT izvedena na
neoptimiziran način.
Najpreprosteje je bilo razširiti obstoječ objekt namenjen
obdelavi v frekvenčnem prostoru z običajnimi naprednimi funkcijami -
poljubno prekovzorčenje in uporaba poljubnih oken. Poleg tega sem za
izvedbo FFT uporabil zunanjo knjižnico FFTW [6], ki slovi po svoji
hitrosti. Ob uporabi knjižnice
FFTW3 je
bilo potrebno rešiti
še pomanjkanje nadzora nad deljenjem pomnilnika pri uporabi
večnitnosti, saj je Cinelerra program, ki krepko izkorišča
možnost večnitnosti.
Po uspešni izvedbi vtičnika "Pitch shift" se je koda le tega
uporabila za vtičnik "Timestrech", ki razteza oziroma krči dolžino
zvočnega odseka, brez spreminjanja višine njegovih tonov.
Slednje se doseže najprej s prevzorčenjem za ustrezen faktor, nato pa
višanjem frekvenc v primeru podaljšanja oziroma
nižanjem frekvenc v primeru krčenja s pomočjo metode "Pitch shift".
Primerjava končnih izhodov izvornih vtičnikov z izhodi novih dveh
vtičnikov pokaže visoko slušno izboljšavo. Trdim
lahko, da sta nova vtičnika uporabna v vsakdanji rabi.
Prenoveljena implementacija obeh vtičnikov se nahaja
v datoteki diff,
ki je relativna na
stanje Cinelerra CVS. Oba vtičnika sta sedaj že del standardne CVS
različice Cinelerre.
Datoteke:
Primer delovanja starega in novega vtičnika Pitch shift.
Primer delovanja starega in novega vtičnika Timestretch
Nadaljnja
razmišljanja
Eden največjih problemov učinka "pitch shift" se pojavi pri
spreminjanju višine tonov v govoru ali petju. V kolikor
človek določeno noto zapoje oktavo višje se sicer osnovna
frekvenca petja pomakne za oktavo, medtem pa se ustvarjanje nekaterih
drugih frekvenc v glasu ne pomakne za enako razmerje. Gre za tako
imenovane formante, ki so bistveni za razumevanje govora. V kolikor na
enak način premaknemo vse frekvence v signalu, ki predstavlja govor ali
petje, bomo ob poslušanju dobili tako imenovan vtis "miki
miška".
Metode s katerimi je mogoče položaje formantov ohranjati tudi pri
dvigovanju oziroma spuščanju frekvence govora že obstajajo,
a so v precejšnji meri poslovne skrivnosti.
Reševanje tega problema bi bilo krepko preko obsega te
seminarske naloge, zato sem se z njem le bežno seznanil. Morda bi bilo
zanimivo poskusiti najbolj trivialen način vtisa formantov nazaj v
signal - množenje z normalizirano osnovno frekvenčno sliko.
Zanimivo pa je, da ta problem ob raztegovanju oziroma krčenju zvočnih
signalov izgine, saj prevzorčenje izniči vpliv premika v frekvenčnem
prostoru, kar pomeni, da so frekvence formatnov po izvedenem učinku
raztegovanja/krčenja zopet na svojih izvornih mestih. Vseeno pa tudi v
tem primeru govor ni upočasnjen na 'naraven' način na
kakršnega bi govoril človek, a to je zopet novo področje
raziskovanja.
Trenutna slabost obeh vtičnikov je tudi v nezmožnosti spreminjanja
višine tonov skozi čas - skozi celoten obdelovan odsek zvoka
se količina spremembe tonov ne sme spreminjati. Lastnost algoritma je
namreč, da s spreminjanjem faktorja premika frekvenc izgubimo stik z
ustreznimi beležniki faz. Verjetno bi bilo s sledenjem fazam na
drugačen način možno izvesti mehko spreminjanje frekvenc oziroma
raztezanja zvoka. Na članke oziroma diskusije na to temo nisem naletel,
kar verjetno pomeni, da je vsaj pri prosto dostopnih algoritmih to
še neobdelano področje.
