YouTubeやニコニコ動画のような動画サービスで0.5倍・2倍速再生が使えるのが一般的になっています。
また、サンプリングされた波形素材の時間伸縮がDAWの基本機能として搭載されていて、曲のタイミングやテンポに上手く合わせて波形素材をいい感じの長さで鳴らすことができます。
さらに、ピッチシフト(カラオケの転調)はタイムストレッチ+リサンプリングで実現できます。
このように、音楽や歌声のタイムストレッチ(時間伸縮)は実用的で非常に重要です。
タイムストレッチをゼロからプログラミングするのはなかなか大変ですが、
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フレーム長など)も引数として指定することができます。
フェーズボコーダにご興味がありましたら、以下の記事も合わせてご覧ください。
サンプルコードとタイムストレッチ適用例
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()