import numpy as np
from scipy.io import wavfile
import matplotlib.pyplot as plt
import IPython
Zeichne für jedes Gruppenmitglied mit PRAAT einen Satz (ca. 10 Wörter) auf und berechne jeweils die Histogramme.
satz_tim_pfad = "satz_tim.wav"
satz_mariia_pfad = "satz_mariia.wav"
IPython.display.Audio(satz_tim_pfad)
IPython.display.Audio(satz_mariia_pfad)
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
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
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.
lim = 0.3
m = satz_mariia[(satz_mariia >= -lim) & (satz_mariia <= lim)]
t = satz_tim[(satz_tim >= -lim) & (satz_tim <= lim)]
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()
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.
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
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
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
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
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.
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
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 |
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')
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.
IPython.display.FileLink("formate/vokale_mariia")
IPython.display.FileLink("formate/vokale_tim")