Introdução
O Fieldnote Audio Studio precisa de prévias curtas para ouvir suas gravações. Você criará um WAV de três segundos, irá reproduzi-lo e transformará esse comando em um script Bash reutilizável. As gravações preparadas são sons sintéticos originais, não gravações de microfone.
Você deve conhecer os argumentos, condições, laços, arrays e funções básicos de Bash apresentados em Shell for Beginners. Este laboratório explica as opções de mídia e as aspas necessárias. O FFmpeg já está pronto. O terminal Workspace e a página Listening Room compartilham um único contêiner; cada laboratório é inicializado de forma independente.
Crie e reproduza uma prévia de áudio
Nesta etapa, você ouvirá o conteúdo de uma prévia correta antes de escrever um script de processamento em lote.
Comece em Workspace, preparado para nomes de arquivo UTF-8. O diretório de trabalho é o estúdio preparado. Se um comando informar que um caminho relativo não existe, use pwd para ver o diretório atual e volte com este comando cd completo. Faça todo o trabalho do curso aqui.
cd /home/labex/project/audio-studio
ls input
Você deve ver Morning bells.wav, 海辺.wav e -closing.wav. Cada arquivo é uma gravação WAV mono de oito segundos, com amostras PCM de 16 bits a 22050 amostras por segundo. PCM armazena as amostras diretamente. Manteremos esse formato e apenas o início. As entradas aceitas são arquivos regulares não ocultos diretamente no diretório de entrada, terminados em .wav minúsculo; este projeto não percorre subdiretórios recursivamente nem trata codecs arbitrários.
Primeiro crie single, um diretório para experimentos individuais. mkdir -p cria o diretório se necessário e aceita que ele já exista.
mkdir -p single
No próximo comando, -i identifica a entrada, -t 3 limita a saída a três segundos e -c:a pcm_s16le escolhe áudio PCM de 16 bits com sinal. As opções descrevem a entrada ou saída seguinte, portanto sua posição importa. -v error esconde o progresso habitual, mas mantém os erros. -nostdin impede que o FFmpeg leia comandos interativos da entrada do terminal, tornando seu uso em laços mais seguro. O último caminho dá nome à saída.
Aspas duplas mantêm um caminho com espaços como um único argumento. Um prefixo ./ ou um diretório absoluto também impede que um nome iniciado por - seja interpretado como opção. Use um arquivo de saída novo: o FFmpeg normalmente recusa sobrescrever um existente quando a interação pela entrada padrão está desativada.
ffmpeg -nostdin -v error -i "input/Morning bells.wav" -t 3 -c:a pcm_s16le "single/Morning bells.wav"
Uma conversão bem-sucedida não imprime nada nesse nível de registro. $? é o código de saída do próprio comando anterior: zero significa sucesso; um valor diferente de zero significa falha. Leia-o imediatamente, pois qualquer outro comando o substitui.
printf 'Conversion exit: %s\n' "$?"
O esperado é Conversion exit: 0. Esse código diz que a conversão foi executada com sucesso; a reprodução verificará se o arquivo é utilizável.
Mude para a aba Listening Room e recarregue a página. Em First preview, pressione o controle de reprodução de Morning bells. Ouça os tons que mudam, arraste o controle de posição para dentro do clipe e confirme que ele termina em três segundos. Selecione Download WAV para salvar o mesmo arquivo. A página lê somente seus arquivos reais de saída; ela não pode completar áudio ausente usando a biblioteca. Volte a Workspace para continuar.

Encontre os controles de reprodução e posição e o link Download WAV em First preview.
Se digitou o caminho de entrada errado, consulte ls input, corrija o nome entre aspas e execute novamente o comando. Se um experimento indesejado já ocupa o nome de saída, remova apenas esse experimento com rm -- "single/Morning bells.wav" antes de tentar de novo. -- encerra as opções; não significa “apagar tudo”. Mantenha library, archive, notes.txt e scratch-other inalterados durante este laboratório.
Coloque a conversão em uma função reutilizável
Nesta etapa, você passará entrada, saída e duração para a mesma conversão, em vez de editar o comando para cada gravação.
Comece em Workspace, em /home/labex/project/audio-studio. Uma função dá nome a um grupo de comandos. Dentro de make_preview, $1, $2 e $3 são os argumentos da função. O script recebe seus próprios argumentos e os encaminha na mesma ordem. As aspas de "$1" preservam cada caminho completo, incluindo espaços e Unicode.
O here-document abaixo escreve um pequeno script. cat > preview-one.sh substitui esse arquivo de script. <<'BASH' recebe as linhas seguintes como texto literal até uma linha contendo apenas BASH; colocar o delimitador entre aspas impede que o shell atual expanda $1 ao salvar o script. A primeira linha seleciona Bash quando o script é iniciado como programa. Aqui o executaremos explicitamente com 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
Use a função para criar outra prévia de dois segundos. 2 é um argumento de duração, não parte de nenhum dos nomes de arquivo.
bash preview-one.sh "input/海辺.wav" "single/海辺.wav" 2
printf 'Conversion exit: %s\n' "$?"
O código deve ser zero novamente. Recarregue Listening Room, reproduza 海辺 em First preview e observe que esse clipe termina em dois segundos. Volte a Workspace. A mesma função já funciona com caminhos e durações diferentes; a próxima etapa acrescenta uma coleção de entradas.
Processe todas as gravações
Nesta etapa, você publicará um diretório novo com uma prévia para cada entrada.
Comece em Workspace. O script aceita exatamente três argumentos: diretório de entrada, novo diretório de saída e duração inteira de um a cinco segundos. Para esse primeiro lote, o diretório de entrada e o diretório pai da saída devem existir e ser separados; a saída deve ficar fora da entrada. Uma saída existente deve ser recusada para que outra execução não sobrescreva bons resultados. Não execute dois processos de escrita no mesmo caminho de saída ao mesmo tempo. Essas verificações tratam erros comuns, não garantem segurança para escritas concorrentes.
Antes de escrever, entenda as partes novas. realpath transforma o diretório de entrada existente em um caminho absoluto, dando a cada entrada um prefixo de diretório seguro. shopt -s nullglob faz um *.wav sem correspondências se expandir em zero itens, em vez de um caminho literal com asterisco. files=(...) guarda as correspondências em um array; as aspas do diretório preservam seus espaços, enquanto *.wav sem aspas continua a corresponder aos nomes. ${#files[@]} conta os membros e "${files[@]}" passa cada um separadamente.
$(command) captura a saída de um comando. || exit 2 para o script se esse comando falhar. Entre testes, || significa OU: [ -e "$2" ] || [ -L "$2" ] considera qualquer um desses tipos de destino existente um motivo para recusar.
case escolhe um ramo; 1|2|3|4|5 permite um desses valores. [ -e path ] verifica se um destino existe, enquanto -L também identifica um link simbólico cujo destino não existe. ${source##*/} remove o prefixo mais longo terminado em /, deixando o nome. if ! command entra no ramo de falha quando o comando retorna um valor diferente de zero. >&2 envia uma explicação para o fluxo de erros e exit 1 encerra com falha.
Substitua o batch.sh incompleto preparado por esta primeira versão funcional. Ela se destina às entradas intactas deste laboratório. Uma conversão com falha retorna um valor diferente de zero, mas pode deixar um novo diretório parcial; o próximo laboratório guiado ensina a impedir essa publicação.
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
Agora crie o lote de três segundos no novo diretório previews. A pasta publicada deve conter exatamente um WAV correspondente por entrada, com os nomes originais e nenhum arquivo adicional.
bash batch.sh input previews 3
O esperado é Published 3 previews. Recarregue Listening Room. Em Your listening pack, reproduza os três clipes, mude de posição dentro deles e baixe um. Todos duram três segundos e contêm o início da própria gravação, incluindo -closing. Os experimentos individuais continuam separados.
De volta a Workspace, repita o comando de propósito. Essa recusa é esperada, não indica um ambiente quebrado.
bash batch.sh input previews 3
printf 'Repeat exit: %s\n' "$?"
O esperado é Output already exists e Repeat exit: 2. Preserve o lote correto; escolha outro nome de saída novo para futuros experimentos. O script também pode falhar claramente com entrada vazia, em vez de fingir que produziu um pacote útil. Você tem um processamento em lote reutilizável; agora melhorará o comportamento quando uma gravação estiver danificada.
Resumo
Você criou áudio que pode ser reproduzido, preservou nomes completos com aspas e combinou uma função e um laço de array em um processamento Bash reutilizável. Leu os códigos de saída dos próprios comandos e recusou sobrescrever um pacote existente. O próximo laboratório acrescenta um diretório de preparação para que falhas de conversão não publiquem um novo pacote parcial.



