본문으로 바로 가기
SubtitleMatrix

LRC를 JSON으로 변환

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

옵션

원본에 종료 시간이 없을 때(일반 텍스트, LRC) 사용합니다. 결과물의 시간축은 변환되는 것이 아니라 여기서 새로 만들어지므로, 이 숫자가 그대로 결과가 됩니다.

이 변환에서 달라지는 것

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

  • 타이밍

    자막 블록 종료 시간 — 원본이 기록하지 않아 결과물의 종료 시간은 변환된 것이 아니라 새로 만들어집니다

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

LRC를 JSON으로 바꾸는 페이지입니다. 가사 한 줄이 cue 객체 하나가 되고 시작과 끝은 밀리초 정수로, 텍스트는 줄 배열로 들어갑니다. LRC에는 끝 시각이 없으므로 다음 줄의 시작을 채워 넣고, 마지막 줄만 기본 길이를 받습니다.

LRC는 `[00:04.12]`, JSON은 같은 순간을 `4120`이라는 정수로 적습니다. 문자열 시간을 다시 해석할 필요가 없고, 100분의 1초 값이 밀리초로 그대로 보존됩니다.

LRC의 `[ti:]` 제목은 JSON의 `title` 필드로 남습니다. 가수와 길이, offset은 대응하는 필드가 없어 남지 않고 offset도 적용하지 않습니다. 같은 타임스탬프의 LRC 줄은 `lines` 배열의 두 원소가 되고, 타임스탬프만 있는 줄은 빈 문자열 하나를 담은 `lines`를 가진 cue가 됩니다.

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

예시

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

입력

[ti:Sample Song]
[ar:Some Artist]
[length:00:41.00]
[offset:+250]
[00:12.00]First line of the song.
[00:15.30]Second line.
[00:15.30]Second line, translated.
[00:18.00]
[00:21.50]Final line.

결과물

{
  "version": 1,
  "title": "Sample Song",
  "cues": [
    {
      "start": 12000,
      "end": 15300,
      "lines": [
        "First line of the song."
      ]
    },
    {
      "start": 15300,
      "end": 18000,
      "lines": [
        "Second line.",
        "Second line, translated."
      ]
    },
    {
      "start": 18000,
      "end": 21500,
      "lines": [
        ""
      ]
    },
    {
      "start": 21500,
      "end": 23500,
      "lines": [
        "Final line."
      ]
    }
  ]
}

이 출력에서 버려지는 것은 타이밍입니다. 각 줄의 시작과 글자는 cue와 lines에 그대로 대응합니다.

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

입력

[ar:Some Artist]
[0:05.5]Leading zero omitted, one decimal.
[00:07]Second with no centiseconds.
[00:03.00]Out of order.
[00:07.00][00:09.00]Repeated chorus line.
[00:12.00]

결과물

{
  "version": 1,
  "cues": [
    {
      "start": 3000,
      "end": 5500,
      "lines": [
        "Out of order."
      ]
    },
    {
      "start": 5500,
      "end": 7000,
      "lines": [
        "Leading zero omitted, one decimal."
      ]
    },
    {
      "start": 7000,
      "end": 9000,
      "lines": [
        "Second with no centiseconds.",
        "Repeated chorus line."
      ]
    },
    {
      "start": 9000,
      "end": 12000,
      "lines": [
        "Repeated chorus line."
      ]
    },
    {
      "start": 12000,
      "end": 14000,
      "lines": [
        ""
      ]
    }
  ]
}

실제 파일에 흔한 손상입니다. BOM, 윈도우 줄바꿈, 한 자리 소수, 순서가 뒤섞인 줄이 있어도 읽을 수 있는 가사는 모두 cue가 됩니다.

자주 묻는 질문

LRC를 JSON으로 바꾸면 끝 시각은 어떻게 정해지나요?

다음 LRC 줄의 시작 시각이 앞 cue의 `end`가 됩니다. 마지막 cue는 다음 시작이 없어 기본 2초를 받습니다. LRC에 끝이 없기 때문에 생기는 계산입니다.

LRC의 제목은 JSON에서 어디에 남나요?

최상위 `title` 필드에 남습니다. `[ti:Sample Song]`이 있으면 그 값이 들어갑니다. 가수와 길이는 대응하는 필드가 없어 남지 않습니다.

같은 타임스탬프의 LRC 줄은 JSON에서 어떻게 표현되나요?

한 cue의 `lines` 배열에 두 원소로 들어갑니다. 같은 시각의 두 줄이 하나의 자막에 속한다는 정보가 배열 구조로 유지됩니다.

LRC의 빈 타임스탬프는 JSON에서 어떻게 되나요?

`lines`에 빈 문자열 하나만 든 cue가 됩니다. 시작과 끝은 정상적으로 계산되지만 표시할 글자가 없습니다. 빈 cue를 없애려면 변환 뒤 필터링하거나 QC 도구로 걸러야 합니다.

LRC의 offset 머리말은 JSON 변환에 적용되나요?

적용되지 않습니다. offset은 읽어서 보관하지만 시작 시각을 밀지 않습니다. JSON의 cue 시각은 LRC에 적힌 값 그대로입니다.

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

JSON의 끝 시각과 밀리초 정밀도가 LRC에 자리가 없어 사라집니다. 지금 방향인 LRC→JSON에서는 타이밍만 잃고, 그 손실은 되돌린다고 복구되지 않습니다.

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

출력은 UTF-8, 유닉스 줄바꿈, BOM 없음입니다. 원본 LRC의 인코딩과 무관하며, UTF-16 입력은 읽는 단계에서 해독되어 결과 패널에 표시됩니다.

관련 도구