audio feature extraction

FSA·2023년 12월 10일
0

video summarization

목록 보기
8/8

UMT repo

github

solve misalignment


과정

150초 짜리 .mp4 파일 -> .wav 파일 추출 (ffmpeg 이용)

비디오의 경우

  • fps = 0.5라면 -> 75장이 추출될텐데
    • 0초, 2초, 4초, 6초, ..., 148초 가 추출되거나,
    • 1초, 3초, 5초, 7초, ..., 149초 가 추출되거나,
    • 2초, 4초, 6초, 8초, ..., 150초 가 추출될 것
  • 결론적으로, (75, output_dim) 이 나올 것임

오디오의 경우

  • 오디오의 목적
    • 가까운 쪽 골대는 그물 소리가 난다.
    • 사람들이 골을 넣으면 환호성을 지른다.
  • samling rate 32000 으로 데이터를 추출합니다.

코드

  • wav 파일로 저장하는 경우
import ffmpeg

def extract_audio(video_file, output_audio_file):
    """ Extracts audio from a video file and saves it as a WAV file. """
    try:
        (
            ffmpeg
            .input(video_file)
            .output(output_audio_file, format='wav')
            .run()
        )
        print(f"Audio extracted and saved as {output_audio_file}")
    except ffmpeg.Error as e:
        print("Error:", e)

# Usage example
video_path = 'path/to/your/video.mp4'  # Replace with your video file path
audio_output_path = 'output/audio.wav' # Replace with desired output file path
extract_audio(video_path, audio_output_path)
  • tensor로 추출하는 방법
import ffmpeg
import numpy as np

def video_to_audio_tensor(video_file):
    # Extract audio from video using FFmpeg
    # Output audio in wav format and pipe the output to stdout
    process = (
        ffmpeg
        .input(video_file)
        .output('pipe:', format='wav')
        .run_async(pipe_stdout=True)
    )

    # Read the audio data from stdout
    audio_data = process.stdout.read()

    # Convert the audio data to a numpy array (tensor)
    # The dtype and shape depend on the audio format and may need adjustment
    audio_tensor = np.frombuffer(audio_data, dtype=np.int16)

    return audio_tensor

# Example usage
video_file = 'path_to_your_video.mp4'
audio_tensor = video_to_audio_tensor(video_file)
print(audio_tensor)
  • 방법 2
  • 아이폰 12로 촬영한 동영상의 MOV 파일은 일반적으로 스테레오 오디오, 즉 2개의 오디오 채널을 가지고 있습니다.
  • pann의 인풋에 맞는 형태로 뽑는 방법
import ffmpeg
import numpy as np
import subprocess
import io

def extract_audio_to_numpy(video_path, target_sr=32000):
    # FFmpeg을 사용하여 오디오 추출 (샘플 레이트 변환 포함)
    out, _ = (
        ffmpeg
        .input(video_path)
        .output('pipe:', format='wav', acodec='pcm_s16le', ac=2, ar=target_sr)
        .run(capture_stdout=True, capture_stderr=True)
    )

    # BytesIO 객체로 오디오 데이터 읽기
    audio_data = io.BytesIO(out)

    # NumPy로 WAV 파일 읽기
    # 'h' 타입은 16비트 정수를 나타냄
    data = np.memmap(audio_data, dtype='h', mode='r')

    # 오디오 데이터를 채널별로 분리 (스테레오 가정)
    channels = 2
    data = np.reshape(data, (-1, channels)).T
    return data

# MP4 파일 경로
video_path = 'path_to_your_video.mp4'

# 오디오 데이터 추출
audio_numpy = extract_audio_to_numpy(video_path)

PANN을 이용하여, 150초 짜리 .wav 파일로부터 audio_feature을 추출함.

  • 해당 알고리즘 공부 후, 비디오와 싱크가 안 맞는다고 하는 github issue 확인해보기
  • sampling rate 32000 으로 추출한 데이터를, 2초 단위로 짤라서 batch로 처리합니다. (2 * sampling rate)

profile
모든 의사 결정 과정을 지나칠 정도로 모두 기록하고, 나중에 스스로 피드백 하는 것

0개의 댓글