인터뷰 녹취록 작성법: 음성을 텍스트로 옮기고 화자 구분하기
인터뷰는 두 단계로 전사합니다. 음성 인식(STT)으로 단어와 시간을 얻은 뒤, 사람별 트랙이나 직접 검토로 화자 라벨을 붙이세요.

인터뷰 녹취록을 만들려면 녹음을 음성 인식(STT)으로 전사해 단어와 타임스탬프를 얻은 뒤, 누가 무엇을 말했는지 표시하고 텍스트를 화자, 시간, 발언으로 이루어진 턴 단위로 정리하세요. 화자를 구분하는 일은 화자 분리(speaker diarization)라는 별도 단계입니다. Sume의 STT 1.0은 단어와 각 단어의 시작·끝 시간은 반환하지만 화자 라벨은 주지 않으므로, 라벨은 사람마다 트랙을 따로 녹음하거나 문장을 직접 훑어보며 붙여야 합니다.
STT 관련 내용은 API 레퍼런스 문서의 바탕이 되는 OpenAPI 문서인 Sume API 레퍼런스의 STT 1.0 스키마에서 가져왔으며, 2026-09-28에 확인했습니다. 현재 동작이라고 설명한 내용은 Sume의 코드에서 확인한 것입니다. 채널 분리는 FFmpeg 필터 문서를 따릅니다.
화자 분리(diarization)란 무엇이고, Sume에서도 되나요?
화자 분리는 녹음을 목소리별로 나누고 각 구간에 화자 1, 화자 2 같은 태그를 붙이는 작업입니다. 목소리를 구별할 뿐, 누구의 이름도 알지 못합니다. STT 1.0은 이 기능을 제공하지 않습니다. API 레퍼런스에 따르면 diarize는 서버 쪽에서 고정되어 있으며, 현재 코드는 화자 분리를 끈 채 실행하고 diarize를 보내는 요청은 거부합니다.
대신 받는 것은 전체 전사문인 text와, 오디오 시작부터 초 단위로 잰 start, end가 담기고 start 순으로 정렬된 words입니다. 문장 단위 구간 나누기를 요청하면 segments도 받습니다.
녹음은 음성 인식에 어떻게 보내나요?
파일이 아니라 링크를 보내세요. STT 1.0은 요청마다 공개 HTTPS audio_url 하나를 받으며, 파일 바이트를 담을 필드가 없습니다. 직접 라벨을 붙일 때 필요한 문장 구간을 받으려면 segmentation: {"mode": "sentence"}를 넣으세요. language_code는 선택적 힌트이며, 없으면 언어를 자동으로 감지합니다. 나머지 요청 필드는 단어별 타임스탬프를 주는 음성 인식 API에서 다룹니다.
curl -X POST https://api.sume.com/v1/stt-1.0/transcribe \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: interview-guest-track-001" \
-d '{
"audio_url": "https://example.com/audio/interview-guest.m4a",
"language_code": "en",
"segmentation": { "mode": "sentence" }
}'사람마다 트랙이 따로 있으면 화자 라벨은 어떻게 붙이나요?
녹음 자체가 화자를 알려 주게 하세요. 사람마다 별도 트랙으로 녹음했다면 트랙마다 별도 Job으로 전사하고, 모든 단어에 그 트랙의 화자를 태그한 뒤, 전체 단어를 start 순으로 정렬하고 화자가 바뀔 때마다 새 턴을 시작하세요.
- 두 사람이 동시에 말하면 두 사람의 단어가 시간순으로 뒤섞이므로, 그런 곳은 직접 정리하세요.
- 현재 코드에서 단어에는 엔진이 반환할 때만
start와end가 담기므로, 아래 병합 코드는 시간이 없는 단어를 건너뜁니다.type이spacing인 항목도 건너뜁니다.
// results: one STT 1.0 result per speaker's track, e.g. { Host: a, Guest: b }
const words = Object.entries(results).flatMap(([speaker, result]) =>
result.words
.filter((w) => w.type !== "spacing" && typeof w.start === "number")
.map((w) => ({ speaker, start: w.start, text: w.word })),
);
words.sort((a, b) => a.start - b.start);
const turns = [];
for (const w of words) {
const last = turns[turns.length - 1];
if (last && last.speaker === w.speaker) last.text += " " + w.text;
else turns.push({ speaker: w.speaker, start: w.start, text: w.text });
}녹음한 통화는 어떻게 전사하나요?
녹음이 통화 양쪽을 스테레오 파일의 채널에 하나씩 따로 담고 있다면, 채널을 나누고 파일마다 별도의 공개 HTTPS URL에 올린 뒤 트랙 두 개로 다루세요. FFmpeg의 channelsplit 필터는 입력의 각 채널을 별도 스트림으로 내보냅니다. 기본 레이아웃은 스테레오이며, FFmpeg는 그 채널을 FL(front left, 왼쪽 앞)과 FR(front right, 오른쪽 앞)이라고 부릅니다. 양쪽이 한 채널에 섞여 있다면 대신 문장에 직접 라벨을 붙이세요.
ffmpeg -i call.wav -filter_complex "channelsplit=channel_layout=stereo[FL][FR]" \
-map "[FL]" side-a.wav -map "[FR]" side-b.wav녹음이 하나뿐이면 화자 라벨은 어떻게 붙이나요?
문장에 라벨을 붙이세요. 문장 모드에서 STT 1.0은 문장 끝 부호를 기준으로 단어를 묶고, 부호 없이 이어지는 구간은 무음에서 나눕니다. 각 구간에는 index, text, start, end, duration_seconds가 담깁니다. 구간마다 start부터 오디오를 재생하며 옆에 화자를 적고, 화자가 같은 이웃 구간은 턴 하나로 합치세요. 경계는 목소리가 아니라 문장 부호와 무음에서 나오므로, 한 사람이 다른 사람의 말에 끼어든 곳은 확인하세요.
인터뷰는 얼마나 길어도 되고, 비용은 얼마인가요?
45분짜리 인터뷰는 트랙마다 요청이 5번 필요합니다. 모든 목소리가 섞인 트랙 하나로 전사하면 $0.45, 따로 녹음한 트랙 두 개로 전사하면 $0.90이며, 기본적으로 5.5% 에이전트 수수료가 더해집니다. 녹음을 나누고 각 부분의 시간을 옮기는 방법은 긴 오디오 파일 전사하기에서 보여 줍니다.
| 한도 | STT 1.0 |
|---|---|
| 요청당 오디오 | 최대 10분. duration_seconds 범위는 1–600 |
| 입력 | 요청당 공개 HTTPS audio_url 하나 |
| 화자 라벨 | 없음. diarize는 서버 쪽에서 고정 |
| 가격 | 전사하는 트랙마다 오디오 분당 $0.01 |
출처
관련 글
미디어 도구 카테고리의 다른 글
- 영상을 4K로 업스케일하는 방법: 배율과 작업 순서
영상을 4K로 업스케일하려면 2160 ÷ 영상 높이만큼 확대하세요. 1080p는 ×2, 720p는 ×3입니다. FFmpeg나 Sume로 하는 방법과 업스케일을 마지막에 해야 하는 이유를 설명합니다.
- Hulu 광고 규격: Disney가 정한 Hulu·Disney+ 영상 규칙
Hulu와 Disney+ 광고는 16:9(1920×1080 선호), 23.98–30 fps의 H.264 또는 ProRes여야 하며, 128 kbps 이상인 두 채널 오디오 트랙 하나가 필요합니다.
- 영상 중간에 다른 영상을 넣는 방법
영상에 다른 영상을 넣으려면 메인 영상을 삽입 지점에서 나누고, 앞부분, 새 클립, 나머지를 렌더 한 번으로 차례로 재생하세요.
- J컷과 L컷이란? 차이와 만드는 방법
J컷은 다음 샷의 소리를 그 화면보다 먼저 들려주고, L컷은 한 샷의 소리를 다음 화면 아래로 계속 이어 갑니다. 각각 만드는 방법을 알아봅니다.
작성자 Sume