KurssiRaportti < KitWiki < TWiki
TWiki> KitWiki Web>HyKpk322s2007PuheenAnalyysi>KurssiRaportti (2007-12-04, MikkoVuorinen) EditAttach
Kpk322/FS1. Puheen analyysi - Kurssiraportti
Kepstrianalyysin ja f0-taajuuden analyysi
On olemassa lähtökohtainen tarve ja motivaatio (ks. käyttökohteet) saada eroteltua (puhe)signaalista sille ominaisia ja olennaisia piirteitä. Näitä piirteitä ovat signaalin perustaajuus (eli f0-taajuus) ja muut äänienergiakeskittymät (näiden intensiteetti,kaistanleveys ja taajuus). Tapoja näiden piirteiden selvittämiseen on useita, mm. kepstrianalyysi, autokorrelaatio ja LPC (Linear Predictive Coding).
Kaistanleveys (bandwidth):
Spektrissä esiintyvän huipun leveys Hz-arvoina mitattuna huipusta 3 dB alaspäin
http://www.cslu.ogi.edu/toolkit/old/old/version2.0a/documentation/csluc/node5.html
F0-taajuuden analyysi
F0-taajuus on taajuus, jonka monikertojen avulla voidaan esittää signaalin kaikki muut taajuudet. "Formantti" on vahvistunut osasävel äänestä. F0-taajuus määrittelee äänteen äänenkorkeuden ja täten siis myös muiden formanttien korkeuden. Toisin sanoen, puheen laskennallinen perustaajuus on suhteessa puheen havaittuun sävelkorkeuteen, joka taasen on erittäin tärkeä, jopa hallitseva piirre puheessa. Sen määritteleminen automaattisesti, matemaattisin keinoin on siis olennaista puheen analyysissa.
On huomattava, että soinittomia äänteitä tuottaessa äänihuulet eivät värähtele toisiaan vasten. Tällöin perustaajuusanalyysi ei voi löytää äänestä tarpeeksi periodisuutta määritelläkseen perustaajuuden korkeuden.
Kepstrianalyysi
Kepstrin voi ajatella olevan tietoa erilaisten spektritaajuuksien muutosnopeudesta. Puheen kepstristä saadaan selville puheen perustaajuus ja estimaatti ääni-väylälle. Kepstri lasketaan siten, että puheen spektrin logaritmi muunnetaan takaisin aika-alueeseen. Soinnilliset äänteet synnyttävät kepstriin piikin, jonka etäisyys origosta määrää perustaajuuden. Loput kepstristä vastaa ääniväylän impulssivastetta. Kepstri-analyysia käyttävä vokooderi kutsutaan homomorfiseksi vokooderiksi.
Kepstri on (käänteinen) Fourier-muunnos spektristä (kaksinkertainen Fourier-muunnos aaltomuodosta). Vaaka-akselilla kuvataan quefrency-arvoa (quefrency = frequency "väärinpäin"), joka kuvaa kepstraalisessa esityksessä alkuperäisen signaalin taajuutta ja on tavallaan käänteinen ajan suhteen. Eli mitä suurempi x:n arvo taajuuspiikillä on, sitä matalampaa taajuutta quefrency kuvaa.
Alemmassa kuvassa quefrencyn arvon T kohdalla oleva piikki kuvaisi ylemmän kuvan spektrin perustaajuutta. Jos T:n arvo olisi esimerkiksi 10 millisekuntia, olisi perustaajuus 100 Hz (1/T).
Esitys kepstrianalyysista:
Wakita (1996)
B. P. Bogert, M. J. R. Healy, and J. W. Tukey: "The frequency analysis of time series for echoes: cepstrum, pseudo-autocovariance, cross-cepstrum, and saphe cracking". Proceedings of the Symposium on Time Series Analysis (M. Rosenblatt, Ed) Chapter 15, 209-243. New York: Wiley, 1963
MFCC:t toimivat puheen (tai puhujan) tunnistuksessa akustisina piirrevektoreina. Nykyään MFCC:itä on käytetty myös musiikin analysoinnissa esim. genren määrittelyssä (http://en.wikipedia.org/wiki/Mel_frequency_cepstral_coefficient). Myös f0:aa, eli perustaajuutta voidaan käyttää puheen tunnistuksessa etenkin ns. toonikielien kohdalla. Chazan et. al (2000) ovat myös käyttäneet näitä piirteitä puheen rekonstruktiossa. Puheen (ja puhujan) tunnistukselle on monia käytössä olevia ja mahdollisia soveltamisalueita on lukuisia. Puhujan tunnistuksen kohdalla puhutaan usein puhujan identifikaatiosta ja verifikaatiosta. Identifikaatiossa tuntematon puhuja tunnistetaan tunnettujen puhujien joukosta, verifikaatiossa puhujan henkilöllisyys "vahvistetaan". Puhujan tunnistusta voidaan tehdä automaattisesti tai auditiivisesti, tässä työssä puhujan tunnistuksella tullaan tarkoittamaan automaattista puhujan tunnistusta. (Tämä kahtiajako automaattisen ja auditiivisen väkillä on tosin karkein mahodllinen).
Verifikaatiota käytetään esim. kulunvalvontasovelluksissa. Lisäksi on olemassa esim. pankkipalveluja, joissa asiakas pääsee käsiksi tilitietohinsa puhelimen avulla ja henkilöllisyys vahvistetaan äänestä (mahdollisen salasanan lisäksi). Eräs kulunvalvontasovellus on Joensuun yliopistossa kehitetty Doorsprofiler, joka koeluontoisesti valvoi tietyn hissin käyttöä http://users.utu.fi/tuiisa/work/raportit/raportti_final.pdf
Identifikaatota tehdään mm. rikostutkinnassa, jossa tiettyä henkilöä etsitään rajatusta joukosta. Puhujan tunnistus on maailmalla ns. nouseva ala ja Suomessakin on tehty tutkimusta aiheesta. Automaattiata puhujan tunnistusta pähkinänkuoressa:
http://joypub.joensuu.fi/publications/masters_thesis/kinnunen_automaattinen
http://www.ll.mit.edu/IST/pubs/aaas00-dar-pres.pdf
Puheen tunnistusta käytetään mm. sovelluksissa, jotka muuttavat puhetta kirjoitetuksi tekstiksi. Mahdollinen (ja osittain käytetty) sovellusalue on myös puheella toimivat (puheella käytettävät) käyttöliittymät. Eräs puheella toimiva käyttöittymä on Tampereen yliopistossa kehitetty Matkamies, puheella toimiva reittiopas http://www.uta.fi/ajankohtaista/tiedotteet/2007/67.html
Puheen käsittelyn algoritmeja voidaan käyttää myös tiedostonsiirrossa ja -pakkauksessa.
Toteutuksen matematiikkaa
Fourier-muunnos lähtee siitä, että mikä tahansa säännöllinen funktio voidaan esittää toisien, siniaaltoisten funktioiden integraalina. Fourier-muunnoksessa siis muutetaan aika-avaruus -signaali taajuusavaruuteen. Alkuperäistä signaalia kuvaa taajuuskomponenttien (sinikomponenttien) taajuus ja vaihe tietyssä (kompleksissa) pisteessä.
Konvoluution Fourier'n muunnos vastaa suoraan konvoloitavien funktioiden Fourier'n muunnosten kertolaskua: konvoluutio:
Hyvin tärkeä kepstraalisen tason ilmiö on se, että kahden signaalin konvoluutio voidaan ilmaista niiden kepstrien yhteenlaskuna:
Autokorrelaatio kuvaa periaatteessa kahden peräkkäisen havainnon samankaltaisuutta. Usein puhutaan myös autokovarianssista, eli lähinnä signaalin sisäisestä samankaltaisuudesta. Autokorrelaatiota voidaan käytää löytämään mm. perustaajuus signaalista, josta on saatavilla vain osasäveliä tai ylipäätään löytämään periodinen signaali kohinasta/melusta. Autokorrelaatio on toisin sanottuna viiveen funktio, siinä missä FFT on taajuuden funktio, vaikka kummatkin tavat ovat käyttökelopisimpia signaalin analysointitapoja. Signaalin s(n) autokorrelaatio r(k) määritellään
∑s(n)s(n − k)
Ikkunoinnissa signaali jaetaan lyhyempiin, ehkä jopa päällekkäisiin osiin. Signaalia käsitellään näytteittäin kertomalla näyte kerrallaan ikkunointifunktiolla.
Tuloksena saadaan äärellisen mittaisia ja "painotettuja"/suodatettuja versioita alkuperäisistä näytteistä. Seuraavassa esitellään joitain ikkunointifunktioita/ikkunointityyppejä.
Ikkunatyyppejä:
Ikkunointikaavoja:
= diskreettiaikaisen ikkunafunktion leveys näytteissä
on vakio välillä
Hamming ikkuna
Hann ikkuna
Gaussin ikkuna
Kolmioikkuna
suorakulmainen ikkuna
Ikkunointifunktion vaikutusta näytteeseen havainnollistaa oheinen kuva
Puheen käsittelyssä käytetään usein "pehmeitä" ikkunointimetodeja (esim. hamming, hann) eikä niinkään suorakulmaisia ikkunoita. Esimerkiksi kurssin python- tiedostoissa on on käytetty hamming- ikkunaa. (http://www.cs.tut.fi/sgn/arg/8003051/ikkunointi.pdf) Oheinen lähde on myös hyvä johdatus ikkunointiin.
Toteutus Pythonilla, tiedostojen kuvaukset
cepstral_fo.py
http://forums.csc.fi/kitwiki/pilot/viewfile/KitWiki/KurssiRaportti?rev=1;filename=cepstral_f0.py.txt
Perustaajuuden hakeminen kepstrianalyysin avulla (Pitch tracking). Koodia on muokattu siten, että näytteenottotaajuutta sekä f0:n maksimitaajuutta on mahdollista vaihtaa. Ohjelma käyttää Hamming-ikkunointia.
Ohjelman käynnistys: python cepstral_f0.py <input_file> [sampling rate] [upper limit]
input_file: äänitiedoston nimi
sampling rate (optionaalinen): näytteenottotaajuus, oletusarvo 16000 samples/sec
upper limit (optionaalinen): maksimitaajuus, josta f0:aa etsitään, oletusarvo 180 Hz
Ohjelma tulostaa f0:n arvon 80 näytteen välein. Ongelmana on se, että f0 lasketaan myös soinnittomista signaalin osista, jolloin f0:n arvo vaihtelee melkoisesti.
autocorr_f0.py
http://forums.csc.fi/kitwiki/pilot/viewfile/KitWiki/KurssiRaportti?rev=1;filename=autocorr_f0.py.txt
f0:n laskeminen autokorrelaation avulla.
Ohjelman käynnistys: python autocorr_f0.py <input_file> <output_file> [sampling rate] [min f0] [max f0]
output_file: kirjoitustiedoston nimi
min f0 (optionaalinen): f0:n minimiarvo, oletusarvo 80 Hz
max f0 (optionaalinen): f0:n maksimiarvo, oletusarvo 180 Hz
Ohjelma laskee äänitiedoston f0:n autokorrelaation avulla. Koodiin on lisätty mahdollisuus vaihtaa tarvittaessa sekä näytteenottotaajuutta että f0:n oletettuja minimi- ja maksimiarvoja. Oletusarvoiset 80 Hz ja 180 Hz eivät välttämättä sovi kaikille puhujille.
Ohjelma laskee f0:n arvon jokaiselle näytteelle, joten se on melko hidas isojen tiedostojen kanssa. Lopuksi se kirjoittaa f0-signaalin output_file-tiedostoon. Ohjelmaan on lisätty saadun f0-jonon printtaus, joten f0-arvon lukemiseksi ei tarvita mitään erillistä ohjelmaa tai binääritiedoston tutkimista.
Jatkokehitysideoita, pohdintaa aiheesta / työstä
Hieno projekti olisi tehdä kokonaisuus: analyysi -> tiedonsiirto -> syntetisaatio
Toinen hieno projekti olisi esim. tehdä annotaatioita ja äänitiedostoja lukeva ohjelma, joka tulostaisi äänenkorkeuden rinnakkain sen perustaajuuskäyrän kanssa. Tämän saa tietysti suoraan Praatistakin mutta pyörä pitää aina keksiä uudelleen.
txt autocorr_f0.py.txt manage 2.7 K 2007-12-02 - 19:25 UnknownUser
txt cepstral_f0.py.txt manage 2.7 K 2007-12-02 - 19:23 UnknownUser
Topic revision: r37 - 2007-12-04 - MikkoVuorinen