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
schreib das ganze doch mal in deiner Muttersprache (englisch?) dann wird es verständlich was du vorhast. Diese Babelfish-Übersetzung hier ist .... irritierend.
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
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.
Matlab: threshold=0.1*max(signal); indexB=find(signal>threshold); indexL=find(signal<=threshold); B=signal(indexB); L=signal(indexL);
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
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);
>>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.