Переведіть фоновий шум з ваших відео за допомогою chatGPT, Python та Demucs

текст перекладу
Чи траплялося вам записувати чудову мить на відео, а потім виявляти, що звук зіпсований набридливим фоновим шумом?
Це сталося зі мною минулого року.

Я проводив свою весільну церемонію на чудових сухих озерах Невади. Усе свято тривало лише 10 хвилин, але саме в цей час над нами пролетів галасливий літальний апарат, що вирішив продемонструвати свою присутність. Постійний гул цього звуку затмив момент, і було неможливо переглядати відео без розчарування.

Як Python-розробник і ентузіаст ШІ, я звернувся до ChatGPT за порадою, як виправити цю проблему, і воно запропонувало кілька чудових варіантів:

pic

запит ChatGPT використати Python для видалення шуму

Добре, ChatGPT, звучить гарно.

Я використав простий скрипт на Python, щоб витягнути аудіо з відео і зберегти його окремо:

from moviepy.editor import VideoFileClip  

def extract_audio(input_video, output_audio):  
 print("Extracting audio from video...")  
 video = VideoFileClip(input_video)  
 audio = video.audio  

 print("Saving audio file...")  
 audio.write_audiofile(output_audio)  

 # Clean up  
 video.close()  
 audio.close()  

if __name__ == "__main__":  
 input_file = "video.MOV" # Input video file  
 output_file = "orig_audio.wav" # Output audio file  

 try:  
 extract_audio(input_file, output_file)  
 print(f"Successfully extracted audio to {output_file}")  
 except Exception as e:  
 print(f"An error occurred: {str(e)}")

Я використовую macOS, Python 3.11 і MoviePy версії 1.0.3.
Для того, щоб MoviePy працював, потрібно встановити FFmpeg (на macOS можна використати: brew install ffmpeg).

Я використав ще один скрипт, щоб видалити аудіо з відео і зберегти беззвучну версію:

from moviepy.editor import VideoFileClip  

def extract_video_without_audio(input_video, output_video):  
 print("Processing video...")  
 video = VideoFileClip(input_video)  

 print("Removing audio and saving video...")  
 video_without_audio = video.without_audio()  

 # Get original dimensions  
 width = video.h  
 height = video.w  

 video_without_audio.write_videofile(  
 output_video,   
 codec='libx264',  
 ffmpeg_params=[  
 "-vf", f"scale={width}:{height}", # Force exact dimensions  
 "-pix_fmt", "yuv420p"  
 ]  
 )  

 # Clean up  
 video.close()  
 video_without_audio.close()  

if __name__ == "__main__":  
 input_file = "video.MOV"  
 output_file = "video_no_audio.mp4"  

 try:  
 extract_video_without_audio(input_file, output_file)  
 print(f"Successfully saved video without audio to {output_file}")  
 except Exception as e:  
 print(f"An error occurred: {str(e)}")

Тепер, коли я маю оригінальний аудіофайл, моєю наступною метою є зменшення шуму.

Ось одна з порад ChatGPT:

pic

Рекомендація ChatGPT для відокремлення голосу від фонового шуму

Моя реакція була: “Справді?! Лише одна команда?! Спробую!”

Що таке Demucs?

Demucs (Deep Extractor for Music Sources) — це потужний інструмент для розділення аудіо, який використовує штучний інтелект, розроблений дослідниками Facebook. Він використовує моделі глибокого навчання, спеціально призначені для розділення різних елементів аудіотреку.

Типові випадки використання:

  • Реміксування музики
  • Видалення вокалу (ідеально для караоке)
  • Відокремлення мови від фонового шуму (ТАК-ТАК-ТАК!!)
  • Відновлення аудіо

Досліджуйте Demucs тут: GitHub — Demucs

Як це допомагає?

Demucs може стати цінним інструментом для відокремлення конкретних звуків, наприклад, для того, щоб відокремити мову ведучого від фонових шумів літальних апаратів під час моєї весільної церемонії.

Оригінальний аудіофайл (приблизно 10 секунд):

оригінальний аудіофайл весільної церемонії з шумом літального апарата

Моя перша спроба:

За замовчуванням в Demucs використовується модель htdemucs, найновіша модель Hybrid Transformer.
текст перекладу
Раніше за замовчуванням використовувалась модель mdx_extra_q, яку я спробував, але результати були гірші в порівнянні.

demucs orig_audio.wav

Результат:

pic

Шум від транспортного засобу переважно знаходиться у файлі other.wav

шум від транспортного засобу, відокремлений demucs

Чистий аудіо знаходиться у файлі vocals.wav

чисте аудіо церемонії, оброблене demucs

Я досить задоволений результатом, але помітив, що є деякі параметри, які можна експериментувати, щоб, можливо, покращити його.

друга спроба з використанням --two-stems=vocals:
Параметр --two-stems=vocals дозволяє відокремити вокал від решти акомпанементу (режим караоке)

demucs --two-stems=vocals orig_audio.wav

Результат:

pic

Опція --two-stems=vocals більш логічна, оскільки вона розділяє аудіо на два файли. Однак результат майже такий самий, як і попередній.

третя спроба з використанням --shifts=5:
Параметр --shifts — це техніка для покращення якості розділення.
Вона обробляє аудіо кілька разів із маленькими зсувами по часу та обчислює середнє значення результатів, що може зробити вокал трохи м’якшим.
Недолік полягає в тому, що кожен додатковий зсув збільшує час обробки.

demucs --two-stems=vocals --shifts=5 orig_audio.wav

Результат:
Для моїх потреб параметр — shifts не суттєво покращив вокал у результативному аудіо. Встановлення shifts=5 зайняло приблизно в п'ять разів більше часу, ніж стандартна обробка.

Тепер, коли я задоволений очищеним аудіо, потрібно знову об'єднати його з відео.

Ось скрипт, який я використовував:

from moviepy.editor import VideoFileClip, AudioFileClip  

def merge_audio_video(video_path, audio_path, output_path):  
 try:  
 print("Loading video and audio...")  
 video = VideoFileClip(video_path)  
 audio = AudioFileClip(audio_path)  

 print("Merging audio with video...")  
 final_video = video.set_audio(audio)  

 print("Saving final video...")  
 final_video.write_videofile(  
 output_path,  
 codec='libx264',  
 audio_codec='aac',  
 temp_audiofile='temp-audio.m4a',  
 remove_temp=True  
 )  

 # Clean up  
 video.close()  
 audio.close()  
 final_video.close()  

 print(f"Done! Check {output_path}")  

 except Exception as e:  
 print(f"An error occurred: {str(e)}")  

if __name__ == "__main__":  
 video_path = "video_no_audio.mp4" # video without audio  
 audio_path = "audio_by_demucs_two-stem_shifts5.wav" # cleaned audio  
 output_path = "ceremony_video.mp4"  

 merge_audio_video(video_path, audio_path, output_path)

Дивно, але написання цього блогу зайняло більше часу, ніж експерименти з ШІ і використання Demucs для створення чистого, безшумного відео!

Якщо ви досліджуєте розділення аудіо, раджу спробувати інші рішення, наприклад, Spleeter: https://github.com/deezer/spleeter

Якщо у вас є відгуки або пропозиції, не соромтеся звертатися до мене за адресою: [email protected]

Перекладено з: Remove background noise from your videos using chatGPT, python and demucs

Leave a Reply

Your email address will not be published. Required fields are marked *