Labor 03¶

Imports¶

In [32]:
import numpy as np
from scipy.io import wavfile
import matplotlib.pyplot as plt

import IPython

Die Saetze¶

Zeichne für jedes Gruppenmitglied mit PRAAT einen Satz (ca. 10 Wörter) auf und berechne jeweils die Histogramme.

In [150]:
satz_tim_pfad = "satz_tim.wav"
satz_mariia_pfad = "satz_mariia.wav"

Satz von Tim gelesen¶

In [151]:
IPython.display.Audio(satz_tim_pfad)
Out[151]:
Your browser does not support the audio element.

Satz von Mariia gelesen¶

In [35]:
IPython.display.Audio(satz_mariia_pfad)
Out[35]:
Your browser does not support the audio element.

Audiodatein einlesen¶

In [36]:
samplerate, satz_tim = wavfile.read(satz_tim_pfad)
satz_tim = satz_tim / satz_tim.max()
print("Laenge Satz Tim: {}s".format(len(satz_tim)/samplerate))
Laenge Satz Tim: 6.64475s
In [37]:
samplerate, satz_mariia = wavfile.read(satz_mariia_pfad)
satz_mariia = satz_mariia / satz_mariia.max()
print("Laenge Satz Mariia: {}s".format(len(satz_mariia)/samplerate))
Laenge Satz Mariia: 6.5875s

Histogramme plotten¶

Wir haben festgestelle, dass nahezu alle Werte im Intervall [-0.3, 0.3] liegen und haben daher das Histogramm auf diesen Wertebereich beschraenkt, da so die Variation zwischen den verschiedenen Signalen deutlicher ist.

In [38]:
lim = 0.3
m = satz_mariia[(satz_mariia >= -lim) & (satz_mariia <= lim)]
t = satz_tim[(satz_tim >= -lim) & (satz_tim <= lim)]
In [39]:
bins = 100
plt.figure(figsize=(13,6))
plt.hist(t, bins=bins, alpha=0.5, label="Tim")
plt.hist(m, bins=bins, alpha=0.5, label="Mariia")
plt.axvline(0, color='red')
plt.xlabel("Byte-Wert")
plt.ylabel("Anzahl von Samples")
plt.title("Histogram Satz von Mariia und Tim")
plt.legend()
plt.show()
  • Man sieht, dass Mariia mehr Samples im +-[0.05, 0.2] und dafuer weniger im Bereich [-0.03, 0.3] hat, aber dafuer wieder am meisten bei Null.
  • Was bedeutet "Wie gut ist das Signal ausgesteuert"

Offset testen¶

In [40]:
m = m + 0.1
t = t - 0.1
plt.figure(figsize=(13,6))
plt.hist(t, bins=bins, alpha=0.5, label="Tim")
plt.hist(m, bins=bins, alpha=0.5, label="Mariia")
plt.axvline(0.1, color='blue')
plt.axvline(-0.1, color='blue')
plt.axvline(0, color='red')
plt.xlabel("Byte-Wert")
plt.ylabel("Anzahl von Samples")
plt.title("Histogram Satz von Mariia und Tim mit Offset")
plt.legend()
plt.show()

man kann sehr eindeutig sehen, dass der Offset der Signale dem Wert an deren Maximum entspricht.

Minimalpaaranalyse¶

CVC (Konsonant, Vokal, Konsonant)¶

  • Pier [piR], Bier[biR], Tier[tiR], dir[diR], Mir[miR]
  • Gas[ga:s], Maß[ma:s]
  • nein[naIn], Wein[vaIn], mein[maIn], dein[daIn], Bein[baIn]
  • Haus[haUs]], Maus[maUs], Laus[laUs]
  • das[das, was[vas]
In [41]:
print("CVC von Mariia")
IPython.display.display(IPython.display.Audio("CVC/pier_mariia.wav"))
IPython.display.display(IPython.display.Audio("CVC/gas_mariia.wav"))
IPython.display.display(IPython.display.Audio("CVC/nein_mariia.wav"))
IPython.display.display(IPython.display.Audio("CVC/haus_mariia.wav"))
IPython.display.display(IPython.display.Audio("CVC/das_mariia.wav"))
CVC von Mariia
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.
In [42]:
print("CVC von Tim")
IPython.display.display(IPython.display.Audio("CVC/pier_tim.wav"))
IPython.display.display(IPython.display.Audio("CVC/gas_tim.wav"))
IPython.display.display(IPython.display.Audio("CVC/nein_tim.wav"))
IPython.display.display(IPython.display.Audio("CVC/haus_tim.wav"))
IPython.display.display(IPython.display.Audio("CVC/das_tim.wav"))
CVC von Tim
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.

Pier, Bier, Tier, Dir, Mir¶

Mariia:¶

title

Tim:¶

title

  • Pier und Bier starten beide mit einem plosiven, an den Lippen geformten, Konsonanten, sind sich daher sehr ähnlich. Bei Bier kommt das ie tiefer aus der Kehle und klingt damit tiefer.
  • Tier und Dir starten ebenfalls plosiv, wobei der Ton mit der Zumge geformt wird. Das T von Tier wird kurz hinter den Zähnen geform, das d von Dir kurz dahinter am Gaumen.
  • Bei den Worten, die plosiv starten kann man deutlich einen Startimpuls sehen. Dieser ist bei Pier und Tier stärker ausgeprägt, bei Bier und Dir weniger.
  • Mir ist zwar auch plosiv da der Mund anfangs geschlossen ist, aber baut nicht so schnell Druck ab. Ist daher deutlich weicher als die restlichen Worte.
  • Man kann auch gut erkennen, dass die Konsonanten nicht periodisch sind und keine Grundfrequenz besitzen. Dies ist nur bei dem m von mir anders. Dort geht das m fließend in das i über.
  • Interessant ist, dass bei Mariia die Grundfrequenz zum Ende des Vokales konsequent nach oben geht, während bei Tim die Grundfrequenz zur Mitte hin steigt und dann Fällt.

Gas, Maß¶

Mariia:¶

title

Tim:¶

title

  • Hier kann man wieder gut sehen, dass das M in Maß stimmhaft ist und eine Grundfrequenz hat.
  • AUffällig ist, dass beim Übergang zum s/ß vom Vokal die Amplitude des Sprachsignals kurzzeitug sehr gering wird.
  • Es ist sehr gut zu erkennen, dass das s/ß großteils aus sehr hochfrequenten Anteilen besteht

nein, Wein, mein, dein, Bein¶

Mariia:¶

title

Tim:¶

title

  • Diese Minimalpaare ähneln sehr denen aus dem Beispiel mit Pier
  • Auffällig ist, dass Mariia das e in ei deutlich stärker betont als Tim, was in einer deutlich plötzlicher ansteigenden Amplitude im Zeitbereich nach Ende es ersten Konsonanten erkennbar ist

Haus, Maus, Laus¶

Mariia:¶

title

Tim:¶

title

  • Hier ist wieder gut zu sehen, dass s ein Laut ohne Grundfrequenz ist
  • Beim Übergang von u zu s geht die Amplitude kuzzeitig zu Null

das, was¶

Mariia:¶

title

Tim:¶

title

  • Hier kann man, besonders bei Mariia, sehr gut die Plosion des führenden Vokals sehen

VCV (Vokal, Konsonant, Vokal)\¶

  • Anne[annE], Amme[ammE], Affe[affE], Asche[aSE] (Asche ist nicht zweisilbig, hier haben wir einen Fehler gemacht)
  • Oper[o:p6], Ober[o:b6], Opa[o:pa]
  • Abba[abba], Appa[appa]
  • Ego[e:go:], Eco[e:ko:]
  • Acker[akk6], Akku[akku:]
In [43]:
print("VCV von Mariia")
IPython.display.display(IPython.display.Audio("VCV/anne_mariia.wav"))
IPython.display.display(IPython.display.Audio("VCV/oper_mariia.wav"))
IPython.display.display(IPython.display.Audio("VCV/abba_mariia.wav"))
IPython.display.display(IPython.display.Audio("VCV/ego_mariia.wav"))
IPython.display.display(IPython.display.Audio("VCV/acker_mariia.wav"))
VCV von Mariia
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.
In [44]:
print("VCV von Tim")
IPython.display.display(IPython.display.Audio("VCV/anne_tim.wav"))
IPython.display.display(IPython.display.Audio("VCV/oper_tim.wav"))
IPython.display.display(IPython.display.Audio("VCV/abba_tim.wav"))
IPython.display.display(IPython.display.Audio("VCV/ego_tim.wav"))
IPython.display.display(IPython.display.Audio("VCV/acker_tim.wav"))
VCV von Tim
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.
Your browser does not support the audio element.

Anne, Amme, Affe, Asche¶

Mariia:¶

title

Tim:¶

title

  • Bei den Worten mit führenden Vokal gibt es keine Plosion. Der Vokal "startet" direkt stimmhaft.
  • Das Frequenzbild ist von den Konsonanten "geschnitten"
  • Die Konsonanten sind deutlich leiser als die Vokale

Oper, Ober, Opa¶

Mariia:¶

title

Tim:¶

title

  • Hier kann man sehr gut sehen, wie der Mund bei dem b/p geschlossen wird und dann plosiv in den Konsonanten startet

Abba, Appa¶

Mariia:¶

title

Tim:¶

title

Ego, Eco¶

Mariia:¶

title

Tim:¶

title

Acker, Akku¶

Mariia:¶

title

Tim:¶

title

  • Hier kann man sehen, wie die Worte von dem ck/kk getrennt werden. Auf das erste k folgt eine recht lange Pause, gefolgt von einem weiteren kurzen Plosivstoß und dem endenden Vokal

Formantkarten¶

Wir betrachten die folgenden distinkten Vokale in den eingeklammerten Wörtern. Dabei haben wir, wenn möglich die oben genutzten Wörter genutzt, mussten aber viele Wörter neu aufnehmen.

  • a (Anne)
  • a: (Gas)
  • O (Offen)
  • o: (Oper)
  • U (bUtter)
  • u: (gut)
  • 6 (Oper)
  • 2: (mögen)
  • E: (gebläse)
  • E (Gäste)
  • e: (Ego)
  • Y (Hütten)
  • y: (hüten)
  • I (bitten)
  • i (Pier)
  • @ (besagt)
In [137]:
import pandas as pd

vokale = ['a', 'a:', 'O', 'o:', 'U', 'u:', '6', '2:', 'E:', 'E', 'e:', 'Y', 'y:', 'I', 'i', '@']

formant1_tim = [1011.61, 871.81, 694.62, 508.15, 722.03, 649.14, 725.59, 1647.15, 458.62, 630.52, 551.80, 1320.79, 1737.07, 1303.83, 1114.69, 1137.72]
formant2_tim = [1262.11, 1165.34, 727.55, 2427.69, 2290.00, 2072.12, 1247.28, 2269.59, 2112.82, 1850.89, 2330.57, 2147.91, 1961.89, 2378.21, 3071.40, 2828.13]

formant1_mariia = [881.30, 734.59, 647.81, 500.62, 451.02, 347.31, 725.14, 425.91, 533.07, 709.30, 414.70, 438.19, 248.97, 426.54, 293.06, 435.20]
formant2_mariia = [1261.91, 1214.61, 996.66, 868.49, 1088.86, 798.82, 1338.97, 1797.34, 2384.90, 2065.09, 2089.7, 1838.14, 1891.18, 2359.11, 2494.77, 2436.30]

formante = pd.DataFrame({'Vokal': vokale, 'formant_1_tim': formant1_tim, 'formant_2_tim': formant2_tim, 'formant_1_mariia': formant1_mariia, 'formant_2_mariia': formant2_mariia})
formante.set_index('Vokal', inplace=True, drop=True)
formante
Out[137]:
formant_1_tim formant_2_tim formant_1_mariia formant_2_mariia
Vokal
a 1011.61 1262.11 881.30 1261.91
a: 871.81 1165.34 734.59 1214.61
O 694.62 727.55 647.81 996.66
o: 508.15 2427.69 500.62 868.49
U 722.03 2290.00 451.02 1088.86
u: 649.14 2072.12 347.31 798.82
6 725.59 1247.28 725.14 1338.97
2: 1647.15 2269.59 425.91 1797.34
E: 458.62 2112.82 533.07 2384.90
E 630.52 1850.89 709.30 2065.09
e: 551.80 2330.57 414.70 2089.70
Y 1320.79 2147.91 438.19 1838.14
y: 1737.07 1961.89 248.97 1891.18
I 1303.83 2378.21 426.54 2359.11
i 1114.69 3071.40 293.06 2494.77
@ 1137.72 2828.13 435.20 2436.30
In [148]:
import matplotlib.pyplot as plt
import numpy as np
from itertools import cycle

colors = ['b', 'g', 'r', 'c'] * 4

fig, ax1 = plt.subplots(figsize=(8,6))
ax1.scatter(formant2_tim, formant1_tim, s=400, c=colors, alpha=0.5)
plt.gca().invert_yaxis()
plt.gca().invert_xaxis()
ax1.xaxis.set_tick_params(labeltop=True, labelbottom=False)
ax1.yaxis.set_tick_params(labelright=True, labelleft=False)
ax1.xaxis.tick_top()
ax1.yaxis.tick_right()
ax1.set_xlabel("Formant 2")
ax1.set_ylabel("Formant 1")
ax1.set_title("Tim")
for i, label in enumerate(formante.index):
    plt.annotate(label, (formant2_tim[i], formant1_tim[i]), ha='center', va='center')
In [149]:
fig, ax2 = plt.subplots(figsize=(8,6))
ax2.scatter(formant2_mariia, formant1_mariia, s=400, c=colors, alpha=0.5)
plt.gca().invert_yaxis()
plt.gca().invert_xaxis()
ax2.xaxis.set_tick_params(labeltop=True, labelbottom=False)
ax2.yaxis.set_tick_params(labelright=True, labelleft=False)
ax2.xaxis.tick_top()
ax2.yaxis.tick_right()
ax2.set_xlabel("Formant 2")
ax2.set_ylabel("Formant 1")
ax2.set_title("Mariia")
for i, label in enumerate(formante.index):
    plt.annotate(label, (formant2_mariia[i], formant1_mariia[i]), ha='center', va='center')

Bei Mariia kann man sehr gut das von a, i und u: aufgespannte Dreieck erkennen, bei Tim weniger. Dies kann zum einen daran liegen, dass Tim unsauber gesprochen hat. Dazu sollte man die Formanten idealerweise an mehreren Punkten auslesen und ein statistisches Mittel darueber bilden. Unten koennen Sie die Dateien mit den Woertern, welche die Vokale enthalten, runterladen.

In [152]:
IPython.display.FileLink("formate/vokale_mariia")
Out[152]:
formate/vokale_mariia
In [153]:
IPython.display.FileLink("formate/vokale_tim")
Out[153]:
formate/vokale_tim
In [ ]: