K-UZA(이하 쿠자)는 저를 포함한 6명이 함께한 프로젝트로 GCP의 STT와 번역 기능을 활용한 유튜브 자막 추출 프로그램입니다.
*이름의 유래는 K(Korean) 유(튜브)자(막 프로그램)입니다.
프로젝트 코드에 대한 설명은 생략하고, 프로젝트의 과정들에 대해 얘기해보도록 하겠습니다.
- 약 4주간의 개발과정을 한 글에 적는 것이기 때문에 글이 길 수 있습니다. 코드를 보고 싶으신 분은 깃허브를 보시면서 하시길 바랍니다.
이 프로젝트는 저희에게 유용하게 사용될 수 있고 저희가 써본 적이 없는 것을 써보고 싶었습니다.
그래서 유튜브에 올라와있는 해외 튜토리얼 영상들을 좀 더 편하게 볼 수 있지 않을까? 하는 생각에 이런 프로젝트를 진행하게 되었습니다.
주제가 정해지고 나서는 먼저 어떤 서비스를 사용해 STT와 번역을 해야 할지 결정해야했습니다.
카카오나 네이버 같은 서비스도 있었지만 몇 시간씩 하는 튜토리얼 영상들의 특성상 한도가 큰 서비스를 사용해야 했기에 구글의 GCP를 사용하게 되었습니다. (역시 구글의 인프라는....)
최초의 고난은 바로 가상 환경의 문제인데, 파이썬의 내장 venv를 사용해야 하는데 왠지는 모르겠지만 윈도우에서 venv가 파워쉘에서 진입이 안되더군요.
다행히 버전 컨트롤로 사용할 git을 다운로드하며 git bash라는 터미널이 같이 다운로드되어 이를 통해 진입할 수 있었습니다.
(저는 맥을 쓰기 때문에 윈도우에서 이런 문제가 생길 줄은 상상을 못 해서 이거랑 git 깔고 VSCode 설치하는데 1시간 정도 소모한 것 같습니다.)
아래는 프로젝트의 실행 다이아그램입니다.
다이아그램을 보시면 먼저 URL을 받고 오디오를 다운로드하게 됩니다.
파이썬에서 URL을 통해 유튜브에서 다운로드할 수 있는 라이브러리는 대표적으로 youtube_dl과 pytube가 있습니다.
(제 생각으로는 pytube가 youtube_dl을 기반으로 한 느낌입니다.)
처음에는 pytube를 사용했지만 테스트해보니 youtube_dl이 조금 더 빨라서 youtube_dl을 사용하기로 했습니다.
그다음에는 구글의 STT를 사용해야 하는데 1분을 초과하는 파일은 구글 스토리지 버킷에 업로드하여하라고 되어있더라고요.
그래서 GCP 프로젝트를 생성하고 스토리지에 업로드하는 코드를 그대로 복사해서 넣으니 버킷 생성과 업로드는 잘 되었습니다.
그런데 STT가 제대로 실행되지 않는 문제가 발생했습니다.
확인해보니까 youtube_dl이 다운로드한 오디오 포맷의 문제였습니다.
youtube_dl은 webm이라는 포맷으로 다운로드하는데 이는 STT가 처리할 수 없는 포맷이었습니다.
문제는 youtube_dl로 다운로드하는 포맷에 가장 범용적인 MP3가 없었습니다.
찾아보니 pytube는 기본적으로 MP3로 다운로드를 하길래 다시 pytube로 바꾸게 되었습니다.
(다행히 바꾸는 과정은 코드가 간단하게 되어있어 1분이면 바꿀 수 있었습니다.)
그리고 STT를 실행해보니까 잘 되긴 하던데 주의할 점은 시간이 꽤 오래 걸린다는 점입니다.
1시간 반 정도 되는 영상이 10분 정도 걸리고 음악이 많은 영상은 결과가 그냥 아무것도 안 나오더라고요.
(환경에 따라 편차가 있을 수 있으며 1시간 이상부터는 거의 30분은 기다린다고 생각하는 게 마음 편합니다.)
번역의 경우 다른 팀원들이 주도적으로 진행했는데 딱히 어려운 점은 없었다고 하더군요.
다만, 번역할 테스트의 언어가 주어지냐 아니냐에 따라 사용하는 버전이 달라서 경우에 맞춰 맞는 버전을 사용하도록 코딩하였습니다. (후반에는 좀 달라집니다.)
그 뒤에는 GUI에 집중하였는데 저희가 사용한 라이브러리는 PyQt5로 tkinter보다 예쁘다는 이유로 제가 추천했습니다.
사실 저랑 다른 팀원 한 명 말고는 GUI 디자인을 해본 사람이 없어서 고생 한 번 해보자는 의미에서 Qt Designer라는 프로그램을 사용하지 않고 순수 코드로만 진행하였습니다.
사용자가 입력으로 주어야 하는 게 URL, 영상 언어, 그리고 GCP 키입니다.
여기서 GCP 키는 당연히 GCP의 기능을 사용하기 때문에 필요하며 JSON의 형태로 받습니다.
영상 언어는 8개는 미리 만든 드롭다운 버튼을 통해 사용 가능하며 사용자가 직접 입력할 수 있도록 구성하였습니다.
영상을 띄우는 것은 pyqtwebengine이라는 라이브러리를 통해 웹에서 실행하는 형식으로 구현하였습니다.
영상을 오디오와 다운로드할 수도 있으나 영상이 길어질수록 다운로드 시간이 길어져 웹을 띄우는 것이 더 효율적이라고 판단하였습니다.
또한, 유튜브는 임베드라는 형식을 URL을 통해 만들 수 있어 이를 통해 오직 영상만 뜨게 하였습니다.
위의 사진을 보시면 아시겠지만 UI가 복잡하지 않은데도 불구하고 꽤 오랜 시간이 걸렸습니다.
그리고 여기서 제가 쓸데없이 헤매었는데, 처음에 유저가 어떻게 프로그램을 써야 하는지에 대한 생각을 안 했던 것입니다.
당시 코드가 프로그램이 시작하자마자 URL을 사용하는 형태로 되어있는데 이 경우 에러가 발생하거나 웹 화면에 에러 메시지가 출력되는 문제가 있었으며 GUI 코드와 백엔드 코드가 서로를 찾지 못해 서로의 코드를 실행하지 못했던 것입니다.
사실, 이걸 굳이 생각할 필요가 없었는 게, 그냥 처음에는 빈 화면을 출력하고 나중에 URL이 주어지면 백엔드를 실행하면 되는데, 처음에 구상할 당시 백엔드를 먼저 짜다 보니 백엔드가 무조건 실행되어야 한다는 일종의 강박관념이 생겼던 모양입니다.
두 코드가 서로를 찾지 못한 것은 폴더가 달라 import가 안돼서 sys 모듈을 통해 path를 추가해주어 고쳤습니다.
이때, 코드를 수정하며 어차피 사용자가 영상의 언어를 아예 모르고 사용하진 않을 것이라고 판단하여 번역 코드에서 언어가 있는 경우를 사용하는 코드를 사용하게 되었습니다.
(좀 웃긴 게, 언어를 무조건 알아야 하는 버전이 v2고 언어를 몰라도 되는 게 v1이더라고요.)
이렇게가 약 4주 정도 걸렸습니다.
뭔가 딱히 제대로 한 게 아무것도 없는 것 같은데 끝나니까 결과물이 있긴 하더라고요.
확실히 느낀 점은 사전 조사를 많이 하고 프로젝트가 실행되는 방법이나 구조 등을 고민을 많이 해볼 필요가 있다는 것이었습니다.
또한, 이번 프로젝트는 사실 제가 아이디어를 내고 대부분의 조사를 제가 했지만 이건 좀 급하게 결정된 것이기도 하고 다들 팀으로 하는 게 처음이라 어색했던 것 같습니다.
다음부터는 조사하는 부분까지 함께 하는 게 더 효율적일 것 같다는 생각이 드네요.
아래는 프로젝트의 디테일로 사용한 언어나 방법 및 위의 내용을 요약한 것입니다.
<기능>
유튜브 영상의 대화를 번역해서 볼 수 있음
- STT - Google
- 언어 목록
- 영어
- 프랑스어
- 스페인어
- 독일어
- 중국어
- 일본어
- 러시아어
- 네덜란드어
- 직접 입력
- 언어 목록
- 번역
- 언어 : 한국어
전체적인 흐름
- URL 통해 오디오 다운로드
- GCP Cloud Storage에 오디오 파일 업로드
- 영상 출력
- 오디오 처리
- STT(Speech to Text) - Google
- Translate - Google
<개발 환경>
[언어]
* Python 3.9.2
[VCS]
* GIT
설치 : https://git-scm.com/
깃허브 Repo : https://github.com/coder38611/K-UZA
[가상 환경]
-Python 내장 venv (가상 환경 설정)
$ python -m venv venv (Mac/Linux: python3)
$ source venv/Scripts/activate (Mac/Linux: venv/bin/activate)
$ pip install wheel (Mac/Linux: pip3)
[외부 라이브러리]
- google-cloud-speech
- google-cloud-translate
- pytube
- PyQt5
$ pip install -r requirements.txt
프로젝트 파일
K-UZA.py - main 파일
- 이 파일을 실행하여 프로그램 실행
GUI
- 메인 GUI 컴포넌트 __init__. py
src
- 영상 다운로드 - youtube_download.py
- 자막 추출 - caption_stt.py
- 자막 번역 - caption_text_translate.py
<일정>
- 1주 차 - 프로젝트 구상 및 아이디어 회의
- 2주 차 - 구체적인 계획 결정
- 3주 차 - 개발 환경 설정
- 4주 차 - 1차시 개발 (기능 개발-오디오 다운로드 및 자막 번역)
- 5주 차 - 2차시 개발 (기능 개발-STT 및 버그 수정)
- 6주 차 - 3차시 개발 (GUI 개발)
- 7주 차 - 버그 수정 및 프로젝트 마무리
'프로젝트 > 파이썬' 카테고리의 다른 글
[파이썬] 네이버 날씨와 뉴스 자동화 - 이메일로 보내기 (0) | 2021.03.12 |
---|---|
[파이썬] 구글 이미지 다운로드 프로그램(수정-12/5/20) (3) | 2020.07.26 |