무음제거를 통한 비디오 개선 방법: 세가지 방법 소개

eLearning 및 언어 학습 영역에서는 속도가 가장 중요합니다. 긴 침묵의 시간 없이 비디오의 리듬을 매력적으로 유지하면 정보 보유력이 크게 향상될 수 있습니다. 동영상에서 소리가 없는 부분을 잘라내는 두 가지 방법, 즉 Olive 0.1을 사용한 수동 접근 방식과 FFmpeg를 사용한 자동화 방법을 소개하고, 세번째 로는 성인식 AI를 활용한 혁신적인 방법을 알아보겠습니다.본내용은 저술한 책 파이썬으로 배우는 엔지니어링의 일부입니다.

1. Olive 0.1을 사용한 수동 무음 제거

1.1 Olive 0.1 이란?

Olive 0.1은 초보자와 전문가를 위한 비선형 비디오 편집 소프트웨어입니다. 직관적인 인터페이스는 무음 세그먼트를 시각적으로 식별하고 다듬는 작업을 단순화합니다.

1.2 Step-by-Step 가이드

  • Video 가져오기:
    • Olive를 열고 파일 > 가져오기로 이동하거나 Ctrl+I를 누릅니다.
    • 비디오 파일을 선택하고 Open을 클릭하세요. 
  • Timeline에 비디오 추가하기:
    • 프로젝트 저장소에서 가져온 비디오를 타임라인으로 드래그합니다.
  • 음성 Waveform 살펴보기:
    • 타임라인에서 오디오 트랙을 확장하여 파형을 시각화합니다. 평평한 선은 침묵을 나타냅니다.
  • 무음 부분을 확인하고 삭제하기:
    • 타임라인을 관찰하여 무음 섹션을 찾습니다.
    • 면도기 도구(단축키 C)를 사용하여 무음 부분의 시작과 끝 부분을 자릅니다.
    • 선택 도구(바로가기 V)로 전환하고 무음 섹션을 선택한 다음 Delete를 누릅니다.
  • 빈칸 메우기:
    • 빈칸을 마우스 오른쪽 버튼으로 클릭하고 Ripple Delete를 선택합니다.
  • 결과 동영상 내보내기:
    • 파일 > 내보내기로 이동하여 형식, 품질, 위치를 선택한 다음 내보내기를 클릭합니다.

2. FFmpeg를 이용한 자동 무음 제거

2.1  FFmpeg 란?

FFmpeg는 멀티미디어 처리를 위해 설계된 강력한 명령줄 도구 키트입니다. 비디오의 무음 간격을 감지하고 다듬는 등의 작업을 자동화할 때 그 다양성이 빛을 발합니다.

2.2 무음 제거를 위한 파이썬 코드:

다음은 무음을 감지하고 제거하기 위해 FFmpeg를 활용하는 Python 스크립트입니다.

import os
import re
import shutil
import subprocess
import tempfile

def remove_silence(input_file, output_file, threshold=-30, duration=1, padding=1):
temp_dir = tempfile.mkdtemp(prefix="temp_segments_")
command = ["ffmpeg", "-i", input_file, "-af", f"silencedetect=n={threshold}dB:d={duration}", "-f", "null", "-"]
output = subprocess.check_output(command, stderr=subprocess.STDOUT, text=True)

silence_starts = [float(match.group(1)) for match in re.finditer(r"silence_start: (\d+(\.\d+)?)", output)]
silence_ends = [float(match.group(1)) for match in re.finditer(r"silence_end: (\d+(\.\d+)?)", output)]

segments = []
prev_end = 0
for start, end in zip(silence_starts, silence_ends):
if start - prev_end > padding:
segments.append((prev_end, start))
prev_end = end + padding

match = re.search(r"Duration: (\d+:\d+:\d+\.\d+)", output)
if match:
hours, minutes, seconds = map(float, match.group(1).split(":"))
total_duration = hours * 3600 + minutes * 60 + seconds
if total_duration > prev_end:
segments.append((prev_end, total_duration))

list_file = f"{temp_dir}/list.txt"
with open(list_file, "w") as f:
for i, (start, end) in enumerate(segments):
segment_file = f"{temp_dir}/segment_{i:03d}.mp4"
command = ["ffmpeg", "-i", input_file, "-ss", str(start), "-to", str(end), "-c", "copy", segment_file]
subprocess.run(command, check=True)
f.write(f"file '{segment_file}'\n")

command = ["ffmpeg", "-f", "concat", "-safe", "0", "-i", list_file, "-c", "copy", output_file]
subprocess.run(command, check=True)
shutil.rmtree(temp_dir)

input_file = "your_video.mp4"
output_file = "output.mp4"
remove_silence(input_file, output_file)

your_video.mp4를 사용자가 원하는 파일이름으로 바꾸도록 합니다. 

3. 인공지능 음성 인식 기능을 이용한 무음 제거 기능

인공 지능의 힘을 활용하여 음성 인식 모델을 활용하여 비디오에서 유효한 오디오 세그먼트를 감지할 수 있습니다. 이 방법은 소리가 없는 부분을 감지할 뿐만 아니라 불일치를 필터링하여 원활한 비디오 출력을 보장합니다.

3.1 인공지능을 이용한 무음제거 코드

import os from moviepy.editor import VideoFileClip import whisper import matplotlib.pyplot as plt import numpy as np import librosa

print(“Current Working Directory:”, os.getcwd()) print(“Files in Current Working Directory:”, os.listdir())

video_path = os.path.join(os.getcwd(), “IND.mp4”) video = VideoFileClip(video_path) video.audio.write_audiofile(os.path.join(os.getcwd(), “myaudio.wav”)) audio = whisper.load_audio(os.path.join(os.getcwd(), “myaudio.wav”))

model = whisper.load_model(“large”, device=”cpu”) result = whisper.transcribe(model, audio, language=”ko”, detect_disfluencies=True)

valid_audio_segments = [] valid_video_segments = [] plt.figure(figsize=(15, 6)) y, sr = librosa.load(os.path.join(os.getcwd(), “myaudio.wav”), sr=None) librosa.display.waveshow(y, sr=sr, alpha=0.7, label=’Original Waveform’)

times = np.linspace(0, len(y) / sr, num=len(y))

for segment in result[‘segments’]: for word in segment[‘words’]: if not ‘[*]’ in word[‘text’]: start_time = word[‘start’] end_time = word[‘end’] plt.fill_between(times, y, where=((times >= start_time) & (times <= end_time)), color=’green’, alpha=0.5) start_sample = int(word[‘start’] * sr) end_sample = int(word[‘end’] * sr) valid_audio_segments.append(y[start_sample:end_sample]) valid_video_segments.append(video.subclip(word[‘start’], word[‘end’]))

plt.title(‘Valid Audio Segments vs. Original Waveform’) plt.xlabel(‘Time (s)’) plt.ylabel(‘Amplitude’) plt.legend() plt.tight_layout() plt.show()

new_audio = np.concatenate(valid_audio_segments) final_video = concatenate_videoclips(valid_video_segments, method=”compose”) output_path = os.path.join(os.getcwd(), “Processed_Test04.mp4”) final_video.write_videofile(output_path, codec=’libx264′, audio_codec=’aac’)

Sorry, the following video is Korean.

4. 적용 확장 분야  

이러한 방법은 eLearning 시나리오 이상으로 적용될 수 있습니다. 콘텐츠 섹션 사이에 리듬 요소나 음악 문구를 삽입하면 시청자 참여를 더욱 높일 수 있습니다.

결론

Olive 0.1, FFmpeg 및 음성 인식 AI를 사용하면 긴 침묵 없이 매력적인 비디오를 제작할 수 있습니다. 수동으로 편집하든, 프로세스를 스크립팅하든, AI를 활용하든 최종 제품은 청중에게 향상된 참여와 효율성을 약속합니다.

Leave a Reply

Your email address will not be published. Required fields are marked *