22-2

在分析一段音訊時,我們通常將音訊切成比較短的單位,稱為音框(frame),通常一個音框必須包含數個基本週期(fundamental period),才能充分擷取音訊的特徵。接著我們就可以從一個音框內提取聲學特徵(acoustic features),以便進行進一步的分析。通常我們允許音框和音框之間可以重疊,而每秒出現的音框數則稱為音框率(frame rate),音框率越高,則所需要的計算資源越大。以下是從一段音訊切出多個音框的示意圖:


圖 5.:由一段音訊中切出音框。

我們人耳聽到一段音訊後,立即可以感受的的特性有音量(volume)、音高(pitch)和音色(timbre),但我們要使用電腦來分析音訊,就必須使用數學公式來描述上列特性,以「逼近」人耳的感覺。這些由每一個音框所抽出來的數值或向量就稱為聲學特徵(acoustic features),說明如下。

上述的聲學特徵,表現在時域的波形方面,可以顯示如下:


圖 5.:聲學特徵顯示於時域的對應表現。

Example 3: frameDisp4fea01.mauFile='taiwanUniversity.wav'; au=myAudioRead(auFile); n=2; au.fs=au.fs/n; au.signal=au.signal(1:n:end, 1); % Down sampling index1=round(0.66*au.fs); frameSize=256; index2=index1+frameSize-1; frame=au.signal(index1:index2); % Take the frame for display audiowrite('frame.wav', frame, au.fs); subplot(2,1,1); plot(au.signal); grid on xlabel('Sample index'); ylabel('Amplitude'); title(auFile); %xlabel('取樣點索引值'); ylabel('波形振幅'); title(auFile); axis([1, length(au.signal), -1 1]); line(index1*[1 1], [-1 1], 'color', 'm', 'linewidth', 1); line(index2*[1 1], [-1 1], 'color', 'm', 'linewidth', 1); subplot(2,1,2); plot(frame, '.-'); grid on xlabel('Sample index within the frame'); ylabel('Amplitude'); %xlabel('音框內的取樣點索引值'); ylabel('波形振幅'); axis([1, length(frame), -1 1]); %boxOverlay([60.5 -0.7 52 1.4], 'r', 1, '音色:基本週期內的波形', 'top'); message=sprintf('Timbre:\nWaveform in a fundamental period'); boxOverlay([60.5 -0.5 52 1.2], 'r', 1, message, 'top'); subplot(211); loc1=get(gca, 'position'); subplot(212); loc2=get(gca, 'position'); %% ===== arrow 1 for closeup x1=[loc1(1)+(index1(1)-1)/(length(au.signal)-1)*loc1(3), loc2(1)]; y1=[loc1(2), loc2(2)+loc2(4)]; ah=annotation('arrow', x1, y1, 'color', 'm', 'linewidth', 1); %% ====== arrow 2 for closeup x2=[loc1(1)+(index2-1)/(length(au.signal)-1)*loc1(3), loc2(1)+loc2(3)]; y2=[loc1(2), loc2(2)+loc2(4)]; ah=annotation('arrow', x2, y2, 'color', 'm', 'linewidth', 1); %% Double arrow for fundamental period axisLimit=axis; % axisLimit=[1, 256, -1, 1] xPos=[171, 223]; yPos=[0.65, 0.65]; xRel=loc2(1)+(xPos-axisLimit(1))/(axisLimit(2)-axisLimit(1))*loc2(3); yRel=loc2(2)+(yPos-axisLimit(3))/(axisLimit(4)-axisLimit(3))*loc2(4); ah=annotation('doublearrow', xRel, yRel, 'color', 'r'); textH=text(mean(xPos), mean(yPos), 'Fundamental period', 'horizontal', 'center', 'vertical', 'bottom'); %% Double arrow for volume axisLimit=axis; % axisLimit=[1, 256, -1, 1] xPos=axisLimit(2)+[1, 1]; yPos=[min(frame), max(frame)]; xRel=loc2(1)+(xPos-axisLimit(1))/(axisLimit(2)-axisLimit(1))*loc2(3); yRel=loc2(2)+(yPos-axisLimit(3))/(axisLimit(4)-axisLimit(3))*loc2(4); ah=annotation('doublearrow', xRel, yRel, 'color', 'r'); textH=text(mean(xPos), mean(yPos), 'Volume', 'horizontal', 'center', 'vertical', 'top', 'rotation', 90);

若是使用 FFT將一個音框的訊號轉成幅度頻譜,上述的聲學特徵可以顯示如下:


圖 5.:聲學特徵顯示於頻域的對應表現。

Example 4: frameDisp4fea02.mwaveFile='taiwanUniversity.wav'; au=myAudioRead(waveFile); n=2; au.fs=au.fs/n; au.signal=au.signal(1:n:end, 1); % Down sampling index1=round(0.66*au.fs); frameSize=256; index2=index1+frameSize-1; frame=au.signal(index1:index2); % Take the frame for display frameBasic=frame.*hanning(frameSize); frameExtended=zeros(8*frameSize, 1); frameExtended(1:frameSize)=frameBasic; [magSpec, phaseSpec, freqVec, powerSpecInDb]=fftOneSide(frameExtended, au.fs); plot(freqVec, powerSpecInDb); grid on title('Power spectrum'); xlabel('Frequency (Hz)'); ylabel('Power (dB)'); axis tight %xlabel('頻率 (Hz)'); ylabel('振幅 (dB)'); order=10; freqNormalized=freqVec/max(freqVec); p=polyfit(freqNormalized, powerSpecInDb, order); f=polyval(p, freqNormalized); line(freqVec, f, 'color', 'g', 'linewidth', 2); %% Plot FF axisLimit=axis; axisLoc=get(gca, 'position'); xPos=[945.3125, 1085.9375]; yPos=[6.9, 6.9]; xRel=axisLoc(1)+((xPos-axisLimit(1))/(axisLimit(2)-axisLimit(1)))*axisLoc(3); yRel=axisLoc(2)+((yPos-axisLimit(3))/(axisLimit(4)-axisLimit(3)))*axisLoc(4); ah=annotation('doublearrow', xRel, yRel, 'color', 'r'); textH=text(mean(xPos), mean(yPos), 'FF', 'horizontal', 'center', 'vertical', 'bottom'); %% Plot first formant [maxValue, maxId]=max(f); xPos=[freqVec(maxId)+100, freqVec(maxId)]; yPos=[maxValue+20, maxValue]; line(xPos(2), yPos(2), 'marker', 'o', 'color', 'r'); xRel=axisLoc(1)+((xPos-axisLimit(1))/(axisLimit(2)-axisLimit(1)))*axisLoc(3); yRel=axisLoc(2)+((yPos-axisLimit(3))/(axisLimit(4)-axisLimit(3)))*axisLoc(4); ah=annotation('arrow', xRel, yRel, 'color', 'r'); textH=text(xPos(1), yPos(1), 'First formant', 'horizontal', 'center', 'vertical', 'bottom'); %% Plot second formant f(1:round(length(f)/2))=-inf; [maxValue, maxId]=max(f); xPos=[freqVec(maxId)+100, freqVec(maxId)]; yPos=[maxValue+30, maxValue]; line(xPos(2), yPos(2), 'marker', 'o', 'color', 'r'); xRel=axisLoc(1)+((xPos-axisLimit(1))/(axisLimit(2)-axisLimit(1)))*axisLoc(3); yRel=axisLoc(2)+((yPos-axisLimit(3))/(axisLimit(4)-axisLimit(3)))*axisLoc(4); ah=annotation('arrow', xRel, yRel, 'color', 'r'); textH=text(xPos(1), yPos(1), 'Second formant', 'horizontal', 'center', 'vertical', 'bottom'); %% Plot timbre curve point=[1184, -41.83]; xPos=[point(1)+300, point(1)]; yPos=[point(2)+25, point(2)]; xRel=axisLoc(1)+((xPos-axisLimit(1))/(axisLimit(2)-axisLimit(1)))*axisLoc(3); yRel=axisLoc(2)+((yPos-axisLimit(3))/(axisLimit(4)-axisLimit(3)))*axisLoc(4); ah=annotation('arrow', xRel, yRel, 'color', 'r'); textH=text(xPos(1), yPos(1), 'Timbre: Smoothed power spectrum', 'horizontal', 'center', 'vertical', 'bottom'); %% Plot energy point=[freqVec(1), powerSpecInDb(1)]; line(point(1), point(2), 'marker', 'o', 'color', 'r'); xPos=[point(1)+300, point(1)]; yPos=[point(2)-25, point(2)]; xRel=axisLoc(1)+((xPos-axisLimit(1))/(axisLimit(2)-axisLimit(1)))*axisLoc(3); yRel=axisLoc(2)+((yPos-axisLimit(3))/(axisLimit(4)-axisLimit(3)))*axisLoc(4); ah=annotation('arrow', xRel, yRel, 'color', 'r'); textH=text(xPos(1), yPos(1), 'Energy (volume)', 'horizontal', 'center', 'vertical', 'top');

把一段音訊切成音框的集合後,我們就可以針對每個音框來抽取聲學特徵(可能是一個數值,例如音量或是音高,或是一個向量,例如頻譜或是 MFCC),不同的應用會需要用到不同的聲學特徵,電腦必須能夠自動地計算這些特徵,才能進一步進行後續的分析或分類。以下各小節將說明音訊辨識的各項應用,以及可能用到的聲學特徵及相關的機器學習方法。

作業

  1. 一段音訊的取樣頻率是 16 kHz,若是音框長度是 320 個取樣點,請回答下列問題:
    1. 如果音框之間的重疊是 120 點,那麼對應的音框率是?
    2. 如果音框率是 100 frame/sec,則音框之間的重疊應該是幾點?
  2. 假設我從我的語音訊號抽出一個音框,如下圖。如果取樣頻率是 8 kHz,請計算這個音框的基本頻率。(在選取基本週期來進行平均時,基本週期的個數必須越多越好,以求穩定。)


    圖 5.:請由此音框計算對應的基本頻率。

  3. 請從網路上尋找資訊,來解釋下列名詞(請盡量使用數學方程式來說明),並說明在日常生活中,何時會遇到這些現象:
    1. 拍頻(beat frequency)
    2. 杜普勒效應(Doppler effect)

Audio Signal Processing and Recognition (音訊處理與辨識)