script pour exécuter sox pour combiner plusieurs pistes mono en stéréo


4

J'ai un dossier plein de .wavfichiers audio.

Certains sont stéréo, la plupart sont mono splits.

Les paires mono split sont toutes nommées foo bar track.L.wavetfoo bar track.R.wav

Je peux utiliser l'outil de ligne de commande soxpour combiner une paire mono dans 1 piste stéréo comme ceci:

sox -M track1.L.wav track1.R.wav track1.Stereo.wav

où les 2 premiers fichiers sont les paires mono et le troisième est le fichier stéréo de sortie.

C'est bien, mais j'aimerais avoir un script qui trouvera automatiquement toutes les paires mono et les combinera en fichiers stéréo.

En d’autres termes, j’ai besoin de trouver tous les fichiers qui portent le même nom, à l’exception de .L.et .R.avant l’extension, et de les exécuter soxsur un nouveau fichier portant le même nom, sans L/Rsuffixe.

Par exemple, si mon dossier contient ces fichiers:

track1.L.wav
track2.L.wav
track3.L.wav
track4.L.wav
track1.R.wav
track2.R.wav
track3.R.wav
track4.R.wav
track6.wav
track7.wav

J'ai besoin d'exécuter ces commandes:

sox -M track1.L.wav track1.R.wav track1.Stereo.wav
sox -M track2.L.wav track2.R.wav track2.Stereo.wav
sox -M track3.L.wav track3.R.wav track3.Stereo.wav
sox -M track4.L.wav track4.R.wav track4.Stereo.wav

Voici où je suis si loin:

for file in ./*.L.wav;
do 
    file2=`echo $file | sed 's_\(.*\).L.wav_\1.R.wav_'`;
    out=`echo $file | sed 's_\(.*\).L.wav_\1.STEREO.wav_'`;
    echo $file - $file2 - $out;
done

Cela fonctionne, mais quand je remplace la echoligne par

sox -M $file $file2 $out;

ça ne marche pas les espaces dans les noms de fichiers le font échouer.

Réponses:


5

Essayez avec cela depuis une console GNU / Linux:

for file in ./*L*wav;
do
    for file2 in ./*R*wav;
    do
        $out = "Stereo"
        sox -M $file $file2 $file-$out.wav;
    done;
done

REMARQUE: "./" représente le répertoire de musique où se trouvent vos fichiers.


soxnécessite 3 arguments: les 2 fichiers, plus le fichier de sortie. J'ai besoin que le nom du fichier de sortie corresponde au nom des deux premiers sans L ni R
Dan

Désolé, cela ne fonctionne pas; il ne correspond pas aux fichiers correspondants. Il retourne simplement chaque fichier avec un "L", suivi de tous les autres fichiers, de manière récursive.
Dan

Oui, je suis désolé. J'ai oublié le troisième argument
slackmart

J'ai mis à jour le post pour clarifier; votre code n'aligne toujours pas les paires correspondantes. Aussi, ça ./*.L.wavmarche mieux ...
Dan

La deuxième fordéclaration doit en quelque sorte trouver les fichiers qui correspondent *à la premièrefor
Dan

2

A partir de la suggestion de sgmart, je l’ai résolue:

for file1 in ./*.L.wav; do 
  file2=`echo $file1 | sed 's_\(.*\).L.wav_\1.R.wav_'`;
  out=`echo $file1 | sed 's_\(.*\).L.wav_\1.STEREO.wav_'`;
  sox -MS "$file1" "$file2" "$out";
  mv "$file1" mono; mv "$file2" mono;
done

Nécessaire "est autour des variables.

Et j'ai ajouté un peu pour déplacer les fichiers traités dans un sous-dossier 'mono'.


0

Pour les personnes ayant besoin de le faire sous Windows avec un fichier de commandes:

Les 4 règles à remplir sont:

1) Le fichier de commandes doit être placé dans le répertoire où est installé SOX.

2) Les fichiers mono doivent avoir les terminaisons .L.WAV et .R.WAV

3) Pas d'espaces dans le nom du fichier

4) Placez tous vos fichiers / dossiers mono dans un nouveau dossier appelé input à l'intérieur du dossier d'installation SOX.

Après avoir exécuté le fichier de commandes, vous obtenez un nouveau dossier appelé sortie avec tous les fichiers stéréo et la même structure de dossier que le dossier d' entrée.

Le code est commenté, il est donc facile de suivre chaque étape du processus. N'hésitez pas à modifier et à publier ici des versions améliorées de ce script (la partie copie devrait être un mouvement, mais je ne suis pas très expert en code batch cmd!).

Et c'est parti:

cd %~dp0
setlocal enabledelayedexpansion

REM for each file with extension .L.WAV in input folder and its subdirectories do:
for /R %~dp0input %%F in (*.L.WAV) do (

    REM get fullpath name and then remove the last 6 characters. ex: MYWAVE.L.WAV -> MYWAVE
    set fileName=%%F
    set finalName=!filename:~0,-6!

    REM set names for each parameter used by sox
    set wavL=!finalName!.L.WAV
    set wavR=!finalName!.R.WAV
    set wavST=!finalName!.ST.WAV

    REM call sox for mono to stereo conversion
    sox !wavL! !wavR! !wavST! -MS

)

REM creat output folder
mkdir %~dp0output

REM copy files to output folder 
echo d | xcopy %~dp0input %~dp0output /S

REM delete ST files from input folder 
for /R %~dp0input %%F in (*.ST.WAV) do del %%F

REM delete L files from output folder 
for /R %~dp0output %%F in (*.L.WAV) do del %%F

REM delete R files from output folder 
for /R %~dp0output %%F in (*.R.WAV) do del %%F
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.