Fonetiek : Gebruik van spraakprogrammatuur : Praat

notaties | algemeen over Praat | geen Praat maar Unix
nieuw spraakbestand maken | spraakbestand openen | segmenteren
oscillogram | spectrum | spectrogram | labelen
sinussignaal aanmaken | ruissignaal aanmaken
LPC | PSOLA | toonhoogte-meting | toonhoogte-manipulatie | duur-manipulatie
verantwoording

Tijdens de studie Fonetiek zul je regelmatig spraak-analyses uitvoeren met de computer. Daarvoor gebruiken we in de eerste plaats het programma Praat, ontwikkeld door Paul Boersma en David Weenink. Dit document is een handleiding voor Praat, voor veel-voorkomende analyses en bewerkingen.
Het programma Praat, en andere spraak-programmatuur, kan je opstarten op de Unix werkstations, in het systeemmenu (het grijze menu linksboven op het scherm), met de keus Speech prog .

Notaties

In dit document worden menu-opties, en opschriften van virtuele knoppen, op deze manier aangegeven. Met de notatie Hoofd > Sub wordt bedoeld: kies eerst Hoofd uit hoofdmenu (meestal bovenin het venster), kies dan Sub uit submenu dat onder keuze Hoofd verschijnt. (Deze menu-keuzes selecteer je meestal door er met de muis op te klikken.) Commando's of formule's die je moet intypen zijn aangegeven in typeletter; informatie die je zelf in het commando moet invullen is aangegeven tussen {accolades}. Een voorbeeld: De formule

sin(2*pi*{freq}*x)

moet je opgeven voor het synthetiseren van een sinus met frequentie freq. Commando's moeten worden afgesloten met Enter, CR, of Return; deze afsluiting wordt in dit document verder niet in de commando's aangegeven.

Algemeen over PRAAT

Raadpleeg ook de Engelstalige introductie voor Praat, geschreven door Sidney Wood.
Na het opstarten opent Praat met twee vensters: een object-venster (Objects, meestal links), en een teken-venster (Picture, meestal rechts).
object-venster
Praat beschouwt alle signalen, en de daarvan afgeleide representaties, als objecten. Objecten zijn er van verschillende typen, bv. Sound, Spectrum, Spectrogram, LPC, Formant, Pitch. Ieder object heeft zijn eigen bewerkingen die erop mogelijk zijn; als je een object van een ander type selecteert (zie hierna), dan veranderen ook de beschikbare knoppen ('dynamic menu').

Een Sound-object is een digitaal geluidsfragment ('sampled data', amplitude-bemonsteringen). Mogelijke 'bewerkingen' zijn Edit, Play, Analysis, enz. Sommige van deze bewerkingen leveren weer objecten op; het resulterende type hangt af van de bewerking. Je kan Sound-objecten inlezen van en wegschrijven naar Unix-files met de opties Read en Write uit het menu van het object-venster.

Een Analysis-object is het resultaat van meerdere (voorgeprogrammeerde) analyses op een Sound object. (In feite is het een complex object, samengesteld uit objecten van andere typen). Mogelijke bewerkingen zijn Edit, Play, enz. Je kan Analysis-objecten bewerken (kies Edit), en het resultaat weer resynthetiseren naar een Sound-object.

Voordat je iets doet met een object, moet je het eerst selecteren door erop te klikken in het object-venster, met de linkermuisknop. Meerdere objecten selecteren doe je door de Ctrl-toets of Shift-toets in te drukken, en dan te klikken met de linkermuisknop. (Ontdek zelf waarin de werking van de Ctrl-toets verschilt van die van de Shift-toets!)

Alle objecten kun je bewaren of wegschrijven met de optie Write in het object-venster. Sound-objecten kan je het beste wegschrijven naar bestanden in AIFF of AIFC formaat (op SGI werkstations) of in WAV formaat (op PC's met MS-Windows). Tegenwoordig kan de meeste programmatuur echter goed overweg met alle formaten geluidsbestanden. (Maar niet met de extra informatie die AIFF-bestanden kunnen bevatten, zoals transcripties). Bij andere objecten (niet-Sounds) is het aan te raden om het type object als extensie op te geven; het Analysis-object panorama3 bewaar je dan dus in bestand panorama3.Analysis).
Geluidsbestanden en eerder bewaarde objecten kun je weer inlezen met de optie Read > Read from file... in het object-venster. Over alle objecten kun je informatie krijgen via de optie Info, in het onderste menu in het object-venster. Objecten kun je weggooien met de knop Remove, in hetzelfde knoppen-menu in het object-venster.

teken-venster
Teken-opdrachten worden uitgevoerd in het picture-venster. De afbeelding wordt zo gemaakt dat het resultaat past in het geel geselecteerde deel van dat venster, de zgn. viewport. Door de viewport te verplaatsen na een teken-opdracht kan je meerdere en verschillende afbeeldingen in één venster krijgen. Het picture-venster wordt afgedrukt met de optie File > Print uit het picture-venster.

Dit commando werkt via een Unix print-commando, en het commando werkt alleen met PostScript printers, d.w.z. printers die de programmeertaal PostScript begrijpen.
Welk Unix-commando Praat gebruikt, kan je instellen met Control > Preferences > Set print command... in het controle-venster.
Let op: De default-instelling werkt niet goed in Utrecht. Kies de instelling lpr %s danwel lpr -Php_ps_10_2 %s.
Op de SGI werkstations kan je het picture-venster ook afdrukken via het systeemmenu (toolchest, linksboven): Tools > Printing > Dump X-Window. De beeld-resolutie is dan echter een stuk slechter (nl. 75 of 100 dots per inch) dan bij afdrukken via PostScript (600 dpi).

Het venster kan ook bewaard worden als een PostScript-bestand, d.w.z. een PostScript-programma dat de uiteindelijke afbeelding reproduceert. Deze PostScript-bestanden kan je ook importeren in MS-Word; je afbeelding wordt dan opgenomen in een Word-document. NB: Alleen Engelstalige versies van MS-Word kunnen PostScript importeren (dank aan MicroSoft)! Raadpleeg desgewenst de aanwijzingen om PostScript afbeeldingen in MS Word te importeren.

Tenslotte kan je een afbeelding ook "bewaren" op een andere manier, nl. als de reeks handelingen die je hebt uitgevoerd om de uiteindelijke afbeelding te verkrijgen. Die reeks handelingen wordt een script genoemd, en ook scripts kan je bewaren.

scripts
Een krachtig aspect van Praat is dat je series van commando's kan bewaren in zgn. scripts (vergelijkbaar met macro's in sommige tekstverwerkers). Je kan eenvoudig de serie van voorafgaande commando's opslaan in zo'n script. Daartoe kies je in het control-venster Control > New script.... Dat geeft je een ScriptEditor-venster. Praat houdt de voorafgaande commando's bij in een zgn. 'history'. Deze voorafgaande commando's kopieer je naar de ScriptEditor door te kiezen Edit > Paste history. Je kan de commando's dan eventueel aanpassen. Scripts kunnen ook argumenten gebruiken, waardoor ze algemener bruikbaar zijn.
Voorbeelden van scripts kan je vinden in de Praat tutorials (Help > Tutorials), en in mijn directory /users.inspraak/quene/praat/. Als je zelf een script hebt geschreven dat ook voor anderen nuttig kan zijn, stuur mij dan een kopie (Hugo.Quene@let.uu.nl).

Praat biedt ook de mogelijkheid om een script "op te slaan" onder een zelf gedefinieerde knop. Met een klik op die knop wordt dan jouw script uitgevoerd. Kijk hiervoor in de ScriptEditor bij Help > Adding to a ? menu.


aanvang

Spraak-commando's in Unix shell

Praat is een omvangrijk programma, met veel mogelijkheden en met een rijke grafische gebruikers-interface. Voor simpele taken is het soms sneller en eenvoudiger om een "simpel" programma aan te roepen vanaf de command-line in een Unix shell. Zo'n programma heeft doorgaans minder mogelijkheden, maar werkt daardoor wel aanzienlijk sneller.
Vergelijk maar de volgende handelingen om bestand hallo.aifc in het huidige directory te beluisteren:
via Praat in Unix shell
kies Speech progr > Praat 3.8 commando usplay hallo.aifc
kies Read > Read from file...
open bestand hallo.aifc
(selecteer Sound hallo)
kies Play
Hieronder volgt een overzicht van de programma's die momenteel beschikbaar zijn, geordend naar hun functionaliteit. (De Engelstalige beschrijving is afkomstig uit de programma's zelf).
command-line speech programs
program description
Information
usinfo display information on sampled data file
sfinfo display information on soundfile
afshow display information on sampled data file
afcheck check header, labels and comments in soundfile
Play
sfplay play soundfile
usplay play sampled data file
playaiff play AIFF file
afplist play AIFF files, with pauses and beeps, from playlist
Record, Resample, Convert
usrecord record audio input into sampled data file (various audio file formats)
afinput record input into AIFF file (from text file or stdin)
usresample convert sampling rate of sampled data
afresample convert sampling rate of sampled data
sfconvert convert soundfile between audio file formats
usconvert convert sampled data file between audio file formats
Modify
afscale scale sampled data to relative or absolute level
usconcat concatenate sampled data files into one long file
usmerge merge sampled data files into one multi-channel file
afmerge merge or concatenate mono files into multi-channel or long mono file
afsplit split multi-channel file into multiple mono files
affade perform fade-in and/or fade-out of sampled data
usfilter filter sampled data file (LP, HP, BP, BR, custom FIR)
LPC
lpcana perform LPC analysis and pitch measurement on sampled data
lpcsyn perform LPC resynthesis of parametric speech data
Option -h or -u after a program name gives more help or information about its usage.

aanvang

Nieuw spraakbestand maken

Het is het mooiste als het digitale signaal van een DAT-bandje rechtstreeks, digitaal, gekopieerd wordt van DAT naar geluidsbestand. Je moet daarvoor wel de juiste instelling kiezen van de hardware, nl. digitale invoer. Start het Audio Control Panel, door in het systeemmenu linksboven op het scherm te kiezen Desktop > Control Audio. Kies in het resulterende venster Audio Control Panel de optie View, en schakel de keuze Digital In aan. Dat geeft je in het Audio Control Panel een extra mengpaneeltje, getiteld Digital In. (Meestal zijn er al twee mengpaneeltjes Analog In en Analog Out, waar het nieuwe mengpaneeltje tussen geplaatst wordt). Klik op dit (nieuwe, middelste) mengpaneeltje om het te selecteren. Kies dan Selected > Make Default Input en klaar is Kees. De hardware is nu ingesteld op audio-invoer via de digitale invoer. Op deze digitale invoer is reeds de uitvoer van de DAT-recorder aangesloten.

NB: Omdat de samples nu digitaal gekopieerd worden van DAT naar geluidsbestand (dus als getallen die samplewaarden voorstellen, niet als spanningen die geluidsdruk voorstellen), is de samplefrequentie altijd gelijk aan die van de DAT-band. Meestal is dat 48 kHz. Het verdient aanbeveling om het signaal te down-samplen naar een lagere samplefrequentie; doe dat pas nadat je het signaal hebt gedigitaliseerd (met 48 kHz) en opgeslagen als Sound object in Praat (zie hierna).

In Praat kan je makkelijk spraak opnemen van de DAT-recorder, via de (hierboven ingestelde) digitale invoer van geluidssignalen. Kies in het controle-venster New > Record Sound... Je krijgt dan een dialoogvenster. De bovenste helft daarvan is equivalent aan het mengpaneeltje in het Audio Control Panel (zie hierboven). De knop Record start de opname, Stop wijst zichzelf. Met de knop Close sluit je het dialoogvenster, zonder dat de opname bewaard wordt! De schuifbalk geeft de maximale lengte aan van een opname (afhankelijk van de omvang van de opnamebuffer, zelf in te stellen via Control > Preferences > Sound input prefs in het object-venster; zie on-line help over SoundRecorder).
De opname bestaat nu alleen binnen het SoundRecoder-venster! Als je je opname wilt bewaren, dan kan dat op twee manieren: van SoundRecorder naar geluidsbestand, of van SoundRecorder via Sound-object naar geluidsbestand. Geef de geluidsbestanden altijd inzichtelijke namen, en houd een (electronisch) logboek bij over je geluidsbestanden en hun inhoud. De extensie van een geluidsbestand dient te corresponderen met het gekozen audio-formaat. Meestal schrijven we bestanden in het AIFF/C formaat, de bijbehorende extensie is .aifc.

Bij de meeste opnamen werken we met mono-signalen, opgenomen met één microfoon op één spoor van de DAT-band. Het lege spoor hoef je uiteraard niet te bewaren als een Praat object of als een geluidsbestand.

Kijk ook even naar deze handige tip!
aanvang


Spraakbestand openen

Kies optie Read > Read from file... in het controle-venster. (Je kan ook Alt+O intypen.) Na elk van deze mogelijkheden verschijnt er een nieuw venster, de 'File Browser'. Om een lijst met alle bestanden te zien te krijgen moet je zorgen dat in het bovenste vakje (Filter) het directory-pad en de algemene specificatie is aangegeven van de gezochte spraakbestanden.

Doorgaans is dat een subdirectory onder het directory waar je inlogt. Bestanden voor het practicum Inleiding Fonetiek staan in /users.inspraak/prak/prak{nr}/data/ .

Daarna 'filter' je de lijst van mogelijke invoer-bestanden door op de knop Filter te klikken. In het vakje Files zie je dan de files in het opgegeven directory die overeenkomen met de opgegeven specificatie. Je kunt hier nu het bestand selecteren dat je wilt openen, door er met de pijltjestoetsen naartoe te gaan (cursor moet wel in het scherm staan) of door er met de linkermuisknop op te klikken. De volledige bestandsnaam verschijnt dan in het vakje Selection. (In plaats van het werken met Filter kan je ook de volledige bestandsnaam rechtstreeks in het vakje Selection intypen.) Klik tenslotte op OK om het geselecteerde bestand te openen.

Als je een geluidsbestand opent, maakt Praat automatisch een Sound object aan met dezelfde naam. Het geluidsbestand wordt ingelezen in dit Sound object; het object bevat een kopie van de inhoud van het bestand.
aanvang


Segmenteren

Hieronder verstaan we het uitknippen en bewaren van een fragment (of segment) uit een langer geluidsbestand. In alle programma's is dat alleen mogelijk nadat het betreffende bestand geopend is. Segmenteren wordt beschouwd als het bewerken van een Sound-object. Selecteer een Sound, en kies daarna Edit. Dat brengt je in een SoundEditor venster. Je kan hierin begin en eind van het segment markeren, op verschillende manieren. Het venster heeft drie tijdsmarkeringen, genaamd Cursor, Begin en End. Het venster toont een oscillogram, met langwerpige knoppen eronder. Klikken op zo'n knop geeft je het corresponderende geluidsfragment te horen. Het segment tussen B en E wordt de selectie genoemd, en afgebeeld op gele ondergrond. Met de muis kan je de markeringen neerzetten, door te klikken op de linkerknop (Cursor), middelste knop (Begin) en rechterknop (End). Je kan de markeringen ook exact neerzetten met de menu-opties B, C, E. Zeer exacte plaatsing op nuldoorgangen kan als volgt:

zet B in de buurt van gewenste nuldoorgang voor B (middelste muisknop),
kies B > Move B to nearest zero crossing,
zet E in de buurt van gewenste nuldoorgang voor E (rechter muisknop),
kies E > Move E to nearest zero crossing.

Om nauwkeurig te segmenteren zul je moeten in- en uitzoomen. De knoppen daarvoor zitten onderaan het edit-venster. De knoppen all, in, out, sel(ection) spreken voor zichzelf. Er verschijnen nieuwe 'sprekende knoppen' rond het ingezoomde deel.
Je kan snel een ruwe selectie maken met de muis: klikken (met linkermuisknop) en slepen, net als bij een tekstverwerker, of Shift+ klikken (ook met linkermuisknop). Bij het bewerken van Sound-objecten kan je het geselecteerde segment bewaren als nieuw Sound-object door te kiezen File | Extract selection. Je kan het ook bewaren als geluidsbestand door te kiezen File > Write selection to AIFC file....
NB: Het is ook mogelijk om het geselecteerde deel te verwijderen, of om de samples in de selectie op nul te zetten (kies gewenste optie onder Edit). Onthoud dat je hiermee het Sound object zelf bewerkt, en niet een kopie ervan!

In Praat versie 3.8 en hoger bestaan ook zgn. LongSound-objecten. Dit zijn geluidsbestanden die alleen op schijfgeheugen bestaan; ze worden niet in het werkgeheugen geladen, en kunnen derhalve ook niet bewerkt worden. Maar je kan er wel een deel van selecteren, en het geselecteerde deel omzetten naar een regulier Sound-object (dat weer bewaard kan worden in een geluidsbestand).
Je maakt een LongSound door te kiezen Read > Open long sound file... in het Control-venster. Geef het gewenste bestand op. Het corresponderende LongSound verschijnt dan in het rijtje objecten. Selecteer dit LongSound, en kies dan knop View. Er wordt dan een LongSoundEditor opgestart; deze werkt vrijwel gelijk aan de SoundEditor die hierboven is besproken. Selecteer het gewenste segment (bv. woord of zin) op dezelfde wijze als in de SoundEditor.
Kies vervolgens in de LongSoundEditor File > Copy selection to Sound object (times from 0). Dit levert een nieuw Sound object op (met begintijd=0). Eventueel kan je ook de oorspronkelijke tijdsas uit het LongSound handhaven in het nieuwe Sound.
aanvang


Oscillogram

Voor een oscillogram moet Praat gaan tekenen in het picture-venster. Zet eerst de (gele) viewport goed, bv. door met de linker-muisknop te slepen over het gewenste gebied. Selecteer een Sound object. Kies dan knop Draw - > Draw.... Amplitudes in Praat liggen altijd tussen -1 en +1. Standaard schaalt Praat de amplitude-schaal.
Als je Garnish ON kiest, maakt Praat zelf (engelstalige) as-labels en layout. Die kan je ook zelf maken door Garnish OFF te kiezen: je krijgt dan alleen een kaal oscillogram, en verder niets. Vervolgens kan je met de opties onder Margins (in het picture-venster) de layout rond dit oscillogram verzorgen. NB: Begin dan altijd met Margins > Draw inner box. Pas daarna moet je as-verdeling, as-labels, begeleidende tekst, pijlen, enz. aanbrengen.

Als je Draw - > Draw samples kiest, worden alle samples getekend. Dat kost veel tijd, ook als het venster opnieuw getekend moet worden. Liever niet doen dus -- behalve als je precies weet wat je doet (bv. bij een zeer kort signaalfragment, waarvan je de exacte bemonstering wilt bekijken).


aanvang

Spectrum

Selecteer het gewenste Sound. Kies daarna de knop To Spectrum. Dit levert een Spectrum-object op. NB: In afwijking van andere analyses wordt hierbij één spectrum berekend over het gehele Sound, dus niet over een (al dan niet verschuivend venster) van het signaal!
Het resulterende Spectrum-object wordt vanzelf geselecteerd (Praat selecteert altijd het resultaat van een analyse); je kan het afbeelden met knop Draw... De mogelijkheden bij afbeelden zijn vergelijkbaar met die van een oscillogram (frequentie- en amplitude-domein zijn instelbaar, layout kan automatisch verzorgd worden, enz.).

Een aardigheid van Praat is dat je een Spectrum-object ook kan bewerken (Edit). Daardoor kan je een signaal filteren: met Edit een deel van het spectrum selecteren of weggooien, en daarna converteren naar een Sound-object. Dit is mogelijk omdat het spectrum altijd berekend wordt over het gehele Sound.


aanvang

Spectrogram

Selecteer het gewenste Sound-object. Kies daarna Spectrum > To Spectrogram.... In het dialoogvenster dat je dan ziet, is vooral de waarde voor Analysis width van belang, omdat deze de bandbreedte bepaalt van het analyse-filter. Een bredeband-spectrogram wordt geproduceerd met een waarde van 4.3 ms (0.0043 s, hoge tijdsresolutie en lage frequentieresolutie). Een smalleband-spectrogram wordt geproduceerd met een waarde van 29 ms (0.029 s, lage tijdsresolutie en hoge frequentieresolutie). De exacte waarden hangen af van het type venster dat over het signaal is gelegd (zie informatie onder de Help-knop).
Het resulterende Spectrogram-object kan je afbeelden met knop Paint... De mogelijkheden bij afbeelden zijn vergelijkbaar met die van een oscillogram en spectum (tijds- en frequentie-domein zijn instelbaar, afstand tussen 'zwartste' en 'witste' amplitude is instelbaar bij Dynamic range, layout kan automatisch verzorgd worden, enz.).
aanvang

Labelen

Hieronder verstaan we het aanbrengen van grenzen in het spraaksignaal, en het benoemen van de tussenliggende segmenten (bv. op het niveau van woorden, syllaben, fonemen, allofonen). In Praat wordt label-informatie opgeslagen in een afzonderlijk object, een zgn. tier (Engels, rijmt op "here". Deze tiers worden samen opgeslagen in een zgn. TextGrid-object. Tiers zijn er in twee typen: een IntervalTier is een reeks van intervallen met begin- en eindtijdstip, waarbij het eindtijdstip van een bepaald interval gelijk is aan het begintijdstip van het volgende interval. Een PointTier is een reeks tijdstippen en labels-bij-tijdstippen. Meestal gebruiken we een IntervalTier om te labelen. De procedure om te labellen is uitgebreid beschreven in de online help-pagina getiteld Labelling. Hier volgt een korte handleiding:
aanvang

Sinussignaal aanmaken

In het Werkboek bij het Practicum 'Inleiding in de Fonetiek' staat in §3.6: “Een gulden regel … is dat de bemonsteringsfrequentie altijd minimaal twee keer zo hoog moet zijn als de hoogste in het signaal voorkomende frequentiecomponent.” Een sinussignaal bevat slechts één frequentiecomponent, namelijk de grondtoon. De bemonsteringsfrequentie van een sinussignaal moet dus altijd minimaal twee keer zo hoog zijn als de frequentie van het sinussignaal. Door onvolkomenheden in het laagdoorlaat-filter (bij A/D- en D/A-conversie) is het verstandig om die factor van “minimaal twee keer” zeer ruim te nemen, bv. een factor 4 of 10, om een zuiver sinussignaal te verkrijgen. Kies in het Control-venster de optie New > Sound > Create Sound... Er verschijnt dan een venster, waarin je bemonsteringsfrequentie (bv. 11025 of nog hoger), begintijd en eindtijd kan invullen. Bovendien kan je de formule opgeven waarmee het resulterende geluid gesynthetiseerd wordt. In het geval van een enkelvoudige sinus gebruik je daarvoor de basis-formule van een sinustrilling:
y(t) = A · sin ( 2 · π · f · t + φ)
… waarbij A= relatieve amplitude-factor (tussen 0=stilte en 1=maximaal), f= frequentie (in Hz), t= huidige tijdstip, φ= fasehoek (in radialen).
Het linker-deel van de vergelijking wordt door Praat aangevuld. Voor tijdstip t gebruikt Praat het symbool x. De formule die je moet invullen voor een sinus van 300 Hz, met relatieve amplitude van 0.9 en fase 0, wordt dan:

0.9 * sin(2*pi*300*x)


aanvang

Ruissignaal aanmaken

Kies in het Control-venster de optie New > Create Sound... Er verschijnt dan een venster, waarin je bemonsteringsfrequentie (bv. 16000), begintijd en eindtijd kan invullen. Bovendien kan je de formule opgeven waarmee het resulterende geluid gesynthetiseerd wordt. In het geval van witte ruis gebruik je daarbij de functie RandomGauss(m,s). Deze produceert random getallen volgens een gaussische (normaal) verdeling, met gemiddelde m en standaarddeviatie s. Omdat Praat altijd amplitudes schaalt tussen -1 en +1, moet je zorgen dat het bereik van de functie RandomGauss past binnen dit amplitude-bereik. Een goed resultaat krijg je met m=0 en s=0.25 .
aanvang

LPC-analyse en -resynthese

Het aantal coëfficiënten m in de LPC-analyse is van zeer groot belang, en daarom meestal zelf in te stellen. De optimale waarde voor m is afhankelijk van de bemonsteringsfrequentie van het signaal, en van het doel van de analyse en resynthese. Het aantal coëfficiënten bepaalt uiteindelijk het aantal spectrale pieken (mogelijke formanten) dat gevonden wordt in het ingangssignaal. Als je een zuivere sinus analyseert met m=10 coëfficiënten, dan levert de LPC-analyse toch meer dan 1 spectrale piek op (en soms zelfs m/2=5 pieken) met sterk uiteenlopende bandbreedtes -- hetgeen duidelijk onjuist is. (NB: Het is een goede oefening om de vorige zin zelf te verifiëren, via LPC-analyse van een zelfgemaakt sinussignaal.)

In het spectrogram van een mannenstem, zie je meestal zo'n 5 formanten in het gebied van 0 tot 5000 Hz. Dat is niet toevallig. Op grond van de bron-filter-theorie kan je uitrekenen waar de formanten liggen, bij een neutrale stand van de mondholte. We nemen aan dat het aanzetstuk van een man 17 cm lang is, van glottis tot lippen. De formanten liggen dan ruwweg bij 500, 1500, 2500, 3500 en 4500 Hz, dus ca. 1000 Hz uit elkaar. Bij niet-neutrale standen van de mondholte veranderen wel de frequenties en bandbreedtes van de formanten, maar het aantal formanten blijft gelijk.
Voor vrouwenstemmen liggen de formanten in neutrale stand bij 550, 1650, 2750, 3850 en 4900 Hz, dus ca. 1100 Hz uit elkaar. Hoe lang is dan ongeveer het aanzetstuk van een vrouw?
Formanten boven F5 zijn niet meer betrouwbaar in het signaal op te sporen, zoals je zelf kan zien in een spectrogram. Het is dus niet verstandig om LPC-analyse uit te voeren met veel meer dan 10 coëfficiënten: de gevonden spectrale pieken corresponderen dan niet meer met echte formanten (die zijn immers te zwak om opgespoord te worden) maar met andere spectrale karakteristieken van het signaal. Zeer grote bandbreedtes van de gevonden "formanten" zijn indicatie voor dergelijke fouten in de LPC-analyse.

Voor sommige toepassingen is het geen probleem dat bron-kenmerken geïnterpreteerd worden als filter-kenmerken. Het gaat pas fout indien de LPC-uitvoer geïnterpreteerd wordt in termen van piekfrequenties en bandbreedtes van formanten (want de coëfficiënten stellen immers geen formanten meer voor, maar andere spectrale karakteristieken). Je kan dus best 'teveel' coëfficiënten gebruiken als je LPC alleen wilt gebruiken om de prosodie van een uiting te manipuleren.

Voor formant-analyse willen we dus niet meer dan 10 LPC-coëfficiënten opgeven. We moeten dan ervoor zorgen dat het invoer-signaal alleen het frequentie-gebied bevat tot 5500 Hz (voor vrouwenstemmen) resp. 5000 Hz (voor mannenstemmen). Deze grenswaarde aan het frequentiegebied kan je instellen bij het commando Formants & LPC... > To Formant {method}, bij het invoerveld Maximum formant. De opgegeven grenswaarde wordt gebruikt voor downsampling van het Sound tot 2x deze grenswaarde.
Je kan die grenswaarde aan het frequentiegebied ook afdwingen door zelf eerst het signaal te downsamplen, via Convert- > Resample... in het object-venster. Voor de eigenlijke LPC-analyse selecteer je het gedownsamplede signaal; daarna kies je Formants & LPC > To LPC (autocorrelation)... Dit is de klassieke methode van LPC. In het vervolg-venster moet je een geschikt aantal filter-coëfficiënten (ofwel m, zie hierboven) invullen bij Prediction order. Voor practicum-opdrachten volstaat een Time step van 0.01 seconde, het analyse-venster schuift dan met stapjes van 10 ms door het signaal.

Het resulterende LPC-object kan je nog niet zinvol afbeelden of interpreteren. Daartoe moet je het eerst converteren To Formant. Dit object bevat voor ieder venster een aantal formanten (d.w.z. piekfrequenties en bandbreedtes) berekend uit de LPC-coëfficiënten. Kies Modify > Sort om de formanten echt in oplopende volgorde te plaatsen (dus F3>F2, enz). De formanten kan je tekenen (Draw) of bevragen (Query), maar helaas (nog) niet interactief bewerken in een editor.

Zelfs met de nodige voorzorgen hoeven de resulterende formanten bepaald niet juist te zijn! Ter controle moet je een grafiek van formantsporen altijd combineren met een spectrogram. Zelfs als die twee afbeeldingen op het oog lijken te kloppen, dan is het nog goed mogelijk dat spectrale pieken fout benoemd worden. Zo wordt dan bijvoorbeeld de 'echte' F2 aangezien voor F3, omdat een lagere harmonische al aangezien wordt voor F2.
LPC-analyse gaat vooral fout, indien er interactie optreedt tussen bron en filter (F0 en F1, bij hoge klinkers) of tussen formanten (F1 en F2, bij /u/), en bij onbedoelde spectrale pieken t.g.v. omgevingsgeluiden. In die gevallen klopt het analyse-model niet meer, maar je formant-analyse levert toch uitvoer!

Hier volgen twee manieren om je formant-analyse te controleren.

aanvang

PSOLA

Praat opdrachten: nog toevoegen
aanvang

Toonhoogte-meting

Selecteer een Sound. Kies dan Periodicity- > To Pitch.... In het venster daarna moet je o.a. de minimale en maximale F0 invullen. Kies hier verstandige waarden; dat maakt de analyse betrouwbaarder. Mannen stijgen zelden tot 600 Hz en vrouwen zakken zelden tot 75 Hz, dus pas de default-waarden liever aan.

Het resulterende Pitch object bevat mogelijke pitch-waarden, voor ieder 'frame' of tijdsvenstertje in het signaal. Dit Pitch object kan je afdrukken (Draw) of bewerken (Edit start een PitchEditor). In de PitchEditor kan je de pitch-kandidaten eventueel nog bewerken: je kan zo octaaffouten verbeteren, bv. door niet de gemarkeerde pitch-kandidaat te kiezen maar een kandidaat die daarboven of daaronder ligt. Ook voiced-unvoiced fouten kan je verbeteren in de PitchEditor -- in feite is de waarde "unvoiced" ook een Pitch-kandidaat, die je kan kiezen door erop te klikken (onderin het venster van de PitchEditor). Als je de Pitch gebruikt voor (re)synthese, kan je zo stemloze segmenten stemhebbend maken, en vice versa.


aanvang


Toonhoogte-manipulatie

Overtuigende manipulatie van toonhoogte vereist een scheiding van het spraaksignaal in bron-parameters en filter-parameters. Alleen de toonhoogte (een bron-parameter) wordt gewijzigd; de filter-parameters blijven ongewijzigd. Kenmerken van bron en filter kunnen in principe op twee manieren onderscheiden worden: met LPC en met PSOLA. Voor toonhoogte-manipulatie met LPC moeten we dus altijd eerst een LPC-analyse uitvoeren, dan de F0 wijzigen, en tenslotte LPC-resynthese uitvoeren. We zullen hier niet uitleggen hoe PSOLA werkt. Voor onze doeleinden is de werkwijze vergelijkbaar met LPC: we moeten eerst een PSOLA-analyse uitvoeren, dan de F0 wijzigen (en eventueel duren wijzigen, zie hierna), en tenslotte een soort PSOLA-resynthese uitvoeren. Bewerking van toonhoogte is mogelijk met zowel LPC als PSOLA.
aanvang

Duur-manipulatie

Ook voor duur-manipulatie moeten we gebruik maken van analyse en resynthese van het spraaksignaal, met LPC of met PSOLA. De truc is dat bij de resynthese de analyse-vensters (nu resynthese-vensters geworden) elkaar iets anders overlappen dan in de oorspronkelijke analyse.
Een voorbeeld gebaseerd op LPC kan dit wellicht verduidelijken. Bij de LPC-analyse maken we doorgaans gebruik van een venster van 25 ms, dat verschoven wordt met stapjes van 10 ms. Ieder 'frame' beschrijft dan een spraakfragment van 10 ms. Bij de resynthese verschuiven we de vensters echter met 15 ms, d.w.z. het frame wordt niet gebruikt om 10 ms spraak te synthetiseren maar om 15 ms te synthetiseren. De geresynthetiseerde spraak duurt dan 1.5x zo lang als het origineel, terwijl de spectrale kenmerken ongewijzigd zijn! Voor duur-manipulatie met PSOLA geldt mutatis mutandis hetzelfde.

Bewerking met LPC is nog niet mogelijk in de huidige versie 3.8. Bewerking met PSOLA is wel mogelijk.


aanvang

Verantwoording

De eerste versie van dit document is geschreven door Hugo Quené, met bijdragen van Denise Bruin en Mirjam Wester, in april-mei 1996. In 1997 is het document omgewerkt naar HTML, en daarna is het voortdurend (en soms ingrijpend) bijgewerkt. Paul Boersma leverde zeer waardevolle suggesties en commentaar bij eerdere versies. Tevens zijn opmerkingen verwerkt van de practicum-assistenten: Olga van Herwijnen, Kim Koppen, Eva Sittig, Joyce Vliegen en Mieke van Wijck.
copyright © 1996-2000 opleiding Taalwetenschap/Fonetiek, Onderwijsinstituut Vreemde Talen, Universiteit Utrecht.

De juiste URL van dit document is http://www.let.uu.nl/~Hugo.Quene/personal/faq/spraakprogr.html .