音楽プログラミングの超入門(仮)

Python / 音楽情報処理 初心者が、初心者にも分かるような記事を書きたい。

(1)音のタイムストレッチとピッチシフト:【リサンプリング】

Pitch shift

音のタイムストレッチとピッチシフト
  • (1)リサンプリング
    この記事
  • (2)波形領域
    予定
  • (3)フェーズボコーダ [Flanagan & Golden, 1966]
    予定
  • (4)反復STFT [Griffin & Lim, 1984]
    予定

導入

 最近は DTM が一般的になってきており、DAW の機能を備えたソフトも数多く存在します。それらのソフトでは、音響信号の長さを短くしてテンポを速めるタイムストレッチや、音の高さを変更するピッチシフトは基本的な操作であり、誰でも簡単に行えるようになっています。

 しかし、かつては音質を保ったままこれらの操作を行うことは非常に難しい問題であり、様々な工夫や発見がなされてきました。タイムストレッチ・ピッチシフトの歴史については Wikipedia に割と詳しく載っていたので参照してください。(タイムストレッチ/ピッチシフト - Wikipedia

 今回は、これらの技術の中でも初期のものを紹介し、実際に実装してみようと思います。他のやつのアルゴリズム難しくてよく分かってないし。そのうち他の技術も紹介できたらいいなぁと思います。

リサンプリング:再生速度を変える

 最も簡単にタイムストレッチ・ピッチシフトを行う技法として、リサンプリングがあります。これは単純に再生する速さを変えるということです。テープカセットの早送りなどを想像すると分かりやすいと思います。

 この技法の弱点、というか性質として、タイムストレッチとピッチシフトが裏表の関係にあることが分かります。2倍の速さで再生すると、ピッチも2倍となり、1/2 の速さで再生するとピッチも 1/2 になります。例えば、100[Hz] の波があったときに、元の速度だと1秒で100周期進むのに対し、2倍の速度で再生すれば0.5秒で100周期進むことになり、つまるところ200[Hz]の波になるということです。これは当然ですね。

実装

# -*- coding: utf-8 -*-
"""
リサンプリング
""" 
from scipy import arange, around, array, linspace
from scipy.interpolate import interp1d
from scipy.signal import resample
from scipy.io.wavfile import read, write

# ============
#  Resampling
# ============
"""
ピッチと再生速度は比例の関係.
"""
def resampling(sig, fs, pitchChangeRate, kind = "fourier"):
    L = len(sig)
    assert pitchChangeRate > 0, "Pitch change rate must be over 0."
    new_L = int(round(L / float(pitchChangeRate)))

    if kind == "fourier":
        new_sig = resample(sig, new_L)
    else:
        f = interp1d(arange(L), sig, kind = "linear")
        new_x = linspace(0, L - 1, num = new_L)
        new_sig = f(new_x)

    return new_sig

# ======
#  Test
# ======
def test(wav_file):
    fs, data = read(wav_file)
    new_data = resampling(data, fs, 1.5, kind = None)

    new_data = array(around(new_data), dtype = "int16")
    write("../wav/output/a01_fast.wav", fs, new_data)

if __name__ == "__main__":
    input_wav = "../wav/a01.wav"
    test(input_wav)

このような感じでしょうか。リサンプリングを行うところで、resample 関数を使うかどうか選べるようにしています。特に使う必要もない気がしますが・・。

音を聞いてみよう

 なんとなく人の声を使いたかったので、Galatea Talk という音声合成プロジェクトで提供されているフリー版の音素バランス文音声を使ってみました。

リリース VoiceMaker atr_503-v1.0 - GalateaTalk - OSDN

リサンプリングしてみた結果がこちらです。

オリジナル

0.5倍速

1.5倍速

2倍速

0.3倍速(笑)

3倍速(笑)

考察とか

 3倍速とかは流石に何言ってるか分からないレベルですね。速くなるほど、どんどんサンプルを削っていくので、そりゃそうですね。サンプリング周波数がもっと高いと結果が違ってくるかもしれません。

 今は実用的な技術かどうか知りませんが、60年代にザ・フォーク・クルセダーズが早回しを用いて『帰って来たヨッパライ』という爆発的ヒット曲を生み出しましたね。

2倍速くらい?上の結果と似たような声になってるのが面白いですね。

関連記事

音のタイムストレッチとピッチシフト
  • (1)リサンプリング
    この記事
  • (2)フェーズボコーダ [Flanagan & Golden, 1966]
    予定
  • (3)反復STFT [Griffin & Lim, 1984]
    予定