스터디/Python

Python moviepy audiofileclip error. noise.

Dalmangyi 2023. 2. 12.

Moviepy 소개

python으로 동영상 편집을 할때 아주 유용한 moviepy라는 라이브러리가 있습니다. 

 

영상과 오디오를 편집할 수 있으며, 

다양한 이펙트 효과도 직접 코딩할 수 있습니다. 

 

이펙트 효과들은 행렬 처리되기 때문에 상당히 빠른 적용이 되지만

인코딩할때는 gpu가 아닌 cpu인코딩을 하기 때문에 추출이 느립니다. 

 

그래도 대량의 영상이나 오디오를 컨트롤할때는 이것만한게 없는거 같습니다.

 

 

 

 

 

Moviepy 오디오 오류

 

1. 오디오 시간 (duration) 정확히 불러오지 못하는 버그

오디오 코덱이나 포맷의 잘못된 입력으로 인해, 시간 계산을 못하는 경우가 많습니다. (이건 오디오 현업에서 자주 겪는일...)

그 상황을 moviepy도 제대로 대처가 안 되어 있습니다.

 

그래서 상세한 오디오 컨트롤을 할때는 'pydub 패키지의 AudioSegment'를 이용하면 됩니다. 

ag = AudioSegment.from_mp3(vers_voice_path)
real_duration = ag.duration_seconds

이렇게 별도의 패키지로 시간을 직접 구해와서 사용해야합니다. 

 

이건 물론 float의 다른 이유지만, moviepy로 duration을 구하면 0.00000000001 의 단위까지 잘 못 구해지곤 합니다.

 

 

 

 

 

2. 잘못된 오디오 반복 버그

일반적으로 흔히 접하는 mp3파일의 경우 초당 44100개의 신호로 이뤄져있습니다.  (영상은 초당 30개 정도의 화면).

영상에 비해 오디오가 많이 민감하며, 사람도 민감하게 반응합니다. 

 

그래서 쪼끔의 잘못된 신호가 발생해선 안되는데, moviepy에서 여러 오디오를 합쳐주는

'CompositeAudioClip'을 이용할때 오류가 많이 발생하곤 합니다.

 

저는 배경음 1개 3분짜리와, 짧은 목소리 5초짜리 A, 또 다른 짧은 목소리 15초 짜리 B를 작업하며 겪었습니다.

배경음을 1개를 전 영역에 깔고. 다른 레이어에는 A 목소리 재생 후에, B 목소리를 재생하려고 했습니다.

 

간혹 이상한 소리가 들려, pcm 데이터를 보니,

아래 사진처럼 B 목소리 마지막 부분에 이상한 소리(오른쪽 빨간색 박스)가 추가된걸 볼 수 있었습니다.

오른쪽 빨간색 부분이, 왼쪽 빨강색 부분의 일부에서 잘못 복사된 신호.

 

 

끝나기 1초 전의 소리가 0.1초간 반복되어 나타나는 버그 였습니다.

상세 코드까지 볼 필요는 없고, 소숫점 연산이 에러나면서 생기는 버그입니다.

이럴 경우, 오디오 클립의 끝나는 시간을 소숫점 첫째단위( 0.1)까지 끊어주면 사라집니다;;

 

예를 들어 오디오 클립의 시간(duration)이 11.87초 라면, 11.8로 세팅해서 끝내줘야합니다.

여기서 절삭된 0.07초이면 70ms로 대략 3087개 정도의 신호가 사라진 수치 입니다..

최대치인 0.09초면 3969개의 신호로 볼 수 있겠네요. (1초당 44100개 => 1000ms 당 44100개 => 1ms 당 44.1개)

 

new_end_time = math.floor(end_time*10)/10
voice_clip = voice_clip.set_end(new_end_time)

코딩은 간단하게 end_time을 다시 세팅해준걸로 해결됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

결론

정말 민감하게 다뤄야하는 오디오 프로그래밍 이용시 moviepy는 피해주세요.... 

 

 

 

 

 

 

 

 

댓글