音頻知識
1) 通道數
又稱聲道數。是在采集(錄制)聲音時引入的概念,即用幾個通道去錄制聲音。一般來說,單聲道和雙聲道的音頻文件較為常見。例如在聲源的不同位置放置通道去錄制,則可以獲得多通道的音頻數據。
2) 采樣率
即每秒鍾內采集的樣本個數,每個通道分別采集。音頻文件的采樣率通常較高,例如44100Hz、32000Hz等。
3) 位深
又稱之為 量化精度、位寬,表示一個楊本值采用多少bit來表示,用的bit越多則越接近樣本的原值。例如若用3個bit表示,則只有2的3次方,也就是8個不同的值,而若用16bit、24bit或更多的bit去量化樣本值,則表示的不同指就越多,從而音頻聽起來就更逼真。
4) 幀數
幀數也就是樣本個數。對於“總幀數”要根據上下文來判斷,可以是一個通道(聲道)的總幀數,也可以是所有通道的總幀數。計算公式為:樣本個數=文件的大小/位深精度/通道數。
5) 波形圖
又稱振幅圖,是音頻的振幅(或能量)這個維度的圖形表達。波形圖的橫坐標一般為時間,縱坐標一般為dB(即分貝)來表示;有的時候只關心振幅的趨勢,那就對振幅進行歸一化為[-1,1]范圍內。
python 代碼
import wave from pydub import AudioSegment import numpy as np import matplotlib.pyplot as plt AudioSegment.converter = r"C:\Users\v-yunhgu\Desktop\VoiceTest\FFmpeg\ffmpeg.exe" AudioSegment.ffprobe = r"C:\Users\v-yunhgu\Desktop\VoiceTest\FFmpeg\ffprobe.exe" def ConvertAudio2Wav(path): # 將mp3 音頻轉為wav,因為mp3格式經過了壓縮,導致失去了很多信息 audio = AudioSegment.from_mp3(path) audio.export('temp.wav', format='wav') def DrawWav(): f = wave.open(r"temp.wav", "rb") # 讀取音頻數據,並把數據轉化為字符串形式 params = f.getparams() nchannels, sampwidth, framerate, nframes = params[:4] print(f"nchannels: {nchannels},sampwidth: {sampwidth},framerate: {framerate},nframes: {nframes}") str_data = f.readframes(nframes) f.close() # 字符串轉化為整數 wave_data = np.fromstring(str_data, dtype=np.int16) # 歸一化數據 wave_data = wave_data*1.0/(max(abs(wave_data))) # 將數據轉化為二維向量 wave_data = np.reshape(wave_data, [nframes, nchannels*2]) print(wave_data.shape) # 通過取樣點數和取樣頻率計算出每個取樣的時間。 time = np.arange(0, nframes)/framerate print(f"time_len:{len(time)} time:{time} shape:{time.shape}") plt.figure(1) plt.plot(time, wave_data) plt.xlabel("time/s") plt.title('Wave') plt.show() if __name__ == "__main__": wavPath = r"C:\Users\v-yunhgu\Desktop\VoiceTest\voice-Task\0000000007.wav" ConvertAudio2Wav(wavPath) DrawWav()