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 으로 데이터를 추출합니다.
코드
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)
video_path = 'path/to/your/video.mp4'
audio_output_path = 'output/audio.wav'
extract_audio(video_path, audio_output_path)
import ffmpeg
import numpy as np
def video_to_audio_tensor(video_file):
process = (
ffmpeg
.input(video_file)
.output('pipe:', format='wav')
.run_async(pipe_stdout=True)
)
audio_data = process.stdout.read()
audio_tensor = np.frombuffer(audio_data, dtype=np.int16)
return audio_tensor
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):
out, _ = (
ffmpeg
.input(video_path)
.output('pipe:', format='wav', acodec='pcm_s16le', ac=2, ar=target_sr)
.run(capture_stdout=True, capture_stderr=True)
)
audio_data = io.BytesIO(out)
data = np.memmap(audio_data, dtype='h', mode='r')
channels = 2
data = np.reshape(data, (-1, channels)).T
return data
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)