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

Lisää aiheesta:
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.

http://www.cslu.ogi.edu/toolkit/old/old/version2.0a/documentation/csluc/node5.html

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).

cepstrum.gif

Lähteitä:
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

Käyttökohteita

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:
7778c762b32a9074cf058f7db3806800.png

Hyvin tärkeä kepstraalisen tason ilmiö on se, että kahden signaalin konvoluutio voidaan ilmaista niiden kepstrien yhteenlaskuna: b9932ef8d41e7864ae9a071e4efad98a.png

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)
n=−∞

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ä:

  • Hann
  • Hamming
  • kolmio
  • puolisuunnikas
  • suorakulmio
  • Gauss

Ikkunointikaavoja:
Selitykset:

beed584371120e11bf20723d0f22e52e.png = diskreettiaikaisen ikkunafunktion leveys näytteissä

a957404c96e59f1746f97ab668c8e1f8.png on vakio välillä e9da9de1972b5401bc886f3cbd64635b.png

Hamming ikkuna
1efd093665705a97787fb5eed03e855c.png 180px-Window_function_%28hamming%29.png

Hann ikkuna
c9fb4d8d160cf7c76648c20f25045672.png 180px-Window_function_%28hann%29.png

Gaussin ikkuna
ada213aaebbd218ca1cb091fde5c4378.png 180px-Window_function_%28gauss%29.png

Kolmioikkuna
82d3a75479c43a00a12f6c2abf675aa0.png 180px-Window_function_%28triangular%29.png

suorakulmainen ikkuna
66ce818a801786276196a57096b3fc6a.png 180px-Window_function_%28rectangular%29.png

Ikkunointifunktion vaikutusta näytteeseen havainnollistaa oheinen kuva

fig5.gif

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]

Komentoriviparametrit:

  • 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]

Komentoriviparametrit:

  • input_file: äänitiedoston nimi
  • output_file: kirjoitustiedoston nimi
  • sampling rate (optionaalinen): näytteenottotaajuus, oletusarvo 16000 samples/sec
  • 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.

Topic attachments
I Attachment Action Size Date Who Comment
Texttxt autocorr_f0.py.txt manage 2.7 K 2007-12-02 - 19:25 UnknownUser  
Texttxt cepstral_f0.py.txt manage 2.7 K 2007-12-02 - 19:23 UnknownUser  
Topic revision: r37 - 2007-12-04 - MikkoVuorinen
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2018 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback