본문으로 바로 가기
SubtitleMatrix

JSON을 SRT로 변환

또는 자막 텍스트를 붙여넣으세요

이 변환에서 달라지는 것

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

  • 스타일

    모든 스타일(굵게, 기울임, 색, 외곽선, 그림자)

  • 위치

    화면 위치 지정(모든 자막 블록이 기본 위치로 돌아갑니다)

  • 가라오케

    가라오케 타이밍(음절 단위 강조)

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

이 페이지는 자막을 설명하는 JSON 문서를 읽어 SRT 파일로 씁니다. 받아들이는 모양은 이 사이트가 쓰는 스키마(버전 번호와 cues 배열)와 cue 목록만 있는 단순 배열 두 가지입니다. 어느 쪽이든 cue마다 start, end, text가 필요하고, 시간은 밀리초라 SRT 타임코드로 그대로 옮겨집니다.

SRT가 담지 못하는 것은 조용히 버리지 않고 보고합니다. 문서의 제목, 프레임 레이트, 스타일 표는 번호 붙은 cue만 담는 자막 파일에 자리가 없습니다. cue에 서식이 있으면 해당 태그로 적고, 태그가 표현하지 못하는 것은 위 손실 목록에 오릅니다.

손상된 파일도 변환을 멈추지 않습니다. 파서는 읽을 수 있는 만큼 읽고, 끝이 시작보다 앞서는 cue는 고쳐서 내보냅니다. 불러서 손볼 수 있는 자막 파일이 오류 메시지보다 쓸모 있기 때문입니다. 시간을 확인해 영상과 맞는지 봐 두세요.

JSON 파일 여러 개를 한 번에 넣으면 브라우저 안에서 차례로 변환되고 결과는 ZIP 하나로 내려옵니다. 원본은 업로드되지 않습니다.

예시

일반적인 JSON 파일을 SRT로 변환

입력

{
  "version": 1,
  "title": "Fixture: typical",
  "fps": 25,
  "styles": {
    "Default": {
      "name": "Default",
      "fontFamily": "Arial",
      "fontSize": 20,
      "primaryColor": "#FFFFFF",
      "bold": false,
      "italic": false
    }
  },
  "generator": "subtitlematrix fixtures",
  "cues": [
    {
      "id": "1",
      "start": 0,
      "end": 2000,
      "lines": [
        "Hello world.",
        "Second line."
      ],
      "style": "Default",
      "position": {
        "x": 100,
        "y": 200,
        "align": "center"
      }
    },
    {
      "id": "2",
      "start": 2500,
      "end": 4000,
      "lines": [
        "Plain line.",
        {
          "text": "Styled line.",
          "tags": [
            {
              "kind": "italic",
              "start": 0,
              "end": 6
            }
          ]
        }
      ]
    },
    {
      "id": "3",
      "start": 4500,
      "end": 6000,
      "lines": [
        "Roger: I am here."
      ],
      "speaker": "Roger"
    }
  ]
}

결과물

1
00:00:00,000 --> 00:00:02,000
Hello world.
Second line.

2
00:00:02,500 --> 00:00:04,000
Plain line.
<i>Styled</i> line.

3
00:00:04,500 --> 00:00:06,000
Roger: I am here.

이 결과에서 사라지는 것: 스타일, 위치, 노래방. 나머지는 줄 단위로 같습니다.

까다로운 입력에 같은 변환 적용

입력

[
    { "start": 0, "end": 1000, "lines": ["First."] },
    { "start": 1000, "end": 2000, "text": "Second." },
    "not an object",
    { "start": 2000, "end": 3000, "lines": ["Third."], "class": "top" }
]

결과물

1
00:00:00,000 --> 00:00:01,000
First.

2
00:00:01,000 --> 00:00:02,000
Second.

3
00:00:02,000 --> 00:00:03,000
Third.

실제 파일에서 흔한 손상입니다. 줄 바꿈이 섞이고, 공백이 남고, 빈 필드가 있습니다. 위의 깔끔한 예시와 비교해 파서가 무엇을 넘겨주는지 보세요.

자주 묻는 질문

어떤 JSON 모양을 받아들이나요?

이 사이트가 쓰는 문서(버전 번호와 cues 배열)와 그에 해당하는 배열 형태, 즉 파일 자체가 cue 목록인 경우를 받아들입니다. 중요한 것은 각 cue가 start, end, text를 인식되는 모양으로 갖추는 것입니다.

JSON 문서의 제목·스타일·프레임 레이트는 어떻게 되나요?

읽은 뒤 버려진 것으로 보고됩니다. SRT에는 이들을 담는 필드가 없기 때문입니다. 특히 프레임 레이트는 SRT가 프레임이 아니라 시계 시간을 저장하므로 쓸 자리가 없어, 조용히 무시하지 않고 위 손실 목록에 올립니다.

JSON을 SRT로 바꾸면 밀리초가 반올림되나요?

반올림되지 않습니다. SRT도 밀리초를 저장하고 JSON도 밀리초로 적으므로 모든 시작과 끝이 정확히 옮겨지고 시간축이 밀리지 않습니다.

cue의 시작이 끝보다 뒤면 어떻게 되나요?

파일을 거부하지 않고 고쳐서 내보냅니다. 손으로 편집한 문서도 불러올 수 있는 자막 파일이 되도록 하기 위해서입니다. 다만 원본이 무언가 잘못됐다고 알려 준 것이므로 그 cue의 시간을 영상과 대조해 보세요.

JSON과 SRT를 왕복하면 무엇이 남고 무엇이 사라지나요?

시간축은 정확히 재현되고, JSON이 표현하는 서식(기울임, 굵기, 색)은 태그로 나갔다가 태그로 돌아옵니다. 왕복에서 살아남지 못하는 것은 SRT 자체가 담지 못하는 정보이며, 그것이 바로 위 손실 목록입니다.

두 줄짜리 JSON 자막은 SRT에서 어떻게 되나요?

두 줄이 위아래로 그대로 나옵니다. 두 줄이 한 자막이라는 사실이 유지되어 재생기가 함께 보여 주며, 번호는 cue 하나에만 붙습니다.

관련 도구