表題の通りのまさに備忘録。
音声波形をヒルベルト変換して包絡および瞬時位相を計算し、そこから元の音声波形を再構成するスクリプトをPythonで書いた話。SPTKに付属のdata.shortをwavに変換して用いた。発話内容は「青い植木鉢」である。
処理の核となるのは以下の通りである。ヒルベルト変換を計算した結果は複素数値の「解析信号」であり、絶対値を取ることで音声波形の包絡線が得られる。位相は瞬時位相と呼ばれる。これら振幅と位相の情報から元の音声波形が再構成される。
scipyのsignalパッケージを使うと上記の処理が本質的に3行で済んでしまうので、scipy最高〜〜、というわけである。
import numpy as np import matplotlib.pyplot as plt import scipy.signal as signal # wave_dataは音声データ envelop = np.abs(signal.hilbert(wave_data)) # 包絡 angle = np.unwrap(np.angle(signal.hilbert(wave_data))) # 瞬時位相 reconst = envelop * np.cos(angle) # 再構成
元の波形と再構成後の波形、そして再構成誤差を図1に示す。誤差は完全に0にはならないことがわかる。
使ったプログラムは以下の通り。