Python實現(xiàn)WAV音頻分析與線性回歸建模
1. 音頻數(shù)據(jù)處理流程
1.1 WAV文件讀取與預(yù)處理
使用scipy.io.wavfile讀取音頻文件,獲取采樣率與時域信號數(shù)據(jù):
from scipy.io import wavfile
sample_rate, audio_data = wavfile.read("sound/cat/1-47819-C-5.wav")
- 自動識別單聲道/立體聲:單聲道返回一維數(shù)組,立體聲返回二維數(shù)組(左/右聲道)
- 關(guān)鍵指標:采樣率(Hz)、數(shù)據(jù)類型(如int16)、數(shù)據(jù)形狀(樣本數(shù)×聲道數(shù))
1.2 聲道分離與標準化
# 立體聲分離 left_channel = audio_data[:, 0] right_channel = audio_data[:, 1] # 標準化(均值歸零、方差歸一) left_norm = (left_channel - np.mean(left_channel)) / np.std(left_channel) right_norm = (right_channel - np.mean(right_channel)) / np.std(right_channel)
標準化消除量綱差異,提升模型收斂效率。
2. 線性回歸建模核心
2.1 回歸參數(shù)計算
基于最小二乘法直接求解斜率與截距:
def linear_regression(x, y):
n = len(x)
sum_x, sum_y = np.sum(x), np.sum(y)
sum_xy = np.sum(x * y)
sum_x2 = np.sum(x ** 2)
slope = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x ** 2)
intercept = (sum_y - slope * sum_x) / n
return slope, intercept
該方法避免迭代計算,效率顯著高于梯度下降法。
2.2 滑動窗口分塊分析
sim_list = []
for i in range(0, len(left_norm)-800, 800):
x = left_norm[i:i+800:2] # 左聲道隔點采樣
y = right_norm[i:i+800:1] # 右聲道連續(xù)采樣
slope, intercept = linear_regression(x, y)
y_pred = slope * x + intercept
sim = cosine_similarity(y_pred, y) # 余弦相似度評估擬合效果
sim_list.append(sim)
- 創(chuàng)新點:通過800樣本滑動窗口捕捉局部特征
- 輸出指標:各窗口回歸方程的余弦相似度序列
3. 模型評估與可視化
3.1 誤差指標計算
def calculate_fit_error(y_true, y_pred):
mse = np.mean((y_true - y_pred) ** 2) # 均方誤差
rmse = np.sqrt(mse) # 均方根誤差
mae = np.mean(np.abs(y_true - y_pred)) # 平均絕對誤差
return mse, rmse, mae
多維度評估模型精度。
3.2 動態(tài)效果可視化
plt.figure(figsize=(12, 4))
plt.plot(sim_list, marker='o', linestyle='-', color='#FF7043')
plt.title("雙聲道線性擬合相似度變化趨勢", fontsize=14)
plt.xlabel("時間窗口索引", fontsize=12)
plt.ylabel("余弦相似度", fontsize=12)
plt.grid(alpha=0.3)
plt.show()
4. 完整代碼實現(xiàn)
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
# 中文顯示支持
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
def cosine_similarity(a, b):
"""計算余弦相似度"""
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def linear_regression(x, y):
"""最小二乘法線性回歸"""
n = len(x)
sum_x, sum_y = np.sum(x), np.sum(y)
sum_xy = np.sum(x * y)
sum_x2 = np.sum(x ** 2)
slope = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x ** 2)
intercept = (sum_y - slope * sum_x) / n
return slope, intercept
def main():
# 數(shù)據(jù)讀取
_, audio = wavfile.read("sound/cat/1-47819-C-5.wav")
left = (audio[:,0]-np.mean(audio[:,0]))/np.std(audio[:,0])
right = (audio[:,1]-np.mean(audio[:,1]))/np.std(audio[:,1])
# 滑動窗口分析
sim_list = []
for i in range(0, len(left)-800, 800):
x, y = left[i:i+800:2], right[i:i+800:1]
if len(x) > len(y): x = x[:len(y)]
slope, intercept = linear_regression(x, y)
sim_list.append(cosine_similarity(slope*x+intercept, y))
# 可視化
plt.plot(sim_list)
plt.show()
if __name__ == "__main__":
main()
5. 應(yīng)用場景與擴展
聲音特征分析:通過回歸斜率變化識別音頻中的突發(fā)事件(如爆破音、重音節(jié))
音頻質(zhì)量評估:雙聲道擬合相似度越高,說明聲道一致性越好(適用于設(shè)備測試)
擴展方向
- 引入MFCC(梅爾頻率倒譜系數(shù))替代原始信號
- 結(jié)合LSTM模型捕捉長期依賴關(guān)系
- 遷移至帕金森病語音診斷等醫(yī)療場景
到此這篇關(guān)于Python實現(xiàn)WAV音頻分析與線性回歸建模的文章就介紹到這了,更多相關(guān)Python音頻分析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python解決拋小球問題 求小球下落經(jīng)歷的距離之和示例
這篇文章主要介紹了Python解決拋小球問題 求小球下落經(jīng)歷的距離之和,涉及Python基于遞歸的數(shù)值計算相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
python基礎(chǔ)教程之基本數(shù)據(jù)類型和變量聲明介紹
這篇文章主要介紹了python基礎(chǔ)教程之基本數(shù)據(jù)類型和變量聲明介紹,首先講解了變量聲明的一些知識,然后列出最常用的基本數(shù)據(jù)類型,需要的朋友可以參考下2014-08-08
Python實現(xiàn)的刪除重復(fù)文件或圖片功能示例【去重】
這篇文章主要介紹了Python實現(xiàn)的刪除重復(fù)文件或圖片功能,結(jié)合實例形式分析了Python基于os與hashlib模塊針對文件的讀取、hash計算及重復(fù)性判定等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04
Python內(nèi)置方法和屬性應(yīng)用:反射和單例(推薦)
這篇文章主要介紹了Python內(nèi)置方法和屬性應(yīng)用:反射和單例,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
Python之numpy.random.seed()和numpy.random.RandomState()區(qū)別及說明
這篇文章主要介紹了Python之numpy.random.seed()和numpy.random.RandomState()區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2017-10-10
Windows系統(tǒng)中將Python添加到系統(tǒng)環(huán)境詳細圖文教程
當(dāng)在命令行使用python或pip指令時,可能會遇到pip不是內(nèi)部命令的報錯,這通常是因為在安裝Python時未將其添加至系統(tǒng)環(huán)境變量,或者有多個Python環(huán)境導(dǎo)致路徑不一致,文中將解決辦法介紹的非常詳細,需要的朋友可以參考下2024-10-10

