Kazalo:
Avtorstvo: Andraž Tori, september 2005 Creative Commons License
To delo je licencirano z licenco Creative Commons Attribution 2.5.
Spreminjanje višine in raztezanje zvoka
v Cinelerri

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.

skica postopka
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.


s1 s2
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.

Izvorna datoteka
Izsek iz Titovih govorov
Višina 150%, star algoritem Višina 50%, star algoritem
Višina 150%, nov algoritem Višina 50%, nov algoritem


Primer delovanja starega in novega vtičnika Timestretch

Izvorna datoteka
Izsek iz Titovih govorov
Dolžina 150%, star algoritem Dolžina 50%, star algoritem
Dolžina 150%, nov algoritem Dolžina 50%, nov algoritem

 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.


Valid XHTML 1.0! Valid CSS!

Cinelerra