Forum: PC Hard- und Software sprachsignal trennen mit matlab


von mark_Do (Gast)


Angehängte Dateien:

Lesenswert?

Hallo alle zusammen,



ich habe ein Sprachsignal, die ich untersuchen möchte.
Die Arbeit muss in Zeitbereich gemacht werden und ein Algo entwerfen, 
der die Sprache trennen kann (nicht erkennen).
Die Trennung sollte wie folgenden:

Sprache dann Pause oder umgekehrt.



Ich habe so gedacht dass der Sprachvektor nach der Amplitude zu trennen 
aber mir ist nicht ganz klar nach wie viel Sample muss die Untersuchung 
durchgeführt?

In diese Untersuchung möchte ich nach dem Ablauf des Sprachsignal ein 
Ergebnis(Anzahl der Stimmhaft und Anzahl der Pausen) bekommen.

um Hinweise werde ich sehr dankbar.

danke

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

schreib das ganze doch mal in deiner Muttersprache (englisch?) dann wird 
es verständlich was du vorhast. Diese Babelfish-Übersetzung hier ist 
.... irritierend.

von mark_Do (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,


mein Vorhaben sieht wie folgenden aus:

Sprachsignal zu Klassifizieren und zwar nach B(i) und L(i).


B(i): ist das Teilvektor des Sprachsignals im dem die Amplitude höheren 
Werte haben. B(i) ist als Nutzsignal

L(i): ist das Teilvektor des Sprachsignals im dem die Amplituden 
niedrige Werte haben.L(i) ist als Lücke bezeichnet.



Das Sprachsignal muss nicht erkannt werden sondern nur klassifiziert, wo 
die B(i) bzw. L(i) ist.


Die Art von erkennen muss gültig für jeder Sprachvektor.


Da es die Sprache unterschiedliche Verlauf hat und die Länge von B(i) 
bzw. L(i) nicht gleich muss ich ein Kompromiss rausfinden.

Hat jemenden vielleicht eine Idee wie man mit solche Signale umgehen 
sollte ?

Besten Dank

von TestX .. (xaos)


Lesenswert?

einfach mit einer schleife über den gesammten vector iterieren und 
jewiels die amplitude des aktuellen samples mit einem referenzwert 
vergleichen. solange das signal kleiner als der referenzwert ist es halt 
L(j) sonst B(j).
wo ist das problem ?

von Albert .. (albert-k)


Lesenswert?

Eine einfache Möglichkeit wäre es den RMS Wert über bestimmte 
Zeitabschnitte zu ermitteln. Wenn der RMS Wert eine bestimmte Grenze 
überschreitet hast du ein Sprachsignal. Wenn er darunter liegt hast du 
eine Pause. Wieviele Samples du zur ermittlung des RMS Wertes verwendest 
hängt ab von deiner Samplerate und wie schnell du darauf reagieren 
willst.

Als Startwert würde ich die Anzahl der Samples wie folgt wählen:
- Minimae Zeitliche dauer eines Sprachsignals das noch erkannt werden 
soll.
- Wieviele Samples erhalte ich für diese minimale Dauer?
- Verwende nur halb so viele Samples wie zuvor ermittelt für den RMS 
Wert. Wenn es zu wenige sind könnte man die Samplezahl Stückchenweise 
erhöhen. Ansonsten ggf. die Samplerate erhöhen (falls möglich).

Wenn die Sprachsignale jedoch nur sehr kurz sind, oder du auch starkes 
Umgebungsrauschen mit reinbekommst, könnte dieser Lösungsansatz 
natürlich ungeeignet sein.

Eine andere Möglichkeit wäre ein FIR Filter als Hüllkurvendetektor. 
Dieser würde dir dann die Hüllkurve deines Signals ausgeben die du dann 
ganz einfach auf über-/unterschreiten deines gewählten Schwellwertes für 
Sprache/keine Sprache überprüfen könntest.

von Thomas (Gast)


Lesenswert?

Matlab:
threshold=0.1*max(signal);
indexB=find(signal>threshold);
indexL=find(signal<=threshold);
B=signal(indexB);
L=signal(indexL);

von mark_Do (Gast)


Lesenswert?

Hallo alle zusammen,



danke an alle die sich beteilt haben.

>> Thomas schreib:

threshold=0.1*max(signal);
indexB=find(signal>threshold);
indexL=find(signal<=threshold);
B=signal(indexB);
L=signal(indexL);


Mit deinem Code wird das Signal getrennt bzw.geschnitten was es nicht 
sein sollte.

Ich möchte das Signal aber mit der positives bzw. negatives Anteil 
haben.

ich habe versucht zu deinem Code etwas ergänzt mit:


threshold1=0.1*max(signal);
threshold2=0.1*min(signal);

indexB1=find(signal>threshold1);
indexB2=find(signal>threshold2);

indexL1=find(signal<=threshold1);
indexL2=find(signal<=threshold2);

B1=signal(indexB1);
B2=signal(indexB2);

L1=signal(indexL1);
L2=signal(indexL2);


>> wenn ich jede eizeln plotten es wiird halt geschnitten was es nicht sein muss.

Wie kann ich mit Hilfe von Matlab das Sprachsignal so trennen ohne das 
Nutzsignal zu beinflussen.

Es sollte so ausehen, dass die Sprache von Pause getrennt wird.
Danke in Voraus

von Thomas (Gast)


Lesenswert?

Neuer Versuch:

Matlab:
threshold=0.1*max(signal);
indexB=find((signal>threshold) | (signal<-threshold));
indexL=find((signal<=threshold) & (signal>=-threshold));
B=signal(indexB);
L=signal(indexL);


Evtl. auch:

Matlab:
threshold=0.1*max(signal);
indexB=find((signal>threshold) || (signal<-threshold));
indexL=find((signal<=threshold) && (signal>=-threshold));
B=signal(indexB);
L=signal(indexL);

von mark_Do (Gast)


Lesenswert?

>>Thomas

Danke es hat geklappt.
Die erste Möglichkeit ist die richtige.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.