새로운 프로젝트 변경

새로운 프로젝트 변경

·

2 min read

우리는 음악 평가 사이트를 만들기로 했다

import os
from pytube import YouTube
from pydub import AudioSegment
import librosa
import numpy as np
from spleeter.separator import Separator
import matplotlib.pyplot as plt

def download_audio_from_youtube(youtube_url, output_path):
    yt = YouTube(youtube_url)
    audio_stream = yt.streams.filter(only_audio=True).first()
    audio_file = audio_stream.download(output_path=output_path)
    return audio_file

def extract_vocals(audio_path, output_path):
    separator = Separator('spleeter:2stems')
    separator.separate_to_file(audio_path, output_path)
    vocal_path = os.path.join(output_path, os.path.basename(audio_path).replace('.mp3', ''), 'vocals.wav')
    return vocal_path

def sync_vocals(vocal_path1, vocal_path2):
    y1, sr1 = librosa.load(vocal_path1, sr=None)
    y2, sr2 = librosa.load(vocal_path2, sr=None)

    y2_stretched = librosa.effects.time_stretch(y2, rate=len(y1)/len(y2))

    return y1, sr1, y2_stretched, sr2

def calculate_pitch_tempo_difference(y1, sr1, y2, sr2):
    pitches1, magnitudes1 = librosa.core.piptrack(y=y1, sr=sr1)
    pitches2, magnitudes2 = librosa.core.piptrack(y=y2, sr=sr2)

    tempo1, _ = librosa.beat.beat_track(y=y1, sr=sr1)
    tempo2, _ = librosa.beat.beat_track(y=y2, sr=sr2)

    pitch_diff = np.abs(pitches1 - pitches2)
    tempo_diff = np.abs(tempo1 - tempo2)

    return pitch_diff, tempo_diff

def visualize_differences(pitch_diff, tempo_diff):
    plt.figure(figsize=(14, 5))

    plt.subplot(2, 1, 1)
    plt.title('Pitch Difference')
    plt.imshow(pitch_diff, aspect='auto', origin='lower', cmap='coolwarm')
    plt.colorbar()

    plt.subplot(2, 1, 2)
    plt.title('Tempo Difference')
    plt.plot(tempo_diff)

    plt.tight_layout()
    plt.show()

def compare_vocals(youtube_url, local_audio_path, output_path='output'):
    # Step 1: Download YouTube audio
    youtube_audio = download_audio_from_youtube(youtube_url, output_path)

    # Step 2: Extract vocals
    youtube_vocals = extract_vocals(youtube_audio, output_path)
    local_vocals = extract_vocals(local_audio_path, output_path)

    # Step 3: Sync vocals
    y1, sr1, y2_stretched, sr2 = sync_vocals(youtube_vocals, local_vocals)

    # Step 4: Calculate pitch and tempo difference
    pitch_diff, tempo_diff = calculate_pitch_tempo_difference(y1, sr1, y2_stretched, sr2)

    # Step 5: Visualize differences
    visualize_differences(pitch_diff, tempo_diff)

# Example usage
youtube_url = 'YOUR_YOUTUBE_LINK_HERE'
local_audio_path = 'YOUR_LOCAL_AUDIO_FILE_PATH_HERE'
compare_vocals(youtube_url, local_audio_path)

librosa를 이용한 목소리 측정 및 비교

pip install librosa
pip install pytube pydub librosa spleeter matplotlib

이걸 하면

if __name__ == "__main__": <- 이걸 넣어야 무한 반복이 안됨
    youtube_url = 'YOUR_YOUTUBE_LINK_HERE' <- 여기에 유튜브 링크
    local_audio_path = 'YOUR_LOCAL_AUDIO_FILE_PATH_HERE' <- 내 음성 녹음
    compare_vocals(youtube_url, local_audio_path)

그러면 해결?? 아니다
ffmpeg 다운 받고 환경 변수에 넣어야 한다

여기서 들어와서 저걸 누르고 다운 받는다

경로 제어판 -> 시스템 -> 고급 시스템 설정 -> 고급 -> 환경 변수 -> Path 편집 ->
새로만들기 -> 찾아보기 -> ffmpeg다운로드 경로 에 bin 확인 -> 코드 실행

이렇게 하면 내 목소리와 유튜브 추출이 가능하다