CS285 강의를 수강하면서 Youtube 영어 자막에 굉장히 불편함을 느껴, 직접 영한 자막을 달아보기로 했다.
그 전에도 OpenAI 의 Whisper 로 음성을 쉽게 추출할 수 있는 걸 알았고 생각만 하고 있다가 사용해볼만 한 적절한 대상을 찾은 것이었다.
YoutubePlaylistDownloader
우선 플레이리스트에 있는 영상을 모두 받아줄 프로그램이 필요했다.
그래서 shaked6540/YoutubePlaylistDownloader를 사용하였다.
윈도우에서는 관리자 권한으로 실행해주어야 하고, .NET 0.10.0 설치가 되어있어야 한다.
faster-whisper 로 음성 추출하기
faster-whisper 는 Whisper 모델을 가속화한 모델로, 훨씬 빠른 속도로 Transcription 이 가능하다. 내 PC의 경우도 GTX 1660S 였음에도 괜찮은 추출 속도를 보여주었다.
Github LINK
모델 사용에 앞서 GPU 사용을 위해 CUDA, cuDNN 을 설치해주었다.
각 GPU 마다 맞는 CUDA 버전이 다르다고 해서 몇몇 글을 참고하였다.
CUDA, cuDNN Installation
References
NVIDIA 공식 문서는 항상 뒤죽박죽되어 있는 느낌이지만 아래 링크대로 차근차근 따라갔다.
CUDA Toolkit 은 11.4.4 버전으로 설치하였다. LINK
>nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Mon_Oct_11_22:11:21_Pacific_Daylight_Time_2021
Cuda compilation tools, release 11.4, V11.4.152
Build cuda_11.4.r11.4/compiler.30521435_0
Windows 에서 deviceQuery
로 확인하려면 해당 폴더에 있는 비쥬얼 스튜디어 .sln
파일을 실행해서 빌드해주면 된다.
디렉터리: C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.4
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2024-01-11 오전 2:15 0_Simple
d----- 2024-01-11 오전 2:15 1_Utilities
d----- 2024-01-11 오전 2:15 2_Graphics
d----- 2024-01-11 오전 2:15 3_Imaging
d----- 2024-01-11 오전 2:15 4_Finance
d----- 2024-01-11 오전 2:15 5_Simulations
d----- 2024-01-11 오전 2:15 6_Advanced
d----- 2024-01-11 오전 2:15 7_CUDALibraries
d----- 2024-01-11 오전 2:15 bin
d----- 2024-01-11 오전 2:15 common
-a---- 2021-08-16 오후 1:14 108936 Samples_vs2017.sln
-a---- 2021-08-16 오후 1:14 108944 Samples_vs2019.sln
버전에 맞게 나는 ./Samples_vs2019.sln
을 실행하였다. 빌드를 해주면 bin\win64\Debug
위치에 실행파일이 생긴다.
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v11.4\bin\win64\Debug\deviceQuery.exe Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "NVIDIA GeForce GTX 1660 SUPER"
CUDA Driver Version / Runtime Version 12.3 / 11.4
CUDA Capability Major/Minor version number: 7.5
Total amount of global memory: 6144 MBytes (6442123264 bytes)
(022) Multiprocessors, (064) CUDA Cores/MP: 1408 CUDA Cores
GPU Max Clock rate: 1815 MHz (1.81 GHz)
Memory Clock rate: 7001 Mhz
Memory Bus Width: 192-bit
L2 Cache Size: 1572864 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total shared memory per multiprocessor: 65536 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 1024
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 6 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
CUDA Device Driver Mode (TCC or WDDM): WDDM (Windows Display Driver Model)
Device supports Unified Addressing (UVA): Yes
Device supports Managed Memory: Yes
Device supports Compute Preemption: Yes
Supports Cooperative Kernel Launch: Yes
Supports MultiDevice Co-op Kernel Launch: No
Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 12.3, CUDA Runtime Version = 11.4, NumDevs = 1
Result = PASS
cuDNN 설치는 아래 링크대로 따라갔다.
NVIDIA Developer Program 에 등록하고 OS 와 CUDA 버전에 맞는 zip 파일을 다운로드 하였다.
여기에 있는 bin, include, lib
폴더를 아까의 CUDA 설치된 위치에 복사 붙여넣기 해준다.
faster-whisper 사용하기
이제 faster-whisper 를 이용해 다운로드한 유튜브 영상들의 음성을 추출하고 이를 SRT 파일로 만들어보자.
설치는 간단하게 pip 로 할 수 있다.
그리고 공식 문서 링크에 예시가 잘 나와있어서 따라하기만 하면 되었다.
나는 가지고 있는 GPU의 VRAM에 맞게 고르라고 하여서 medium
모델로 돌렸다. 모델에 대한 정보는 여기에 나와있다.
실제 코드에서는 폴더 안에 있는 모든 영상을 알아서 추출하고 싶어서 약간의 수정을 더 하였다. 그리고 print()
문이나 tqdm
이 없으면 각 파일마다 진행도를 알기 어려워서 터미널 출력도 추가하였다.
DeepL API 로 SRT 파일 번역하기
만들어진 SRT 파일은 다양한 방법으로 번역할 수 있다. ChatGPT 로 번역해도 되고, API로 해도 되고 Google Translation API 도 있다.
그 중 DeepL 을 직접 잘쓰고 있기도 하고, 성능이 제일 좋은 것 같다는 이야기도 많았어서 DeepL API 로 번역해보기로 하였다.
DeepL API 는 계정을 가입하고 카드 등록만 해도 Free API 가 주어진다. 한 달에 500,000 자 제한이 있어 많이 번역은 어렵지만 사용해 볼 만 하다. LINK
그리고 이걸 SRT 번역에 손쉽게 사용하게 도와주는 레포를 찾아서 이를 활용하였다.
Github LINK
마찬가지로 pip 로 손쉽게 설치하고, API 가 없어도 여러 번 번역기를 호출하면서 번역을 할 수도 있다. 이번 경우에도 제한을 다 사용해서 제공하는 다른 번역기도 사용하였다. (각각의 차이는 정확히는 모르겠다.)
DeepL Python API 공식 문서도 굉장히 잘되어 있어서 직접 구현하는 것도 크게 어렵진 않을 것 같다. LINK
다른 SRT 번역기들
최근에 GPT Store 가 생기면서 각자의 GPTs 를 만들어서 공유하고 있다. 거기에 subtitle
로 검색해서 나온 몇 가지를 사용해보았는데, 대부분 python 스크립트로 연동해서 만들어진 것 같다.
하지만 한국어로 번역을 시키면 모두 처리 도중에 에러가 나타났다.
직접 DeepL, 파파고나 구글 번역기에서 나눠서 번역하는 것도 글자 수 제한때문에 쉽지 않고, DeepL API 제한수가 끝나면 더이상 양질의 번역이 어려운 것도 아쉬움이 있다.
subtitletranslator.com 에서 여러 개의 파일을 한번에 번역하고 다운로드 할 수 있게 해준다. 어떻게 이렇게 빠르게 가능한지는 잘 모르겠으나, 번역 상태를 보았을 때 꽤 괜찮았다.
DeepL
subtitletranslator.com
결과물
Adobe Premiere Pro 로 자막을 넣어준 모습. 수학 notation 이나 용어들도 직접 번역되거나 (e.g. : 파이, policy : 정책) 내용이 길면 줄바꿈이 되어서 세 줄로 나오는 등 아쉬움도 있지만 전반적으로 잘 되었다.