Python

[Python] youtube-transcript-api - 동영상 자막 내용 가져오기

비번변경 2024. 6. 13. 17:24

개요

회사 스터디에서 Youtube를 주제로 사이드 프로젝트를 진행하려고 한다. 관련하여 Youtube에 업로드되어 있는 영상 정보, 예로 들어 제목, 좋아요 수, 싫어요 수, 디스크립션, 자막 등의 정보를 API 등을 통해서 받아오려고 한다.

 

참고 : 2024.05.27-[YouTube] API로 Youtube 동영상 정보 요청하기

 

다만, Youtube Data API Videos 공식 문서를 확인해 보면 자막과 같은 스크립트 정보는 응답에 포함되어 있지 않은 것 같다. API나 다른 방식으로 정보를 받아올 방법을 찾다가 해당 기능을 지원해 주는 Python 라이브러리가 있는 것을 확인했다.

마침 사용할 언어도 Python이므로, 사용 방법을 적어둔다.

 

 

youtube-transcript-api

URL : https://github.com/jdepoix/youtube-transcript-api

 

youtube-transcript-api는 YouTube 비디오의 스크립트, 자막 내용을 확인할 수 있는 Python 라이브러리다. 수동으로 입력한 자막 뿐만 아니라 자동으로 생성된 자막 정보도 얻을 수 있고, 자막 번역을 지원한다.

 

 

설치

youtube-transcript-api는 pip를 통해 설치할 수 있다.

pip install youtube-transcript-api

 

 

임포트

코드에서 사용할 때는 아래와 같이 import하여 사용한다.

from youtube_transcript_api import YouTubeTranscriptApi

 

 

특정 비디오의 자막 내용 확인

테스트로 https://www.youtube.com/watch?v=bUY3wNjcVMk 영상의 스크립트 내용을 긁어와보려고 한다.

특정 비디오의 자막 내용을 확인할 때는 YouTubeTranscriptApi.get_transcript 함수를 사용한다. 함수에는 확인할 비디오의 id 값을 기재한다. 기본적으로 영어 자막 정보를 받아오는데, 만약 다른 언어의 자막을 확인하고 싶을 때는 languages 매개변수에 확인할 언어를 리스트로 전달한다.

from youtube_transcript_api import YouTubeTranscriptApi

video_id = 'bUY3wNjcVMk'
transcription = YouTubeTranscriptApi.get_transcript(video_id, languages=['ko', 'en'])
for content in transcription:
    print(content)

languages는 자막을 확인할 언어의 우선순위 순으로 나열한 것이다. 예시의 경우에는 한국어(ko) 자막을 먼저 확인하여 사용하되, 만약 한국어 자막이 없으면 영어 자막을 확인하게 된다.

반환값은 자막 텍스트와 해당 자막이 사용되는 지점(start)과 자막이 노출되는 시간(duration) 정보를 저장한 딕셔너리의 리스트이다.

 

 

 

여러 비디오의 자막 내용 확인

여러 비디오의 자막 내용을 확인할 때는 YouTubeTranscriptApi.get_transcripts 함수를 사용한다. 사용법에 있어서는 video_id를 목록으로 전달하는 것 외에는 get_transcript 함수와 차이점이 없다.

video_id = ['bUY3wNjcVMk', '9aZZIVeb5lQ']
transcription_list = YouTubeTranscriptApi.get_transcripts(video_id, languages=['ko', 'en'])

for transcription in transcription_list:
    if type(transcription) is dict:
        for k, v in transcription.items():
            print(k)
            for content in v:
                print(content)

다만 반환값에는 차이가 좀 있는데, tuple 형식으로 반환한다. tuple의 원소는 video_id가 key이고 자막 텍스트와 해당 자막이 사용되는 지점(start)과 자막이 노출되는 시간(duration) 정보를 저장한 딕셔너리 리스트를 value로 한다.

(
{video_id: [{'text': text, 'start': start, 'duration': duration}, {'text': text, 'start': start, 'duration': duration}]}, 
{video_id: [{'text': text, 'start': start, 'duration': duration}, {'text': text, 'start': start, 'duration': duration}]},
[]
)

그리고 이유는 잘 모르겠지만 마지막에 빈 리스트가 붙었다. 때문에 파싱 할 때 조금 주의해야 하는 것 같다.

 

 

참고 문서

https://pypi.org/project/youtube-transcript-api/