Help

Difference between revisions of "SoX"

 
(18 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 
== Dependencies ==
 
== Dependencies ==
* [https://linux.die.net/man/1/sox SoX] - Sound eXchange, the Swiss Army knife of audio manipulation
+
* [https://linux.die.net/man/1/sox SoX] Sound eXchange, the Swiss Army knife of audio manipulation
* [https://linux.die.net/man/1/ffmpeg FFmpeg] - ffmpeg video converter
+
* [https://linux.die.net/man/1/ffmpeg FFmpeg] ffmpeg video converter
 
** '''-ss:''' the time offset from beginning. (<code>h:m:s.ms</code>).
 
** '''-ss:''' the time offset from beginning. (<code>h:m:s.ms</code>).
 
** '''-t duration:''' record or transcode duration seconds of audio/video.
 
** '''-t duration:''' record or transcode duration seconds of audio/video.
 +
** '''-vn no video:''' ignore video stream
 +
* FFprobe – complement to FFmpeg, gives information on files.
 +
* Audacity – UI software to inspect audio file, convenient to see their audio waves.
  
 
== Denoise ==
 
== Denoise ==
=== Extract noise file from silence + room’s noise ===
+
:''See also [[:phab:T251638]].''
Given a file with silence in it’s first 0.3sec. :
 
  
<source lang="bash"># sox in.ext out.ext trim {start: s.ms} {duration: s.ms}
+
=== Extract noise samples ===
 +
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}
 
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</source>
+
ffmpeg -i audio.wav -vn -ss 00:00:00 -t 00:00:00.300 noise-audio.wav
 +
</syntaxhighlight>
  
=== Generate a noise profile in sox: ===
+
For a folder with .wav audios with noisy silence in first 150ms and last 200ms :
<source lang="bash">sox noise-audio.wav -n noiseprof noise.prof</source>
+
<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 ===
 +
[[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
 +
sox noise-audio.wav -n noiseprof noise.prof</syntaxhighlight>
 +
 
 +
<syntaxhighlight lang="bash"># 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 ;
 +
</syntaxhighlight>
  
 
=== Clean the noise from the audio ===
 
=== Clean the noise from the audio ===
 
Single file :
 
Single file :
  
<source lang="bash">sox audio.wav audio-clean.wav noisered noise.prof 0.21</source>
+
<syntaxhighlight lang="bash">sox audio.wav audio-clean.wav noisered noise.prof 0.21</syntaxhighlight>
 
Batch of files:
 
Batch of files:
  
<source lang="bash">mkdir -p ./clean;
+
<syntaxhighlight lang="bash"># Denoise
for file in ./*.wav;do key=$(basename "$file" .wav); sox "$file" ./clean/"$key".wav noisered ./noise.prof 0.21; done;</source>
+
mkdir -p ./clean;
 +
for file in ./wav/*.wav;do key=$(basename "$file" .wav);
 +
sox "$file" ./clean/"$key".wav noisered ./noise/noise.prof 0.21;
 +
done;</syntaxhighlight>
 
According to source :
 
According to source :
  
Line 35: Line 64:
  
 
== Fades ==
 
== Fades ==
 +
:''See also [[:phab:T251640]].''
 
To fade-in on 0.3s and out in 0.4s, you can use a simple ./fadeWav.sh bash script, such as:
 
To fade-in on 0.3s and out in 0.4s, you can use a simple ./fadeWav.sh bash script, such as:
  
<source lang="bash">#! /bin/bash
+
<syntaxhighlight lang="bash">
 +
sox input.wav output.wav fade "0:0.3" `soxi -d input.wav` "0:0.3"
 +
</syntaxhighlight>
 +
 
 +
Or as a script:
 +
<syntaxhighlight lang="bash">#! /bin/bash
 
WAV_IN=$1
 
WAV_IN=$1
 
WAV_OUT=$2
 
WAV_OUT=$2
Line 45: Line 80:
 
LENGTH=`soxi -d $WAV_IN`
 
LENGTH=`soxi -d $WAV_IN`
  
sox $WAV_IN $WAV_OUT fade $FADE_IN_L $LENGTH $FADE_OUT_L</source>
+
sox $WAV_IN $WAV_OUT fade $FADE_IN_L $LENGTH $FADE_OUT_L</syntaxhighlight>
 
<code>soxi -d</code> returns the length of the wav file. See sox documentation for more on [http://sox.sourceforge.net/soxi.html soxi].
 
<code>soxi -d</code> returns the length of the wav file. See sox documentation for more on [http://sox.sourceforge.net/soxi.html soxi].
  
 
You can run this bash script as follows:
 
You can run this bash script as follows:
  
<source lang="bash">./fadeWav.sh input.wav faded.wav</source>
+
<syntaxhighlight lang="bash">./fadeWav.sh input.wav faded.wav</syntaxhighlight>
 
=== Sources ===
 
=== Sources ===
 
* [https://stackoverflow.com/a/24307805?stw=2 Answer:SOX and fade in and fade out]
 
* [https://stackoverflow.com/a/24307805?stw=2 Answer:SOX and fade in and fade out]
 +
 +
== Normalize ==
 +
:''Content to create. See also [[:phab:T213535]] and [[LinguaLibre:Chat_room/Archives/2019#Normalize_loudness|LinguaLibre:Chat_room#Normalize_loudness]].''
  
 
== See also ==
 
== See also ==
 +
* [[Help:Rename]]
 +
* [[Help:Converting audios]]
 
* [https://stackoverflow.com/questions/20014064/ How to batch split audio files wherever there is silence?]
 
* [https://stackoverflow.com/questions/20014064/ How to batch split audio files wherever there is silence?]
 
* [https://people.xiph.org/~jm/demo/rnnoise/ RNNoise]
 
* [https://people.xiph.org/~jm/demo/rnnoise/ RNNoise]
 +
 +
{{Technicals}}
 +
 +
[[Category:Lingua Libre:Help]]

Latest revision as of 16:06, 24 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.
    • -vn no video: ignore video stream
  • FFprobe – complement to FFmpeg, gives information on files.
  • Audacity – UI software to inspect audio file, convenient to see their audio waves.

Denoise

See also phab:T251638.

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

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.
# 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:

# Denoise
mkdir -p ./clean;
for file in ./wav/*.wav;do key=$(basename "$file" .wav);
sox "$file" ./clean/"$key".wav noisered ./noise/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

See also phab:T251640.

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

Sources

Normalize

Content to create. See also phab:T213535 and LinguaLibre:Chat_room#Normalize_loudness.

See also

Lingua Libre technical helps
Template {{Speakers category}} • {{Recommended lists}} • {{To iso 639-2}} • {{To iso 639-3}} • {{Userbox-records}} • {{Bot steps}}
Audio files How to create a frequency list?Convert files formatsDenoise files with SoXRename and mass rename
Bots Help:BotsLinguaLibre:BotHelp:Log in to Lingua Libre with PywikibotLingua Libre Bot (gh) • OlafbotPamputtBotDragons Bot (gh)
MediaWiki MediaWiki: Help:Documentation opérationelle MediawikiHelp:Database structureHelp:CSSHelp:RenameHelp:OAuthLinguaLibre:User rights (rate limit) • Module:Lingua Libre record & {{Lingua Libre record}}JS scripts: MediaWiki:Common.jsLastAudios.jsSoundLibrary.jsItemsSugar.jsLexemeQueriesGenerator.js (pad) • Sparql2data.js (pad) • LanguagesGallery.js (pad) • Gadgets: Gadget-LinguaImporter.jsGadget-Demo.jsGadget-RecentNonAudio.jsLiLiZip.js
Queries Help:APIsHelp:SPARQLSPARQL (intermediate) (stub) • SPARQL for lexemes (stub) • SPARQL for maintenanceLingualibre:Wikidata (stub) • Help:SPARQL (HAL)
Reuses Help:Download datasetsHelp:Embed audio in HTML
Unstable & tests Help:SPARQL/test
Categories Category:Technical reports