Sox를 사용한 간격 없는 리샘플링

Sox를 사용한 간격 없는 리샘플링

원활하게 재생되어야 하는 일련의 트랙을 리샘플링하기 위해 sox를 ​​사용하려고 합니다. 각 트랙을 개별적으로 리샘플링하면 개별 리샘플이 제대로 정렬되지 않았기 때문에 트랙 경계에서 딸깍 소리가 나는 경우가 있습니다. 솔루션은 개념상 단순해 보입니다. 모든 트랙을 연결하고 단일 단위로 리샘플링한 다음 다시 분할하는 것입니다. 그러나 자동화된 방식으로 이 작업을 수행하는 방법을 잘 모르겠습니다. 연결 단계는 간단합니다(모든 파일을 단일 sox 호출로 전달하기만 하면 됩니다). 하지만 원본 트랙과 동일한 지속 시간으로 결과를 다시 분할하려면 어떻게 해야 합니까?

답변1

나는 결국 이 문제를 처리하기 위한 스크립트를 만들었습니다.

#!/usr/bin/env bash
set -o errexit -o pipefail -o nounset

# Can be changed to point to, e.g., a DSD-enabled SoX build.
SOX="sox"

TRACKS=()

while [[ $# -gt 0 ]]; do
  case $1 in
    -b|--bits)
      # Use the specified number of bits-per-sample for the output
      BITS="$2"
      shift 2
      ;;
    -o|--out)
      # Output template for resampled tracks
      OUT="$2"
      shift 2
      ;;
    -r|--rate)
      # The sample rate of the output
      RATE="$2"
      shift 2
      ;;
    -*|--*)
      echo "Unknown option $1" >&2
      exit 1
      ;;
    *)
      TRACKS+=("$1") # positional arg
      shift
      ;;
  esac
done

if [[ -z ${OUT+x} ]]; then
  echo "Option --out is required" >&2
  exit 1
fi

if [[ -z ${RATE+x} ]]; then
  echo "Option --rate is required" >&2
  exit 1
fi

if [[ ${#TRACKS[@]} -eq 0 ]]; then
    echo "No input files provided" >&2
    exit 1
fi

if [[ -n ${BITS+x} ]]; then
  BITS_ARG=(-b "$BITS")
else
  BITS_ARG=()
fi

if [[ ${#TRACKS[@]} -eq 1 ]]; then
  TRIM_ARGS=()
else
  # Get lengths of all tracks except the last one
  LENGTHS=($("$SOX" --i -D "${TRACKS[@]:0:${#TRACKS[@]}-1}"))
  TRIM_ARGS=(trim 0 "${LENGTHS[0]}" : newfile)
  for length in "${LENGTHS[@]:1}"; do
    TRIM_ARGS+=(: trim 0 "$length" : newfile)
  done
fi

# --guard resamples to a temporary file with added headroom, then writes the
# output as close to the original level as possible without clipping.
# Remove to write directly to the output files at the originally level, with the
# possibility of some samples clipping if the input has insufficient headroom.

"$SOX" --guard "${TRACKS[@]}" "${BITS_ARG[@]}" -t wav - rate -v "$RATE" | "$SOX" - "$OUT" "${TRIM_ARGS[@]}"

사용 예:

샘플당 동일한 비트 수를 사용하여 flac 파일을 48kHz로 리샘플링합니다(레이블 복사 없음).

$ resample.sh -o output.flac -r 48k ../96kHz/*.flac

DSD 오디오를 48kHz, 24비트 FLAC로 변환(필요DSD를 지원하는 SoX):

$ resample.sh -o output.flac -r 48k -b 24 ../DSD/*.dsf

출력 파일의 이름은output001.flac,output002.flac등으로 지정됩니다.

스크립트에 추가 옵션(예: 16비트 이하 파일을 생성할 때 디더링을 지정하는 기능)을 추가하는 것은 독자의 연습 문제로 남아 있습니다.

관련 정보