일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- HTTP
- React Native
- 깃 연동
- 리액트 네이티브
- 깃허브 로그인
- 리액트 네이티브 시작하기
- 모두를위한딥러닝
- 데베
- 깃 터미널 연동
- 자바
- 모두의 네트워크
- 백준 4358번
- 정리
- SQL
- 데이터베이스
- 백준
- 모두를 위한 딥러닝
- 깃허브 토큰 인증
- 백준 4358 자바
- 머신러닝
- 팀플회고
- 스터디
- 문자열
- 백준 5525번
- 리액트 네이티브 프로젝트 생성
- 지네릭스
- 딥러닝
- 모두의네트워크
- 백준 4949번
- 네트워크
- Today
- Total
솜이의 데브로그
webVTT 를 이용한 vtt 자막 생성 (TXT to VTT) 본문
현재 진행중인 졸업프로젝트에서, 자막 파일을 생성하여 동영상에 같이 재생해줘야하는 부분을 구현해야했다.
이 부분에서 프론트 담당하신분이 자막을 VTT 포맷으로 만들어달라고 요청하셨기에, JSON 형태의 파일을 VTT로 바꾸는 작업을 했다.
(해당 작업은 python을 통해서 진행했다)
1. VTT 파일 형태
먼저 VTT 파일을 만들기 위해서는 해당 포맷의 자막이 어떤식으로 구성되는지를 알아야 했다.
vtt 형식 구성에 대해서는 다음 링크를 참고했다. 다양한 형식을 참고 할 수 있으므로 자신이 필요한 형태의 자막을 생성하자.
https://www.w3.org/TR/webvtt1/
먼저 시간을 지정해주어야하는데, 시작 시간 --> 끝 시간 형태로 구성한다.
시간 다음 라인에는 출력할 자막 내용 텍스트가 들어온다
이런 형태로 반복됨을 확인하고, 시간은 어떤 형식으로 포맷팅되는지를 주의깊게 확인하자.
그러면 이제 가지고 있는 데이터가 텍스트든, csv이든, 나처럼 JSON이든 어떻게 가공해서 정렬할 것인지를 감 잡을 수 있을것이다.
2. JSON (Text) to VTT
가지고 있는 데이터를 어떤식으로 가공할지 알았으면 자막을 생성해보자. 나는 먼저 colab 환경에서 테스트해보았다.
먼저 vtt 파일과 관련한 작업을 하기 위해서 web-vtt 라이브러리를 설치한다.
pip install webvtt-py
그리고 해당 라이브러리의 함수들에 관해서는 이 링크를 참고했다
https://webvtt-py.readthedocs.io/en/latest/usage.html
그럼 이제 필요한 모듈들을 import 해오자.
from webvtt import WebVTT, Caption
import webvtt
import json
import pandas as pd
import datetime
import os
json의 경우 내가 json 형태의 데이터를 가공할것이기 때문에 불러왔는데, 가지고 있는 데이터가 텍스트 또는 csv라면 필요 없을 듯 하다.
os는 필요한 환경에 맞추어 불러온다.
def make_vtt(text):
vtt = WebVTT()
for line in text:
fmt = '%H:%M:%S.%f'
start_time = datetime.datetime.fromtimestamp(line['start'], tz=datetime.timezone.utc).strftime(fmt)[:-3]
end_time = datetime.datetime.fromtimestamp(line['end'], tz=datetime.timezone.utc).strftime(fmt)[:-3]
caption = Caption(start_time, end_time, line['text'])
vtt.captions.append(caption)
vtt.save('temp.vtt')
다음과 같은 함수를 통해 vtt 파일을 생성 가능하다.
위 함수에서 input으로 받는 text는 json파일을 python dictionary 형태로 풀어준 파일이다.
따라서 해당 딕셔너리에 있는 라인 한 줄씩 읽으면서 시작시간, 끝시간과 text 값을 읽어오고, 자막에 추가하는 방식으로 진행한다. 가지고 있는 데이터에서 해당하는 값을 읽어오는 방식으로 대체하면 된다.
먼저 vtt = WebVTT() 를 선언한다.
위에서 vtt 파일의 경우 시간을 어떻게 포맷팅하는지 확인했으니, 해당 포맷으로 fmt를 선언한다. 시간 분 초로 포맷팅하고, 각각 시작시간과 끝시간을 아까 import 해온 datetime 모듈을 통해 가공한다. (소수점 세자리까지)
그리고 대사는 Caption 함수를 통해 불러와 저장한 후, vtt.captions에 append 하여 데이터를 붙여나간다.
이 과정을 가지고 있는 데이터의 시작부터 끝까지 돌아가면서 수행 한다.
과정이 끝나면 vtt.save('file_name') 을 통해 저장한다.
위의 과정을 통해 임시로 생성된 파일을 S3에 업로드 한 후, os.remove()를 통해 삭제하면 과정 끝!
가지고 있는 데이터만 잘 불러와서 가공하면 아주 간단한 작업이다. 검색해도 같은 방법이 잘 나와있지 않아 직접 정리하는 글..
'dev > 졸업프로젝트_눈소리' 카테고리의 다른 글
Github Action 이용해서 AWS Lambda에 도커 이미지 자동 배포하기 (0) | 2022.05.03 |
---|