Przejdź do treści
SubtitleMatrix

Konwerter napisów SRT na JSON

Albo wklej tekst napisów

Co zmienia ta konwersja

W tym kierunku nic nie ginie — każda cecha formatu źródłowego ma gdzie trafić w formacie docelowym.

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.

Ta strona zamienia plik napisów na dane strukturalne: dokument JSON z listą bloków, ich czasem początku i końca oraz tekstem. Schemat jest własny tego serwisu i celowo mały — numer wersji i tablica cues, a czasy to całe milisekundy, nie znaczniki czasu. Nic w nim nie zależy od konkretnej biblioteki i niczego nie trzeba zgadywać.

Milisekundy są po to, żeby plik był użyteczny bez parsowania. Najdrobniejsza jednostka, jaką zapisuje którykolwiek format na tej stronie, to jedna milisekunda, a liczba całkowita nie da się źle odczytać przez konwencję przecinka czy kropki. Linia bez formatowania to zwykły napis; linia z kursywą, pogrubieniem albo kolorem staje się obiektem z tekstem i tablicą tagów, z których każdy mówi, jakiego jest rodzaju i które znaki obejmuje.

Wynik to plik, który wczytasz do skryptu, porównasz jak diff albo wrzucisz do systemu kontroli wersji, a konwersja z powrotem zwróci Ci napisy. Praca odbywa się w przeglądarce.

Przykłady

Typowy plik SRT przekonwertowany na JSON

Wejście

1
00:00:01,000 --> 00:00:03,500
Hello there.

2
00:00:03,500 --> 00:00:06,000
<i>Whispering</i> now.
And a second line.

3
00:00:06,000 --> 00:00:09,250
<b>Bold</b> statement.

Wynik

{
  "version": 1,
  "cues": [
    {
      "id": "1",
      "start": 1000,
      "end": 3500,
      "lines": [
        "Hello there."
      ]
    },
    {
      "id": "2",
      "start": 3500,
      "end": 6000,
      "lines": [
        {
          "text": "Whispering now.",
          "tags": [
            {
              "kind": "italic",
              "start": 0,
              "end": 10
            }
          ]
        },
        "And a second line."
      ]
    },
    {
      "id": "3",
      "start": 6000,
      "end": 9250,
      "lines": [
        {
          "text": "Bold statement.",
          "tags": [
            {
              "kind": "bold",
              "start": 0,
              "end": 4
            }
          ]
        }
      ]
    }
  ]
}

Nic tu nie ginie: porównaj obie strony linia po linii.

Ta sama konwersja na zniszczonym wejściu

Wejście

1
0:00:01,00 --> 0:00:03,500
<B>Bold</B> and <I>italic</I>.


2
00:00:03,500 --> 00:00:06,000


3
00:00:08,000 --> 00:00:09,000
Last one.

Wynik

{
  "version": 1,
  "cues": [
    {
      "id": "1",
      "start": 1000,
      "end": 3500,
      "lines": [
        {
          "text": "Bold and italic.",
          "tags": [
            {
              "kind": "bold",
              "start": 0,
              "end": 4
            },
            {
              "kind": "italic",
              "start": 9,
              "end": 15
            }
          ]
        }
      ]
    },
    {
      "id": "2",
      "start": 3500,
      "end": 6000,
      "lines": []
    },
    {
      "id": "3",
      "start": 8000,
      "end": 9000,
      "lines": [
        "Last one."
      ]
    }
  ]
}

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

Częste pytania

Jaki schemat ma wyjściowy JSON z SRT?

Własny schemat tego serwisu: numer wersji i tablica cues. Każdy blok ma id, start i end w milisekundach oraz tablicę lines. Nie ma ukrytych metadanych ani zależności od formatu zewnętrznego, a SRT w tym samym pliku trzyma numer, znacznik czasu i tekst w trzech liniach.

Dlaczego JSON ze SRT podaje milisekundy zamiast znaczników czasu?

Żeby plik dało się użyć bez uprzedniego parsowania. Dodawanie, porównywanie i sortowanie czasów to zwykłe działania na liczbach całkowitych, podczas gdy 00:00:01,000 trzeba najpierw zdekodować i można zrobić to błędnie. SRT zapisuje ten sam moment tekstem, więc każdy odczyt wymaga konwersji.

Jak formatowanie z SRT jest reprezentowane w JSON-ie?

Zwykła linia zostaje zwykłym napisem. Linia z formatowaniem staje się obiektem z polem text i tablicą tags, a każdy tag mówi, jakiego jest rodzaju i gdzie zaczyna się i kończy w tekście. SRT trzyma to samo jako tagi <i> i <b> w tekście bloku.

Czy bezpiecznie edytować ręcznie JSON wyeksportowany z SRT?

Tak, a konwersja z powrotem jest sprawdzeniem. Jeśli plik się parsuje, konwersja odtworzy bloki z podanymi czasami — więc przejście tam i z powrotem to szybki sposób na znalezienie literówki. SRT nie wybacza tyle: zepsuty znacznik czasu oznacza blok pominięty.

Czy wczytam w skrypcie JSON otrzymany z pliku SRT?

Po to on jest. Czytasz tablicę cues, bierzesz start i end jako liczby i łączysz linie — linia to albo napis, albo obiekt, którego pole text niesie słowa. W SRT ten sam skrypt musiałby najpierw rozbijać znaczniki czasu i porządkować bloki.

Powiązane narzędzia