본문으로 바로 가기
SubtitleMatrix

SMI를 JSON으로 변환

형식 변환SAMI (SMI)
또는 자막 텍스트를 붙여넣으세요

이 변환에서 달라지는 것

1가지가 버려지거나 결정이 필요합니다

  • 형식 고유 내용

    원본 형식이 자막 블록 밖에 두는 내용(자막 블록이 아닌 구획, 머리말 텍스트, 자막 블록별 설정, 주석 처리된 이벤트) — 대상 형식에는 들어갈 자리가 없습니다

이 목록은 불러온 특정 파일이 아니라 두 형식의 기능 행렬에서 나옵니다. 어떤 파일은 형식이 허용하지만 행렬이 모델링하지 않는 기능을 쓰고 있다면 더 많이 잃을 수 있습니다.

SMI를 JSON으로 바꾸는 페이지입니다. 자막 하나가 객체 하나가 되고 시작과 끝은 밀리초 정수로, 텍스트는 줄 배열로 들어갑니다. 프로그램에서 읽기 좋은 형태가 되지만, SAMI의 스타일 문서와 채널 설정은 JSON의 cue 모델에 들어가지 않아 사라집니다.

SMI는 `Start=4126`으로 시작을 적고 다음 SYNC가 앞 블록을 끝냅니다. JSON은 같은 순간을 `4126`이라는 정수로 적습니다. 문자열 시간을 다시 해석할 필요가 없고, 두 줄짜리 자막은 `lines` 배열의 두 원소가 됩니다.

사라지는 것은 형식 고유 구성입니다. `<STYLE>` 블록의 CSS, `<TITLE>`, `Class=ENCC` 같은 채널 표시가 해당됩니다. 출력 JSON에는 `version`과 `cues`만 들어가고 제목이나 스타일을 담는 필드는 생기지 않습니다.

파일은 업로드되지 않고 브라우저 안에서 처리됩니다. 여러 파일을 한 번에 넣으면 각각 변환되어 ZIP 하나로 내려옵니다. ZIP은 파일별 하위 폴더 없이 풀립니다.

예시

전형적인 SMI 파일을 JSON으로 변환

입력

<SAMI>
<HEAD>
<STYLE TYPE="text/css">
<!--
P { text-align: center; font-family: Arial; }
.ENCC { Name: English; lang: en-US; }
-->
</STYLE>
</HEAD>
<BODY>
<SYNC Start=1000>
<P Class=ENCC>Hello there.
<SYNC Start=3000>
<P Class=ENCC>&nbsp;
<SYNC Start=3500>
<P Class=ENCC>How are you?<br>Fine, thanks.
<SYNC Start=6000>
<P Class=ENCC>&nbsp;
</BODY>
</SAMI>

결과물

{
  "version": 1,
  "cues": [
    {
      "start": 1000,
      "end": 3000,
      "lines": [
        "Hello there."
      ]
    },
    {
      "start": 3500,
      "end": 6000,
      "lines": [
        "How are you?",
        "Fine, thanks."
      ]
    }
  ]
}

이 출력에서 버려지는 것은 형식 고유 구성입니다. 시각과 줄 배열은 왼쪽과 정확히 대응합니다.

지저분한 SMI를 JSON으로 바꿀 때

입력

<SAMI>
<HEAD>
<TITLE>Episode 1</TITLE>
<STYLE TYPE="text/css">
<!--
.ENCC { Name: English; }
-->
</STYLE>
</HEAD>
<BODY>
<sync start="00:00:02,500">
<P Class=ENCC>Line one<br>Line two
<sync start=9000>
<P Class=ENCC>Tom &amp; Jerry
<SYNC Start=12000>
<P Class=ENCC>&nbsp;
</BODY>
</SAMI>

결과물

{
  "version": 1,
  "cues": [
    {
      "start": 2500,
      "end": 9000,
      "lines": [
        "Line one",
        "Line two"
      ]
    },
    {
      "start": 9000,
      "end": 12000,
      "lines": [
        "Tom &amp; Jerry"
      ]
    }
  ]
}

실제 파일에 흔한 손상입니다. BOM, 윈도우 줄바꿈, 읽을 수 없는 SYNC가 섞여도 읽을 수 있는 자막은 모두 객체가 됩니다.

자주 묻는 질문

SAMI의 STYLE 블록과 TITLE, Class 표시는 JSON에서 어디로 가나요?

남지 않습니다. JSON 출력에는 `version`과 `cues`만 들어가고 제목이나 스타일을 담는 필드가 생기지 않습니다. `Class=ENCC` 같은 채널 표시도 cue 바깥 정보라 들어가지 않습니다.

SMI를 JSON으로 바꾸면 파일은 어떤 모습인가요?

`version`과 `cues` 배열을 가진 객체입니다. 각 cue에는 `start`와 `end`(밀리초 정수), `lines`(문자열 배열)가 들어가고 자막 순서가 배열 순서가 됩니다.

SMI의 Start 시각이 JSON에서 밀리초 정수로 남나요?

네. `Start=4126`은 `4126`이 되어 문자열 변환 없이 바로 계산에 쓸 수 있습니다. 끝 시각은 다음 SYNC의 시작에서 오며 역시 정수로 적힙니다.

SMI의 두 줄 자막은 JSON에서 어떻게 표현되나요?

`lines` 배열의 원소 두 개가 됩니다. 두 줄이 같은 cue에 속한다는 정보가 배열 구조로 유지되므로 다시 SMI로 만들면 한 자막의 두 줄로 돌아갑니다.

SMI를 JSON으로 바꾸면 cue의 순서는 어떻게 되나요?

시작 시각이 이른 순서로 배열에 들어갑니다. 원본이 뒤섞여 있었다면 정렬되어 나오고, JSON을 읽는 쪽도 이 순서를 전제로 다루면 됩니다.

JSON을 다시 SMI로 바꾸면 무엇이 사라지나요?

JSON에 스타일이나 위치, 가라오케 정보가 들어 있으면 SMI에 자리가 없어 사라집니다. 지금 방향인 SMI→JSON은 형식 고유 구성만 잃고, 그 정보는 원본 SMI 파일에만 남습니다.

SMI를 JSON으로 저장하면 인코딩은 무엇인가요?

출력은 UTF-8, 유닉스 줄바꿈, BOM 없음입니다. 원본 SMI가 어떤 인코딩이었든 읽을 때 해독하며, 그 사실을 결과 패널에 표시합니다.

관련 도구