{"id":21616028,"url":"https://github.com/9beach/srt-tools","last_synced_at":"2025-04-11T07:33:46.081Z","repository":{"id":145321666,"uuid":"568110943","full_name":"9beach/srt-tools","owner":"9beach","description":"Command line tools for translating, syncing, fixing and converting SubRip files.","archived":false,"fork":false,"pushed_at":"2024-08-15T08:32:14.000Z","size":461,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-25T05:05:13.292Z","etag":null,"topics":["claude-ai","cli","gemini","llm","sami","smi","srt","subrip","subtitle","toolkit","translate"],"latest_commit_sha":null,"homepage":"","language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/9beach.png","metadata":{"files":{"readme":"README.ko-KR.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-19T13:41:33.000Z","updated_at":"2025-01-09T04:57:16.000Z","dependencies_parsed_at":"2024-05-30T12:13:28.656Z","dependency_job_id":"581893c2-9972-45e6-afcd-3aea43815228","html_url":"https://github.com/9beach/srt-tools","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/9beach%2Fsrt-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/9beach%2Fsrt-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/9beach%2Fsrt-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/9beach%2Fsrt-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/9beach","download_url":"https://codeload.github.com/9beach/srt-tools/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248358842,"owners_count":21090442,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-ai","cli","gemini","llm","sami","smi","srt","subrip","subtitle","toolkit","translate"],"created_at":"2024-11-24T22:13:24.645Z","updated_at":"2025-04-11T07:33:46.002Z","avatar_url":"https://github.com/9beach.png","language":"Perl","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SRT-TOOLS\n\n한국어 | [English](README.md)\n\n`srt-tools`는 [서브립](https://en.wikipedia.org/wiki/SubRip)\n파일(`.srt` 확장자)을 LLM을 이용해서 번역하고, 다양한 방식으로 수정하고\n변환하는 커맨드 라인 기반의 프로그램 모음입니다. 현재 `smi2srt`와 `srttidy`, `srttrans`, `srtmerge`가 포함되어 있습니다.\n\n## 설치\n\n맥이나 리눅스 사용자는 파일을 실행 경로에 등록된 디렉터리에 복사하고 실행 권한을 부여하면 바로 사용할 수 있습니다. 다음과 같이 설치하세요:\n\n```\nsudo curl -L https://raw.githubusercontent.com/9beach/srt-tools/main/smi2srt -o /usr/local/bin/smi2srt\nsudo curl -L https://raw.githubusercontent.com/9beach/srt-tools/main/srttidy -o /usr/local/bin/srttidy\nsudo curl -L https://raw.githubusercontent.com/9beach/srt-tools/main/srttrans -o /usr/local/bin/srttrans\nsudo curl -L https://raw.githubusercontent.com/9beach/srt-tools/main/srtmerge -o /usr/local/bin/srtmerge\ncd /usr/local/bin \u0026\u0026 sudo chmod a+rx srttidy smi2srt srtmerge srttrans\n```\n\n## `srttrans`\n\n`srttrans`를 이용해서 인공지능 자막 번역 기능을 사용하려면 [llm-cli](https://github.com/9beach/llm-cli)를 먼저 설치한 뒤 인공지능 서비스 API 키를 직접 발급받아야 합니다. 2024년 현재 구글의 제미나이 API는 무료로 이용할 수 있고 DeepL도 한달 500,000자 제한이 있는 키를 무료로 제공합니다. 대부분의 LLM 서비스는 저작권이나 부적절한 표현과 관련된 제약이 있기 때문에, 자막 번역 용도로는 DeepL이 가장 적합합니다. 사용 방법은 다음과 같습니다:\n\n```sh\nexport DEEPL_API_KEY=\"your-api-key-here\"\ncat my-english.srt | srttrans deepl-cli KO \u003e my-ko.srt\n```\n\n```sh\nexport GEMINI_API_KEY=\"your-api-key-here\"\ncat my-france.srt | srttrans gemini-cli ko \u003e my-ko.srt\n```\n\n```sh\nexport ANTHROPIC_API_KEY=\"your-api-key-here\"\ncat my-brazil.srt | srttrans claude-cli hi \u003e my-hi.srt\n```\n\n`ko`, `hi`는 각각 한국어와 힌디어의 약자입니다. `deepl-cli`는 반드시 두 글자로 지정해야 하며 `gemini-cli`와 `claude-cli`는 `Korean`, `Hindi`로 써도 무방합니다.\n\n환경 변수 `LT_LINES`와 `LT_SLEEP_SEC`을 지정하여 한 번에 번역을 요청하는 라인 수와 대기 시간을 조절할 수 있습니다. `LT_LINES`는 한 번에 번역 요청할 라인 수를 설정하고, `LT_SLEEP_SEC`는 각 번역 요청 사이의 대기 시간을 설정합니다.\n\n```sh\nexport GEMINI_API_KEY=\"your-api-key-here\"\nexport LT_LINES=100\nexport LT_SLEEP_SEC=5\ncat my-france.srt | srttrans gemini-cli JP \u003e my-japanese.srt\n```\n\n번역 작업이 너무 오래 걸려 \u003ckbd\u003eCTRL + C\u003c/kbd\u003e로 멈추더라도, 번역된 부분은 파일에 저장됩니다. 그러나 이 경우 번역된 부분뿐만 아니라 번역되지 않은 부분도 함께 저장됩니다. 이는 번역되지 않은 부분을 쉽게 찾을 수 있도록 하기 위함입니다. 이제 번역되지 않은 부분만 따로 저장하여 번역을 완료한 후, `srtmerge`를 사용해 병합할 수 있습니다.\n\n`deepl-cli`에서는 이러한 일이 드물지만, `gemini-cli`와 `claude-cli`는 다양한 이유로 일부 문장의 번역을 거부하는 경우가 많아 `srtmerge`가 유용할 때가 있습니다.\n\n## `srtmerge`\n\n아래와 같은 두 파일을 병합할 때 `srtmerge`를 사용하세요.\n\n**파일 a**\n\n```\n1\n00:00:50,313 --\u003e 00:00:52,478\n안녕하세요.\n\n2\n00:00:52,545 --\u003e 00:00:54,043\n-You okay?\n-Person 4: You ready to go in?\n\n3\n00:00:54,109 --\u003e 00:00:55,208\nLet's go.\n```\n\n**파일 b**\n\n```\n2\n00:00:52,545 --\u003e 00:00:54,043\n-괜찮아요?\n-사람 4: 들어갈 준비 됐어요?\n\n3\n00:00:54,109 --\u003e 00:00:55,208\n가자.\n```\n\n```\n❯ srtmerge a b\n1\n00:00:50,313 --\u003e 00:00:52,478\n안녕하세요.\n\n2\n00:00:52,545 --\u003e 00:00:54,043\n-괜찮아요?\n-사람 4: 들어갈 준비 됐어요?\n\n3\n00:00:54,109 --\u003e 00:00:55,208\n가자.\n```\n\n파일 `a`는 자신에게 존재하는 번호만 파일 `b`로부터 가져와 병합합니다. 즉 파일 `a`에 영어로 된 2, 3 번 자막이 없다면 `b`로부터 해당 자막을 병합하지 않습니다. 이 점에 유의하세요.\n\n파일 b가 반드시 자막 양식일 필요는 없습니다. 다음의 양식도 지원합니다.\n\n```txt\n2%-\n-괜찮아요?\n-사람 4: 들어갈 준비 됐어요?\n3%-\n가자.\n```\n\n즉, 타임스탬프가 없어도 순서 다음에 `%-` 기호만 있으면 병합할 수 있습니다. 이 기능을 이용하면 번역 엔진을 사용할 때 필요 없는 부분을 제거하고 번역한 뒤 병합할 수 있습니다. 터미널에서 다음 명령어를 실행해 보세요. 타임스탬프를 없애고 순서 다음에 `%-` 기호를 자동으로 붙여줍니다.\n\n```sh\ncat org.srt | perl -0777 -pe 's/^\\s*\\n//mg; s/([0-9]+)[\\r\\n]*([0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3} --\u003e [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3})/$1%-/g'\n```\n\n## `smi2srt`\n\n`smi2srt`는 [sami](https://ko.wikipedia.org/wiki/sami) 포맷의 파일을\n[서브립](https://en.wikipedia.org/wiki/subrip) 포맷으로 변경하는 커맨드 라인\n프로그램입니다. 기본 사용법은 다음과 같습니다.\n\n```\n$ smi2srt my.smi\ncreated: my.srt\n```\n\n이름을 지정하고 싶다면 다음과 같이 명령하세요.\n\n```\nsmi2srt \u003c my.smi \u003e new.srt\n```\n\n`smi2srt my.smi \u003e new.srt`가 아니라 `smi2srt \u003c my.smi \u003e new.srt`임에 주의하세요.\n다음과 같이 명령하면 파일로 저장하지 않고 화면에 출력합니다.\n\n```\nsmi2srt \u003c my.smi\n```\n\n저장되는 파일의 이름을 직접 지정하지 않으려면 `\u003c` 없이 사용하세요. 이때는 한꺼번에 많은 파일을 변환할 수도 있습니다.\n\n```\n$ smi2srt 1.smi 2.smi 3.smi\ncreated: 1.srt\ncreated: 2.srt\ncreated: 3.srt\n```\n\n```\n$ smi2srt */*.smi\ncreated: dir1/1.srt\ncreated: dir1/2.srt\n...\ncreated: dirN/M.srt\n```\n\n## `srttidy`\n\n`srttidy`는 [서브립](https://en.wikipedia.org/wiki/subrip) 파일의 싱크를 맞추고\n타임스탬프를 수정하는 등 다양한 작업을 지원하는 커맨드 라인 프로그램입니다.\n특히 글자 수에 비해 표시 시간이 적은 자막만 골라서 시간을 수정하는 등 자막\n번역에 필요한 다양한 기능을 제공합니다.\n\n다음의 헬프 메시지를 중심으로 하나씩 설명하겠습니다.\n\n```\nUsage: srttidy [OPTIONS] SRT-FILE [...]\n   or: srttidy [OPTIONS] \u003c IN-SRT-FILE \u003e OUT-SRT-FILE\n\nOptions\n  -t                      show subtitle texts only\n  -u                      show numeric counters and subtitle texts only\n  -c COLOR                specify default subtitle font color\n  -r                      remove srttidy-specified font color\n  -s SECOND               shift timestamps by given time in seconds\n  -l TIME-MAP             correct timestamps linearly by given time map\n  -p FRAMERATE-MAP        correct timestamps linearly by given frame rate map\n  -n                      remove empty subtitles, and reorder lefts one-by-one\n  -d PATTERN              remove subtitles including given pattern\n  -g PATTERN              show subtitles including given pattern\n  -f CONDITION            show subtitles matching given condition\n  -m DURATION,GAP[;COND]  change timestamps by given minimum duration, gap\n                          in seconds, and condition\n  -b                      remove carriage returns and BOM\n  -y                      remove unnecessary whitespace\n  -1                      make each subtitle one line\n\nExamples\n  srttidy -t \u003c my.srt \u003e my.txt\n  srttidy -c silver *.srt\n  srttidy -r \u003c old.srt \u003e new.srt\n  srttidy -s -8.26 \u003c old.srt \u003e new.srt\n  srttidy -b -l \"00:00:19,145-00:00:22,189 02:39:17,715-02:39:18,390\" my.srt\n  srttidy -p \"23.976-24\" my.srt\n  srttidy -n -d '(yts|sub2smi|elsubtitle)' *.srt\n  srttidy -b -n Movies/*/*.srt\n  srttidy -g '(yts|sub2smi|elsubtitle)' *.srt\n  srttidy -f '(lc=1 and cc\u003e15) or cc\u003e20 or dt\u003e3.5' \u003c old.srt\n  srttidy -m 1.0,0.1 my.srt\n  srttidy -m '3,0.1;cc\u003e20 and dt\u003c2' my.srt\n  srttidy -1 -t \u003c my.srt \u003e my.txt\n  srttidy -yb \u003c my.srt \u003e my.txt\n\nSee \u003chttps://github.com/9beach/srt-tools\u003e for updates and bug reports\n```\n\n다음의 `my.srt`를 예로 사용하겠습니다.\n\n```srt\n1\n00:00:30,000 --\u003e 00:00:30,524\n\n2\n00:00:30,900 --\u003e 00:00:31,000\nLolita, light of my life,\n\n3\n00:00:35,000 --\u003e 00:00:35,575\nfire of my loins. My sin, my soul.\n\n4\n00:00:40,000 --\u003e 00:00:42,000\n\u003cfont color=red\u003e\u003ci\u003eLo-lee-ta:\u003c/i\u003e\u003c/font\u003e\n\n6\n00:00:45,000 --\u003e 00:00:50,469\nthe tip of the tongue taking a trip of\nthree steps down the palate to tap,\n\n7\n00:00:50,000 --\u003e 00:00:50,635\nat three, on the teeth. Lo. Lee. Ta.\n```\n\n### 텍스트만 추출하기\n\n`-t` 옵션은 자막에서 텍스트만 추출합니다.\n\n```\n$ srttidy -t \u003c my.srt\nLolita, light of my life,\nfire of my loins. My sin, my soul.\nLo-lee-ta:\nthe tip of the tongue taking a trip of\nthree steps down the palate to tap,\nat three, on the teeth. Lo. Lee. Ta.\n```\n\n아래의 두 명령과 비교해 보세요.\n\n```\n$ srttidy -t my.srt\ncreated: my-tidy.txt\n```\n\n```\nsrttidy -t \u003c my.srt \u003e my.txt\n```\n\n`\u003c` 기호를 파일 앞에 붙이면 결과를 화면에 출력합니다. 이때 출력된 결과를\n화면이 아닌 파일로 저장하고 싶다면 `\u003e` 기호 뒤에 저장할 파일의 이름을\n지정합니다. `\u003c` 기호 없이 실행하면 `-tidy` 이름을 붙여서 새로운 파일을 만듭니다.\n\n서브립이 아닌 SAMI에서 텍스트만 추출하고 싶다면 다음을 실행합니다.\n\n```\nsmi2srt \u003c my.smi | srttidy -t\n```\n\n### 기본 자막색깔 변경하기\n\n하얀색 자막이 눈에 거슬려 `silver`나 `gray`로 고치고 싶다면 다음과 같이\n실행합니다.\n\n```\n$ srttidy -c silver my.srt\ncreated: my-tidy.srt\n$ srttidy -c gray \u003c my.srt \u003e new.srt\n```\n\n물론 이미 색깔이 지정된 자막은 변경하지 않습니다. 기본인 하얀색만 원하는\n색깔로 변경합니다.\n\n`srttidy -c gray \u003c my.srt \u003e my.srt`과 같이 실행하면 기존 파일을 대체하려는\n의도와는 달리 기존 파일의 내용을 지워버립니다. `srttidy -c gray \u003c my.srt`\n명령을 수행하기 전에 먼저 `\u003e my.srt` 명령으로 빈 파일을 만들기 때문입니다.\n다음과 같이 실행해야 합니다.\n\n```\nsrttidy -c gray \u003c my.srt \u003e tmp.srt \u0026\u0026 [ -s tmp.srt ] \u0026\u0026 mv tmp.srt my.srt\n```\n\n`srttidy`로 지정한 색깔을 없애고 원래대로 복구하려면 다음과 같이 실행합니다.\n\n```\n$ srttidy -r my-tidy.srt\ncreated: my-tidy-tidy.srt\n```\n\n```\nsrttidy -r \u003c my-tidy.srt \u003e my-org.srt\n```\n\n### 자막 싱크 조절하기\n\n자막이 영상에 비해 일찍 나와서 2.1초 뒤로 보내고 싶다면 다음을 실행합니다.\n\n```\nsrttidy -s 2.1 \u003c my.srt \u003e new.srt\n```\n\n반대로, 앞으로 보내고 싶다면 다음과 같이 실행합니다.\n\n```\nsrttidy -s -9.2 \u003c my.srt \u003e new.srt\n```\n\n10분 이후의 자막만 앞으로 보내고 싶다면 다음과 같이 실행합니다.\n\n```\nsrttidy -s -9.2,600 \u003c my.srt \u003e new.srt\n```\n\n자막의 싱크가 앞부분에서 3초 정도 차이 나는데 뒤로 가면 0.6초로 차이가\n줄어드는 경우가 있습니다. 이때는 관찰을 통해서 측정할 수도 있지만 잘 맞는\n영문 자막을 찾은 뒤 전후반부 한 장면씩 골라 한글 자막과 영문 자막의\n타임스탬프를 비교하면 확실히 알 수 있습니다. 이런 경우 다음과 같이 명령하여\n싱크를 선형으로 보정할 수 있습니다.\n\n```\nsrttidy -l \"00:00:19,145-00:00:22,189 02:39:17,715-02:39:18,390\" my.srt\n```\n\n자막의 싱크가 점차 틀어진다면 위와 같은 방법 이외에 프레임레이트를 변환하는\n방법도 있습니다.\n\n```\nsrttidy -p \"23.976-24\" my.srt\n```\n\n### 자막 번호 보정하기\n\n번역 과정에서 짧은 대사 두 개를 병합하는 등의 이유로 자막 번호의 순서가 맞지\n않은 경우가 있습니다. 위의 `my.srt`은 첫 번째 자막의 텍스트가 비어 있고\n자막 번호가 4에서 6으로 뛰는 등 순서가 맞지 않습니다. 이런 경우 다음과 같이\n보정합니다.\n\n```srt\n$ srttidy -n \u003c my.srt\n1\n00:00:30,900 --\u003e 00:00:31,000\nLolita, light of my life,\n\n2\n00:00:35,000 --\u003e 00:00:35,575\nfire of my loins. My sin, my soul.\n\n3\n...\n```\n\n### 인덴트 정리하기\n\n```\n\n8\n00:00:50,313 --\u003e 00:00:52,478\nOkay. Everyone has bottles?\n9\n00:00:52,545 --\u003e 00:00:54,043\n-You okay?\n\n-Person 4: You ready to go in?\n\n\n10\n00:00:54,109 --\u003e 00:00:55,208\nLet's go.\n```\n\n위와 같은 자막은 `-y` 옵션으로 말끔히 정리할 수 있습니다.\n\n```\n\u003e cat nasty.srt | srttidy -y\n8\n00:00:50,313 --\u003e 00:00:52,478\nOkay. Everyone has bottles?\n\n9\n00:00:52,545 --\u003e 00:00:54,043\n-You okay?\n-Person 4: You ready to go in?\n\n10\n00:00:54,109 --\u003e 00:00:55,208\nLet's go.\n```\n\n### 옵션의 조합\n\n대부분의 옵션은 조합해서 사용할 수 있습니다.\n\n```\nsrttidy -n -l \"00:00:19,145-00:00:22,189 02:39:17,715-02:39:18,390\" my.srt\nsrttidy -n -c gray \u003c my.srt \u003e new.srt\nsrttidy -s -9.2 -c gray \u003c my.srt \u003e new.srt\nsrttidy -r -n \u003c my.srt \u003e new.srt\n```\n\n### 키워드로 자막 검색하기\n\n`the`라는 단어를 포함하는 자막만 보고 싶다면 다음과 같이 명령합니다.\n\n```\nsrttidy -g the \u003c my.srt\n```\n\n대소문자를 가지리 않기 때문에 위의 결과는 `THE`라는 단어를 포함한 자막도\n보여줍니다. `the` 또는 `my`로 검색 조건을 늘리고 싶다면 다음과 같이 명령합니다.\n\n```\nsrttidy -g '(the|my)' \u003c my.srt\n```\n\n검색 조건은\n[정규 표현식](https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D)을\n지원합니다. 상당히 강력하니 따로 찾아 보시기 바랍니다. 여기서는 몇 가지\n핵심적인 특징만 소개하겠습니다.\n\n- `-g '(dog|cat)'`으로 검색하면 `dog` 또는 `cat`을 포함한 자막을 보여줍니다.\n- `.`은 임의의 문자를 뜻합니다. 마침표는 `\\.`로 표기합니다. 그래서 `-g '이.해'`로 검색하면 \"이동해\", \"이상해\" 등의 단어를 포함한 자막을 보여주고,`-g '(,|\\.)'`로 검색하면 마침표나 쉼표가 있는 자막을 보여줍니다.\n- `*`는 바로 앞의 문자가 0번 이상 반복되는 것을 뜻합니다. 그래서 `-g 'dog.*cat'`으로 검색하면 `dogcat`, `dog cat`, `dog and cat` 등 `dog`과 `cat`이 순서대로 나오는 자막을 보여줍니다.\n\n### 키워드로 자막 삭제하기\n\n`sub2smi`라는 단어를 포함하는 자막만 삭제하려면 다음과 같이 명령합니다.\n\n```\nsrttidy -d sub2smi \u003c my.srt\n```\n\n위에서 설명한 `-n` 옵션과 조합하면 삭제한 뒤 자막 번호를 순차적으로 고쳐줍니다.\n\n```\nsrttidy -n -d sub2smi \u003c my.srt\n```\n\n`-g` 옵션과 마찬가지로 정규 표현식을 지원합니다.\n\n```\nsrttidy -g '(,|\\.|\\?)' \u003c my.srt | srttidy -d '\\.\\.\\.'\n```\n\n위와 같이 실행하면 `...`을 포함한 자막은 제외하고 마침표나 쉼표, 물음표가 있는\n자막을 보여줍니다.\n\n### 글자 수, 라인 수, 표시 시간으로 자막 검색하기\n\n`cc`, `lc`, `dt`는 각각 글자 수, 라인 수, 표시 시간을 뜻합니다.\n다음의 실행 예를 살펴 보세요.\n\n```\n$ srttidy -f 'lc=1 and cc\u003e20' \u003c my.srt\n3\n00:00:35,000 --\u003e 00:00:35,575\nfire of my loins. My sin, my soul.\n\n7\n00:00:50,000 --\u003e 00:00:50,635\nat three, on the teeth. Lo. Lee. Ta.\n```\n\n```\n$ srttidy -f 'lc=2' \u003c my.srt\n6\n00:00:45,000 --\u003e 00:00:50,469\nthe tip of the tongue taking a trip of\nthree steps down the palate to tap,\n```\n\n```\n$ srttidy -f 'dt\u003e4' \u003c my.srt\n6\n00:00:45,000 --\u003e 00:00:50,469\nthe tip of the tongue taking a trip of\nthree steps down the palate to tap,\n```\n\n`'(lc=1 and cc\u003e=15) or cc\u003e20 or dt\u003e3.5'`와 같이 괄호를 써서 복잡한 조건을\n구성할 수도 있습니다.\n\n### 표시 시간 보정하기\n\n자막이 너무 빨리 지나가서 읽기 힘든 경우가 있습니다. `-m` 옵션으로 자막의\n최소 표시 시간을 지정해서 늘릴 수 있습니다. 다음의 예를 봅시다.\n\n```\n$ srttidy -n -m '4.5,0.1' \u003c my.srt \u003e /dev/null\n* 1 1,19: SHORT/FIXED BUT SHORT (0.100 -\u003e 4.000)\n  00:00:30,900 --\u003e 00:00:31,000\n  Lolita, light of my life,\n\n* 2 1,24: SHORT/FIXED (0.575 -\u003e 4.500)\n  00:00:35,000 --\u003e 00:00:35,575\n  fire of my loins. My sin, my soul.\n\n* 3 1,7: SHORT/FIXED (2.000 -\u003e 4.500)\n  00:00:40,000 --\u003e 00:00:42,000\n  \u003cfont color=red\u003e\u003ci\u003eLo-lee-ta:\u003c/i\u003e\u003c/font\u003e\n\n* 4 2,58: OVERLAPPED/FIXED (5.469 -\u003e 4.900)\n  00:00:45,000 --\u003e 00:00:50,469\n  the tip of the tongue taking a trip of\n  three steps down the palate to tap,\n\n* 5 1,24: SHORT/FIXED (0.635 -\u003e 4.500)\n  00:00:50,000 --\u003e 00:00:50,635\n  at three, on the teeth. Lo. Lee. Ta.\n```\n\n`-n` 옵션으로 빈 자막은 제거되었고 `-m '4.5,0.1'` 옵션으로 최소 표시 시간은\n4.5초, 다음 자막과의 최소 간격은 0.1초로 지정되었습니다. 수행 결과로 보정된\n자막은 `new.srt` 파일에 저장되었으며 수행 내역은 화면에 표시되었습니다. 첫\n줄부터 보겠습니다.\n\n```\n* 1 1,19: SHORT/FIXED BUT SHORT (0.100 -\u003e 4.000)\n```\n\n`1 1,19`는, 첫 번째 자막이 1개의 라인과 19개의 글자로 구성된다는 뜻입니다.\n`SHORT/FIXED BUT SHORT (0.100 -\u003e 4.000)`는 표시 시간이 0.100초여서 4.5초로\n늘리려 했으나, 다음 자막을 고려해 겹치지 않는 최대인 4.000초로 늘렸다는\n뜻입니다.\n\n```\n* 2 1,24: SHORT/FIXED (0.575 -\u003e 4.500)\n...\n* 3 1,7: SHORT/FIXED (2.000 -\u003e 4.500)\n```\n\n두 번째, 세 번째 자막은 원래는 짧았지만 4.5초로 변경되어 `SHORT/FIXED`가\n표시되었습니다.\n\n```\n* 4 2,58: OVERLAPPED/FIXED (5.469 -\u003e 4.900)\n```\n\n4번째 자막은 두 개의 줄과 58개의 글자로 구성되는데, 종료시간이 5번째 자막의\n시작시간보다 늦어서 겹친 상태였고 이를 수정했다는 메시지입니다. 이런 오류는\n기준 시간이 아니라 겹치지 않는 최대 시간만큼 고칩니다. 그래서 4.5초가 아닌\n4.9초로 고쳤습니다.\n\n만약 수행 내역에 짧은 자막이 연속해서 자주 이어진다면 최소 표시 시간을\n늘이기보다 짧은 자막을 병합해서 두 줄 자막을 만드는 것을 고려하세요.\n\n### 조건에 부합하는 자막만 표시 시간 보정하기\n\n`-m` 옵션에 부가 조건을 줘서 조건에 부합하는 자막만 표시 시간을 보정할\n수 있습니다.\n\n다음은 글자 수가 15 이상 20 이하이고 줄 수가 하나인 자막의 최소 표시 시간을\n2초로 지정합니다.\n\n```\n$ srttidy -m '2,0.1;lc=1 and cc\u003e=15 and cc\u003c=20' \u003c my.srt \u003e new.srt\n* 2 1,19: SHORT/FIXED (0.100 -\u003e 2.000)\n  00:00:30,900 --\u003e 00:00:31,000\n  Lolita, light of my life,\n```\n\n다음은 스무 글자 이상이고 한 줄인 자막의 최소 표시 시간을 3초로 지정합니다.\n\n```\n$ srttidy -m '3,0.1;lc=1 and cc\u003e=20' \u003c my.srt \u003e new.srt\n* 3 1,24: SHORT/FIXED (0.575 -\u003e 3.000)\n  00:00:35,000 --\u003e 00:00:35,575\n  fire of my loins. My sin, my soul.\n\n* 7 1,24: SHORT/FIXED (0.635 -\u003e 3.000)\n  00:00:50,000 --\u003e 00:00:50,635\n  at three, on the teeth. Lo. Lee. Ta.\n```\n\n### 바이트 순서 표시와 캐리지 리턴 제거하기\n\n사용자 눈에 보이지는 않으나\n[바이트 순서 표시](https://ko.wikipedia.org/wiki/바이트_순서_표식)라는\n것이 문제를 일으키는 경우가 있습니다. `-b` 옵션으로 이것을 제거할 수 있습니다.\n\n```\nsrttidy -b \u003c old.srt \u003e new.srt\n```\n\n위와 같이 실행하면 [캐리지 리턴](https://ko.wikipedia.org/wiki/캐리지_리턴)도\n같이 제거합니다. 일반적으로 몰라도 되는 기능입니다만 캐리지 리턴이 파일에\n붙는 것이 싫다면, 다른 옵션으로 작업할 때도 습관적으로 `-b` 옵션을 붙이는\n것을 생각할 수 있습니다.\n\n### 두 줄 이상의 자막을 한 줄로 만들기\n\n한 문장이 두 줄 이상으로 이루어진 경우 구글 번역기 등으로 번역하면 독립된\n문장으로 인식해 어색할 때가 많습니다. 다음과 같이 한 줄로 변경할 수 있습니다.\n\n```\nsrttidy -1 -t \u003c my.srt \u003e text-to-translate.txt\n```\n\n### 파일 인코딩을 UTF-8으로 변경하기\n\n`srttidy`는 기본적으로 작업 결과를 UTF-8으로 인코딩합니다. 따라서 아무런 옵션\n없이 실행해도 인코딩은 UTF-8으로 바뀝니다.\n\n```\nsrttidy \u003c cp949.srt \u003e utf-8.srt\nsrttidy \u003c utf-16.srt \u003e utf-8.srt\n```\n\n## 윈도우 사용자\n\n마이크로소프트 윈도우 사용자는 [윈도우용 펄](https://strawberryperl.com)\n또는 [WSL](https://apps.microsoft.com/store/detail/windows-subsystem-for-linux/9P9TQF7MRM4R?hl=en-us\u0026gl=us)을 설치한 뒤 사용할 수 있습니다.\nWSL은 가상 리눅스 환경이라 맥이나 리눅스와 사용법이 동일합니다. 그러나\n윈도우용 펄은 몇 가지 차이가 있습니다.\n\n```\n$ smi2srt my.smi\ncreated: my.srt\n```\n\n리눅스나 맥의 터미널에서 위와 같이 입력하면 `my.srt`파일이 생성됩니다.\n\n```\nc:\\\u003e perl c:\\path-to\\smi2srt my.smi\ncreated: my.srt\n```\n\n도스창에서는 위와 같이 명령해야 합니다. `c:\\path-to`는 여러분이 `smi2srt`를\n복사한 경로입니다.\n\n```\n$ smi2srt *.smi\ncreated: 1.srt\ncreated: 2.srt\n...\n```\n\n리눅스나 맥 환경에서 위와 같이 실행하면 현재 디렉터리 안의 모든 `smi` 파일을\n`srt`로 변경합니다. 그러나 윈도우에서는 다음과 같이 명령해야 합니다.\n\n```\nfor %a in (\"*.smi\") do perl C:\\path-to\\smi2srt %a\n```\n\n`srttidy`는 옵션이 많아서 조금 더 복잡합니다. 도스창의 인코딩을 UTF-8으로\n바꾸고 펄을 실행할 때 별도의 옵션을 줘야 합니다.\n\n```\nc:\\\u003e chcp 65001\nc:\\\u003e perl -CA c:\\path-to\\srttidy -n \u003c my.srt\n...\n```\n\n저런 식으로 수행해서 대부분이 제대로 작동했지만 `-g` 옵션의 한글 검색은\n제대로 작동하지 않았습니다. 물론 제가 펄 언어를 처음 써서 생긴 문제이며 곧\n고칠 수 있을지도 모릅니다. 하지만 현재로는 모든 기능을 충분히 활용하기 위해\nWSL을 설치해서 사용하기를 권합니다.\n\n이 문서는 맥이나 리눅스 환경을 가정해서 설명합니다.\n\n## 마무리\n\n앞서 밝혔듯이 대부분의 옵션은 조합해서 사용할 수 있습니다. 다양하게 시도해\n보세요. 그리고 어떠한 질문이나 의견도 환영하니\n[이슈 트래커](https://github.com/9beach/srt-tools/issues)에 남기시기 바랍니다.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F9beach%2Fsrt-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F9beach%2Fsrt-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F9beach%2Fsrt-tools/lists"}