Korben a publié sur son blog un lien et une vidéo vers le travail d'une équipe pour construire un programme de découpage de spectrogramme.
C'est sympa comme truc. Avec sox
on peut aussi extraire la musique et les paroles séparément.
En effet, l'enregistrement des voix est en général en mono alors que la musique est en stéréo. Une différence des deux permet de les séparer.
Un exemple fera l'affaire :
Avant tout on télécharge une vidéo depuis, par exemple, youtube.
$ quvi -q -f best 'https://www.youtube.com/watch?v=9HANzOFtZ5c' --exec "wget %u -O %t.%e -q" > log.quvi
warning: --quiet: deprecated, use --verbosity instead
On vérifie que tout est bien arrivé
$ ls
Despicable Me 2 - Minion Dance Y.M.C.A.webm log.quvi
On inspecte la vidéo récupérée
$ exiftool Despicable\ Me\ 2\ -\ Minion\ Dance\ Y.M.C.A.webm -v | grep -v '\(Simple\|Timecode\|Cluster\|Cue\)'
ExifToolVersion = 8.60
FileName = Despicable Me 2 - Minion Dance Y.M.C.A.webm
Directory = .
FileSize = 7586906
FileModifyDate = 1373952984
FilePermissions = 33188
FileType = MKV
MIMEType = video/x-matroska
EBMLVersion = 1
EBMLReadVersion = 1
EBMLMaxIDLength = 4
EBMLMaxSizeLength = 8
DocType = webm
FileType [override] = WEBM
MIMEType [override] = video/webm
DocTypeVersion = 2
DocTypeReadVersion = 2
+ [SegmentHeader directory, 7586851 bytes]
| + [SeekHead directory, 45 bytes]
| | + [Seek directory, 11 bytes]
| | | SeekID = .I.f
| | | SeekPosition = 223
| | + [Seek directory, 12 bytes]
| | | SeekID = .T.k
| | | SeekPosition = 290
| | + [Seek directory, 13 bytes]
| | | SeekID = .S.k
| | | SeekPosition = 7586505
| Void =
| + [Info directory, 55 bytes]
| | MuxingApp = Google
| | WritingApp = Google
| | SegmentUID = ..f:.;..3[.....
| | Duration = 65168
| + [Tracks directory, 4352 bytes]
| | + [TrackEntry directory, 68 bytes]
| | | TrackNumber = 1
| | | TrackUID = 1
| | | TrackLacing = 0
| | | TrackLanguage = und
| | | TrackDefault = 1
| | | CodecID = V_VP8
| | | TrackType = 1
| | | VideoFrameRate = 1000000
| | | + [Video directory, 22 bytes]
| | | | ImageWidth = 640
| | | | ImageHeight = 360
| | | | DisplayWidth = 640
| | | | DisplayHeight = 360
| | | | DisplayUnit = 3
| | + [TrackEntry directory, 4266 bytes]
| | | TrackNumber = 2
| | | TrackUID = 2
| | | TrackLacing = 0
| | | TrackLanguage = und
| | | TrackDefault = 1
| | | VideoCodecID = A_VORBIS
| | | TrackType = 2
| | | + [Audio directory, 13 bytes]
| | | | AudioChannels = 2
| | | | AudioSampleRate = 44100
| | | CodecPrivate = ..".vorbis.D..............vorbis..encoder=Google..vorbis)BCV..."[snip]
C'est une vidéo, avec plein de google dedans. Le son qui nous intéresse est sûrement en vorbis :
$ exiftool -v ~/tm/Despicable\ Me\ 2\ -\ Minion\ Dance\ Y.M.C.A.webm | grep -i codec
| | | CodecID = V_VP8
| | | VideoCodecID = A_VORBIS
| | | CodecPrivate = ..".vorbis.D..............vorbis..encoder=Google..vorbis)BCV..."[snip]
Constatons avec un outil dédié aux vidéos plutôt qu'avec exiftool
:
$ avconv -i Despicable\ Me\ 2\ -\ Minion\ Dance\ Y.M.C.A.webm
Input #0, matroska,webm, from 'Despicable Me 2 - Minion Dance Y.M.C.A.webm':
Duration: 00:01:05.16, start: 0.000000, bitrate: N/A
Stream #0.0: Video: vp8, yuv420p, 640x360, PAR 1:1 DAR 16:9, 1k fps, 29.97 tbr, 1k tbn, 1k tbc (default)
Stream #0.1: Audio: vorbis, 44100 Hz, stereo, s16 (default)
On extrait le stream 0:1 (l'audio) et on copie le codec (on ne va pas décoder puis réencoder, on aurait des pertes).
$ avconv -i Despicable\ Me\ 2\ -\ Minion\ Dance\ Y.M.C.A.webm -map 0:1 -c:a copy audio.ogg
Input #0, matroska,webm, from 'Despicable Me 2 - Minion Dance Y.M.C.A.webm':
Duration: 00:01:05.16, start: 0.000000, bitrate: N/A
Stream #0.0: Video: vp8, yuv420p, 640x360, PAR 1:1 DAR 16:9, 1k fps, 29.97 tbr, 1k tbn, 1k tbc (default)
Stream #0.1: Audio: vorbis, 44100 Hz, stereo, s16 (default)
Output #0, ogg, to 'audio.ogg':
Metadata:
encoder : Lavf53.21.1
Stream #0.0: Audio: libvorbis, 44100 Hz, stereo (default)
Stream mapping:
Stream #0:1 -> #0:0 (copy)
Press ctrl-c to stop encoding
size= 1024kB time=65.15 bitrate= 128.7kbits/s
video:0kB audio:1012kB global headers:0kB muxing overhead 1.126693%
On regarde le spectrogramme, desfois qu'il y ait des informations utiles dedans. Pour ne pas avoir trop d'informations dans peu de pixels, on ne s'intéresse qu'aux 5 secondes à partir de la quatorzième. Ici, on voit que différentes sources de différents taux (en hertz) ont été mélangées, ce qui laisse penser que l'extraction va fonctionner :
$ sox audio.ogg -n spectrogram -S 14 -d 5
On voit mieux en n'observant qu'un canal (je ne sais pas si c'est gauche ou droite, mais on s'en fiche)
$ sox audio.ogg -n remix 1 spectrogram -S 14 -d 5
Vous remarquerez la voix, ces petites zébrures très visibles.
On fait faire le travail à sox, avec l'option oops, comme « out of phase stereo ».
$ sox audio.ogg music.ogg oops
sox WARN oops: oops clipped 16 samples; decrease volume?
Voila le résultat : plus de zébrures (et plus de voix non plus). Les quelques artefacts louches peuvent être supprimés en appliquant quelques filtres, mais ce n'est pas bien grave.
Détail intéressant, on remarque une différence d'énergie (il me semble) entre les zones en dessous 8kHz et au dessus de 8kHz. C'est probablement la preuve que l'enregistrement d'une des pistes a été fait avec un taux moindre.
C'est gagné.
$ vlc music.ogg