Help
Difference between revisions of "SoX"
Line 27: | Line 27: | ||
=== Generate a noise profile in sox === | === Generate a noise profile in sox === | ||
+ | [[File:Noise-audio-shtooka.wav|Background audio noise sample from Shtooka project based on 282 samples from 191 audio files' header (0.17s) and tail (0.23s), totalling 51 sec. of noise. Such file are used as sample to remove background noise (denoise) in audio files recorded in similar conditions.|thumb]] | ||
<syntaxhighlight lang="bash"># From one noise sample audio file | <syntaxhighlight lang="bash"># From one noise sample audio file | ||
sox noise-audio.wav -n noiseprof noise.prof</syntaxhighlight> | sox noise-audio.wav -n noiseprof noise.prof</syntaxhighlight> | ||
Line 36: | Line 37: | ||
sox ./noise/noise-audio.wav -n noiseprof ./noise/noise.prof ; | sox ./noise/noise-audio.wav -n noiseprof ./noise/noise.prof ; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
− | |||
− | |||
− | |||
=== Clean the noise from the audio === | === Clean the noise from the audio === |
Revision as of 14:50, 15 January 2024
Dependencies
- SoX - Sound eXchange, the Swiss Army knife of audio manipulation
- FFmpeg - ffmpeg video converter
- -ss: the time offset from beginning. (
h:m:s.ms
). - -t duration: record or transcode duration seconds of audio/video.
- -ss: the time offset from beginning. (
Denoise
Extract noise samples
Given a file with silence in its first 0.3sec. :
# sox in.ext out.ext trim {start: s.ms} {duration: s.ms}
sox audio.wav noise-audio.wav trim 0 0.300
# or :
ffmpeg -i audio.wav -vn -ss 00:00:00 -t 00:00:00.300 noise-audio.wav
For a folder with .wav audios with noisy silence in first 150ms and last 200ms :
# Create noise samples
mkdir -p ./noise;
for file in ./wav/*.wav;
do key=$(basename "$file" .wav);
ffmpeg -i "$file" -vn -ss 00:00:00 -t 00:00:00.150 ./noise/noise-"$key"-head.wav ;
ffmpeg -vn -sseof -0.200 -t 0.200 -i "$file" ./noise/noise-"$key"-tail.wav
# sox "$file" ./noise/noise-"$key"-head.wav trim 0 0.200
# sox "$file" ./noise/noise-"$key"-tail.wav reverse trim 0 0.200 reverse
done;
Generate a noise profile in sox
# From one noise sample audio file
sox noise-audio.wav -n noiseprof noise.prof
# Contact noise samples into single noise sample
ffmpeg -f concat -safe 0 -i <(for f in ./noise/*.wav; do echo "file '$PWD/$f'"; done) -c copy ./noise/noise-audio.wav
# From sample, creates noise profile
sox ./noise/noise-audio.wav -n noiseprof ./noise/noise.prof ;
Clean the noise from the audio
Single file :
sox audio.wav audio-clean.wav noisered noise.prof 0.21
Batch of files:
mkdir -p ./clean;
for file in ./*.wav;do key=$(basename "$file" .wav); sox "$file" ./clean/"$key".wav noisered ./noise.prof 0.21; done;
According to source :
Change 0.21 to adjust the level of sensitivity in the sampling rates (I found 0.2-0.3 often provides best result).
Sources
Fades
To fade-in on 0.3s and out in 0.4s, you can use a simple ./fadeWav.sh bash script, such as:
sox input.wav output.wav fade "0:0.3" `soxi -d input.wav` "0:0.3"
Or as a script:
#! /bin/bash
WAV_IN=$1
WAV_OUT=$2
FADE_IN_L="0:0.3"
FADE_OUT_L="0:0.4"
LENGTH=`soxi -d $WAV_IN`
sox $WAV_IN $WAV_OUT fade $FADE_IN_L $LENGTH $FADE_OUT_L
soxi -d
returns the length of the wav file. See sox documentation for more on soxi.
You can run this bash script as follows:
./fadeWav.sh input.wav faded.wav