Scipy文件輸入/輸出,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')