Whisper(stable-ts)를 사용하여 좋은 NVIDIA CUDA 지원 카드를 가진 로컬 PC에서 자막을 추출하고, 우리 나라에도 정식 서비스가 되기 시작한 DeepL API를 써서 번역할 수 있는 파이썬 스크립트를 소개합니다.
Whisper가 가끔 유령 자막, 반복되는 자막, 무의미한 짧은 자막(예: - ) 등의 문제가 있고, DeepL PC용 앱 클립보드 무료 번역 시 자막의 시각 정보가 깨지는 문제 등이 있어서 만들기 시작했었습니다. AWS CodeWhisperer/Bard/Bing Chat/ChatGPT의 도움을 받았습니다.
개인적으로는 대부분 stable-ts를 썼고 GTX-1070Ti(8GB)라서 medium 모델을 사용했습니다. large-v2 모델은 whisper-ctranslate2로 8GB 내에서도 작동했습니다.
(추가 2023-08-27) faster-whisper를 사용하면 추론 작업 시 float32나 float16이 아닌 int8로 작업하여 더 빠르고 더 적은 메모리로도 이용 가능하고, 해당 기능도 추가했습니다. 예를 들면, Notebook PC의 MX150 2GB VRAM + 4GB GPU 공유메모리인 상태에서도 medium 모델을 2~3배속 정도로 작동 시킬 수 있습니다.
i7-8550U / MX150 에서 faster-whisper로 medium모델을 이용할 때 GPU 메모리 현황
stable-ts는 demucs, vad, mel_first등 추가 옵션도 제공하는데 demucs는 긴 비디오의 경우 8GB를 초과합니다.
[기능]
- stable-ts 혹은 whisper를 사용하여 영상/오디오에서 음성 추출 자막 생성(.SRT 포맷)
- (추가 2023-08-27) faster_whisper도 이용 가능합니다(CTranslate2기반으로 int8 양자화 사용으로 노트북과 같이 적은 VRAM 메모리에서도 medium을 이용하거나, 8GB에서 large-v2 이용이 가능: cuDNN 및 cuBLAS 필요).
- 자막 중에 짧은 자막(예: 1글자)이나 중복되는 자막을 자동 삭제
- 시각 정보는 제외하고 자막 텍스트만 API 번역(구글 클라우드, 네이버 파파고, DeepL API, DeepL-Rapidapi)하기
- 타겟 언어(예:한글) 자막 생성 후 원어 자막도 따로 저장(.SRT 포맷)
- DeepL API 번역 사용량 표시(예: 300000 / 500000)
[한계]
- stable-ts이 전반적으로 whisper보다 나은 편이지만, 그래도 누락되는 자막이 있습니다. 경우에 따라서는 whisper가 낫기도 합니다.
- 완벽한 것은 아니므로 업무적인 목적 등에 사용하려면 충분한 사전 검토가 필요해 보입니다.
[설치 방법 및 소스, 사용법]
- CUDA, 파이썬, 파이토치 등의 설치가 필요합니다. 첨부의 README.md 혹은 아래 링크를 참조해 주세요.
- 첨부 파일 참조 혹은 https://github.com/sevengivings/subtitle-xtranslator
- (venv) PS D:\python\subtitle-xtranslator > python .\subtitle-xtranslator --audio_language en --subtitle_language ko --translator deepl-api 'D:\video\sample video.mp4'
[사용하는 모습의 동영상]
[팁]
- 비디오/오디오명과 같은 파일명을 가진 자막(.SRT)이 있는 경우 음성 추출 작업은 생략됩니다(덮어쓰지 않음). 원하는 다른 프로그램에서 자막만 추출한 후 (불필요한 시각정보를 제거하여 번역 텍스트 용량 줄이는 용도의) API 번역기로만도 이용도 가능할 것 같아요.
- whisper와 stable-ts 명령어 라인을 참고하여 비슷하지만 다른 부분(예: --language는 --audio_language로 변경)도 있습니다. 제공하지 않는 옵션은 whisper와 stable-ts를 호출하는 코드에서 직접 추가 가능합니다.
- 여러 개의 MP4를 나열하면 배치로 작동시킬 수 있습니다. GTX-1070Ti에서는 보통 8배속 정도라서 오래 기다려야 합니다.
- https://github.com/sevengivings/subtitle-extractor 는 DeepL API의 국내 서비스가 없을 때 만들었던 스크립트인데, stable-ts와 whisper, faster-whisper로 자막 추출 하고 .docx로 자막을 저장하여, 사용자가 직접 수동으로 .docx를 DeepL 앱을 이용하여 번역하면 자막을 만들 수 있습니다.
- 무료 이용 가능한 번역 용량은 DeepL API(개발자)는 월 50만자, DeepL-Rapidapi는 월 30만자 /100회 호출입니다. 네이버 파파고는 하루 1만자 정도였던 것 같습니다.
- 조절할 수 있는 옵션이 많아서 일일이 다 확인하기는 어려움이 있습니다. 그래도 condition_on_previous_text는 whisper의 자막이 이상하게 나올 때 써 볼 만하다고 합니다(stable-ts에서는 기본이 True인데, False로 설정).
- stable-ts는 버전 별로 추출되는 자막이 조금 다른 것 같습니다. 참고로 저는 주로 2.6.x 혹은 2.7.x을 이용했었습니다. stable-ts · PyPI 참조.
[활용한 오픈소스]
- https://github.com/openai/whisper 오리지널 Whisper
- https://github.com/jianfch/stable-ts 주로 이용해 온 stable-ts, Whisper 기반 자막 생성 부분 개선
- https://github.com/DeepLcom/deepl-python DeepL 공식 파이썬 라이브러리
[기타 참조]
- https://github.com/jhj0517/Whisper-WebUI Whisper를 웹UI로 제공(편리한 반면 한동안 2023.03 Whisper의 개선판으로 갱신을 안 해줘서 자막 품질에도 문제가 있었습니다. 아마 지금은 괜찮겠죠?)
- https://github.com/guillaumekln/faster-whisper 8GB VRAM에서 large-v2 모델 가동(fp16이나 int8 precision, cuDNN - NVIDIA 개발자계정필요 및 cuBLAS 필요 - pip install nvidia-cublas-cu12) 자막 파일 제공 기능은 없는 듯 => (추가 2023-08-27) subtitle-xtranslator.py에 자막 생성 기능도 구현 완료
- Softcatala/whisper-ctranslate2: Whisper command line client compatible with original OpenAI client based on CTranslate2. (github.com) 8GB VRAM large-v2 모델 작동되면서 명령어 구조가 whisper와 같아서 이용이 편리, 마이크로 입력 받은 소리로부터 실시간 자막 생성 하는 기능도 테스트 가능
- Subs AI - OpenAI Whisper로 동영상의 자막 자동 생성하기 | GeekNews (hada.io)
잘 봐 보겠습니다.. 감사합니다.. ㅎㅎ
whisper-ctranslate2 --device cuda --model medium --compute_type int8 --output_format srt --language ko --output_dir d:\video d:\video\20220902_131203.mp4 식으로 하면 됩니다. GPU 전용메모리(2GB)는 거의 100%가까이 사용하고 GPU 공유메모리(4GB)도 아주 조금은 이용하는군요. 다만, 속도는 좀 느려서 2~3배속 가량으로 나옵니다(i7-8550U).