우리는 음악 평가 사이트를 만들기로 했다
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 확인 -> 코드 실행
이렇게 하면 내 목소리와 유튜브 추출이 가능하다