[librosa] 파이썬으로 음 높이(key) 변화 없이 음악의 템포(tempo) 변경하기 / tempo change to python librosa without key change
파이썬으로 key 변화 없이 음악의 tempo를 변경해보자.
코랩 환경에서 진행한다.
먼저, 음악을 다루는 파이썬 도구인 librosa를 pip를 이용해 설치한다.
!pip install librosa
librosa를 불러오고, 다음과 같은 함수를 정의하자. 이 함수는 바꾸고 싶은 템포와 원래 템포의 비율을 통해 tempo를 바꿔주는 코드이다.
import librosa
def tempo_trans(audio, trans_tempo, origin_tempo):
tempo_ratio = trans_tempo / origin_tempo
audio_stretched = librosa.effects.time_stretch(audio, rate = tempo_ratio)
return audio_stretched
즉, 템포의 비(ratio)를 통해 음악의 길이를 변경하는 작업인데, time_stretch 함수의 rate를 조절하는 것이므로, 음질이 떨어질 수 있음은 유의해야한다.
y, sr = librosa.load("/content/input.wav")
다음 함수를 쓰기 위해서는 audio에 음악의 amplitude 값을 넣어주어야한다. 즉, 위의 함수를 이용해서 음악을 load한 뒤, 변수 y에 저장되어 있는 배열을 tempo_trans 함수의 audio 매개변수에 전달하자.
audio_stretched = tempo_trans(y, 1.05, 1) # 배속을 앞에 적는다.
1.05배속을 하고 싶다면 위와 같이 코드를 작성해준다. 앞에 바꾸고 싶은 템포, 뒤에 원본 템포를 넣어도 원하는 대로 동작한다.
ex) (y, 110, 100)
* 템포를 넣는다면 두번째와 세번째 매개변수 모두에 템포를 적어야한다. 배속 정도를 넣고 싶다면 두번째에 몇배속인지 적고 오른쪽에 1을 적어야한다.
IPython을 통한 음악 듣기
!pip install IPython
IPython이 없다면 pip를 통해 설치한다.
import IPython.display as ipd
ipd.Audio(audio_stretched, rate=sr)
ipd.Audio 함수를 이용해서 템포가 바뀐 음악을 직접 들어볼 수 있다.
soundfile을 통한 음악 저장하기
soundfile 라이브러리가 없다면, 다시 pip로 설치해준다.
!pip install soundfile
라이브러리를 불러오고, sf.write 함수로 음악을 저장할 수 있다. 맨 첫번째에 파일 이름(주소)를 넣어주면 해당 이름(주소)으로 저장된다.
import soundfile as sf
sf.write("output_stretched.wav", audio_stretched, sr)
음악의 tempo 구하기
바뀐 음악의 템포가 궁금할 경우, 역시 파이썬 코드를 이용해 얼마 정도의 템포를 가지는지 구해볼 수 있다. 정확도가 높지는 않으니 유의한다.
def calcul_tempo(y, sr):
tempo , _ = librosa.beat.beat_track(y=y,sr=sr)
return tempo
위와 같은 함수를 정의하고, 템포가 바뀐 음악의 amplitude와 원본의 sr을 넣는다. 그러면 아래와 같이 tempo가 계산되어 나온다.
배속을 기준으로 하면 자연수의 템포를 기대하기 어려울 수 있다.