Introduction
Fieldnote Audio Studio a besoin de courts extraits pour faire écouter ses enregistrements. Vous créerez un WAV de trois secondes, l’écouterez, puis transformerez cette commande en script Bash réutilisable. Les enregistrements fournis sont des sons de synthèse originaux, pas des enregistrements réalisés avec un microphone.
Vous devez déjà connaître les arguments, conditions, boucles, tableaux et fonctions de base de Bash présentés dans Shell for Beginners. Ce laboratoire explique les options multimédias et les guillemets nécessaires. FFmpeg est prêt. Le terminal Workspace et la page Listening Room partagent un seul conteneur ; chaque laboratoire est initialisé indépendamment.
Créer et écouter un premier extrait
Dans cette étape, vous entendrez ce que contient un extrait réussi avant d’écrire un script de traitement par lots.
Commencez dans Workspace, préparé pour les noms de fichiers UTF-8. Le répertoire de travail est le studio fourni. Si une commande indique qu’un chemin relatif manque, utilisez pwd pour voir le répertoire courant, puis revenez avec cette commande cd complète. Effectuez tout le travail du cours ici.
cd /home/labex/project/audio-studio
ls input
Vous devez voir Morning bells.wav, 海辺.wav et -closing.wav. Chaque fichier est un enregistrement WAV mono de huit secondes, contenant des échantillons PCM sur 16 bits à 22050 échantillons par seconde. Le PCM stocke directement les échantillons. Nous conserverons ce format et seulement le début. Les entrées acceptées sont les fichiers ordinaires non cachés directement dans le répertoire d’entrée, avec l’extension .wav en minuscules ; ce projet ne parcourt pas les sous-répertoires et ne gère pas des codecs quelconques.
Créez d’abord single, un répertoire pour les essais individuels. mkdir -p le crée au besoin et accepte qu’il existe déjà.
mkdir -p single
Dans la commande suivante, -i désigne l’entrée, -t 3 limite la sortie à trois secondes et -c:a pcm_s16le choisit le PCM signé sur 16 bits. Les options décrivent l’entrée ou la sortie qui suit : leur position compte. -v error masque la progression habituelle tout en conservant les erreurs. -nostdin empêche FFmpeg de lire l’entrée du terminal pour ses commandes interactives, ce qui le rend aussi plus sûr dans une boucle. Le dernier chemin nomme la sortie.
Les guillemets doubles conservent un chemin contenant des espaces comme un seul argument. Un préfixe ./ ou un répertoire absolu évite aussi qu’un nom commençant par - soit pris pour une option. Utilisez un nouveau fichier de sortie : FFmpeg refuse normalement d’écraser un fichier existant lorsque l’interaction sur l’entrée standard est désactivée.
ffmpeg -nostdin -v error -i "input/Morning bells.wav" -t 3 -c:a pcm_s16le "single/Morning bells.wav"
Une conversion réussie n’affiche rien à ce niveau de journalisation. $? est le code de sortie natif de la commande précédente : zéro indique un succès, une autre valeur un échec. Lisez-le immédiatement ; toute autre commande le remplace.
printf 'Conversion exit: %s\n' "$?"
Vous devez obtenir Conversion exit: 0. Ce code indique que la conversion s’est bien exécutée ; l’écoute vérifiera que le fichier est utilisable.
Passez à l’onglet Listening Room et rechargez la page. Sous First preview, appuyez sur le bouton de lecture de Morning bells. Écoutez les sons changeants, déplacez le curseur de lecture dans l’extrait et vérifiez qu’il se termine à trois secondes. Sélectionnez Download WAV pour enregistrer ce même fichier. La page lit uniquement vos fichiers de sortie réels ; elle ne peut pas compléter un son manquant depuis la bibliothèque. Revenez à Workspace pour continuer.

Repérez les commandes de lecture et de position ainsi que le lien Download WAV sous First preview.
Si vous avez mal saisi le chemin d’entrée, consultez ls input, corrigez le nom entre guillemets et relancez la commande. Si un essai devenu inutile occupe déjà le nom de sortie, supprimez uniquement cet essai avec rm -- "single/Morning bells.wav" avant de recommencer. -- termine les options ; il ne signifie pas « tout supprimer ». Gardez library, archive, notes.txt et scratch-other inchangés pendant ce laboratoire.
Encapsuler la conversion dans une fonction réutilisable
Dans cette étape, vous transmettrez l’entrée, la sortie et la durée à une même conversion au lieu de modifier sa commande pour chaque enregistrement.
Commencez dans Workspace, dans /home/labex/project/audio-studio. Une fonction donne un nom à un groupe de commandes. À l’intérieur de make_preview, $1, $2 et $3 sont les arguments de cette fonction. Le script reçoit ses propres arguments et les transmet dans l’ordre. Les guillemets de "$1" préservent chaque chemin complet, espaces et caractères Unicode compris.
Le here-document suivant écrit un petit script. cat > preview-one.sh remplace ce fichier de script. <<'BASH' prend les lignes suivantes comme du texte littéral jusqu’à une ligne contenant seulement BASH ; les guillemets du délimiteur empêchent le shell actuel de développer $1 lors de l’enregistrement du script. La première ligne choisit Bash lorsque le script est lancé comme programme. Ici, nous l’exécuterons explicitement avec bash.
cat > preview-one.sh <<'BASH'
#!/usr/bin/env bash
make_preview() {
ffmpeg -nostdin -v error -i "$1" -t "$3" -c:a pcm_s16le "$2"
}
make_preview "$1" "$2" "$3"
BASH
Utilisez la fonction pour produire un autre extrait de deux secondes. 2 est un argument de durée, pas une partie de l’un des noms de fichiers.
bash preview-one.sh "input/海辺.wav" "single/海辺.wav" 2
printf 'Conversion exit: %s\n' "$?"
Le code doit de nouveau être zéro. Rechargez Listening Room, écoutez 海辺 sous First preview et remarquez que cet extrait se termine à deux secondes. Revenez à Workspace. La même fonction accepte maintenant différents chemins et durées ; l’étape suivante ajoute une collection d’entrées.
Traiter tous les enregistrements
Dans cette étape, vous publierez un nouveau répertoire contenant un extrait pour chaque entrée.
Commencez dans Workspace. Le script accepte exactement trois arguments : le répertoire d’entrée, un nouveau répertoire de sortie et une durée entière de une à cinq secondes. Pour ce premier lot, fournissez des répertoires d’entrée et parent de sortie existants et distincts, en gardant la sortie hors de l’entrée. Une sortie existante doit être refusée afin qu’une autre exécution n’écrase pas un bon résultat. Ne lancez pas deux processus d’écriture sur le même chemin de sortie. Ces contrôles gèrent les erreurs ordinaires ; ils ne garantissent pas la sûreté d’écritures concurrentes.
Avant d’écrire le script, comprenez les nouveautés. realpath transforme le répertoire d’entrée existant en chemin absolu, donnant à chaque entrée un préfixe de répertoire sûr. shopt -s nullglob fait qu’un motif *.wav sans correspondance produit zéro élément plutôt qu’un chemin littéral avec astérisque. files=(...) conserve les correspondances dans un tableau ; les guillemets du répertoire préservent ses espaces, tandis que *.wav sans guillemets recherche encore les noms. ${#files[@]} compte les éléments et "${files[@]}" transmet chacun séparément.
$(command) capture la sortie d’une commande. || exit 2 arrête le script si cette commande échoue. Entre des tests, || signifie OU : [ -e "$2" ] || [ -L "$2" ] considère chacun de ces types de cible existante comme un motif de refus.
case choisit une branche ; 1|2|3|4|5 autorise une de ces valeurs. [ -e path ] teste l’existence d’une cible, tandis que -L détecte aussi un lien symbolique dont la cible manque. ${source##*/} supprime le plus long préfixe se terminant par /, ne gardant que le nom. if ! command prend la branche d’échec si la commande renvoie une valeur différente de zéro. >&2 écrit une explication dans le flux d’erreurs et exit 1 termine en échec.
Remplacez le batch.sh incomplet fourni par cette première version fonctionnelle. Elle vise les entrées intactes de ce laboratoire. Une conversion échouée renvoie une valeur différente de zéro, mais peut laisser un nouveau répertoire partiel ; le laboratoire guidé suivant apprend à empêcher cette publication.
cat > batch.sh <<'BASH'
#!/usr/bin/env bash
if [ "$#" -ne 3 ]; then
printf 'Usage: batch.sh INPUT OUTPUT SECONDS\n' >&2
exit 2
fi
case "$3" in 1|2|3|4|5) ;; *) exit 2 ;; esac
if [ -e "$2" ] || [ -L "$2" ]; then
printf 'Output already exists\n' >&2
exit 2
fi
input=$(realpath -- "$1") || exit 2
shopt -s nullglob
files=("$input"/*.wav)
if [ "${#files[@]}" -eq 0 ]; then
printf 'No WAV inputs\n' >&2
exit 1
fi
mkdir -- "$2" || exit 1
make_preview() {
ffmpeg -nostdin -v error -i "$1" -t "$3" -c:a pcm_s16le "$2"
}
for source in "${files[@]}"; do
name=${source##*/}
if ! make_preview "$source" "$2/$name" "$3"; then
printf 'Could not convert: %s\n' "$name" >&2
exit 1
fi
done
printf 'Published %s previews\n' "${#files[@]}"
BASH
Créez maintenant le lot de trois secondes dans le nouveau répertoire previews. Le dossier publié doit contenir exactement un WAV correspondant à chaque entrée, avec les noms d’origine et aucun fichier supplémentaire.
bash batch.sh input previews 3
Vous devez voir Published 3 previews. Rechargez Listening Room. Sous Your listening pack, écoutez les trois extraits, déplacez-vous dans chacun et téléchargez-en un. Chacun dure trois secondes et contient le début de son propre enregistrement, y compris -closing. Les essais individuels restent séparés.
De retour dans Workspace, répétez volontairement la commande. Ce refus est attendu ; l’environnement n’est pas en panne.
bash batch.sh input previews 3
printf 'Repeat exit: %s\n' "$?"
Vous devez obtenir Output already exists et Repeat exit: 2. Gardez le lot réussi et choisissez un autre nom de sortie neuf pour vos prochains essais. Le script peut aussi échouer clairement sur une entrée vide, plutôt que prétendre avoir créé un paquet utile. Vous disposez d’un traitement par lots réutilisable ; vous allez améliorer son comportement lorsqu’un enregistrement est endommagé.
Résumé
Vous avez créé du son lisible, préservé les noms complets avec des guillemets et combiné une fonction et une boucle de tableau dans un traitement Bash réutilisable. Vous avez lu les codes de sortie natifs et refusé d’écraser un pack existant. Le laboratoire suivant ajoute un répertoire de préparation pour empêcher un échec de publier un nouveau pack partiel.



