영상에서 무음 구간을 자동으로 제거하는 방법

전사문의 단어 타이밍으로 모든 쉼을 찾고, 말소리 앞뒤로 약간의 여유를 남긴 뒤, 남길 구간을 Timeline Job 하나에서 차례로 이어 렌더링하세요.

읽는 시간 5분Sume
전체 글

영상에서 무음 구간을 제거하려면 아무도 말하지 않는 쉼을 찾아 잘라 내고, 남은 부분을 이어 붙이세요. Sume에서는 클립이 이미 Sume에 호스팅되어 있다면 영상 검사(transcribe: true)로 클립을 전사하고, 단어 사이의 틈 중 임계값보다 긴 것은 모두 무음으로 본 뒤, 남길 구간들을 클립에서 분리한 오디오 위에 Timeline 1.0 Job 하나로 차례로 이어 렌더링하세요.

아래 내용은 2026-09-27에 확인한 Sume의 영상 검사, 오디오 분리, Timeline 1.0, 타임라인 오디오 문서와 Sume API 레퍼런스를 기준으로 합니다. 렌더 자체는 API로 영상 일부 잘라내기에서 단계별로 설명하며, 이 글은 모든 쉼을 자동으로 찾는 방법을 다룹니다.

무음 구간은 어떻게 자동으로 찾나요?

전사문을 요청하세요. 클립은 앞서 실행한 Sume Job의 출력처럼 이미 워크스페이스에 있는 media.sume.com 아티팩트나 에셋이어야 합니다. Sume에는 컴퓨터에 있는 녹화 파일을 올리는 공개 업로드 경로가 없습니다(엔드포인트별로 받는 URL). 클립을 transcribe: true, 그리고 스틸을 건너뛰는 frames: false와 함께 POST /v1/video-inspect로 보내세요. 기본 mode는 sync이며, 최대 30초 기다렸다가 결과와 함께 200으로 응답하거나, GET /v1/video-inspect/:id에서 폴링할 Job과 함께 202로 응답합니다.

결과의 transcript.words[]에는 단어마다 영상 시작부터 잰 초 단위의 start와 end가 담깁니다. 단어가 있는 곳이 말소리이고, 한 단어의 end와 다음 단어의 start 사이의 틈은 모두 쉼입니다.

curl -X POST https://api.sume.com/v1/video-inspect \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: talk-silence-001" \
  -d '{
    "video_url": "https://media.sume.com/artifacts/artf_demo/talk.mp4",
    "frames": false,
    "transcribe": true
  }'

단어 타이밍을 컷으로 바꾸려면 어떻게 하나요?

숫자 두 개를 정하세요. 잘라 낼 만한 가장 짧은 쉼인 임계값과, 단어 가장자리가 잘리지 않도록 말소리 양쪽에 남겨 두는 여유입니다. 둘 다 Sume 설정이 아니라 여러분이 정하는 값입니다. 아래 Python 함수는 단어들을 병합해 남길 구간을 만듭니다. API 레퍼런스는 word만 필수로 표시하므로, 이 함수는 타이밍이 없는 항목을 건너뜁니다.

  • 두 구간의 여유가 서로 겹치지 않도록 임계값은 여유의 두 배보다 크게 두세요.
  • 각 쌍은 분리한 wav의 audio.parts[] 조각 하나와 클립의 video[] 슬롯 하나가 되며, 둘 다 그 쌍의 source_in과 duration을 씁니다. 각 슬롯은 앞서 남긴 길이의 누적 합에서 시작하고, audio.duration_seconds는 남긴 길이를 모두 더한 값입니다.
  • 스파인으로 쓸 오디오는 POST /v1/audio-detach로 분리하세요. 전사문 자체의 audio_url은 음성 인식용 16 kHz 모노 사본이며, API 레퍼런스에 따르면 타임라인 스파인이 아닙니다.
  • 비용을 내기 전에, 과금되지 않는 POST /v1/timeline-1.0/plan이 슬롯이 수십 개인 본문을 검사하고 그 본문의 duration_seconds, segment_count, estimated_cost_usd_micros를 반환합니다.
def kept_ranges(words, clip_length, threshold=0.6, margin=0.15):
    """(source_in, duration) pairs from transcript.words[]."""
    timed = [w for w in words if "start" in w and "end" in w]
    ranges = []
    for w in timed:
        if ranges and w["start"] - ranges[-1][1] <= threshold:
            ranges[-1][1] = w["end"]  # same stretch of speech
        else:
            ranges.append([w["start"], w["end"]])  # pause before this word
    kept = []
    for start, end in ranges:
        s, e = max(0.0, start - margin), min(clip_length, end + margin)
        if e - s >= 0.2:  # a Timeline slot lasts at least 0.2 s
            kept.append((round(s, 3), round(e - s, 3)))
    return kept

무엇을 무음으로 보나요?

여기서 무음은 소리가 작은 구간이 아니라 전사된 단어가 없는 구간을 뜻합니다. 단어 사이의 틈은 음악이나 배경음이 채우고 있어도 잘리며, 전사문이 놓친 단어는 그 틈과 함께 잘립니다. 게시하기 전에 결과를 한 번 재생해 보세요.

렌더 한 번으로 쉼을 몇 개까지 제거할 수 있나요?

video[]가 슬롯을 최대 200개까지 받으므로, 렌더 하나에 남길 구간을 최대 200개까지 넣을 수 있습니다. 다만 audio.parts[]는 조각 20개가 상한이므로, 남길 구간이 20개를 넘으면 API로 영상 일부 잘라내기에서 보여 주듯 타임라인 오디오로 오디오 조각부터 이어 붙인 뒤, 이어 붙인 파일을 audio.url로 넘기세요.

비용은 얼마이고, 한도는 어떻게 되나요?

각 단계는 따로 과금되며, 기본적으로 5.5% 에이전트 수수료가 더해집니다. 오디오 분리 한 번의 출력은 최대 900초이므로, 900초보다 긴 클립에는 range를 지정한 분리가 두 번 필요합니다. 이때 각 part의 source_in은 자기 파일의 시작부터 셉니다.

영상 검사, 오디오 분리, 타임라인 오디오, Timeline 1.0, API 요금 기준, 2026-09-27 확인.
단계호출과금한도
전사문POST /v1/video-inspectduration_seconds 힌트로 계산해 오디오 분당 $0.01 기준으로 예약(힌트를 생략하면 일 분); 프로브는 과금 없음소스 ≤ 1,800초; 힌트 ≤ 600초
스파인POST /v1/audio-detachJob당, 요율은 GET /v1/catalog에 표시소스 ≤ 1,800초; 출력 ≤ 900초
오디오 잇기POST /v1/timeline-1.0/audioJob당, 요율은 GET /v1/catalog에 표시part 1–20개; 생성 오디오 ≤ 1,800초
렌더POST /v1/timeline-1.0/render출력 분당 $0.10 기준으로 예약, 예약액을 넘는 청구 없음출력 1–1,800초; 오디오 part ≤ 20개; 슬롯 1–200개, 각 ≥ 0.2초

출처

관련 글

미디어 도구 카테고리의 다른 글

미디어 도구 글 전체 보기

작성자 Sume