# Stille in wav-File abschneiden



## Tueftler (21. Jan 2015)

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]


----------



## Java20134 (21. Jan 2015)

Vielleicht hilft dir ja diese Website: java - cutting a wave file - Stack Overflow
Was ich noch als weitere Idee hätte. Du kannst dir ja die Frequenz aller x Sekunden geben lassen und wenn diese kleiner oder gleich y ist, dann schneide aus. Praktisch kann ich dir da aber nicht weiter helfen, da ich mit dem Thema Musik nicht so aktuell bin.


----------



## Tueftler (21. Jan 2015)

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 (28. Jan 2015)

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


----------



## Tueftler (20. Feb 2015)

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.


----------



## franky27 (20. Feb 2015)

Sehr interessant, kannte ich noch nicht, danke für den Share!


----------

