Stille in wav-File abschneiden

Tueftler

Mitglied
Hallo zusammen,
weiß jemand, wie ich in Java die Stille am Anfang und Ende einer wav-Datei abschneiden kann?

Zweck des Ganzen: Aussprachetraining in einer Fremdsprache. Erst wird die Mikrofoneingabe des Trainierenden ausgegeben, dann folgt das Wort gesprochen von einem Native Speaker. Das Programm funktioniert bereits, nur sind die Sprechpausen bei verschiedenen Wörtern halt sehr unterschiedlich. Deshalb möchte ich die Stille abschneiden und wo notwendig durch Thread.sleep ersetzen

Hier das Format des wav-Files:
[Java]
AudioFormat getAudioFormat() {
float sampleRate = 44100.0F;
int sampleSizeInBits = 16;
int channels = 2;
boolean signed = true;
boolean bigEndian = true;
AudioFormat format = new AudioFormat(sampleRate, sampleSizeInBits,
channels, signed, bigEndian);
return format;
}
[/Java]
 

Tueftler

Mitglied
Danke für die Antwort, Java20134,
leider hilft mir dein Link nicht weiter, weil - wenn ich den code richtig verstehe, das ja nur das Überspringen eine VORGEGEBENE Zeit beschreibt und die Zeit der Stille will ich ja gerade ermitteln, um dann abschneiden zu können.
Dein Vorschlag mit der Frequenzausgabe ist da schon vielversprechender, aber wie könnte so etwas gehen? Weiß jemand, was die Methode getLevel() (von DataLine) zurückgibt? Ist das der Wert des eingestellten Lautstärkepegels oder der im Play-Modus sich (ständig verändernde) Pegel?
 

JeromeC

Aktives Mitglied
Siehe -> DOK

float getLevel()
Obtains the current volume level for the line. This level is a measure of the signal's current amplitude, and should not be confused with the current setting of a gain control. The range is from 0.0 (silence) to 1.0 (maximum possible amplitude for the sound waveform). The units measure linear amplitude, not decibels.
Returns:
the current amplitude of the signal in this line, or AudioSystem.NOT_SPECIFIED

Du musst aber beachten, dass je nach Abstand des Sprechers zum Mikrofon, nach Lautstärke des Gesprochenen und der Einstellung und Qualität des Mikrofons starke Schwankungen in der Aufnahmelautstärke herrschen kann.
Eventuell lohnt es sich einmal durch die Audio-Datei zu gehen und einen cut-off-Pegel festzulegen. Also du summierst die Amplituden auf und musst dir dann eine geeignete Formel ausdenken, wie z.B.
cutOffPegel = (summe der amplituden) / (anzahl der frames) + 0.05
Dann gehst du nochmal durch die Datei und kopierst nur die Frames, deren Pegel oberhalb dieses Wertes liegt.
Das Problem entsteht hierbei wenn der Nutzer zulange aufnimmt, ohne dass Gesprochen wird. Der cutOffPegel wird dann hier sehr gedrückt. Oder die Aufnahme ist stark verrauscht, z.B. durch ein schlechtes Kabel, dann wird der Wert sehr weit oben angesetzt und kann teile der Sprache ausfiltern. Du musst also eine Weile tüffteln wenn du diese Idee verfolgen möchtest und die Formel erweitern, etc.

Viel Erfolg
 
Zuletzt bearbeitet:

Tueftler

Mitglied
Vielen Dank, JeromeC,
das hat mich im Verständnis der Audio-Dateien ein Stück weiter gebracht. Inzwischen bin ich aber auch fündig geworden: Unter musicg - Lightweight Java API for audio analysing, Android compatible - Google Project Hosting kann man eine library downloaden, die die Sache vereinfacht. Die hat zwar keinen javadoc dabei, aber ltrim und righttrim wird man auch so verstehen. Mit diesen Methoden muss man einen int-Wert übergeben, von dem ich vermute, dass es die An- und Ablaufzeit in Sekunden ist (der Stille-Zeitraum, der bestehen bleiben soll). Das Trimmen bringt brauchbare Ergebnisse, wenn die Aufnahme ohne allzu großes Rauschen daherkommt.
 

Oben