Skip to content

Instantly share code, notes, and snippets.

@yhager
Created March 26, 2024 05:17
Show Gist options
  • Save yhager/4c86d7ff657fcd947ea25817501d1204 to your computer and use it in GitHub Desktop.
Save yhager/4c86d7ff657fcd947ea25817501d1204 to your computer and use it in GitHub Desktop.
generate story book from a list of audio and image files
#!/bin/zsh
# Usage: generate-story-book <output> <audio_files_pattern> <image_files_pattern>
emulate -LR zsh
set -e
output=$1
audio_files_pattern=$2
image_files_pattern=$3
SILENCE_DURATION=2
FFMPEG_FLAGS=(-v error -y)
make-silence() {
local duration=$1
local output=silence.mp3
ffmpeg $FFMPEG_FLAGS -f lavfi -i "anullsrc=r=44100:cl=mono" -t $duration -q:a 9 -acodec libmp3lame ${output}
echo $output
}
concat-audio() {
# concat-audio <output> <audio files>
local output=$1
shift
ffmpeg $FFMPEG_FLAGS -i "concat:${(j:|:)@[1,-1]}" -acodec copy $output
}
convert-to-mp3() {
reply=()
echo -n "Converting aif to mp3\t"
for aif_file in $*; do
mp3_file=$(basename $aif_file .aif).mp3
ffmpeg $FFMPEG_FLAGS -i $aif_file -f mp3 -acodec libmp3lame -ab 192000 -ar 44100 $mp3_file
echo -n .
reply+=($mp3_file)
done
echo done
}
pad-audio-files() {
echo -n "Padding audio files\t"
silence=$(make-silence $SILENCE_DURATION)
reply=()
for audio_file in $*; do
padded=$(basename $audio_file .mp3)-padded.mp3
concat-audio $padded $silence $audio_file $silence
echo -n .
reply+=($padded)
done
rm $silence
echo done
}
make-pages() {
reply=()
echo -n "Making story book pages\t"
for audio_file image_file in $*; do
page=$(basename $audio_file .mp3).mp4
ffmpeg $FFMPEG_FLAGS -loop 1 -i $image_file -i $audio_file -acodec copy -shortest $page
echo -n .
reply+=($page)
rm $audio_file
done
echo done
}
convert-to-mp3 ${~audio_files_pattern}
mp3_audio_files=($reply)
pad-audio-files $mp3_audio_files
padded_audio_files=($reply)
image_files=(${~image_files_pattern})
make-pages ${padded_audio_files:^image_files}
pages=($reply)
echo "Calculating transitions"
ffmpeg-concat -t BookFlip -d 1000 $pages
echo -n "Converting audio to AAC..."
ffmpeg $FFMPEG_FLAGS -i out.mp4 -c:v copy -c:a aac $output
echo done
rm $pages
echo "Output file is $output"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment