in reply to Re^2: Split MP3 file at silence
in thread Split MP3 file at silence

I think you need to use much shorter time intervals for the min_silence_sec and min_signal_sec parameters. I don't know how the internals of that module work, and how it does silence detection, but it is quite possible that it chops the audio up into chunks that are min_silence_sec, and tests each to see if they are silent. In practice most of those chunks will contain some signal, so the module will not detect much silence.

If I where you, I would write a script that tries out lots of different values for those three parameters, and tabulates the results according to the number of chunks found. You know that there ought to be 7 chunks in the sample you linked to, so just try out lots of values for min_signal_sec and min_silence_sec between 0.01 sec and 0.5 sec, and in each case count the number of chunks you get back. Ideally you should do permutations and build a table, or perhaps use some sort of genetic algorithm to home in on the correct set of settings.

As you have already found, if min_silence_sec and min_signal_sec are to long, then not enough chunks are found. If they are to small, then your audio will get split in to many places, but there will probably be a wide range of values that work correctly. From that you can try feeding your test script with some more audio files until you know what values work reliably.

The mp3 chunk size is 1/25 of a second. It is in the docs for MP3::Split by the same author as Audio::FindChunks.

Replies are listed 'Best First'.
Re^4: Split MP3 file at silence
by Dirk80 (Pilgrim) on Apr 27, 2011 at 20:40 UTC

    I now tried to automatically get all combinations which produce 7 mp3 files.

    Here is the code:

    use strict; use warnings; use Audio::FindChunks; my @min_silence_sec_list = map { $_/100 } (0..50); my @min_signal_sec_list = map { $_/100 } (0..50); my @above_thres_window_list = (0,1,2,3,4); open( my $CSV_FH, ">", "split_results.csv") or die $!; for my $min_silence_sec ( @min_silence_sec_list ) { for my $min_signal_sec ( @min_signal_sec_list ) { for my $above_thres_window ( @above_thres_window_list ) { Audio::FindChunks->new(filename => 'bere.mp3', min_silence_sec => $min_silence_sec +, min_signal_sec => $min_signal_sec, + above_thres_window => $above_thres_ +window)->split_file(); my @split_mp3_files = glob("*_bere.mp3"); my $num_chunks = scalar(@split_mp3_files); unlink(@split_mp3_files); if( $num_chunks == 7 ) { print $CSV_FH "$min_silence_sec;$min_signal_sec;$above_thres_win +dow\n"; } } } } close($CSV_FH);

    Afterwards I tried some of these combinations. But the results are not good. Often the split is done in the middle of a word,...

    Difficult how to continue now with this module.

    But I learned one obvious thing from you and I don't know why I did not have this idea on my own. I was first trying manually the possible combinations. But you are right with your advice to do this automatically with a script as I have done it now.

    But the good message is that I now know how to solve the problem with audacity. It has a "Soundfinder" plugin and this is working perfectly with all my mp3 files.

    I'm still interested how to solve it with the Audio::FindChunks module. But I don't know how to continue now. Perhaps taking more parameters into account and trying more combinations or even comparing the split times with the correct split times I got from audacity.