Wizard Notes

Pythonを使った音楽信号分析の技術録、作曲活動に関する雑記

Python LibROSA で音楽・歌声をタイムストレッチ(時間伸縮) librosa.effects.time_stretch()

YouTubeニコニコ動画のような動画サービスで0.5倍・2倍速再生が使えるのが一般的になっています。

また、サンプリングされた波形素材の時間伸縮がDAWの基本機能として搭載されていて、曲のタイミングやテンポに上手く合わせて波形素材をいい感じの長さで鳴らすことができます。

さらに、ピッチシフト(カラオケの転調)はタイムストレッチ+リサンプリングで実現できます。

www.wizard-notes.com

このように、音楽や歌声のタイムストレッチ(時間伸縮)実用的で非常に重要です。

タイムストレッチをゼロからプログラミングするのはなかなか大変ですが、

Pythonの音楽分析モジュール LibROSA にはタイムストレッチを簡単に実行できる関数 librosa.effects.time_stretch() が用意されています

そこで、この記事では librosa.effects.time_stretch() 使い方と利用例を紹介します。

librosa.effects.time_stretch() の使い方

librosa - librosa.effects.time_stretch()

librosa.effects.time_stretch(y, rate, **kwargs)

重要な引数は以下の通りです。

  • y:
    • np.ndarray型の、時間波形領域の入力信号
      • ver. 0.8.0 時点では、1次元配列、すなわちモノラルの信号のみを対象としています。
  • rate:
    • float型で、どのくらい時間伸縮させるかを指定する引数
    • 例1:2倍速 rate = 2.0
    • 例2:1/2倍速 rate = 0.5
    • rateの値が1.0から離れるほど、品質は劣化しやすい

なお、中身はlibrosa.effects.time_stretch()の正体はフェーズボコーダであり、そのパラメタ(STFTフレーム長など)も引数として指定することができます。

フェーズボコーダにご興味がありましたら、以下の記事も合わせてご覧ください。

www.wizard-notes.com

サンプルコードとタイムストレッチ適用例

f:id:Kurene:20210712004219p:plain:w500

import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt

# オーディオ信号読み込み
filepath = librosa.ex('trumpet')
y, sr   = librosa.load(filepath, mono=True)

# 2倍にタイムストレッチ
y_fast  = librosa.effects.time_stretch(y, 2.0)
# 1/3倍にタイムストレッチ
y_slow  = librosa.effects.time_stretch(y, 1./3)


# プロット
length = np.array([len(y), len(y_fast), len(y_slow)]).max()

plt.subplot(3,1,1)
plt.plot(y, c="c")
plt.xlim(0, length)
plt.ylim(-1, 1)
plt.title("Original")
plt.grid()
plt.subplot(3,1,2)
plt.plot(y_fast, c="c")
plt.title("x2")
plt.xlim(0, length)
plt.ylim(-1, 1)
plt.grid()
plt.subplot(3,1,3)
plt.plot(y_slow, c="c")
plt.title("x1/3")
plt.xlim(0, length)
plt.ylim(-1, 1)
plt.grid()
plt.tight_layout()
plt.show()