Introducción
Fieldnote Audio Studio necesita fragmentos cortos para escuchar sus grabaciones. Crearás un WAV de tres segundos, lo reproducirás y convertirás ese comando en un script Bash reutilizable. Las grabaciones preparadas son sonidos sintéticos originales, no grabaciones de micrófono.
Debes conocer los argumentos, condiciones, bucles, arrays y funciones básicos de Bash de Shell for Beginners. Este laboratorio explica las opciones multimedia y las comillas necesarias. FFmpeg está listo. La terminal Workspace y la página Listening Room comparten un único contenedor; cada laboratorio se inicializa de forma independiente.
Crea y reproduce un fragmento
En este paso, escucharás qué contiene un fragmento correcto antes de escribir un script por lotes.
Empieza en Workspace, preparado para nombres de archivo UTF-8. El directorio de trabajo es el estudio preparado. Si un comando indica que falta una ruta relativa, usa pwd para ver el directorio actual y vuelve con este comando cd completo. Realiza aquí todo el trabajo del curso.
cd /home/labex/project/audio-studio
ls input
Debes ver Morning bells.wav, 海辺.wav y -closing.wav. Cada archivo es una grabación WAV mono de ocho segundos con muestras PCM de 16 bits a 22050 muestras por segundo. PCM almacena directamente las muestras. Conservaremos ese formato y solo el principio de la grabación. Las entradas admitidas son archivos regulares no ocultos directamente en el directorio de entrada, con extensión .wav en minúsculas; este proyecto no recorre subdirectorios ni trata códecs arbitrarios.
Primero crea single, un directorio para los experimentos individuales. mkdir -p lo crea si hace falta y admite que ya exista.
mkdir -p single
En el siguiente comando, -i identifica la entrada, -t 3 limita la salida a tres segundos y -c:a pcm_s16le selecciona audio PCM de 16 bits con signo. Las opciones describen la entrada o salida que viene después, por lo que importa su posición. -v error oculta el progreso habitual, pero conserva los errores. -nostdin evita que FFmpeg lea la entrada de la terminal para órdenes interactivas y también lo hace más seguro dentro de bucles. La última ruta nombra la salida.
Las comillas dobles mantienen una ruta con espacios como un solo argumento. Un prefijo ./ o un directorio absoluto también evita que un nombre que empieza por - se interprete como opción. Usa un archivo de salida nuevo: FFmpeg normalmente rechaza sobrescribir uno existente cuando se desactiva la interacción por la entrada estándar.
ffmpeg -nostdin -v error -i "input/Morning bells.wav" -t 3 -c:a pcm_s16le "single/Morning bells.wav"
Una conversión correcta no imprime nada con este nivel de registro. $? es el estado de salida nativo del comando anterior: cero significa éxito y un valor distinto de cero indica fallo. Léelo inmediatamente; otro comando lo sustituye.
printf 'Conversion exit: %s\n' "$?"
Debes obtener Conversion exit: 0. Este estado indica que la conversión se ejecutó correctamente; la reproducción comprobará que el archivo es utilizable.
Cambia a la pestaña Listening Room y recarga la página. En First preview, pulsa el control de reproducción de Morning bells. Escucha los tonos cambiantes, arrastra el control de posición dentro del fragmento y comprueba que termina a los tres segundos. Selecciona Download WAV para guardar ese mismo archivo. La página solo lee tus archivos de salida reales; no puede completar el audio que falta desde la biblioteca. Vuelve a Workspace para continuar.

Busca el control de reproducción y posición y el enlace Download WAV bajo First preview.
Si escribiste mal la ruta de entrada, consulta ls input, corrige el nombre entre comillas y ejecuta de nuevo el comando. Si un experimento que ya no quieres ocupa el nombre de salida, elimina únicamente ese experimento con rm -- "single/Morning bells.wav" antes de repetirlo. -- termina las opciones; no significa «borrar todo». Conserva library, archive, notes.txt y scratch-other sin cambios durante el laboratorio.
Encapsula la conversión en una función reutilizable
En este paso, pasarás la entrada, la salida y la duración a la misma conversión en vez de editar su comando para cada grabación.
Empieza en Workspace, en /home/labex/project/audio-studio. Una función da nombre a un grupo de comandos. Dentro de make_preview, $1, $2 y $3 son los argumentos de esa función. El script recibe sus propios argumentos y los reenvía en orden. Las comillas de "$1" conservan cada ruta completa, incluidos espacios y Unicode.
El siguiente here-document escribe un pequeño script. cat > preview-one.sh sustituye ese archivo de script. <<'BASH' toma las líneas siguientes como texto literal hasta una línea que solo contiene BASH; entrecomillar el delimitador impide que el shell actual expanda $1 al guardar el script. La primera línea selecciona Bash cuando el script se inicia como programa. Aquí lo ejecutaremos explícitamente con 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
Usa la función para crear otro fragmento de dos segundos. 2 es un argumento de duración, no parte de ninguno de los nombres de archivo.
bash preview-one.sh "input/海辺.wav" "single/海辺.wav" 2
printf 'Conversion exit: %s\n' "$?"
El estado debe volver a ser cero. Recarga Listening Room, reproduce 海辺 bajo First preview y observa que este fragmento termina a los dos segundos. Vuelve a Workspace. La misma función ya funciona con rutas y duraciones distintas; el siguiente paso añade una colección de entradas.
Procesa todas las grabaciones
En este paso, publicarás un directorio nuevo con un fragmento para cada entrada.
Empieza en Workspace. El script acepta exactamente tres argumentos: directorio de entrada, directorio de salida nuevo y una duración entera de uno a cinco segundos. Para este primer lote, proporciona directorios de entrada y padre de salida existentes y separados, y mantén la salida fuera de la entrada. Debe rechazarse una salida existente para que otra ejecución no sobrescriba un buen resultado. No ejecutes dos escritores sobre la misma ruta de salida. Estas comprobaciones son manejo habitual de errores, no una garantía para escritores concurrentes.
Antes de escribirlo, entiende las partes nuevas. realpath convierte el directorio de entrada existente en una ruta absoluta y da un prefijo de directorio seguro a cada archivo. shopt -s nullglob hace que un *.wav sin coincidencias se expanda a cero elementos, en lugar de a una ruta literal con asterisco. files=(...) guarda las coincidencias en un array; las comillas del directorio conservan sus espacios, mientras que *.wav sin comillas sigue buscando nombres. ${#files[@]} cuenta los miembros y "${files[@]}" pasa cada uno por separado.
$(command) captura la salida de un comando. || exit 2 detiene el script si ese comando falla. Entre pruebas, || significa O: [ -e "$2" ] || [ -L "$2" ] considera cualquiera de los dos tipos de destino existente como motivo para rechazarlo.
case selecciona una rama; 1|2|3|4|5 permite uno de esos valores. [ -e path ] comprueba si existe un destino, mientras que -L también detecta un enlace simbólico colgante. ${source##*/} quita el prefijo más largo terminado en / y deja el nombre. if ! command entra en la rama de fallo cuando el comando devuelve un valor distinto de cero. >&2 envía una explicación al flujo de errores y exit 1 termina con fallo.
Sustituye el batch.sh incompleto preparado por esta primera versión funcional. Está pensada para las entradas intactas de este laboratorio. Una conversión fallida devuelve un valor distinto de cero, pero puede dejar un directorio nuevo parcial; el siguiente laboratorio guiado enseña a impedir esa publicación.
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
Ahora crea el lote de tres segundos en el nuevo directorio previews. La carpeta publicada debe contener exactamente un WAV correspondiente por entrada, con los nombres originales y sin archivos adicionales.
bash batch.sh input previews 3
Debes ver Published 3 previews. Recarga Listening Room. Bajo Your listening pack, reproduce los tres fragmentos, desplázate dentro de ellos y descarga uno. Cada uno dura tres segundos y contiene el principio de su propia grabación, incluido -closing. Los experimentos individuales siguen separados.
De vuelta en Workspace, repite deliberadamente el comando. Este rechazo es esperado; no indica que el entorno esté roto.
bash batch.sh input previews 3
printf 'Repeat exit: %s\n' "$?"
Debes obtener Output already exists y Repeat exit: 2. Conserva el buen lote y elige otro nombre de salida nuevo para futuros experimentos. El script también puede fallar claramente ante una entrada vacía, en lugar de fingir que creó un paquete útil. Ya tienes un proceso por lotes reutilizable; ahora mejorarás lo que sucede si una grabación está dañada.
Resumen
Creaste audio reproducible, conservaste los nombres completos con comillas y combinaste una función y un bucle sobre un array en un lote Bash reutilizable. Leíste estados de salida nativos y rechazaste sobrescribir un paquete existente. El siguiente laboratorio añade un directorio de preparación para que las conversiones fallidas no publiquen un paquete nuevo parcial.



