유튜브로 영어 자막 스크립트를 추출하고 해당 자막을 chatGPT를 이용해서 한국어로 번역해보려고 한다.
만약 자막이 없으면 Whisper API를 통해 음성을 텍스트로 추출하고 해당 텍스트를 번역해볼 예정이다
1. 유튜브로 자막 스크립트 추출하기
youtube-transcript-api라는 라이브러리를 사용했다.
자막이 있는 영상에서 텍스트 및 타임스탬프 추출이 가능하다.
해당 라이브러리에서 번역 기능도 제공하기는 하지만 ChatGPT보다는 기능이 좋지 않아서
번역 기능은 사용하지 않았다.
테스트 영상으로는 BTS의 UN 연설 영상을 사용해보려고 한다
https://www.youtube.com/watch?v=XXCqBotaGRI
우선 YouTubeTransciptAPI를 설치한다
pip install youtube_transcript_api
아래의 코드에서 video_id 부분에 원하는 유튜브 영상의 아이디(url의 watch?v= 뒷부분)를 넣어주면 된다
YouTubeTranscriptApi.get_transcript(video_id)
langeage_list 부분에는 원하는 언어를 넣어주자.
나는 영어 자막을 원해서 ['en']을 넣었는데 한국어 자막을 원하면 ['ko']를 넣어주면 된다
transcript_list.find_transcript(language_list)
아래처럼 코드를 작성하고 실행하면 영어 자막의 텍스트와 타임스템프를 얻을 수 있다.
from youtube_transcript_api import YouTubeTranscriptApi
transcript_list = YouTubeTranscriptApi.list_transcripts("XXCqBotaGRI")
transcript = transcript_list.find_transcript(['en'])
# 번역 기능을 사용하고 싶으면 아래 코드 주석을 해제하면 된다
# translated_transcript = transcript.translate('ko')
script = transcript.fetch()
print('script:', script)
sentences = []
for sentence in script:
text = sentence['text'].replace('\n', ' ')
sentences.append(text)
print('sentences:', sentences)
결과는 아래처럼 나온다. (너무 길어서 앞 열문장 정도만 옮긴다)
2. ChatGPT api로 번역하기
ChatGPT api와 Whisper api는 유료이기 때문에 계정에서 카드를 우선 등록해줘야한다
https://platform.openai.com/overview
오른쪽 상단의 본인 프로필 클릭 -> Manage Account를 선택한 후
Billing overview에서 Set up paid account를 클릭하여 카드를 등록해준다
가격은 아래와 같은데 1000토큰은 영어로 약 750단어다.
나중에 사용하고 나면 몇번 request를 보냈는지, 가격은 얼마나 나왔는지도 상세히 확인할 수 있다
API Keys에서 create new secret key를 클릭해서 API key를 생성한다
이 키는 한번만 볼 수 있기 때문에 생성해서 잘 간직해야한다.
남에게 노출되서 사용되면 안되니 절대절대 git에 올리거나 어딘가에 유출되지 않도록 하자 (나쁜 사람이 맘먹으면 큰돈 잃음...)
openai를 설치하고
pip install openai
아래와 같이 코드를 작성해본다 (OPEN_AI_API_KEY에 본인이 발급받은 secret key를 넣는다)
import openai
openai.api_key = OPEN_AI_API_KEY
# 모델 - GPT 3.5 Turbo 선택
model = "gpt-3.5-turbo"
# 질문 작성하기
query = f"Please translate this script to Korean script: {sentences}"
# 메시지 설정하기
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": query}
]
# ChatGPT API 호출하기
response = openai.ChatCompletion.create(
model=model,
messages=messages
)
answer = response['choices'][0]['message']['content']
print(answer)
결과는 아래처럼 나온다. (앞 열문장 정도만 번역했다)
한번에 주고받을 수 있는 토큰 수가 정해져있기때문에 너무 긴 경우라면 잘라서 질문해야한다.
GPT-3.5의 경우 한번에 최대 주고받을 수 있는 토큰은 4096 이다. (질문에 4090 토큰 사용하면 답변은 6 토큰만큼 끊어져서 옴)
3. Whisper API로 음성을 텍스트로 추출하기
OpenAI에서는 음성을 텍스트로 추출하는 API도 제공한다.
가격은 오늘 기준(23년 4월9일) 1분당 0.006달러이다
아래 코드처럼 오디오 파일의 파일경로를 입력해주면 음성을 텍스트로 추출할 수 있다.
audio_file = open("파일경로", "rb")
transcript = openai.Audio.transcribe("whisper-1", audio_file)
text = transcript['text']
print(text)
결과는 아래와 같다. 생각보다 퀄리티가 정말 좋아서 놀랐다
앞의 몇 문장만 보면 아래와 같은데 자막과 거의 같다는 것을 알 수 있다.
"Thank you, Mr. Secretary General, UNICEF Executive Director, and all the excellencies and distinguished guests from across the world. My name is Kim Namjoon, also known as RM, the leader of the group BTS. It is an incredible honor to be invited to an occasion with such significance for today's young generation. Last November, BTS launched the Love Myself campaign with UNICEF, building on our belief that true love first begins with loving myself. We've been partnering with UNICEF's End Violence Program to protect children and young people all over the world from violence. And our fans have become a major part of this campaign with their action and with their enthusiasm. We truly have the best fans in the world. And I'd like to begin by talking about myself. I was born in Ilsan, a city near Seoul, South Korea. It is a really beautiful place with a lake, hills, and even an annual flower festival. I spent a very happy childhood there, and I was just an ordinary boy. I used to look up at the night sky and wonder, and I used to dream the dreams of a boy."
OUTRO
ChatGPT를 유료로 사용하면서 API도 써보고싶었는데 이번 기회에 테스트해볼 수 있어서 좋았다.
모델이 아직 GPT 3.5 Turbo라서 번역이 GPT-4보다는 살짝 어색한것같긴하다.
GPT-4 API를 사용하려면 waitlist에 등록해놓고 기다려야해서 등록은 해뒀는데 아직 연락이 없다ㅠ
whisper는 생각보다 훨씬 정확하게 음성 추출이 되다보니 지금 상태로도 활용할 수 있는 분야가 많을 것 같다.
간단하게 API를 써봤는데 앞으로 활용할 수 있는게 무궁무진할 것 같아서 기대가 된다!
'Python' 카테고리의 다른 글
Whisper에 단어별 타임스탬프가 필요할 때 - whisperX or whisper-timestamped (1) | 2023.06.18 |
---|---|
[Locust] 부하테스트 툴 사용 방법 (2) | 2023.03.26 |
[Python] 파이썬 classmethod와 staticmethod 차이 (0) | 2023.03.12 |