DEV Community

How to cut an mp3 file into multiple audios with bash and ffmpeg according to a timetable.

Anton on April 24, 2019

I have a timetable in a text file that looks like this: 00:05 - 00:54 Dédicace, À léon werth 00:54 - 01:37 Premier chapitre. Lorsque j'avais six ...
Collapse
 
lucifer1004 profile image
Gabriel Wu • Edited

I think all your requirements have been met.

#!/bin/bash
# split.sh

TIMETABLE="timetable.txt"
INPUT="input.mp3"
NUM=0

while getopts t:i: option 
do
  case "${option}" 
  in
    t) TIMETABLE=${OPTARG};;
    i) INPUT=${OPTARG};;
  esac
done

while read CMD; do
  let NUM=NUM+1
  START=$(echo "$CMD" | awk '{printf("00:%s", $1)}')
  END=$(echo "$CMD" | awk '{printf("00:%s", $3)}')
  FILENAME=$(printf "%02d" $NUM).$(echo "$CMD" | awk -f filename.awk)
  ffmpeg -i "$INPUT" -ss "$START" -t "$END" -acodec copy "$FILENAME"
done < "$TIMETABLE"

The default timetable is timetable.txt, and the default input is input.mp3, however, you can specify other files with options -t for timetables and -i for .mp3 files.

And here is the awk script file used in the shell script.

# filename.awk
{
  for (i=4; i < NF; i++) {
    gsub(/[\.,]/, "", $i)
    if (i < NF-1) printf("%s_", $i)
    else printf("%s", $i)
  }
  printf(".mp3")
}
Collapse
 
antonrich profile image
Anton

Big big thank you man.

Collapse
 
missamarakay profile image
Amara Graham

My coworker did something similar, but in python. Not sure it will help, but here is a link to his post with code snippets: medium.com/@SamuelCouch/using-mach...

Collapse
 
antonrich profile image
Anton

This is not exactly what I want in this case, however, using Watson for synchronizing text and audio is awesome. Thanks.