55 votes

Comment vérifier si un fichier WAV à 2 pistes est "réellement" en stéréo ?

J'ai un fichier audio (au format WAV pour être précis). Lorsque je l'ouvre avec un éditeur (par exemple audacity), je vois deux canaux ; je soupçonne que l'enregistrement est en fait mono plutôt qu'audio, c'est-à-dire que je soupçonne que les pistes sont dupliquées. Quel est le moyen le plus simple de vérifier si elles le sont...

  • "parfaitement" dupliqué ?
  • "presque" double, indiscernable à l'oreille ?

J'utilise Devuan GNU/Linux. Une solution en ligne de commande serait la bienvenue, mais une interface graphique est également acceptable.

94voto

Kamil Maciorowski Points 57004

Cette réponse a été élargie pour couvrir trois façons différentes d'y parvenir, de la plus simple (aucun code requis, il suffit d'écouter) à des exemples plus complexes qui pourraient être utilisés pour des tests en masse.

Méthode la plus simple

Inversez la phase d'un côté et additionnez les sorties en mono.
Si le résultat est un silence, alors il s'agissait d'un mono ; sinon, il s'agissait d'un stéréo.
Même en stéréo, certaines parties auront été placées au centre - les voix, la basse, une grande partie de la batterie, etc., mais vous entendrez une différence énorme entre "quelques morceaux manquent" et "un silence presque total".
Si vous n'entendez que des petits bouts de la piste, des crépitements, des grésillements et des bruits sourds périodiques, mettez cela sur le compte d'un mauvais encodage, il s'agit toujours de "mono" à toutes fins utiles.

Cela repose sur la physique du son ; dans sa forme la plus simple, si vous additionnez deux formes d'onde identiques, le résultat sera deux fois plus fort. Si vous en inversez une, elles s'annuleront mutuellement et s'additionneront toujours jusqu'à "zéro" le silence. Ce principe est utilisé pour les casques antibruit et la réduction du bruit de fond dans le microphone de votre téléphone.

Méthode
De la Manuel d'Audacity

Effet > Inverser
Il n'y a pas de boîte de dialogue d'effet contenant des paramètres pour cet effet ; Inverser opère directement sur l'audio sélectionné. Si l'inversion prend un temps appréciable, un dialogue de progression apparaîtra.

Exemples d'utilisation

Utilisez le menu déroulant de la piste audio et choisissez Split Stereo to Mono.
Sélectionnez un canal mais pas l'autre, appliquez Invert et ensuite Play. Les voix de chaque piste s'annuleront les unes les autres, ne laissant que les instruments.
Découvrez à quel point les canaux stéréo sont différents : Effectuez les mêmes étapes 1 et 2 ci-dessus sur n'importe quelle piste stéréo. Si le son est aussi fort après les étapes qu'avant, les canaux sont très différents. Si le résultat est un silence, la piste n'est pas vraiment stéréo mais double mono, où les canaux gauche et droit contiennent un son totalement identique.

Méthode simple

Chargez (importez) le fichier (prétendument stéréo) dans Audacity. Dans le menu de la barre supérieure, sélectionnez Effet , Nyquist Prompt . Collez ce qui suit :

(diff (aref *track* 0) (aref *track* 1))

et cliquez sur OK. Cela va calculer la différence entre les deux pistes.

  • Un résultat totalement silencieux signifie que les pistes étaient identiques.
  • Un résultat très silencieux ou très bruyant signifie que les pistes étaient presque identiques.
  • Un résultat qui ressemble à l'audio original au moins pour certains fragments signifie que les pistes ont été probablement différent.

"Probablement", car il se peut que les pistes soient identiques mais en opposition de phase. Alors diff va augmenter l'amplitude au lieu de la ramener à zéro. Le résultat sera nettement plus fort que l'original. Pour écarter cette possibilité, revenez aux pistes d'origine ( Modifier , Annuler l'invite de Nyquist ) et sum au lieu de calculer le diff :

(sum (aref *track* 0) (aref *track* 1))

Un résultat totalement silencieux signifie que les pistes étaient identiques mais en opposition de phase.

Ces tests simples échoueront si les deux pistes sont similaires mais déphasées, ou similaires mais avec des volumes différents. Une formule capable de repérer les similitudes également dans de tels cas peut exister mais je ne connais pas la Audacity Nyquist Prompt pour vous aider davantage.

Cette réponse s'inspire largement du fil de discussion suivant du forum Audacity : Opérations arithmétiques de mixage de pistes .


Une méthode pas si simple

Utilisez le code suivant pour créer un .png les graphiques de votre .wav . Il fonctionne ffmpeg y convert (de Imagemagick).

#!/bin/sh

for input do

ffmpeg -nostdin -i "$input" -lavfi \
 '[0:a] channelsplit=channel_layout=stereo [left][right];
  [left] loudnorm [L];
  [right] loudnorm [R];
  [L][R] join=inputs=2:channel_layout=stereo [a];
  [a] showspectrumpic=s=800x600:mode=combined:color=channel:legend=no [out]' \
  -f apng -map '[out]' - \
| convert - -colorspace RGB -color-matrix \
' 20   0 -20   0   0   0
   0   0   0   0   0   0
   0  20 -20   0   0   0
   0   0   0   0   0   0
   0   0   0   0   0   0
   0   0   0   0   0   0
' "$input".png

done

Nommez-le spect et rendre exécutable ( chmod +x spect ). Fournir une ou plusieurs stéréos présumées .wav comme arguments de ligne de commande. Exemple :

./spect foo.wav /path/to/bar.wav

Cela générera foo.wav.png y /path/to/bar.wav.png . En examinant ces fichiers, vous serez en mesure de dire si les fichiers d'entrée étaient réellement en stéréo.

Ce que fait le script :

  1. ( ffmpeg ) Il normalise les canaux gauche et droit indépendamment. C'est au cas où un faux fichier stéréo a été créé en dupliquant des mono avec une amplification différente.

  2. (encore ffmpeg ) Il visualise le spectre sous forme de graphiques, où les deux canaux sont représentés par des couleurs différentes. La méthode est ainsi immunisée contre les déphasages, car c'est l'amplitude qui compte lors de la création d'un tel spectre, et non la phase. Les composantes rouge et verte correspondent aux deux canaux ; la composante bleue encode ce qui est commun aux deux canaux (elle sera utile dans un moment).

  3. ( convert ) Il traite les graphiques :

    • Les composantes de couleur "gauche" et "droite" sont réduites par la composante "commune". De cette façon, nous soulignons les fragments où les deux canaux diffèrent.
    • Le résultat est renforcé par un facteur de 20 (vous pouvez modifier ce facteur).
    • Les couleurs passent du rouge/vert au rouge/bleu. C'est uniquement parce que je voulais que la solution soit plus adaptée aux daltoniens.

Je vais analyser quelques exemples de résultats ci-dessous. Vous pourrez ainsi apprendre comment déterminer si une stéréo est authentique.

Notes :

  • Le code suppose qu'il y a deux canaux. Il a été testé uniquement avec .wav les fichiers ayant deux canaux.
  • Dans les images, le temps s'écoule de gauche à droite, la fréquence augmente de bas en haut.
  • Vous pouvez vouloir ne pas normaliser. Dans ce cas showspectrumpic est le seul filtre dont vous avez besoin dans ffmpeg .
  • J'ai utilisé 800x600 dans cette réponse. Adaptez la résolution à vos besoins.
  • La moitié supérieure de chaque image est noire, je suppose qu'elle s'étend à 48 kHz ( ?) alors que 22,1 kHz serait suffisant. Mon ffmpeg semble ne pas soutenir le stop option pour showspectrumpic Si vous avez besoin d'aide, cette option vous aidera probablement. Il existe d'autres méthodes pour traiter ce "problème", mais j'ai décidé de ne pas obscurcir le code. C'est un inconvénient, pas vraiment un problème.
  • spect peut être utilisé avec find -exec ou find | xargs .
  • Un traitement automatique supplémentaire est possible, jusqu'au point où le script vous indique I'm X% certain it's genuine stereo, I'm Y% certain it's fake stereo . Dans cette réponse, je n'irai pas aussi loin. Regardez des images et appliquez l'heuristique. Apprenez des exemples ci-dessous.

Exemples - chanson 1

C'est l'original .wav de la chanson 1 traitée par spect :

song 1, genuine stereo

Vous pouvez voir qu'il y a des colonnes de rouge, des colonnes de bleu. C'est là que (quand) l'un des canaux domine. Cela indique que c'est une véritable stéréo.

Queen - Bohemian Rhapsody


Le même morceau 1 avec un canal en opposition de phase semble pratiquement identique (cliquez pour agrandir) :

song 1, genuine stereo, opposite phase in one channel


La même chanson 1 mixée en mono et présentée comme stéréo (deux canaux identiques), fausse stéréo :

song 1, fake stereo

Le résultat est pratiquement tout noir. En théorie, il devrait être parfaitement noir. Je ne sais pas exactement d'où viennent les artefacts. L'important est qu'il n'y a pas de "structure" détaillée que la chanson originale avait. Le site diff de la méthode ci-dessus générerait le silence pour celui-ci.


La même chanson 1 mixée en mono et présentée en stéréo (deux canaux identiques), fausse stéréo, mais avec un canal en opposition de phase :

song 1, fake stereo, opposite phase in one channel

Celui-ci "tromperait" le diff vous aurez besoin de la méthode sum méthode. spect fonctionne bien malgré tout.


La même chanson 1 mixée en mono et présentée en stéréo, en fausse stéréo, mais avec un canal réduit en volume de 10 dB :

song 1, fake stereo, one channel reduced volume

Vous pouvez voir des artefacts mais, une fois encore, l'image est très différente de celle de la chanson originale. Ni l'un ni l'autre diff ni sum générerait le silence.


La même chanson 1 mixée en mono et présentée en stéréo, en fausse stéréo, mais avec un canal réduit en volume de 10 dB et opposé en phase :

song 1, fake stereo, one channel reduced volume

Il devrait maintenant être clair que la phase opposée ne compte pas pour spect . Le reste de cette réponse considère ce problème comme résolu.


Pour comparaison : chanson originale 1 avec un canal réduit en volume de 10 dB :

song 1, genuine stereo, one channel reduced volume

Grâce à la normalisation des canaux séparément, la "structure" détaillée que possédait la chanson originale est toujours visible.


La même chanson 1 avec un canal complètement silencieux :

song 1, one channel silent


Les résultats ci-dessus l'un à côté de l'autre. De gauche à droite :

  • véritable stéréo
  • véritable stéréo déséquilibré
  • un canal silencieux
  • fausse stéréo
  • fausse stéréo, asymétrique

<a href="https://i.stack.imgur.com/sPQEi.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/sPQEis.png" alt="song 1, genuine stereo"></a> <a href="https://i.stack.imgur.com/yGrMl.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/yGrMls.png" alt="song 1, genuine stereo, one channel unbalanced"></a> song 1, one channel silent song 1, fake stereo song 1, fake stereo, one channel unbalanced

Notes :

  • Si je manipule l'autre canal, les artefacts bleus ou rouges pourraient être de l'autre couleur. Ce sont les détails qui comptent, pas la couleur.
  • "Véritable stéréo, non équilibrée" reste une véritable stéréo. "Déséquilibré" signifie qu'un canal n'est pas aussi fort que l'autre. Ici, j'ai manipulé le fichier original pour obtenir ce résultat. En général, il se peut que l'enregistrement original soit comme ça. Cela ne signifie pas que quelqu'un a trafiqué le fichier.

Exemples - chanson 2

C'est l'original .wav de la chanson 1 traitée par spect :

song 1, genuine stereo

Cette chanson ne sépare pas les canaux aussi clairement que la première, il n'y a pas de colonnes de rouge ou de bleu. Pourtant, certaines fréquences sont plus rouges que bleues. Les caractéristiques changent plusieurs fois au fil de la chanson. Cela indique qu'il s'agit d'une véritable stéréo.

Counting Crows - M. Jones


Des résultats différents l'un après l'autre. De gauche à droite :

  • véritable stéréo
  • véritable stéréo déséquilibré
  • un canal silencieux
  • fausse stéréo
  • fausse stéréo, asymétrique

<a href="https://i.stack.imgur.com/Z9OLy.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Z9OLys.png" alt="song 2, genuine stereo"></a> <a href="https://i.stack.imgur.com/ff6av.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ff6avs.png" alt="song 2, genuine stereo, unbalanced"></a> song 2, one channel silent song 2, fake stereo song 2, fake stereo, unbalanced

Comme pour la chanson 1, vous pouvez reconnaître une véritable stéréo en repérant la "structure" détaillée.


Exemples - chanson 3

Cette chanson est en fait monophonique. Le signal mono avait été enregistré sur (je suppose) une bande stéréo. Il a été extrait de la bande en stéréo avec un bruit de bande différent pour chaque canal.

song 3

Il n'y a pas de "structure" détaillée, juste du bruit. Cela indique que la différence entre les canaux n'est en fait que du bruit. Le résultat de l'analyse diff méthode ne serait pas silencieuse, bien que pour cet exact .wav fichier la méthode fonctionnerait car je pourrais jouer le résultat et entendre son bruit.

Avec une entrée asymétrique, le diff / sum La méthode peut fonctionner si vous normalisez d'abord. Notre site spect le fait automatiquement. Pour mémoire, c'est ainsi que le morceau 3 déséquilibré est traité par spect ressemble :

song 3, unbalanced


Notes finales

  • Long .wav "compressé" à .png où 800 pixels couvrent toute la durée peut ressembler à du bruit. Une approche raisonnable consiste à améliorer spect il récupère donc la durée au préalable et ajuste la résolution horizontale en conséquence.
  • Si votre contribution est alors la sortie de spect sera du bruit. Il est possible d'en déduire quelque chose à partir de son intensité, mais comme la méthode repose sur le repérage d'une "structure" détaillée, elle ne donnera pas des résultats aussi évidents que dans le cas d'une véritable stéréo, par exemple pour les chansons 1 et 2.
  • Expérimentation. :)

20voto

Panda Pajama Points 389

Une méthode alternative, et à mon avis plus facile, pour calculer la différence entre la piste gauche et la piste droite :

Cliquez sur la piste, puis sur "Split Stereo Track".

Split stereo track

Cliquez sur la deuxième piste, puis sur "Effet/Inversion".

Effect Invert

Placez le panoramique des deux pistes au centre, sélectionnez tout, et cliquez sur "Tracks/Mix/Mix and Render".

Mix and render

Le résultat est la différence entre les deux voies. Si elle est égale à zéro, alors il s'agit de la même piste à gauche et à droite. Dans ce cas, ce n'est pas le cas.

Result

11voto

kubi Points 233

Voici une solution avec sox qui a plus de sens pour cette tâche que ffmpeg, à mon avis.

Sox a le oops l'effet, alias le filtre karaoké :

Effet stéréo déphasé. Mélange la stéréo en twin-mono où chaque canal mono contient la différence entre les canaux stéréo gauche et droit.

Et si les deux canaux sont les mêmes, le résultat devrait être tout zéro .
Nous pouvons utiliser la méthode de Sox stat effet pour vérifier cela.

Nous pouvons enchaîner les deux effets et avoir une seule commande simple :

sox infile.wav -n oops stat

Ce qui donne ce résultat pour un fichier "faux stéréo", c'est-à-dire que les canaux gauche/droite sont identiques :

...
Maximum amplitude:     0.000000
Minimum amplitude:     0.000000 
...

Pour un fichier qui est presque stéréo ça ressemble à ça :

Maximum amplitude:     0.000397

En revanche, pour une chanson que j'ai choisie au hasard :

Maximum amplitude:     0.950149
Minimum amplitude:    -1.000000

Vous pouvez aller encore plus loin et comparer les canaux au niveau du bit, en diff les deux canaux :

# check the -b/-e params with: soxi in.wav
sox in.wav -b 16 -e signed -c 1 in.l.raw remix 1
sox in.wav -b 16 -e signed -c 1 in.r.raw remix 2
diff in.l.raw in.r.raw

Ce qui donnera

Binary files in.l.raw and in.r.raw differ

s'ils diffèrent.

Je suis sûr que vous pourriez aussi condenser cela en une seule ligne avec des sous-coques.

8voto

blerontin Points 272

Vous pouvez y parvenir avec FFmpeg, en utilisant la fonction poêle afin de générer le delta entre les deux canaux audio, suivi du filtre astats pour imprimer le niveau global du signal RMS.

ffmpeg -i $INPUT_FILE -filter:a "pan=1c|c0=c0-c1,astats=measure_perchannel=none:measure_overall=RMS_level" -f null /dev/null

Exemple de sortie :

[Parsed_astats_1 @ 0x3ad1340] Channel: 1
[Parsed_astats_1 @ 0x3ad1340] Overall
[Parsed_astats_1 @ 0x3ad1340] RMS level dB: -16.015304

Plus le niveau RMS affiché est bas, plus la différence entre les deux canaux audio est faible. S'ils sont parfaitement égaux, la valeur affichée sera "-inf".

1voto

harrymc Points 394411

Si vous avez installé ffmpeg et ont ffprobe utilisez cette commande :

ffprobe -i file.wav -show_streams -select_streams a:0

Cela vous donnera une sortie où se trouve la partie importante :

[STREAM]
...
channels=2
channel_layout=stereo

Notez le channels=2 y channel_layout=stereo que vous pouvez traverser grep pour vérifier.

Une commande plus simple utilise -show_entries pour spécifier ce que vous voulez, applique formatage d'impression via -of pour dépouiller tout le reste et définir la verbosité à 0 pour ne pas imprimer les informations de départ habituelles :

ffprobe -i yourFile.mp4 -show_entries stream=channels -select_streams a:0 -of compact=p=0:nk=1 -v 0

Cela renverra "2" pour un fichier audio stéréo typique.

fuente


Pour comparer les deux canaux, le post Comparaison de deux morceaux supposés identiques a ce conseil qui utilise l'outil gratuit Audacity :

Importez-les tous les deux dans Audacity. Appliquez l'effet "Invert" à l'une des pistes. Sélectionnez les deux pistes, puis à partir du menu "Tracks > Mix and Render". Si les pistes étaient identiques, le résultat sera un silence. Pour vérifier qu'il s'agit d'un silence absolu, sélectionnez la piste complète (mixage), et ouvrez l'effet " Amplify ". Si l'effet "Amplify" indique que la "New Peak Amplitude" est "-infinity", alors la piste de mixage est totalement silencieuse et les deux fichiers importés ont un son identique.

Le post contient beaucoup de discussions qui vous intéresseront et quelques alternatives.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X