Pydub 사용법 - Pydub sayongbeob

프로젝트로 환경음 자막과 음성 자막을 자동으로 달아주는 프로그램을 만들어 보았다.

암튼 프로젝트이다.

0. 프로젝트 개요

전체적인 흐름은 다음과 같다.

Pydub 사용법 - Pydub sayongbeob

1. 음성으로만 자막을 제작할 것이기 때문에 불필요하게 용량이 큰 영상을 가지고 할게 아니라, 음성 파일만을 사용하기 위해서 영상으로 부터 음성을 추출하였다.

2. 음성 파일에서 발화(사람 목소리)와 환경음(효과음, 배경음악)등을 분리하면 더 인식이 잘되지 않을까? 라는 생각으로 사람 목소리와 환경음을 분리해주었다.

3. 막연하게 처음부터 끝까지 자막을 달 수 없기에, 무음구간을 제거하여 소리가 있는 부분만 남겨놓는다.

4. 그리고 발화 음성들에 대해서는 STT API(네이버)를 사용하여 자막을 작성했고,

5. 환경음에 대해서는 Sound Detection 모델을 활용하여 자막을 작성했다.

6. 이렇게 만들어진 각각의 자막을 합쳐서 최종 자막을 출력한다.

1. Requirements & Model

▶ 대표적인 라이브러리

- python == 3.7

- ffmpeg-python

- google-trans-new

- moviepy

- pydub

- spleeter

- torch==1.8.1+cu111

- torchaudio==0.8.1

- torchlibrosa==0.0.9

▶ 활용한 모델

- Audioset_tagging_cnn (https://github.com/qiuqiangkong/audioset_tagging_cnn)

: Sound Detection(환경음 인식) 모델이다. 사실 직접 모델링하는 것이 좋겠지만 소리 데이터를 건드리기엔 너무 내가 하찮다... 그리고 직접 인식해야할 소리 데이터들을 모으고, 그 분류하는 모델을 잘 짤 자신이 없었다.. 그래서 열심히 찾던 중 유튜브 오디오 셋 데이터를 바탕으로 훈련시킨 모델이 있기에 쏠랑 가져왔다.

- AutoSub (https://github.com/abhirooptalasila/AutoSub)

: 많은 아이디어를 준 깃헙이다. 사실 STT나 환경음 인식 모델을 구해놓고, 그래서 자막을 어떻게 달지..? 소리의 나오는 구간을 어떻게 인식하지? 하고 멍때리고 있는데, 여기서 많이 베껴 많은 영감을 얻어왔다. 무음 구간 제거와 구간에 맞게 srt 자막을 자동으로 작성해준다.

2. 코드 리뷰

코드를 다 쓸까했는데 이왕 깃헙 꾸미고, 커밋한김에 링크만 올려야지 ㅎㅎㅎㅎ

https://github.com/wooluck-98/BarrierFree_AutoSubtitle

그래서 여기에는 그냥 코드 발상이나 설명만 쓴다.

▶ main.py

: 모든 기능들을 가지고 있는 파이썬 파일로, input_movie 폴더에 영상을 넣고 이 파일만 실행시키면 된다. 함수들을 전부 import 해서 차례대로 실행해주었다. 작업에 필요한 폴더들을 그때그때 만들고, 작업이 끝나면 삭제해주었고 필요한 경로 설정들도 다 해주었다. 또한 환경음 소리와 발화 소리를 동시에 진행할 순 없어서 리스트로 하나씩 차근차근 처리해주었다. 짜면서 느낀거지만, 폴더를 필요해서 만들고 삭제하는 이런 작업들이 너무 지저분 하게 느껴지고 리스트를 만들고 이걸 for문으로 처리하는게 그냥 무식하게 처리하는거 같아서 답답하다.

▶ sound_extract.py

: 영상에서 소리를 추출하는 함수이다. 본래는 ffmpeg를 많이 사용하겠지만 윈도우에서 사용하기도 어렵고, 단순히 음성만 추출하면 되기에 moivepy.editor를 사용했다. 또한 밑에서 사용할 spleeter가 메모리의 문제라 10분까지밖에 되지 않으므로, 음성을 9분 단위로 나누어서 추출했다. 사용방법은 다음과 같다.

import moviepy.editor as mp videoclip = mp.VideoFileClip(moive_file) clip = videoclip.subclip(start, end) audioclip = clip.audio audioclip.write_audiofile(save_path)

Pydub 사용법 - Pydub sayongbeob

▶ separate_audio.py

: spleeter 모델을 활용하여 환경음과 발화 소리를 분리해주는 함수이다. 원래는 노래에서 악기소리를 분리해주는 모델인데, 2개로 분류하면 보컬 / 반주 분리라서 얼추 그럴듯하게 환경음과 발화가 분리된다. 여기서는 subprocess 라이브러리를 사용했다. subprocess는 파이썬에서 쉘 명령을 실행할 수 있게 해준다. 그래서 쉘에서 spleeter를 실행하고, 그 결과물들을 활용한다.

Pydub 사용법 - Pydub sayongbeob

▶ audio_segments.py

: AutoSub에 있는 파이썬 파일을 쏠랑 가져다 쓴 것으로, 무음 구간을 제거해주는 함수가 있다. 위에 spleeter로 나온 결과물들에 대해서 무음 구간을 제거해준다. extract에서 9분 단위로 여러개의 파일로 나누었기 때문에 구간들을 잘 계산해주었다.

Pydub 사용법 - Pydub sayongbeob

▶ audio_tagging.py

: 소리들에 대해서 발화 소리들에 대해서는 STT API를 적용하고, 환경음에는 pretrain된 sound detection모델을 활용하여 소리를 인식하고, 그 인식한 값을 자막으로 작성하는 함수이다. STT API는 네이버꺼를 사용했다. 그치만 결과가 그렇게 좋진 않다... 네이버 뭐하냐,,, 그리고 환경음은 너무 정확도가 떨어지게 인식하는 경우가 많다보니 추측 정확도가 60%이상일 때만 자막으로 작성하게끔 설정해놓았다. 그리고 영어로 나온것을 google_translator()를 사용해서 번역해서 반환했다.

Pydub 사용법 - Pydub sayongbeob

Pydub 사용법 - Pydub sayongbeob

▶ merge_srt.py

: 위의 과정들을 거쳐서 만들어진 두개의 자막을 합치는 함수이다. 자막들이 이런식으로

5 00:02:06,45 --> 00:02:08,0: ♪ : [ 차량 ] 48 00:00:44,45 --> 00:00:54,75 이 녀석들은 우리 손바닥 안이라고

되어 있기에 어떻게 처리할까 고민을 많이하다가, 저 타임라인들도 결국엔 문자열이라서 정렬을 하면 시간순서대로 쭈욱 정리할 수 있다. 그래서 시간+자막내용을 하나의 요소로 해서 전부 리스트에 추가하고 정렬을 해줬다. 자막놈 별거 없었다.

Pydub 사용법 - Pydub sayongbeob

3. 결과

마침 유튜브 알고리즘에 뜬 코난 더빙 영상을 돌려봤다. 보시다시피 결과는 뭐,, 처참하다... ㅠㅠ

Pydub 사용법 - Pydub sayongbeob

Pydub 사용법 - Pydub sayongbeob

4. 개선점

개선점이라고 하긴 했지만, 실제로 개선이 될지는 모르겠다. 왜냐하면 말했다싶이 이쪽 데이터나 모델에 대해서는 지식이 전무하기 때문이다. 그렇기에 여기 써놓는 것들은 다 내 뇌피셜이다... 그래도 하나라도 얻어걸리면 ㄱㅇㄷ

- 음성 파일 전처리 : 사람의 목소리나, 환경음 각각 인식이 잘되는 소리 특성이 있을 것이라 생각한다. 샘플레이트라던지 기타 등등 그런 특성들을 파악해서 각각의 모델이 좋아하게끔 음성 파일을 전처리 해주면 정확도가 개선되지 않을까 싶다.

- STT API : 이번에는 네이버꺼를 썼지만 유료라는 점이 제일 큰 단점이긴 하다. ETRI STT API 같은 경우는 무료 오픈소스 STT API이다. 물론 성능은 네이버만 못하고, 하루 횟수 제한이 있다는 점이 아쉽다. 또는 STT 모델을 직접 사용해도 된다. 사실 DeepSpeech 모델을 며칠을 학습시키고 삽질 했지만 실패한 경험이 있다.... 잘만 하면 앵간한 API보다 괜찮지 않을까라는 생각이 든다.

5. 프로젝트를 마치고...

AI 관련 공부를 한다고 하고 이쪽 분야로 간다고 하지만 실제로 할 수 있는게 아무것도 없다는 걸 느꼈다. 음성 데이터 전처리나, 모델링도 못하겠고, 그렇다고 이미 만들어진 모델을 튜닝해서 성능을 올릴 수 있는 것도 아니고... 정말 할 수 있는게 아무것도 없었다. 플젝을 한다고 하지만 그냥 구글링하고, 깃허브에서 비슷한 모델있으면 가져다가 쓰고.. 이게 정말 맞는건가 싶은 생각이 든다.

성능이 정말 처첨하고 오래걸리더라도 직접 데이터 수집, 전처리, 모델링, 학습을 해보는게 더 나았을까라는 생각도 든다. 어떻게 접근해야할지, 어떻게 공부해야할지도 감이 안잡히고 내가 얼마나, 어디까지 알고 있는지도 모르겠다. 그냥 남들보다 플젝 한두개 더 해봤다고 거들먹거리는데, 누구보다 내가 빈 깡통인걸 아니깐 정말 현타가 많이 온다. 공부 열심히 해야지이.....

그래서 비록 모델을 가져다 썼다해도 무언가 파이썬으로 flow를 만들었다는건 조금 뿌듯할지도... 원래는 함수 하나씩 짜서 import 못하고 하나씩 실행하게끔 해놨을텐데, 나름 main함수로 다 묶어서 자동으로 된다는거에 조금은 나 성장했을지도..? 라고 할뻔~

결론은 AI관련 공부뿐만 아니라 더 고차원적인 python 사용법이나 디자인 패턴 등도 더 공부하고 싶다는 생각이 드는 프로젝트 였다!