PyTorch音頻處理技術及應用研究:從特征提取到相似度分析

文章目錄

  • 音頻處理技術及應用
    • 音頻處理技術
    • 音視頻摘要技術
    • 音頻識別及應用
  • 梅爾頻率倒譜系數音頻特征
    • 爾頻率倒譜系數簡介及參數提取過程
    • 音頻處理
    • 快速傅里葉變換(FFT)
    • 能量譜處理
    • 離散余弦轉換
  • 練習案例:音頻建模
    • 加載音頻數據源
    • 波形變換的類型
    • 繪制波形頻譜圖
    • 波形Mu-Law 編碼
    • 對比前后波形的比較
  • 練習案例:音頻相似度分析
    • 案例說明
    • 實現代碼
    • 結果分析

音頻處理技術及應用

  • 音頻信號具有采集設備簡單、存儲空間小、處理速度快等優勢,本節介紹其核心技術及應用場景。

音頻處理技術

  • 音頻處理技術的商業化應用日益廣泛。例如,微軟于2021年收購智能語音公司Nuance,主要看中其在醫療領域的對話式AI和云端解決方案。Nuance的Dragon語音轉錄軟件采用深度學習技術,持續提升識別精度,該技術已應用于蘋果Siri等產品。

  • 隨著移動設備的普及和算力提升,現代智能終端普遍配備聲音傳感器和高效處理器,使音頻處理技術廣泛應用于以下領域: 多媒體數據檢索 、環境檢測與自適應調整 、視覺輔助系統(在視線受阻或光照不足時提供補充信息)

  • 關鍵技術突破包括:

    • 環境類別識別:設備可通過音頻分析自動切換模式(如手機識別場景類型)
    • 輔助功能增強:助聽器等設備整合環境識別功能,提升用戶體驗
    • 場景感知:系統能通過聲音特征(如對話、背景音)判斷環境類型(如區分餐廳和車輛)
  • 音頻場景建模主要解決兩個問題: 特定場所的聲學特征建模(如餐廳、車站) 場景內對象/事件的聲學特征檢測(如笑聲、鳴笛聲)。盡管已開發MFCC等特征提取方法,但由于聲音信號的復雜性,建模分析仍面臨挑戰。

音視頻摘要技術

該技術通過提取關鍵內容實現信息壓縮:

  • 音頻摘要:識別重要轉折點,生成時間縮短但保留核心內容的版本
  • 視頻摘要:濃縮長視頻的關鍵片段,特別適用于監控錄像分析

關鍵技術實現:

  1. 音頻興趣度量化:
    • 分割音頻為等長片段
    • 提取MFCC特征并計算協方差矩陣
    • 通過特征空間映射評估興趣度(實驗證明可有效識別笑聲等特征音)
  2. 音視頻融合分析:場景轉換常伴隨聲音變化(如球賽進球時的歡呼聲),可輔助關鍵幀提取

音頻識別及應用

主要解決海量音頻數據的高效檢索問題,核心應用包括:

  1. 音頻分類: 四大類別:語音、音樂、環境音、靜音

    • 處理流程: 靜音檢測(基于能量閾值) ,MFCC特征提取,基于MDL的高斯建模分割,分層分類(語音/音樂/環境音)
  2. 音樂情感分析: 情感模型:

    • 類別模型(6種基礎情感)
    • 維度模型(情感空間坐標)
    • 應用價值:實現多媒體內容的情緒化索引和檢索

梅爾頻率倒譜系數音頻特征

  • 在語音識別(SpeechRecognition)和說話者識別(SpeakerRecognition)方面,最常用到的語音特征就是梅爾頻率倒譜系數(MFCC)。

爾頻率倒譜系數簡介及參數提取過程

  • 梅爾頻率倒譜系數(MFCC)是音頻處理中常用的特征提取方法。它的設計模仿了人耳對聲音的感知特點。
  1. 基本原理:人耳對低頻聲音更敏感(比如能更好地區分低音變化),高頻區域的區分能力相對較弱

  2. 計算過程:

    1. 先設置一組三角濾波器(低頻區域濾波器密集,高頻區域稀疏)
    2. 讓音頻信號通過這些濾波器
    3. 記錄每個濾波器輸出的能量值
    4. 對這些能量值做進一步處理得到最終特征

  1. 主要優勢:不受原始聲音內容影響(適用于各種聲音);抗噪能力強(在嘈雜環境中仍能準確提取特征);符合人耳聽覺特性(提取的特征更貼近實際聽感)
  • 這種方法讓機器能像人耳一樣"聽懂"聲音的關鍵特征。
  • MFCC參數的提取過程如圖
    在這里插入圖片描述

音頻處理

  • 信號預處理過程包括預加重,分偵,加載。預加重的過程即使將語音信號通過一個高通濾波器得到新的信號,如語音信號 s ( n ) s(n) s(n)通過高通濾波器 H ( z ) = l ? α × ( z ? l ) H(z)=l-α×(z-l) H(z)=l?α×(z?l)預加重后得到的信號為 s 2 ( n ) = s ( n ) ? a × s ( n ? l ) s_2(n)=s(n)-a×s(n-l) s2?(n)=s(n)?a×s(n?l),其中,系數 a a a介于 0.9 0.9 0.9 1.0 1.0 1.0之間。預加重的目的是補償音頻信號被隱藏的高頻部分,從而凸顯高頻的共振峰。
  • 預處理過程的第二個步驟是分幀,語音信號分幀的目的是將若干個取樣點集合作為一個觀測單位,即處理單位,一般認為 10 ~ 30 m s 10~30ms 1030ms的語音信號是穩定的,比如采樣率為 44.1 k H z 44.1kHz 44.1kHz的聲音信號,取20ms長度為一個幀長,那么一個幀長由 44100 × 0.02 = 882 44100×0.02=882 44100×0.02=882個取樣點組成。通常為了避免相鄰兩幀之間的變化過大,會在兩相鄰幀之間設置一段的重疊區域,重疊區域的長度一般是幀長的一半或 1 / 3 1/3 1/3
  • 在完成預加重和分幀之后,下一步是對每一幀應用漢明窗。通常,在處理語音信號時,“加窗”意味著一次只處理窗口內的數據。由于實際的語音信號往往很長,無法一次性全部處理。只需要每次分析一段數據即可。通過構造特定的函數實現,函數在處理區間內取非零值,在非處理區間內則為零。漢明窗就是這樣一種函數,任何信號與漢明窗,任何信號與漢明窗相乘后,結果的一部分將是非零值,其余部分則為零。處理完一個窗口內的數據后,需要移動窗口,通常移動的步長是幀長的一半或三分之一以產生重疊。
  • 漢明窗函數的形式
    w ( n , a ) = ( 1 ? a ) ? a × c o s ( 2 π × n N ? 1 ) 0 ≤ n ≤ N ? 1 w(n,a)=(1-a)-a\times cos(2\pi \times \frac{n}{N-1}) 0\leq n\leq N-1 w(n,a)=(1?a)?a×cos(2π×N?1n?)0nN?1
  • N N N是處理數據點的個數(幀長),分幀是窗函數截取原音頻信號形成的,一般a取值為0.46,漢明窗函數還可以寫成如下形式:
    KaTeX parse error: Undefined control sequence: \leqN at position 89: …{N-1}) 0\leq n \?l?e?q?N?\\ 0\quad \te…
  • 加漢明窗后的聲音信號如下:
    s ( n ) = s ( n ) × w ( n ) n = 0 , 1 , . . . , N ? 1 s(n)=s(n)\times \qquad w(n) n=0,1,...,N-1 s(n)=s(n)×w(n)n=0,1,...,N?1

快速傅里葉變換(FFT)

  • 快速傅里葉變換(FastFourierTransform,FFT)是一種高效計算離散傅里葉變換(DFT)的算法,在音頻處理中有著廣泛的應用。
  • 原始音頻信號在時域上難以直觀體現特征,因此需要通過加漢明窗后進行快速傅里葉變換(FFT),將其轉換到頻域來觀察聲音的能量分布特征。
  • FFT是對離散傅里葉變換(DiscreteFourierTransform,DFT)的改進算法,快速算法實現的基本思想是分析原有變換的計算特點以及某些子運算的特殊性,想辦法減少乘法和加法操作次數,換一種方式實現原變換的效果。
  • 語音信號的離散傅里葉變換如下
    S a ( k ) = ∑ n = 0 N ? 1 s ( n ) ? e ? j 2 π k / N 0 ≤ k ≤ N S_a(k)=\sum_{n=0}^{N-1}s(n)*e^{-j2\pi k/N} \qquad 0\leq k \leq N Sa?(k)=n=0N?1?s(n)?e?j2πk/N0kN
  • s ( n ) s(n) s(n)是加窗后的語音信號, N N N表示傅里葉變換的點數。
  • FFT是利用分治策略和對稱性來減少DFT計算中的冗余步驟,從而提高了計算效率。這種算法特別適合信號處理中的頻譜分析,因為它可以快速地從時域信號中提取出頻域信息。

能量譜處理

  • 音頻預處理后,就需要計算能量譜,即求頻譜幅度的平方。其計算方法是,將能量譜輸入一組Mel頻率的三角帶通濾波器組,三角濾波器的中心頻率為 f ( m ) , m = 1 , 2 , . . . , M f(m),m=1,2,...,M f(m)m=1,2,...,M,f(m)的取值隨m取值的減小而縮小,隨著m取值的增大而變寬,Mel頻率代表的是一般人耳對于頻率的感受度,其與一般的頻率間的關系如下。
    m e l ( f ) = 2595 ? l g ( 1 + f 700 ) mel(f)=2595*lg(1+\frac{f}{700}) \\ mel(f)=2595?lg(1+700f?)
  • 或者
    m e l ( f ) = 1125 ? l g ( 1 + f 700 ) mel(f)=1125*lg(1+\frac{f}{700}) mel(f)=1125?lg(1+700f?)
  • 人耳對頻率的感受度是呈對數變化的,在高頻部分人耳對聲音的感受越來越粗糙,在低頻部分則相對敏感。三角濾波器引入的目的是平滑化頻譜,消除諧波的作用,并突出原始信號的共振峰,因此MFCC參數不能呈現原始語音的音調或音高,即提取聲音信號的MFCC特征時,不受語音音調的影響。三角濾波器的頻率響應定義如下所示,其中
    ∑ m = 0 M ? 1 H m ( k ) = 1 \sum_{m=0}^{M-1}H_m(k)=1 m=0M?1?Hm?(k)=1
    H m ( k ) = { 0 k < f ( m ? 1 ) 2 ( k ? f ( m ? 1 ) ) ( f ( m + 1 ) ? f ( m ? 1 ) ) ( f ( m ) ? f ( m ? 1 ) ) f ( m ? 1 ) ? k ? f ( m ) 2 ( f ( m + 1 ) ? k ) ( f ( m + 1 ) ? f ( m ? 1 ) ) ( f ( m + 1 ) ? f ( m ) ) f ( m ) ? k ? f ( m ? 1 ) 0 k ? f ( m + 1 ) \begin{equation} H _ { m } ( k ) = \left\{ \begin{array} { l l } { 0 } & { k < f ( m - 1 ) } \\ { \cfrac { 2 ( k - f ( m - 1 ) ) } { ( f ( m + 1 ) - f ( m - 1 ) ) ( f ( m ) - f ( m - 1 ) ) } } & { f ( m - 1 ) \leqslant k \leqslant f ( m ) } \\ { \cfrac { 2 ( f ( m + 1 ) - k ) } { ( f ( m + 1 ) - f ( m - 1 ) ) ( f ( m + 1 ) - f ( m ) ) } } & { f ( m ) \leqslant k \leqslant f ( m - 1 ) } \\ { 0 } & { k \geqslant f ( m + 1 ) } \end{array} \right. \end{equation} Hm?(k)=? ? ??0(f(m+1)?f(m?1))(f(m)?f(m?1))2(k?f(m?1))?(f(m+1)?f(m?1))(f(m+1)?f(m))2(f(m+1)?k)?0?k<f(m?1)f(m?1)?k?f(m)f(m)?k?f(m?1)k?f(m+1)???

離散余弦轉換

  • 離散余弦轉換是一種在數字信號處理中非常有用的工具,它通過將信號轉換為頻域表示,幫助分析和處理信號,尤其在圖像和音頻編碼領域有著重要的應用。例如,我們對對數能量做離散余弦轉換(DCT),得到的 C ( n ) C(n) C(n) 即為 M M M 階的Mel倒譜參數,通常取前12個作為最終的MFCC特征。計算公式如下:

C ( n ) = ∑ m = 0 N ? 1 S ( m ) cos ? ( π n ( m ? 0.5 ) M ) 0 ≤ n < M C(n) = \sum_{m=0}^{N-1} S(m) \cos \left( \frac{\pi n (m - 0.5)}{M} \right) \quad 0 \leq n < M C(n)=m=0N?1?S(m)cos(Mπn(m?0.5)?)0n<M

  • 上式得到的倒譜參數只能反映語音信號的靜態特性,如果要獲得語音信號的動態特性需采用靜態特性的差分譜描述,結合動態和靜態的特征能更有效地提高對信號的識別性能,計算差分參數的公式如下:

d t = { C t + 1 ? C t t < K ∑ k = 1 K k ( C t + k ? C t ? k ) 2 ∑ k = 1 K k 2 其他 C t ? C t ? 1 t ≥ Q ? K d_t = \begin{cases} C_{t+1} - C_t & t < K \\ \frac{\sum_{k=1}^{K} k (C_{t+k} - C_{t-k})}{\sqrt{2 \sum_{k=1}^{K} k^2}} & \text{其他} \\ C_t - C_{t-1} & t \geq Q - K \end{cases} dt?=? ? ??Ct+1??Ct?2k=1K?k2 ?k=1K?k(Ct+k??Ct?k?)?Ct??Ct?1??t<K其他tQ?K?

  • 其中, Q Q Q 表示的是倒譜系數的階數, d t d_t dt? 表示第 t t t 個一階差分, C t C_t Ct? 表示第 t t t 個倒譜系數, K K K 表示的是一階導數的時間差,取1或2。

練習案例:音頻建模

加載音頻數據源

import torchaudio
import matplotlib.pyplot as plt#加載聲音文件,原始音頻信號
filename = "恭喜發財.mp3"
# 加載音頻文件并獲取波形和采樣率
waveform,sample_rate = torchaudio.load(filename)
# 顯示波形
print("波形形狀:{}".format(waveform.size()))
# 顯示采樣率
print("波形采樣率:{}".format(sample_rate))
# 繪制波形圖并添加標題和坐標軸標簽
plt.figure()
plt.plot(waveform.t().numpy())
plt.title("Audio Waveform")
plt.xlabel("Sample Points")
plt.ylabel("Amplitude")
plt.show()
波形形狀:torch.Size([2, 8935836])
波形采樣率:44100

在這里插入圖片描述

波形變換的類型

torchaudio庫支持的波形轉換類型如下。

功能名稱描述
重采樣 (Resample)將波形重采樣為其他采樣率。
頻譜圖 (Spectrogram)從波形創建頻譜圖。
GriffinLim使用Griffin-Lim轉換從線性比例幅度譜圖計算波形。
ComputeDeltas計算張量(通常是聲譜圖)的增量系數。
ComplexNorm計算復數張量的范數。
MelScale使用轉換矩陣將正常STFT轉換為Mel頻率STFT。
AmplitudeToDB將頻譜圖從功率/振幅標度變為分貝標度。
MFCC根據波形創建梅爾頻率倒譜系數。
MelSpectrogram使用PyTorch中的STFT功能從波形創建MEL頻譜圖。
MuLawEncoding基于mu-law壓擴對波形進行編碼。
MuLawDecoding解碼mu-law編碼的波形。
TimeStretch在不更改給定速率的音高的情況下,及時拉伸頻譜圖。
FrequencyMasking在頻域中屏蔽頻譜圖應用。
TimeMasking在時域中屏蔽頻譜圖應用。

繪制波形頻譜圖

  1. 以對數刻度查看頻譜圖的對數。首先使用torchaudio庫中的Spectrogram函數將波形數據轉換為頻譜圖。然后打印出頻譜圖的形狀,并使用Matplotlib庫繪制并顯示頻譜圖。通過觀察頻譜圖,可以了解信號在不同頻率上的能量分布情況。
import torchaudio
import matplotlib.pyplot as plt
#加載聲音文件,原始音頻信號
filename = "恭喜發財.mp3"
# 加載音頻文件并獲取波形和采樣率
waveform,sample_rate = torchaudio.load(filename)
#對數刻度查看頻譜圖
spectrogram = torchaudio.transforms.Spectrogram()(waveform)
# 打印頻譜圖的形狀,即頻譜圖的尺寸
print("頻譜圖形狀:{}".format(spectrogram.size()))
plt.figure()
"""
# 顯示頻譜圖的對數變換結果spectrogram.log2()[0,:,:].numpy()表示取頻譜圖的對數變換結果,并將其轉換為NumPy 數組cmap='gray用于指定顏色映射為灰度色aspect="auto”表示自動調整圖像的縱橫比
"""
plt.imshow(spectrogram.log2()[0,:,:].numpy(),cmap='gray',aspect="auto")
plt.show()
頻譜圖形狀:torch.Size([2, 201, 44680])

在這里插入圖片描述

  1. 使用對數刻度查看梅爾頻譜圖。將波形數據轉換為梅爾頻譜圖,并將其可視化顯示出來,以便觀察信號在梅爾頻率尺度上的能量分布情況。使用MelSpectrogram函數來生成梅爾頻譜圖。梅爾頻譜圖是一種特殊的頻譜表示,它基于梅爾頻率尺度,常用于語音處理等領域。
import torchaudio
import matplotlib.pyplot as plt
#加載聲音文件,原始音頻信號
filename = "恭喜發財.mp3"
# 加載音頻文件并獲取波形和采樣率
waveform,sample_rate = torchaudio.load(filename)
#對數刻度查看梅爾光譜圖
spectrogram = torchaudio.transforms.MelSpectrogram()(waveform)
print("梅爾頻譜圖形狀:{}".format(spectrogram.size()))
plt.figure()
# 顯示梅爾頻譜圖的對數變換結果
p = plt.imshow(spectrogram.log2()[0,:,:].detach().numpy(),cmap='viridis',aspect="auto")
plt.show()
梅爾頻譜圖形狀:torch.Size([2, 128, 44680])

在這里插入圖片描述

  1. 重新采樣波形,一次一個通道。重采樣常用于改變波形的采樣率,以便適應不同的需求或處理。
import torchaudio
import matplotlib.pyplot as plt
#加載聲音文件,原始音頻信號
filename = "恭喜發財.mp3"
# 加載音頻文件并獲取波形和采樣率
waveform,sample_rate = torchaudio.load(filename)
# 計算新的采樣率,將原始采樣率除以15
new_sample_rate = sample_rate/15
# 選擇要處理的通道,設置為0
channel = 0
# 使用Resample函數對波形進行重采樣將原始采樣率和新的采樣率作為參數傳遞給函數,并將波形數據的指定通道轉換為一維張量
transformed = torchaudio.transforms.Resample(sample_rate,new_sample_rate)(waveform[channel,:].view(1,-1))
# 打印變換后波形的形狀,即尺寸信息
print("變換后波形形狀:{}".format(transformed.size()))
plt.figure()
# 繪制變換后的波形 transformed[O,:]表示取變換后波形的第一個樣本,并將其轉換為NumPy數組進行繪圖
plt.plot(transformed[0,:].numpy())
plt.show()
變換后波形形狀:torch.Size([1, 595723])

在這里插入圖片描述

波形Mu-Law 編碼

  • 基于Mu-Law編碼對信號進行編碼,需要信號在-1和1之間。由于張量只是一個常規的PyTorch張量,因此可以在其上應用標準運算符。
print("波形最小值:{}\n波形最大值:{}\n波形平均值:{}".format(waveform_.min(),waveform_.max(),waveform_.mean()))
波形最小值:-1.0179462432861328
波形最大值:0.9967186450958252
波形平均值:-1.8553495465312153e-05
  • 對波形進行歸一化,使其處于-1到1之間。
#波形的歸一化
def normalize(tensor):tensor_minusmean = tensor - tensor.mean()return tensor_minusmean/tensor_minusmean.abs().max()waveform_normalize = normalize(waveform)print("波形最小值:{}\n波形最大值:{}\n波形平均值:{}".format(waveform_normalize.min(),waveform_normalize.max(),waveform_normalize.mean()))
波形最小值:-1.0
波形最大值:0.9791827201843262
波形平均值:1.3822981648203836e-09
  • 應用編碼波形,繪制波形圖幫助理解變換后的波形特征。
#新波形Mu-Law編碼
transformed = torchaudio.transforms.MuLawEncoding()(waveform_normalize)
print("變換后波形形狀: {}".format(transformed.size()))plt.figure()
plt.plot(transformed[0,:].numpy())
plt.show()

在這里插入圖片描述

  • 解碼并觀察到解碼后新波形的形狀和特征。Mu-Law編碼是Mu-Law編碼的逆操作,用于將編碼后的波形還原為原始波形的近似。繪制波形圖可以幫助直觀地理解解碼后的波形特征。
#對新波形解碼
reconstructed = torchaudio.transforms.MuLawDecoding()(transformed)
print("新波形形狀: {}".format(reconstructed.size()))plt.figure()
plt.plot(reconstructed[0,:].numpy())
plt.show()

在這里插入圖片描述

對比前后波形的比較

  • 分析波形變換前后是否存在較大差異,可以將原始波形與歸一化和Mu-Law變換后的波形進行比較。評估原始波形和重構波形之間的相似度或差異程度。
#比較原始波形與新波形
epsilon = 1e-8
err = ((waveform - reconstructed).abs() / (waveform.abs() + epsilon)).mean()
print("原始信號和重構信號之間的差異: {:.2%}".format(err))
原始信號和重構信號之間的差異: 27.08%

練習案例:音頻相似度分析

案例說明

  • 通過使用torchaudio庫和余弦相似度研究兩個音頻之間的相似程度,從而根據用戶喜歡的音頻信號進行音樂等方面的推薦。

實現代碼

import torch
import torchaudio
import soundfile
import matplotlib.pyplot as plt
# 支持中文的字體
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 解決負號 '-' 顯示為方塊的問題filename1 = "教程1.wav"
waveform1,sample_rate1 = torchaudio.load(filename1)
print("Shape of waveform:{}".format(waveform1.size())) #音頻大小
print("sample rate of waveform:{}".format(sample_rate1))#采樣率
plt.figure()
plt.plot(waveform1.t().numpy())
plt.title("教程1波形")
plt.show()filename2 = "教程2.wav"
waveform2,sample_rate2 = torchaudio.load(filename2)
print("Shape of waveform:{}".format(waveform2.size())) #音頻大小print("sample rate of waveform:{}".format(sample_rate2))#采樣率
plt.figure()
plt.plot(waveform2.t().numpy())
plt.title("教程2波形")
plt.show()similarity = torch.cosine_similarity(waveform1, waveform2, dim=0)
print('similarity', similarity)
# 輸出平均差異值
print(similarity.mean())
# 輸出中位數
print(similarity.median())

結果分析

在這里插入圖片描述
在這里插入圖片描述

Shape of waveform:torch.Size([2, 22601250])
sample rate of waveform:44100
Shape of waveform:torch.Size([2, 22601250])
sample rate of waveform:44100
similarity tensor([0.0000, 0.0000, 0.0000,  ..., 0.9701, 1.0000, 0.9487])
tensor(-6.3115e-05)
tensor(0.)
  • 余弦相似度是一種常用的相似性度量,用于衡量兩個向量之間的相似程度。這里用于比較兩個波形之間的相似度運行結果為similarity tensor([0.0000, 0.0000, 0.0000, ..., 0.9701, 1.0000, 0.9487])
  • 相似度矩陣的均值similarity.mean()計算相似度矩陣的均值。
  • 相似度矩陣的中位數similarity.median()接近于0,說明兩個音頻不相思。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80552.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80552.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80552.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙OSUniApp 實現的語音輸入與語音識別功能#三方框架 #Uniapp

UniApp 實現的語音輸入與語音識別功能 最近在開發跨平臺應用時&#xff0c;客戶要求添加語音輸入功能以提升用戶體驗。經過一番調研和實踐&#xff0c;我成功在UniApp項目中實現了語音輸入與識別功能&#xff0c;現將過程和方法分享出來&#xff0c;希望對有類似需求的開發者有…

2025年衛星遙感行業最新發展趨勢深度分析

一、國內發展趨勢&#xff1a;政策引領與技術突破雙輪驅動 &#xff08;一&#xff09;政策體系持續完善&#xff0c;頂層設計深化行業發展 國家級戰略與標準體系構建 中國政府將衛星遙感產業納入“十四五”規劃核心戰略&#xff0c;明確構建“通導遙”一體化空間基礎設施。20…

SIP協議棧--osip源碼梳理

文章目錄 osiposip主體結構體code main函數 狀態機轉化結構體code狀態轉換 sip事務結構體code osip_dialog結構體code 創建并發送200 OK響應 osip_message結構體code osip_eventcode 打印接收到的SIP消息 osip OSIP&#xff08;Open Source Implementation of SIP&#xff09;…

Linux之Yum源與Nginx服務篇

1.Yum源知識理論總結概括 Yum源概述 Yum 源 即軟件倉庫的標識&#xff0c;里面承載著軟件包集合 Yum源組成 包含模塊 【OS】、【everything】、【EPOL】、【debuginfo】、【source】、【update-source】 【os】:簡稱operator system 它內部包含操作系統的核心組件&#x…

從單體架構到微服務:架構演進之路

引言&#xff1a;當“大貨車”遇上“集裝箱運輸” 在軟件開發領域&#xff0c;單體架構曾像一輛載滿貨物的大貨車&#xff0c;將所有功能打包在一個應用中。但隨著業務復雜度飆升&#xff0c;這輛“大貨車”逐漸陷入泥潭&#xff1a;啟動慢如蝸牛、故障波及全局、升級如履薄冰……

AM32電調學習解讀九:ESC上電啟動關閉全流程波形分析

這是第九篇&#xff0c;前面的文章把各個模塊的實現都介紹了一輪&#xff0c;本章是從運行的角度結合波形圖&#xff0c;把整個流程走一遍。 先看下一運行的配置&#xff0c;我把一些配置關閉了&#xff0c;這樣跑起來會好分析一些&#xff0c;不同配置跑起來效果會有差異。使用…

全球寵物經濟新周期下的亞馬遜跨境采購策略革新——寵物用品賽道成本優化三維路徑

在全球"孤獨經濟"與"銀發經濟"雙輪驅動下&#xff0c;寵物用品市場正經歷結構性增長。Euromonitor數據顯示&#xff0c;2023年全球市場規模突破1520億美元&#xff0c;其中中國供應鏈貢獻度達38%&#xff0c;跨境電商出口增速連續三年超25%。在亞馬遜流量紅…

reshape/view/permute的原理

在pytorch中&#xff0c;Tensor的存儲是行主序的&#xff0c;也就是意味著最后一個維度的元素的存儲時連續的&#xff0c;reshape和view并不改變元素存儲的內存&#xff0c;僅僅改變訪問的間隔&#xff0c;下面舉例說明&#xff1b; 比如一個23的Tensor在內存中的存儲是連續的&…

upload-labs靶場通關詳解:第11關

一、分析源代碼 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(UPLOAD_PATH)) {$deny_ext array("php","php5","php4","php3","php2","html","htm","phtml"…

L1-7 最短字母串【保姆級詳細講解】

請你設計一個程序&#xff0c;該程序接受起始字母和目標字母作為輸入&#xff0c;通過在字母表中向前或向后移動來計算兩個給定字母之間的最短路徑。然后&#xff0c;程序會沿著最短路徑打印出從起始字母到目標字母的所有字母。例如&#xff0c;如果輸入“c”和“k”作為起始字…

項目QT+ffmpeg+rtsp(三)——延遲巨低的項目+雙屏顯示

文章目錄 前言雙屏顯示widget.cppwidget.h前言 對于復現情況,分為兩種情況 第一種,對于我而言,是直接解壓后,就能直接運行了 第二種,對于師兄而言,需要你構建debug后,會產生這個文件夾,執行的時候,地址應該在這,我猜的,這里面沒有dll,exe程序就找不到dll這些庫,你…

ansible進階06

復雜的循環結構 循環基礎 [studentworktest myansible]$ cat users.yml --- - name: create usershosts: serveratasks:- name: create some usersuser:name: "{{item}}"password: "{{123456|password_hash(sha512)}}"state: presentloop:- zhangsan- li…

Go 模塊版本管理

Go 模塊版本管理指南 1、創建帶注釋的 Git 標簽 基本命令 # 創建帶注釋的標簽 git tag -a v1.0.0 -m "Release version 1.0.0 - initial stable release" -a&#xff1a;創建帶注釋的標簽 -m&#xff1a;添加標簽注釋信息 # 推送標簽到遠程倉庫 git push origin v…

Java—— IO流 第一期

什么是IO流 存儲和讀取數據的解決方案 I&#xff1a;input O&#xff1a;output 流&#xff1a;像水流一樣傳輸數據 IO流的作用 用于讀寫數據(本地文件&#xff0c;網絡) IO流的分類 按照流向分類 輸出流&#xff1a;程序 --> 文件 輸入流&#xff1a;文件 --> 程序 按照…

物聯網安全技術的最新進展與挑戰

隨著物聯網&#xff08;IoT&#xff09;技術的飛速發展&#xff0c;越來越多的設備被連接到互聯網&#xff0c;從智能家居設備到工業控制系統&#xff0c;物聯網正在深刻改變我們的生活和生產方式。然而&#xff0c;物聯網的安全問題也日益凸顯&#xff0c;成為制約其發展的關鍵…

【深度學習基礎】損失函數與優化算法詳解:從理論到實踐

【深度學習基礎】損失函數與優化算法詳解&#xff1a;從理論到實踐 一、引言 1. 損失函數與優化算法在深度學習中的核心作用 在深度學習中&#xff0c;模型訓練的本質是通過不斷調整參數&#xff0c;使模型輸出盡可能接近真實值。這一過程的核心驅動力是損失函數&#xff08;…

mvc-review

review&#xff1a; 1.Servlet生命周期中初始化方法&#xff1a;init(),init(config) public void init(ServletConfig config) throws ServletException { this.config config; this.init(); } 因此&#xff0c;如果我們需要…

YouTube視頻字幕轉成文章算重復內容嗎?

很多創作者誤以為「自己說的話不算抄襲」&#xff0c;卻不知道YouTube自動生成的字幕早已被搜索引擎存檔。 去年就有案例&#xff1a;某美食博主將教程視頻字幕轉為圖文&#xff0c;結果原創度檢測僅42%&#xff0c;導致頁面權重暴跌。 本文揭秘5個實操技巧&#xff1a;從刪除…

R語言數據可視化

R note book 文檔–輸出html格式文檔&#xff0c;plotly不能生成PDF文件 --- title: "R語言數據可視化" output: html_notebook ---在R語言中進行數據可視化是數據分析和呈現的重要環節&#xff0c;R提供了多種強大的繪圖系統和工具。以下是常見的數據可視化方法和示…

Axure難點解決分享:垂直菜單展開與收回(4大核心問題與專家級解決方案)

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝!如有幫助請訂閱專欄! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 課程主題:垂直菜單展開與收回 主要內容:超長菜單實現、展開與收回bug解釋、Axure9版本限制等問題解…