音頻數據波形圖


音頻知識

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()

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM