Sox를 사용하여 여러 오디오 파일의 스펙트로그램을 효율적으로 생성하는 방법은 무엇입니까?

Sox를 사용하여 여러 오디오 파일의 스펙트로그램을 효율적으로 생성하는 방법은 무엇입니까?

나는 많은 오디오 파일을 가지고 있으며 Sox를 사용하여 각 개별 파일에 대한 스펙트로그램을 생성하고 싶습니다. 일반적으로 단일 파일에 대해 다음을 수행합니다.

sox audiofile.flac -n spectrogram

하지만 이 방법을 여러 파일로 확장하는 방법을 모르겠습니다. 이상적으로는 출력 파일에 for , for 등 .png의 해당 오디오 파일과 연결된 파일 이름을 지정하고 싶습니다 .audiofile1.pngaudiofile1.flacaudiofile2.pngaudiofile2.flac

이 작업을 수행하는 방법을 아는 사람이 있나요?

답변1

답변을 주신 Joseph에게 감사드립니다. 아마도 그가 게시한 당시에는 효과가 있었을 것입니다. 그러나 -oRed Sox가 주문을 받자마자 나는 그것을 추가해야 할 것입니다.spectrogram

for file in *.flac;do
    outfile="${file%.*}.png"
    sox "$file" -n spectrogram -o "$outfile"
done

모두 각자의 폴더에 보관하겠습니다. 효과가있다!

한 단계 더 나아가 이미지의 스펙트로그램 위에 파일 제목을 추가하고 더 넓게 만들어 더 자세한 내용을 볼 수도 있습니다. 기본 이미지는 나에게 조금 작습니다.

for file in *.flac;do
    outfile="${file%.*}.png"
    title_in_pic="${file%.*}"
    sox "$file" -n spectrogram -t "$title_in_pic" -o "$outfile" -x 2000
done

답변2

명령을 루프로 래핑할 수 있습니다.

for file in *.flac
do
    outfile="${file%.*}.png"
    sox "$file" -n spectrogram "$outfile"
done

파일 이름의 경우,sox(1) 매뉴얼 페이지루프에서 사용할 수 있도록 명령줄에서 출력 파일의 이름을 명시적으로 지정하는 것이 좋습니다.

루프의 첫 번째 줄은 Bash를 사용합니다.매개변수 대체.flac파일 이름에서 확장자를 제거하고 .png확장자를 추가합니다.

답변3

여기 내 "스펙트로그램 가져오기" 솔루션이 있습니다.

  • aac, opus 등 더 많은 코덱 처리
  • mp4, mkv, avi, m4a와 같은 더 많은 컨테이너를 처리합니다.
  • 24kHz로 표준화된 스펙트로그램 높이
  • 하나의 채널만 그리기 = 모노
  • 표준화된 볼륨
  • 출력 파일의 입력 파일 확장자를 유지합니다.
#!/bin/bash

# aspec.sh
# get spectrograms of audio streams
#
# usage: aspec.sh a.mp3 b.m4a c.mp4 d.mkv ....
#
# dependencies: sox, ffmpeg
# license: public domain, warranty: none
# version: 2019-05-17 by milahu

ff_args="" # ffmpeg arguments
sx_args="" # sox arguments

ff_args+=" -loglevel error"

ff_astream=0 # only use first audio stream
ff_args+=" -map 0:a:${ff_astream}?"

ff_args+=" -ac 1" # use only one audio channel
sx_args+=" channels 1"

sx_args+=" gain -n -3" # normalize volume to -3dB

# set sampling rate
# only analyze frequencies below f_max = rate / 2
# also normalize spectrogram height to f_max
#sx_args+=" rate 6k"  # only show f <  3kHz "where the human auditory system is most sensitive"
sx_args+=" rate 48k" # only show f < 24kHz

# use wav as temporary format, if sox cant read file
ff_args+=" -c:a pcm_s16le -f wav"
sx_type="wav"

# process files from "argv"
for i in "$@"
do
    echo "$i"
    o="$i.sg.png" # output file
    t=$(basename "$i") # title above spectrogram
    c="spectrogram by SoX, the Sound eXchange tool" # comment below spectrogram

    # try to read original format
    echo analyze
    sox "$i" -n \
        $sx_args \
        spectrogram -o "$o" -c "$c" -t "$t" \
        2>&1 | grep -v "no handler for detected file type"

    if (( ${PIPESTATUS[0]} != 0 ))
    then
        # sox failed. convert audio and retry
        echo convert

        # get duration of stream or container
        # spectrogram filter has no "ignore length" option
        # and without a "duration prediction" will only read 8 seconds
        d=$(ffprobe "$i" -v error -of compact=s=_ \
            -select_streams "0:a:${ff_astream}?" \
            -show_entries stream=duration:format=duration \
            | sort | grep -v =N/A \
            | tail -n 1 | cut -d= -f2)
        # 'tail -n 1' --> prefer stream duration
        # 'head -n 1' --> prefer container duration

        if [[ -z "$d" ]]
        then
            echo -e "skip. duration not found FIXME\n"
            continue
        fi

        # bash "process substitution" magic
        sox \
            --type "$sx_type" \
            --ignore-length \
            <( ffmpeg -i "$i" $ff_args - ) \
            --null \
            $sx_args \
            spectrogram -d "$d" -o "$o" -c "$c" -t "$t"
    fi

    echo -e "done\n$o\n"
done

관련 정보