是的,Python 3.7可以用於音頻編程。Python有許多第三方庫和工具可用沖陸於音頻處理和生成,例如PyAudio、SoundDevice、SciPy等昌判森。這些庫提供了易於耐畝使用的API,使得在Python中進行音頻錄制、播放、編輯和分析變得更加容易。
Ⅱ Python 簡單的擴音,音頻去噪,靜音剪切
數字信號是通過對連續的模擬信號采樣得到的離散的函數。它可以簡單看作一個以時間為下標的數組。比如,x[n],n為整數。比如下圖是一個正弦信號(n=0,1, ..., 9):
對於任何的音頻文件,實際上都是用這種存儲方式,比如,下面是對應英文單詞「skip」的一段信號(只不過由於點太多,筆者把點用直線連接了起來):
衡量數字信號的 能量(強度) ,只要簡單的求振幅平方和即可:
我們知道,聲音可以看作是不同頻率的正弦信號疊加。那麼給定一個聲音信號(如上圖),怎麼能夠知道這個信號在不同頻率區段上的強度呢?答案是使用離散傅里葉變換。對信號x[n], n=0, ..., N-1,通常記它的離散傅里葉變換為X[n],它是一個復值函數。
比如,對上述英文單詞「skip」對應的信號做離散傅里葉變換,得到它在頻域中的圖像是:
可以看到能量主要集中在中低音部分(約16000Hz以下)。
在頻域上,也可以計算信號的強度,因為根據Plancherel定理,有:
對於一般的語音信號,長度都至少在1秒以上,有時候我們需要把其中比如25毫秒的一小部分單獨拿出來研究。將一個信號依次取小段的操作,就稱作分幀。技術上,音頻分幀是通過給信號加一系列的 窗 函數 實現的。
我們把一種特殊的函數w[n],稱作窗函數,如果對所有的n,有0<=w[n]<=1,且只有有限個n使得w[n]>0。比如去噪要用到的漢寧窗,三角窗。
漢寧窗
三角窗
我們將平移的窗函數與原始信號相乘,便得到信號的「一幀」:
w[n+d]*x[n]
比如用長22.6毫秒的漢寧窗加到「skip」信號大約中間部位上,得到一幀的信號:
可見除一有限區間之外,加窗後的信號其他部分都是0。
對一幀信號可以施加離散傅里葉變換(也叫短時離散傅里葉變換),來獲取信號在這一幀內(通常是很短時間內),有關頻率-能量的分布信息。
如果我們把信號按照上述方法分成一幀一幀,又將每一幀用離散傅里葉變換轉換到頻域中去,最後將各幀在頻域的圖像拼接起來,用橫坐標代表時間,縱坐標代表頻率,顏色代表能量強度(比如紅色代表高能,藍色代表低能),那麼我們就構造出所謂 頻譜圖 。比如上述「skip」發音對應的信號的頻譜圖是:
(使用5.8毫秒的漢寧窗)
從若干幀信號中,我們又可以恢復出原始信號。只要我們適當選取窗口大小,以及窗口之間的平移距離L,得到 ..., w[n+2L], w[n+L], w[n], w[n-L], w[n-2L], ...,使得對k求和有:
從而簡單的疊加各幀信號便可以恢復出原始信號:
最後,注意窗函數也可以在頻域作用到信號上,從而可以起到取出信號的某一頻段的作用。
下面簡單介紹一下3種音效。
1. 擴音
要擴大信號的強度,只要簡單的增大信號的「振幅」。比如給定一個信號x[n],用a>1去乘,便得到聲音更大的增強信號:
同理,用系數0<a<1去乘,便得到聲音變小的減弱信號。
2. 去噪(降噪)
對於白噪音,我們可以簡單的用「移動平均濾波器」來去除,雖然這也會一定程度降低聲音的強度,但效果的確不錯。但是,對於成分較為復雜,特別是頻段能量分布不均勻的雜訊,則需要使用下面的 雜訊門 技術,它可以看作是一種「多帶通濾波器」。
這個特效的基本思路是:對一段雜訊樣本建模,然後降低待降噪信號中雜訊的分貝。
更加細節的說,是在信號的若干頻段f[1], ..., f[M]上,分別設置雜訊門g[1], ..., g[M],每個門都有一個對應的閾值,分別是t[1], ..., t[M]。這些閾值時根據雜訊樣本確定的。比如當通過門g[m]的信號強度超過閾值t[m]時,門就會關閉,反之,則會重新打開。最後通過的信號便會只保留下來比雜訊強度更大的聲音,通常也就是我們想要的聲音。
為了避免雜訊門的開合造成信號的劇烈變動,筆者使用了sigmoid函數做平滑處理,即雜訊門在開-關2個狀態之間是連續變化的,信號通過的比率也是在1.0-0.0之間均勻變化的。
實現中,我們用漢寧窗對信號進行分幀。然後對每一幀,又用三角窗將信號分成若干頻段。對雜訊樣本做這樣的處理後,可以求出信號每一頻段對應的閾值。然後,又對原始信號做這樣的處理(分幀+分頻),根據每一幀每一頻段的信號強度和對應閾值的差(diff = energy-threshold),來計算對應雜訊門的開合程度,即通過信號的強度。最後,簡單的將各頻段,各幀的通過信號疊加起來,便得到了降噪信號。
比如原先的「skip」語音信號頻譜圖如下:
可以看到有較多雜音(在高頻,低頻段,藍色部分)。採集0.25秒之前的聲音作為雜訊樣本,對信號作降噪處理,得到降噪後信號的頻譜圖如下:
可以明顯的看到大部分噪音都被清除了,而語音部分仍完好無損,強度也沒有減弱,這是「移動平均濾波器」所做不到的。
3. 靜音剪切
在對音頻進行上述降噪處理後,我們還可以進一步把多餘的靜音去除掉。
剪切的原理十分簡單。首先用漢寧窗對信號做分幀。如果該幀信號強度過小,則捨去該幀。最後將保留的幀疊加起來,便得到了剪切掉靜音部分的信號。
比如,對降噪處理後的「skip」語音信號做靜音剪切,得到的新信號的頻譜圖為:
Ⅲ 怎麼通過程序(如python)判斷一個音頻文件(如wav、mp3等格式)的聲音清晰度
我用wpf畫過wav的頻譜圖和語譜圖,這里有個參考http://www.codeproject.com/Articles/488655/Visualizing-Sound
波形圖應該更簡單吧 計算聲音強度就好了 至於mp3我想應該先解碼成pcm
Ⅳ OpenCV Python 系列教程4 - OpenCV 圖像處理(上)
學習目標:
OpenCV 中有 150 多種色彩空間轉化的方法,這里只討論兩種:
HSV的色相范圍為[0,179],飽和度范圍為[0,255],值范圍為[0,255]。不同的軟體使用不同的規模。如果要比較 OpenCV 值和它們,你需要標准化這些范圍。
HSV 和 HLV 解釋
運行結果:該段程序的作用是檢測藍色目標,同理可以檢測其他顏色的目標
結果中存在一定的噪音,之後的章節將會去掉它
這是物體跟蹤中最簡單的方法。一旦你學會了等高線的函數,你可以做很多事情,比如找到這個物體的質心,用它來跟蹤這個物體,僅僅通過在相機前移動你的手來畫圖表,還有很多其他有趣的事情。
菜鳥教程 在線 HSV-> BGR 轉換
比如要找出綠色的 HSV 值,可以使用上面的程序,得到的值取一個上下界。如上面的取下界 [H-10, 100, 100],上界 [H+10, 255, 255]
或者使用其他工具如 GIMP
學習目標:
對圖像進行閾值處理,算是一種最簡單的圖像分割方法,基於圖像與背景之間的灰度差異,此項分割是基於像素級的分割
threshold(src, thresh, maxval, type[, dst]) -> retval, dst
計算圖像小區域的閾值。所以我們對同一幅圖像的不同區域得到不同的閾值,這給我們在不同光照下的圖像提供了更好的結果。
三個特殊的輸入參數和一個輸出參數
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
opencv-threshold-python
OpenCV 圖片集
本節原文
學習目標:
OpenCV 提供兩種變換函數: cv2.warpAffine 和 cv2.warpPerspective
cv2.resize() 完成縮放
文檔說明
運行結果
說明 : cv2.INTER_LINEAR 方法比 cv2.INTER_CUBIC 還慢,好像與官方文檔說的不一致? 有待驗證。
速度比較: INTER_CUBIC > INTER_NEAREST > INTER_LINEAR > INTER_AREA > INTER_LANCZOS4
改變圖像的位置,創建一個 np.float32 類型的變換矩陣,
warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) -> dst
運行結果:
旋轉角度( )是通過一個變換矩陣變換的:
OpenCV 提供的是可調旋轉中心的縮放旋轉,這樣你可以在任何你喜歡的位置旋轉。修正後的變換矩陣為
這里
OpenCV 提供了 cv2.getRotationMatrix2D 控制
cv2.getRotationMatrix2D(center, angle, scale) → retval
運行結果
cv2.getAffineTransform(src, dst) → retval
函數關系:
egin{bmatrix} x'_i y'_i end{bmatrix}egin{bmatrix} x'_i y'_i end{bmatrix} =
其中
運行結果:圖上的點便於觀察,兩圖中的紅點是相互對應的
透視變換需要一個 3x3 變換矩陣。轉換之後直線仍然保持筆直,要找到這個變換矩陣,需要輸入圖像上的 4 個點和輸出圖像上的對應點。在這 4 個點中,有 3 個不應該共線。通過 cv2.getPerspectiveTransform 計算得到變換矩陣,得到的矩陣 cv2.warpPerspective 變換得到最終結果。
本節原文
平滑處理(smoothing)也稱模糊處理(bluring),是一種簡單且使用頻率很高的圖像處理方法。平滑處理的用途:常見是用來 減少圖像上的噪點或失真 。在涉及到降低圖像解析度時,平滑處理是很好用的方法。
圖像濾波:盡量保留圖像細節特徵的條件下對目標圖像的雜訊進行抑制,其處理效果的好壞將直接影響到後續圖像處理和分析的有效性和可靠性。
消除圖像中的雜訊成分叫做圖像的平滑化或濾波操作。信號或圖像的能量大部分集中在幅度譜的低頻和中頻段,在高頻段,有用的信息會被雜訊淹沒。因此一個能降低高頻成分幅度的濾波器就能夠減弱雜訊的影響。
濾波的目的:抽出對象的特徵作為圖像識別的特徵模式;為適應圖像處理的要求,消除圖像數字化時混入的雜訊。
濾波處理的要求:不能損壞圖像的輪廓及邊緣等重要信息;圖像清晰視覺效果好。
平滑濾波是低頻增強的空間濾波技術,目的:模糊和消除噪音。
空間域的平滑濾波一般採用簡單平均法,即求鄰近像元點的平均亮度值。鄰域的大小與平滑的效果直接相關,鄰域越大平滑效果越好,但是鄰域過大,平滑也會使邊緣信息的損失的越大,從而使輸出圖像變得模糊。因此需要選擇合適的鄰域。
濾波器:一個包含加權系數的窗口,利用濾波器平滑處理圖像時,把這個窗口放在圖像上,透過這個窗口來看我們得到的圖像。
線性濾波器:用於剔除輸入信號中不想要的頻率或者從許多頻率中選擇一個想要的頻率。
低通濾波器、高通濾波器、帶通濾波器、帶阻濾波器、全通濾波器、陷波濾波器
boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) -> dst
均值濾波是方框濾波歸一化後的特殊情況。歸一化就是要把處理的量縮放到一個范圍內如 (0,1),以便統一處理和直觀量化。非歸一化的方框濾波用於計算每個像素鄰近內的積分特性,比如密集光流演算法中用到的圖像倒數的協方差矩陣。
運行結果:
均值濾波是典型的線性濾波演算法,主要方法為鄰域平均法,即用一片圖像區域的各個像素的均值來代替原圖像中的各個像素值。一般需要在圖像上對目標像素給出一個模板(內核),該模板包括了其周圍的臨近像素(比如以目標像素為中心的周圍8(3x3-1)個像素,構成一個濾波模板,即 去掉目標像素本身 )。再用模板中的全體像素的平均值來代替原來像素值。即對待處理的當前像素點(x,y),選擇一個模板,該模板由其近鄰的若干像素組成,求模板中所有像素的均值,再把該均值賦予當前像素點(x,y),作為處理後圖像在該點上的灰度個g(x,y),即個g(x,y)=1/m ∑f(x,y) ,其中m為該模板中包含當前像素在內的像素總個數。
均值濾波本身存在著固有的缺陷,即它不能很好地保護圖像細節,在圖像去噪的同時也破壞了圖像的細節部分,從而使圖像變得模糊,不能很好地去除雜訊點。
cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) → dst
結果:
高斯濾波:線性濾波,可以消除高斯雜訊,廣泛應用於圖像處理的減噪過程。高斯濾波就是對整幅圖像進行加權平均的過程,每一個像素點的值,都由其本身和鄰域內的其他像素值經過 加權平均 後得到。高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值。
高斯濾波有用但是效率不高。
高斯模糊技術生成的圖像,其視覺效果就像是經過一個半透明屏幕在觀察圖像,這與鏡頭焦外成像效果散景以及普通照明陰影中的效果都明顯不同。高斯平滑也用於計算機視覺演算法中的預先處理階段,以增強圖像在不同比例大小下的圖像效果(參見尺度空間表示以及尺度空間實現)。從數學的角度來看,圖像的高斯模糊過程就是圖像與正態分布做卷積。由於正態分布又叫作高斯分布,所以這項技術就叫作高斯模糊。
高斯濾波器是一類根據高斯函數的形狀來選擇權值的線性平滑濾波器。 高斯平滑濾波器對於抑制服從正態分布的雜訊非常有效。
一維零均值高斯函數為: 高斯分布參數 決定了高斯函數的寬度。
高斯雜訊的產生
GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst
線性濾波容易構造,並且易於從頻率響應的角度來進行分析。
許多情況,使用近鄰像素的非線性濾波會得到更好的結果。比如在雜訊是散粒雜訊而不是高斯雜訊,即圖像偶爾會出現很大值的時候,用高斯濾波器進行圖像模糊時,雜訊像素不會被消除,而是轉化為更為柔和但仍然可見的散粒。
中值濾波(Median filter)是一種典型的非線性濾波技術,基本思想是用像素點鄰域灰度值的中值來代替該像素點的灰度值,該方法在去除脈沖雜訊、椒鹽雜訊『椒鹽雜訊又稱脈沖雜訊,它隨機改變一些像素值,是由圖像感測器,傳輸信道,解碼處理等產生的黑白相間的亮暗點雜訊。椒鹽雜訊往往由圖像切割引起。』的同時又能保留圖像邊緣細節,
中值濾波是基於排序統計理論的一種能有效抑制雜訊的非線性信號處理技術,其基本原理是把數字圖像或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的像素值接近的真實值,從而消除孤立的雜訊點,對於 斑點雜訊(speckle noise)和椒鹽雜訊(salt-and-pepper noise) 來說尤其有用,因為它不依賴於鄰域內那些與典型值差別很大的值。中值濾波器在處理連續圖像窗函數時與線性濾波器的工作方式類似,但濾波過程卻不再是加權運算。
中值濾波在一定的條件下可以克服常見線性濾波器如最小均方濾波、方框濾波器、均值濾波等帶來的圖像細節模糊,而且對濾除脈沖干擾及圖像掃描雜訊非常有效,也常用於保護邊緣信息, 保存邊緣的特性使它在不希望出現邊緣模糊的場合也很有用,是非常經典的平滑雜訊處理方法。
與均值濾波比較:
說明:中值濾波在一定條件下,可以克服線性濾波器(如均值濾波等)所帶來的圖像細節模糊,而且對濾除脈沖干擾即圖像掃描雜訊最為有效。在實際運算過程中並不需要圖像的統計特性,也給計算帶來不少方便。 但是對一些細節多,特別是線、尖頂等細節多的圖像不宜採用中值濾波。
雙邊濾波(Bilateral filter)是一種非線性的濾波方法,是結合 圖像的空間鄰近度和像素值相似度 的一種折衷處理,同時考慮空域信息和灰度相似性,達到保邊去噪的目的。具有簡單、非迭代、局部的特點。
雙邊濾波器的好處是可以做邊緣保存(edge preserving),一般過去用的維納濾波或者高斯濾波去降噪,都會較明顯地模糊邊緣,對於高頻細節的保護效果並不明顯。雙邊濾波器顧名思義比高斯濾波多了一個高斯方差 sigma-d ,它是基於空間分布的高斯濾波函數,所以在邊緣附近,離的較遠的像素不會太多影響到邊緣上的像素值,這樣就保證了邊緣附近像素值的保存。 但是由於保存了過多的高頻信息,對於彩色圖像里的高頻雜訊,雙邊濾波器不能夠干凈的濾掉,只能夠對於低頻信息進行較好的濾波。
運行結果
學習目標:
形態變換是基於圖像形狀的一些簡單操作。它通常在二進制圖像上執行。
膨脹與腐蝕實現的功能
侵蝕的基本思想就像土壤侵蝕一樣,它會侵蝕前景物體的邊界(總是試圖保持前景為白色)。那它是做什麼的?內核在圖像中滑動(如在2D卷積中)。只有當內核下的所有像素都是 1 時,原始圖像中的像素( 1 或 0 )才會被視為 1 ,否則它將被侵蝕(變為零)
erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
與腐蝕的操作相反。如果內核下的至少一個像素為「1」,則像素元素為「1」。因此它增加了圖像中的白色區域或前景對象的大小增加。通常,在去除噪音的情況下,侵蝕之後是擴張。因為,侵蝕會消除白雜訊,但它也會縮小我們的物體。所以我們擴大它。由於噪音消失了,它們不會再回來,但我們的物體區域會增加。它也可用於連接對象的破碎部分
Ⅳ python中音頻圖像識別和網頁相關的庫合集!
1、OpenCV
OpenCV是最常用的圖像和視頻識別庫。毫不誇張地說,OpenCV能讓Python在圖像和視頻識別領域完全替代Matlab。
OpenCV提供各種應用程序介面,同時它不僅支持Python,還支持Java和Matlab。OpenCV出色的處理能力使其在計算機產業和學術研究中都廣受好評。
2、Librosa
Librosa是一個非常強大的音頻和聲音處理Python庫。Librosa可以用來從音頻段中提取各個部分,例如韻律,節奏以及節拍。
像Laplacia分割這樣極度復雜的演算法,在使用了Librosa之後只需幾行代碼就能輕而易舉的運用。
Python在被廣泛運用於數據科學領域前,曾經可是網頁開發領域的寵兒。因此也有很多用於網頁開發的庫。
3、Django
要想使用Python來開發一個網頁服務後端,Django一直都是不二之選。Django的設計理念便是,能用幾行代碼就建立一個網站的高級框架。
Django直接與大多數知名資料庫相連,這樣使用者就可以省下建立連接和數據模型開發的時間。Django的使用者只需專注於業務邏輯而不需擔心受創建、更新、讀取和刪除(Create,update,retrieve and delete, CURD)的操控,因為Django是一個由資料庫驅動的框架。
4、Flask
Flask是一個用於Python的輕量級網頁開發框架。其最寶貴的特點是能夠輕而易舉地進行能夠滿足任何需求的定製化處理。
有很多提供網站UI的知名Python庫和Python工具都是使用Flask構建的,例如Plotly Dash和Airflow。這些網站之所以使用Flask,正是由於其輕量級的特點。
誠然,還有許多優秀的Python庫應當被提及,但上述這些庫就足夠你研究好一陣子了。人生苦短,及時Python!
更多python知識,請關注python視頻教程!!