【數據分析day05】Scipy讀/寫.mat文件,wav,mp3

  • 讀取png文件命名爲“moon”(df),降噪後處理成“moon_cleaned”(df),並將兩個df數據存儲到.mat文件中
  • mat :標準二進制文件
  • 常規圖片讀取用"plt.imread"
  • mat文件讀取用 scipy.io 庫的 .loadmat() 和.savemat()

moon (df)
在這裏插入圖片描述
降噪後的moon_cleaned (df)
在這裏插入圖片描述

導入: import scipy.io as spio

讀寫.mat 文件

寫入 .savemat()

將上面兩個df數據,存儲到“moon_cleaned.mat”文件中,分佈命名爲{‘moon_cleaned’和’moon_origin’

import scipy.io as spio

spio.savemat('moon_cleaned.mat', mdict={'moon_cleaned': moon_cleaned,  'moon_origin': moon})

讀取 .loadmat()

讀取上面的“moon_cleaned.mat”文件

data = spio.loadmat('./moon_cleaned.mat')
data

在這裏插入圖片描述
可分別取df,這裏取‘moon_origin’爲例:

data['moon_origin']	

在這裏插入圖片描述

wav

使用scipy處理wav文件

  • WAV爲微軟公司(Microsoft)開發的一種聲音文件格式,音質好
  • 單聲道是一維矩陣,立體聲(雙聲道)是二維
  • 標準的採樣頻率爲:11.025kHz(語音效果)、22.05kHz(音樂效果)、44.1kHz(高保真效果)
  • 導包:from scipy.io import wavfile

讀 wavfile.read()

	from scipy.io import wavfile
	
	# 返回值爲元組,分別爲:“採樣頻率: 和 ”數據“
	_, deng = wavfile.read('../data/鄧紫棋-喜歡你.wav')

wav的音樂文件, 數據類型必須是int16,取值範圍: -32768 ~ +32767
在這裏插入圖片描述
查看矩陣形狀

deng.shape

在這裏插入圖片描述
10776444 / 44100 剩下的是秒數

#算分鐘數
10776444 / 44100 / 60

在這裏插入圖片描述
4.072分鐘 相當於 4分42秒

截取一半的音頻只需要 len(deng)//2 (整除)

再讀取另一首歌

_, lin = wavfile.read('../data/林俊杰-愛不會絕跡.wav')
lin

拼接 np.vstack()

將兩首歌各自截取一半,再拼接成一首歌

# 拼接
mix_music = np.vstack((deng[:len(deng)// 2], lin[:len(lin)//2]))

寫 wavfile.write()

# 導出
wavfile.write('mix_music.wav', 44100, mix_music)

MP3

使用pydub+ ffmpeg處理mp3文件

  • 需要安裝pydub
  • ffmpeg需要下載,並解壓將3個文件放至Python安裝目錄中的bin目錄下,然後還要配置環境變量
  • pydup中的AudioSegment可以處理mp3文件

導包:

from pydub import AudioSegment

讀: AudioSegment.from_mp3()

jing = AudioSegment.from_mp3('../data/難唸的經.mp3')
type(jing)

返回一個AudioSegment對象
在這裏插入圖片描述
可直接運行播放音頻(需要等一陣子)

jing

在這裏插入圖片描述
獲取原始數據

jing_data = jing.get_array_of_samples()

注意:這裏不要直接打印它(因爲數據特別長,可能會卡死)

查看一下類型

type(jing_data)

在這裏插入圖片描述
轉換成 ndarray

# 轉化爲ndarray
jing_ndarray = np.array(jing_data.tolist())		

查看形狀

jing_ndarray.shape

在這裏插入圖片描述
查看類型

jing_ndarray.dtype

在這裏插入圖片描述

轉化爲wav: wavfile.write()

wavfile.write('經.wav', 44100, jing_ndarray.reshape(-1, 2).astype(np.int16))

轉換後 4M --> 40+M
在這裏插入圖片描述
在這裏插入圖片描述
導入另一首歌 並 查看時長

love = AudioSegment.from_mp3('../data/Love Story.mp3')
love.duration_seconds

返回的是秒
在這裏插入圖片描述
切片的時候切的是音樂的時長, 單位是毫秒.
先算出兩首歌的時長毫秒數

jing.duration_seconds * 1000

在這裏插入圖片描述

love.duration_seconds * 1000

在這裏插入圖片描述

裁剪(就是按毫秒切片)

# 切片的時候切的是音樂的時長, 單位是毫秒.
jing[: 20000]

剪輯合併各一半的兩首歌

mix = jing[: 269609 // 2] + love[: 234527 // 2]
mix

在這裏插入圖片描述

導出 export()

mix.export('./mix.mp3')

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章