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.