Przejdź do treści
SubtitleMatrix

Konwerter napisów LRC na JSON

Konwersja formatówTekst piosenki (LRC)
Albo wklej tekst napisów

Opcje

Używane, gdy źródło nie ma czasów końca (zwykły tekst, LRC). Oś czasu w wyniku jest tu generowana, a nie konwertowana, więc dostajesz dokładnie tę liczbę.

Co zmienia ta konwersja

1 rzecz zostaje pominięta albo wymaga decyzji

  • Czasy

    czasy końca bloków — źródło ich nie zapisuje, więc czasy w wyniku zostaną wygenerowane, a nie skonwertowane

Ta lista pochodzi z macierzy możliwości tych dwóch formatów, a nie z konkretnego wczytanego pliku. Konkretny plik może stracić więcej, jeśli używa cech, które format dopuszcza, ale macierz ich nie modeluje.

JSON nie ma własnych czasów ani bloków napisów — to struktura danych, którą trzeba wypełnić. Konwersja z LRC zapisuje więc tablicę `cues`, a w każdej pozycji czas `start` i `end` w milisekundach oraz tablicę `lines` z tekstem wierszy.

LRC nie podaje końca, więc parser bierze go z początku następnego wiersza, a ostatniemu wierszowi nadaje długość z pola na stronie. Kilka wierszy dzielących jeden znacznik staje się jedną pozycją z kilkoma napisami w `lines` — nie kilkoma pozycjami o identycznym czasie.

Tytuł z nagłówka `[ti:…]` trafia do pola `title` w wyniku, bo JSON ma na to miejsce. Wykonawca i przesunięcie nie mają odpowiednika w tej strukturze i są raportowane jako strata. Plik powstaje w przeglądarce, bez wysyłania czegokolwiek.

Przykłady

Typowy plik LRC po konwersji na JSON

Wejście

[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.

Wynik

{
  "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."
      ]
    }
  ]
}

W tym wyniku ginie timing: milisekundy końca zostały wyliczone z kolejnych wierszy LRC.

Ta sama konwersja na nierównym pliku wejściowym

Wejście

[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]

Wynik

{
  "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": [
        ""
      ]
    }
  ]
}

Takie uszkodzenia ma wiele prawdziwych plików: mieszane końce wierszy, zbłąkane spacje, puste pola. Porównaj to z czystym przykładem powyżej, żeby zobaczyć, co parser wybacza.

Częste pytania

Jak wiersz LRC dostaje czas zakończenia w JSON?

JSON przechowuje `start` i `end` w milisekundach, a LRC tylko start. Parser przyjmuje więc początek następnego wiersza jako koniec bieżącego, co daje dokładne odstępy. Ostatni wiersz nie ma następcy i otrzymuje długość z pola na stronie, odnotowaną w raporcie.

Jak wygląda JSON powstały z pliku LRC?

To obiekt z polem `version`, opcjonalnym `title` i tablicą `cues`. Każda pozycja ma `start` oraz `end` jako liczby całkowite w milisekundach i tablicę `lines` z tekstem. Nie ma numerów bloków ani formatowania — to czysta struktura danych.

Jak dwuwierszowy blok LRC wychodzi w JSON?

Jako jedna pozycja w `cues`, w której `lines` zawiera dwa napisy. Para oryginał–tłumaczenie pozostaje więc nierozdzielona — nie powstają dwie pozycje z tym samym `start`. To odpowiada dokładnie jednemu blokowi w innych formatach.

Czy kolejność bloków LRC zostaje w JSON?

Tak. Przed zapisem parser sortuje pozycje rosnąco według `start`, bo struktura ma odwzorowywać przebieg napisów. Jeśli plik LRC miał wiersze poza kolejnością, tablica `cues` zostanie uporządkowana. Zmienia się układ, nie treść ani wartości czasów.

Co ginie przy powrocie z JSON do LRC?

Timing, style, pozycjonowanie, karaoke i precyzja. LRC nie zapisuje końców ani pól wyglądu, a czas startu musi zmieścić się w setnej sekundy. Zostaje tekst wierszy oraz ich początki — o ile struktura JSON w ogóle zawierała dane potrzebne do ich odtworzenia.

Jakie kodowanie ma JSON powstały z LRC?

Wynik jest w UTF-8, z końcami wierszy LF i bez BOM. Nie ma znaczenia, czy plik LRC przyszedł w UTF-16, czy w jednobajtowym kodowaniu Windows — zostanie zdekodowany, a panel wyniku o tym poinformuje. Każdy wynik jest identycznie zakodowany.

Powiązane narzędzia