Add a noise reduction script (using sox and ffmpeg) (#850)
* Create noisereduce * Update noisereduce * Update noisereduce
This commit is contained in:
parent
b5821a2308
commit
9c5faeeb95
1 changed files with 81 additions and 0 deletions
81
.local/bin/noisereduce
Normal file
81
.local/bin/noisereduce
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
#!/usr/bin/sh
|
||||||
|
|
||||||
|
usage ()
|
||||||
|
{
|
||||||
|
printf "Usage : noisereduce <input video file> <output video file>\n"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# Tests for requirements
|
||||||
|
ffmpeg -version >/dev/null || { echo >&2 "We require 'ffmpeg' but it's not installed. Install it by 'sudo apt-get install ffmpeg' Aborting."; exit 1; }
|
||||||
|
sox --version >/dev/null || { echo >&2 "We require 'sox' but it's not installed. Install it by 'sudo apt-get install sox' Aborting."; exit 1; }
|
||||||
|
|
||||||
|
if [ "$#" -ne 2 ]
|
||||||
|
then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -e "$1" ]
|
||||||
|
then
|
||||||
|
printf "File not found: %s\n" "$1"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -e "$2" ]
|
||||||
|
then
|
||||||
|
printf "File %s already exists, overwrite? [y/N]\n: " "$2"
|
||||||
|
read -r yn
|
||||||
|
case $yn in
|
||||||
|
[Yy]* ) ;;
|
||||||
|
* ) exit;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
inBasename=$(basename "$1")
|
||||||
|
inExt="${inBasename##*.}"
|
||||||
|
|
||||||
|
isVideoStr=$(ffprobe -v warning -show_streams "$1" | grep codec_type=video)
|
||||||
|
if [ -n "$isVideoStr" ]
|
||||||
|
then
|
||||||
|
isVideo=1
|
||||||
|
printf "Detected %s as a video file\n" "$inBasename"
|
||||||
|
else
|
||||||
|
isVideo=0
|
||||||
|
printf "Detected %s as an audio file\n" "$inBasename"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "Sample noise start time [00:00:00]: "
|
||||||
|
read -r sampleStart
|
||||||
|
if [ -z "$sampleStart" ] ; then sampleStart="00:00:00"; fi
|
||||||
|
printf "Sample noise end time [00:00:00.900]: "
|
||||||
|
read -r sampleEnd
|
||||||
|
if [ -z "$sampleEnd" ] ; then sampleEnd="00:00:00.900"; fi
|
||||||
|
printf "Noise reduction amount [0.21]: "
|
||||||
|
read -r sensitivity
|
||||||
|
if [ -z "$sensitivity" ] ; then sensitivity="0.21"; fi
|
||||||
|
|
||||||
|
|
||||||
|
tmpVidFile="/tmp/noiseclean_tmpvid.$inExt"
|
||||||
|
tmpAudFile="/tmp/noiseclean_tmpaud.wav"
|
||||||
|
noiseAudFile="/tmp/noiseclean_noiseaud.wav"
|
||||||
|
noiseProfFile="/tmp/noiseclean_noise.prof"
|
||||||
|
tmpAudCleanFile="/tmp/noiseclean_tmpaud-clean.wav"
|
||||||
|
|
||||||
|
printf "Cleaning noise on %s...\n" "$1"
|
||||||
|
|
||||||
|
if [ $isVideo -eq "1" ]; then
|
||||||
|
ffmpeg -v warning -y -i "$1" -qscale:v 0 -vcodec copy -an "$tmpVidFile"
|
||||||
|
ffmpeg -v warning -y -i "$1" -qscale:a 0 "$tmpAudFile"
|
||||||
|
else
|
||||||
|
cp "$1" "$tmpAudFile"
|
||||||
|
fi
|
||||||
|
ffmpeg -v warning -y -i "$1" -vn -ss "$sampleStart" -t "$sampleEnd" "$noiseAudFile"
|
||||||
|
sox "$noiseAudFile" -n noiseprof "$noiseProfFile"
|
||||||
|
sox "$tmpAudFile" "$tmpAudCleanFile" noisered "$noiseProfFile" "$sensitivity"
|
||||||
|
if [ $isVideo -eq "1" ]; then
|
||||||
|
ffmpeg -v warning -y -i "$tmpAudCleanFile" -i "$tmpVidFile" -vcodec copy -qscale:v 0 -qscale:a 0 "$2"
|
||||||
|
else
|
||||||
|
cp "$tmpAudCleanFile" "$2"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "Done"
|
Loading…
Reference in a new issue