音訊訊號處理入門

Tnxts發表於2024-06-09

普及知識

什麼是訊號分析?

將一個複雜訊號分解成若干簡單訊號分量之和,或者用有限的一組參量去表示一個複雜波形的訊號,從這些簡單的分量組成情況去考察複雜訊號的特性。

對訊號分析的過程實際上就是一個特徵提取的過程,從一段複雜的波形中提取我們需要的資訊。

為什麼要分析訊號?

  1. 訊號分析是獲取訊號特徵資訊的重要手段,透過訊號分析,可以得到複雜訊號的基本特徵。
  2. 訊號分析是獲取訊號源特徵資訊的重要手段,可以透過對訊號特徵的詳細瞭解,得到訊號源特性、執行情況等資訊。
  3. 深度學習的第一步是要收集資料的特徵(feature)。所以需要透過訊號分析,提取資料集特徵。

怎樣進行訊號分析?

訊號分析方式────根據訊號的型別選擇

  1. 訊號平穩────由於訊號不隨時變化,可以在時域和頻域直接分析;
  2. 訊號不穩────由於訊號隨時變化,需要將訊號拆解分析
    1. 時間維度拆解,利用平均瞬時功率訊號,可以知道訊號傳播規律
    2. 頻域維度拆解,按照不同頻帶的濾波器進行濾波處理
    3. 時頻域緯度拆解,同時包含訊號隨時間和頻域變化的規律

訊號的頻域拆解

訊號的頻率成分

  1. 任何訊號都可以看作是多個不同頻率的簡單波形(如正弦波)的疊加
  2. 每個頻率的波形都有其特定的振幅

包絡(Envelope)

包絡是在訊號處理中描述訊號強度變化的曲線或輪廓。

包絡曲線是在訊號波形的最高點和最低點之間繪製一條平滑曲線,它可以用來描述訊號的振幅隨時間變化的趨勢.

包絡有助於捕獲訊號的宏觀變化特徵,忽略瞬時波動,適合分析具有調幅特性或其他週期性變化的訊號。

精細結構

指音訊中的高頻細節,如每個振動週期內的變化。

訊號的包絡結構和精細結構與訊號頻率的關係

多個不同頻率訊號的疊加,由於和差化積,會形成包絡結構和精細結構。

image-20240526002042154

決定包絡結構(261.63Hz):image-20240526002129551

決定精細結構(3401.19Hz):

image-20240526002245212

訊號的包絡結構是由低頻訊號決定的,訊號的精細結構是由高頻訊號決定的。

在語音識別中,主要透過訊號的包絡結構來區分不同的音訊訊號,因此在識別領域更關注低頻的作用。

訊號的時域分析

分幀(framing)

什麼是分幀?

分幀是指:將訊號按照時間尺度分割,劃分為多個較短的、固定長度的幀。

也就是將訊號按照時間尺度劃分成多個段,每一段的長度就是幀長frame_size。

分出的段的數量,就是幀的個數frame_num。

如果不考慮重疊分幀,則該訊號的總取樣點數為frame_size * frame_num。

為什麼要分幀?

由於音訊訊號是一個隨時間變化的連續訊號,而我們通常需要在一個較短的時間視窗內去分析,來捕捉訊號的時間變化特性。

分幀重疊(Overlapping)

分幀重疊是指相鄰幀之間存在部分重疊,這樣可以確保幀與幀之間的過渡區域不會丟失重要資訊。重疊部分有助於平滑的過渡,減少由分幀引入的邊界效應。

重疊大小(Overlap Size):相鄰幀之間重疊的樣本數

幀移(Hop Size):每次移動的樣本數,即相鄰幀的開始位置之間的距離

幀數計算公式

設:

  • \(N\)為音訊訊號的總樣本數
  • \(L\)為每幀的長度
  • \(O\)為幀與幀的重疊大小

幀移(Hop Size)可以表示為:

\[H=L-O \]

幀數\(F\)的計算公式為:

\[F=\left\lceil\frac{N-O}{H}\right\rceil \]

公式推導

為了計算幀數,我們需要知道音訊訊號在分幀後的幀數。

基本思路是:從訊號起始位置開始,每次移動幀移(H)個樣本,直到覆蓋整個訊號。

假設有總樣本數\(N\),幀長度\(L\),重疊大小\(O\),幀移\(H=L-O\)

  1. 初步分析:

    我們要覆蓋從0到\(N-1\)​的所有樣本,從而計算總的幀移動次數。考慮到幀開始的位置

    • 第一個幀的起始位置:\(0\)
    • 第二個幀的起始位置:\(H\)
    • 第三個幀的起始位置:\(2H\)
    • ...
    • 第k個幀的起始位置:\((k-1)H\)
  2. 覆蓋整個訊號

    為了覆蓋整個訊號,我們希望最後一個幀的起始位置滿足:\((k-1)H + L\ge N\)

    也就是說,k必須滿足:\(k\ge \frac{N-L}{H}+1\)

  3. 得出總幀數計算公式

    為了確保所有的訊號樣本的覆蓋,我們需要向上取整:

    \[F=\left\lceil\frac{N-L}{H}+1\right\rceil \]

    由於\(H=L-O\)​,化簡得:

    \[F=\left\lceil\frac{N-O}{H}\right\rceil \]

幅值包絡(Amplitude Envelope)

幅值包絡是描述訊號振幅隨時間變化的曲線,能夠反映一個訊號整體的振幅結構。

幅值包絡是一條平滑的曲線,代表訊號在每個時間點的最大幅值,它定義了訊號振幅的外部輪廓軌跡。

時域與頻域的關係

相位與振幅

正弦波就是一個圓周運動在一個二維平面的投影。

任意時刻的相位:\(\phi\)

任意時刻的幅度:\(\sin{\phi}\times振幅A\)

在這裡插入圖片描述

頻域的基本單元

頻域的基本單元可以理解為一個是始終在旋轉的圓。

在這裡插入圖片描述

快速傅立葉變換(Fast Fourier Transform)

FFT可以將訊號從原始域(通常是時間或空間)轉換到頻域或逆轉換回來。

在這裡插入圖片描述

任意波形的FFT

在這裡插入圖片描述

相位差

\[相位差=(時間差/週期)×2π \]

相位差不是時間差,透過求時間差佔週期的比例,乘\(2\pi\)就得到了相位差。

在這裡插入圖片描述

頻譜圖(Spectrogram)

頻譜圖通常用來表示訊號在頻域上的能量分佈。

它顯示了訊號各個頻率分量的振幅或功率。一般是針對整個訊號,或者某一個固定時間視窗。

頻譜圖是一個二維影像,橫軸是訊號頻率,縱軸是訊號振幅。

語譜圖

語譜圖是頻譜圖在時間軸上的延伸。

在這裡插入圖片描述

在這裡插入圖片描述

時頻域分析

為什麼不能只依靠頻域分析?

頻譜雖然可以看出訊號的頻率分佈,但是由於丟失了時域資訊,因此無法看出頻率分佈隨時間的變化。

時域分析方法

幅值包絡法

學習程式碼

其餘方法待續

時頻域分析方法

短時傅立葉變換(STFT)

短時傅立葉變換(Short-Time Fourier Transform,STFT)

小波變換(WT)

Wigner分佈

聲音

聲音包括兩個基本屬性:頻率和振幅

角頻率

角頻率與頻率的關係:

\[\omega=2\pi f \]

簡單理解:

\(\omega\)表示rad/s,f表示完成多少次/s,那麼每轉完一圈,也就是走了2\(\pi\)rad,就完成了一次。因此

\[\frac{走的總弧度/s}{2\pi}={完成的總次數/s} \]

\[\frac{\omega}{2\pi}={f} \]

響度(Loudness)

響度是指人耳對聲音強弱的主觀感受

它不僅與聲音的物理屬性有關,還與人耳的感知特性有關。

響度的主觀感受取決於多個因素,包括聲壓級(Sound Pressure Level, SPL)、頻率時間等。

聲壓級

聲壓級是聲音強度的一個物理量,通常以分貝(dB)為單位。

聲壓級越高,響度感知通常越大。

頻率

人耳對不同頻率的聲音敏感度不同。

一般來說,人耳對1kHz到4kHz之間的聲音最為敏感。

同樣聲壓級的聲音,在這個頻率範圍內會會被感知為更響。

時間

持續時間對響度感知也有影響。

持續時間較短的聲音可能會被感知為不如等聲壓級的長時間聲音響。

人耳的非線性特徵

人耳的響度感知是非線性的。

這意味著響度的增加與聲壓級的增加不是簡單的線性關係。

通常使用等響曲線(Fletcher-Munson曲線)來描述這一特性,這些曲線顯示了人耳在不同頻率下對相對響度的感知。

img

頻譜

頻譜就是頻域影像

頻域

可以把某一時刻的聲波拆分成一系列不同頻率的正弦波,

頻域關注的就是每個頻率的正弦波的振幅(或者相位

時頻譜

Time-Frequency Spectrum

一個用來表示訊號在時域和頻域屬性的工具,它能在同時考慮時間和頻率的情況下分析訊號。

如何看時頻圖

音訊遮掩效應

功率譜 (Power Spectrum)

什麼是功率?

在訊號處理中,功率通常表示訊號的能量。

對於一個頻率成分,功率通常是該頻率成分振幅的平方

什麼是功率譜?

功率譜是描述訊號在不同頻率功率分佈的影像或函式。

它揭示了訊號的頻率成分及對應的能量大小。

功率譜通常用來分析訊號的頻率特性,比如找出訊號中的主要頻率成分、噪聲特性等

如何計算功率譜?

  1. 對訊號做傅立葉變換:對時域訊號進行傅立葉變換,得到頻域表示。

\[X(f)=F[X(t)] \]

  1. 計算功率譜密度:將傅立葉變換結果的振幅平方來計算功率譜密度(Power Spectral Density)。

\[P(f)={|X(f)|}^2 \]

  1. 歸一化:有時需要對功率譜進行歸一化處理,便於比較不同訊號的功率譜。

梅爾頻譜

梅爾刻度

梅爾刻度(mel scale)是一種基於頻率定義的非線性刻度單位,目的是表示人耳對音高(pitch)等距變化的感官。

梅爾刻度與線性的頻率刻度────赫茲(Hz)之間可以進行近似的數學運算,用來表述聲音訊率與人類感知的關係。

頻率f與梅爾刻度m的轉換公式

\[m=2595\log_{10}{(1+\frac{f}{700})} \]

image-20240527110532224

梅爾刻度將1000Hz,且高於人耳聽閾值40分貝的聲音訊號,定為1000mel的參考點。在頻率500Hz以上時,隨著頻率的增加,人耳每感覺到等量的音高變化,所需要的頻率變化愈來愈大。這導致在赫茲刻度500Hz往上的四個八度(一個八度即為兩倍的頻率),只對應梅爾刻度上的兩個八度。Mel的名字來源於單詞melody,表示這個刻度是基於音高比較而被創造的。

什麼是梅爾頻譜?

梅爾頻譜(Mel Spectrum)是將聲音訊號的頻譜透過梅爾刻度進行轉換後得到的結果,更貼近人類的聽覺感知特性。在語音識別、語音合成等領域有重要應用。

動態時間規整(DTW)

常見音訊檔案

  • wav
  • mp3
  • ogg
  • wma
  • flac

如何讓計算機聽懂語音?

語音訊號是模擬量,透過取樣量化編碼可以將模擬量轉換為數字量

取樣率(Sample rate)

單位時間內從連續訊號中取樣的次數

奈奎斯特定理

只要取樣頻率大於等於取樣訊號中最高頻率兩倍,原訊號既可無失真恢復

即 音訊檔案能達到的最高頻率是其取樣率的一半

與音訊相關的庫

librosa

[!NOTE]

舊版本只支援wav,可以使用ffmpeg將其他型別的音訊檔案轉換成wav(新版本自帶ffmpeg)

librosa.effects.trim // 消除音訊前後靜音部分

librosa.effects.split // 找到所有非靜音的下標區間
librosa.effects.remix // 根據多個下標區間來擷取音訊,與split結合可以消除音訊中所有的靜音部分

audioread

wave

soundfile

scipy

pyaudio

與音訊相關的領域

語音合成TTS

Text-To-Speech

簡單實現:將處理的文字作為輸入,輸出對應音訊的頻譜,再由頻譜轉化成聲音

作用:將文字轉換成口語

用途:

  1. 虛擬助手
  2. 有聲讀物
  3. 無障礙

常見的TTS系統:

WaveNet Google
GPT

語音識別ASR

Automatic-Speech-Recognition

音樂生成

聲音分析與處理

語音轉換VC

voice conversion

相關文章