Help
Difference between revisions of "SoX"
Line 6: | Line 6: | ||
== Denoise == | == Denoise == | ||
− | === Extract noise | + | === Extract noise samples === |
Given a file with silence in its first 0.3sec. : | Given a file with silence in its first 0.3sec. : | ||
− | |||
<syntaxhighlight lang="bash"># sox in.ext out.ext trim {start: s.ms} {duration: s.ms} | <syntaxhighlight lang="bash"># sox in.ext out.ext trim {start: s.ms} {duration: s.ms} | ||
sox audio.wav noise-audio.wav trim 0 0.300 | sox audio.wav noise-audio.wav trim 0 0.300 | ||
# or : | # or : | ||
− | ffmpeg -i audio.wav -vn -ss 00:00:00 -t 00:00:00.300 noise-audio.wav</syntaxhighlight> | + | ffmpeg -i audio.wav -vn -ss 00:00:00 -t 00:00:00.300 noise-audio.wav |
+ | </syntaxhighlight> | ||
+ | |||
+ | For a folder with .wav audios with noisy silence in first 150ms and last 200ms : | ||
+ | <syntaxhighlight lang="bash"># 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; | ||
+ | </syntaxhighlight> | ||
=== Generate a noise profile in sox: === | === Generate a noise profile in sox: === |
Revision as of 13:36, 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:
sox noise-audio.wav -n noiseprof 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