端點偵測(End-Point Detection, EPD)是指找出一段音訊的開始和結束的位置。比較簡單的方法,是在時域上用音量和過零率等方法計算。以單純使用音量來說,可以設定門檻為「整段音訊音量最大值的 1/n」、「整段音訊音量最小值的 n 倍」等方法,其中的參數要經過經驗或實驗來取得。此外,反覆對波型計算差分再計算音量,也會因為可以凸顯氣音的音量,因此可以跟音量結合來執行 EPD。若要觀察,你可以使用此範例,或者自己錄製一個氣音比較多的音檔(原始音檔為「successes」的發音):
import librosa import matplotlib.pyplot as plt import numpy as np WAV_PATH = 'successes.wav' y, sr = librosa.load(WAV_PATH, sr=None) t = np.arange(y.shape[0]) / sr plt.subplot(2, 1, 1) plt.plot(t, y) plt.subplot(2, 1, 2) frames = librosa.util.frame(y, frame_length=1024, hop_length=512).T # (n_frames, frame_size) vol_0 = np.sum(np.abs(frames), axis=1) d1 = np.diff(frames, axis=1) d2 = np.diff(d1, axis=1) d3 = np.diff(d2, axis=1) d4 = np.diff(d3, axis=1) vol_1 = np.sum(np.abs(d1), axis=1) vol_2 = np.sum(np.abs(d2), axis=1) vol_3 = np.sum(np.abs(d3), axis=1) vol_4 = np.sum(np.abs(d4), axis=1) t = librosa.frames_to_time(np.arange(frames.shape[0]), sr=sr, hop_length=512) plt.plot(t, vol_0, label='Vol') plt.plot(t, vol_1, label='Vol (1st diff)') plt.plot(t, vol_2, label='Vol (2nd diff)') plt.plot(t, vol_3, label='Vol (3rd diff)') plt.plot(t, vol_4, label='Vol (4th diff)') plt.legend() plt.xlabel('Time (sec)') plt.show()