sprachsignal trennen mit matlab

Gast #2139160
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
Angehängte Dateien:
Gast
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
Angehängte Dateien:
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 ?
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.
Gast
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
Gast
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);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.