#!/bin/bash # hprid ################################################################################ # # script to prepare audio files for HPR shows # # input: mp3 or ogg file # result: mp3, ogg in 44100 Hz, spx files 16000Hz with intro and outro # provides 3 interactive checks for audio quality, intro and outro # ################################################################################ # This file is part of the HPR Tool set # # HPR Tool set is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # HPR Tool set is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with HPR Tool set. If not, see . # http://www.gnu.org/licenses/agpl-3.0.html # ######################################################################### ################################################################################ # # PREREQUISITS # - current folder has to be writable # - there should NOT be a temp.ogg or temp.mp3 file # - intro.mp3 and outro.mp3 have to be present # - IMPORTANT: sox compiled with mp3 support # see http://a0u.xanga.com/700438974/howto-soc-installation # # # IMPORTANT # Backup the files before feeding them to this script, no guarantees here # Handling of .wav not yet tested, but it should work # # code.cruncher, May 2011 # ################################################################################ ################################################################################ # # TODO # # test handling of wav files # add play final files or open them in specific player(s) # add handling of ID3 tags # create html interface for standardized info gathering # ################################################################################ #============================================================ # Check input usage="usage: $(basename $0 ) [ -i ] [ -o ] , -i to add intro and -o outro, fname is a file with audio for HPR" CHANNELS="1" ADDINTRO="n" ADDOUTRO="n" while getopts "io" opt; do case $opt in i ) ADDINTRO="y" ;; o ) ADDOUTRO="y" ;; esac done shift $(($OPTIND - 1)) # if not ${mediafile} return usage if [ $# -lt 1 ]; then echo $usage exit 1 fi mediafile=${1} # test if file exists if [ ! -f "intro.flac" ]; then echo "sorry, file \"intro.flac\" does not exist" echo "To download it run the command:" echo " wget http://hackerpublicradio.org/media/theme-music/intro.flac" exit 1 fi if [ ! -f "outro.flac" ]; then echo "sorry, file \"outro.flac\" does not exist" echo "To download it run the command:" echo " wget http://hackerpublicradio.org/media/theme-music/outro.flac" exit 1 fi for mediafile in "$@" do echo $var if [ ! -f "${mediafile}" ]; then echo "sorry, file \"${mediafile}\" does not exist" continue fi # test if file exists if [ ! -r "${mediafile}" ]; then echo "sorry, file \"${mediafile}\" is not readable" continue fi if [ $(ffprobe "${mediafile}" 2>&1 | grep "Audio:" | wc -l ) -eq 0 ]; then echo "sorry, file \"${mediafile}\" has no audio track" continue fi # extract file name and extension fname=${mediafile%.*} ext=${mediafile/*./} #Make a backup # mediafilebackup=${mediafile}_$(md5sum ${mediafile} | cut -c -32 )_orig.${ext} # cp -v ${mediafile} ${mediafilebackup} # # if [[ ! -e ${mediafilebackup} ]]; then # echo "Backup not made: ${mediafilebackup}" # exit # fi # check audio quality dur=7 # playtime of sample in seconds go=1 # variable to repeat playing of sample from=180 # start sample at 3 minutes in #============================================================ # Question Time # # # while [ $go -ne 0 ] # # # do # # # echo # # # echo "--------------------------------------------------------------------------------" # # # echo "1/4 AUDIO TEST: check audio quality: ... playing $dur seconds ..." # # # play "${mediafile}" trim $from $dur # # # ((from+=180)) # next sample will be 3 minutes later # # # read -s -n1 -p "sound quality ok?[y,n] ... or play another sample[a] ... [y,n,a]" # # # echo # # # case "$REPLY" in # # # n) echo "aborting ... get better quality sound file ... good bye!"; exit 0;; # # # y) go=0;; # # # esac # # # done # # # # # # # Check for intro # # # echo # # # echo "--------------------------------------------------------------------------------" # # # echo "2/4 ADDINTRO TEST: Is the intro playing? " # # # play "${mediafile}" trim 1 5 # play 5 seconds at beginning of file # # # read -s -n1 -p "Is there a intro? [y, n]" -i "n"; echo # # # if [ "$REPLY" = 'y' ]; then # # # echo "Will add the intro" # # # ADDINTRO="y" # # # fi # # # # # # # Check for outro # # # echo # # # echo "--------------------------------------------------------------------------------" # # # echo "3/4 ADDOUTRO TEST: Is the outro playing? " # # # len=$(eval "soxi -D \"${mediafile}\"") # # # len=$(echo "scale=0; $len - 50" | bc) # # # play "${mediafile}" trim $len 5 # # # read -s -n1 -p "Is there a outro ? [y, n]" -i "n"; echo # # # if [ "$REPLY" = 'y' ]; then # # # echo "Will add the outro" # # # ADDOUTRO="y" # # # fi # # # # # # # # # echo # # # echo "--------------------------------------------------------------------------------" # # # echo "4/4 STEREO TEST: Should this be mono or stereo [m,s] ? " # # # CHANNELS="1" # # # read -s -n1 -p "intro ok? [m, s]" -i "m" ; echo # # # if [ "$REPLY" = 's' ]; then # # # echo "Will convert to stereo" # # # CHANNELS="2" # # # fi #============================================================ # Preprocess the source file echo "Convert from ${mediafile} to known wav format ${fname}_tmp.wav" ffmpeg -i ${mediafile} -ar 44100 -ac $CHANNELS ${fname}_tmp.wav > ${fname}_tmp.log 2>&1 # echo "Normalising the audio" # normalize -a 0.5 ${fname}_tmp.wav >> ${fname}_tmp.log 2>&1 # TODO Compressor ! # TODO add a little speed up # TODO little overlap in fade in of intro # echo "Truncating the silence" # sox ${fname}_tmp.wav ${fname}_sox.wav silence -l 1 0.1 1.6% -1 0.6 1.6% >> ${fname}_tmp.log 2>&1 cp -v ${fname}_tmp.wav ${fname}_sox.wav echo "Add the intro if it is missing and add it to the temp pcm file" if [ "$ADDINTRO" = 'y' ]; then ffmpeg -i intro.flac -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - > ${fname}_tmp.pcm 2>> ${fname}_tmp.log fi echo "convert the uploaded episode and add it to the temp pcm file" ffmpeg -i ${fname}_sox.wav -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp.pcm 2>> ${fname}_tmp.log echo "Add the outro if it is missing and add it to the temp pcm file" if [ "$ADDOUTRO" = 'y' ]; then ffmpeg -i outro.flac -ar 44100 -ac $CHANNELS -acodec pcm_s16le -f s16le - >> ${fname}_tmp.pcm 2>> ${fname}_tmp.log fi echo "Convert the pcm file to a know wav format" ffmpeg -f s16le -ar 44100 -ac 1 -acodec pcm_s16le -i ${fname}_tmp.pcm ${fname}_mez.wav 2>> ${fname}_tmp.log # echo "Get an image of the converted audio" # sox ${fname}_mez.wav -n spectrogram -x 800 -y 100 -o ${fname}_mez.png echo "--------------------------------------------------------------------------------" echo "File information" ffprobe ${fname}_mez.wav 2>&1 | grep Audio: mediainfo ${fname}_mez.wav echo "--------------------------------------------------------------------------------" # display ${fname}_mez.png & # read -s -n1 -p "Spectrogram check: Everything look ok [y,n] ? " -i "y" ; echo # if [ "$REPLY" = 'n' ]; then # echo "Something went w rong. Aborting." # exit # fi # echo "--------------------------------------------------------------------------------" # vlc ${fname}_mez.wav >> ${fname}_tmp.log 2>&1 & # read -s -n1 -p "VLC check: Everything look ok [y,n] ? " -i "y" ; echo # if [ "$REPLY" = 'n' ]; then # echo "Something went wrong. Aborting." # exit # fi echo "Remove temp files" rm -v ${fname}_tmp.wav ${fname}_sox.wav ${fname}_tmp.pcm ${fname}_tmp.log echo "Convert to mp3" # TODO and add tags" sox -S ${fname}_mez.wav ${fname}_mez.mp3 echo "Convert to ogg" # TODO and add tags" sox -S ${fname}_mez.wav ${fname}_mez.ogg echo "Convert to spx" # TODO and add tags" sox -S ${fname}_mez.wav -c 1 -r 16000 -t wav - | speexenc - ${fname}_mez.spx echo "Changing the file dates to the time of upload" touch -r ${mediafile} ${fname}* done