# Python 筆記 - Sound and Signal ## Idea (發想可以做什麼事情) ### 樂譜生成 - 輸入是一個音源檔案,產生對應主旋律的樂譜 - 可進一步分析主旋律之間的關聯 ### 音樂分群 - 對於一個音樂庫,把形似的風格歸類為一 - 可用於推薦系統 ## 環境 - 系統: Ubuntu 14.04 - FFmpeg: - 安裝: https://www.faqforge.com/linux/how-to-install-ffmpeg-on-ubuntu-14-04/ - 功用:配合Pydub處理常用音訊(e.g. mp3) - Pydub - 安裝: sudo pip install pydub --upgrade - 功用: 處理wav等檔案格式,簡化wave模塊 - wave - 內建 ## Pydub - 參考:https://xin053.github.io/2016/11/05/pydub%E9%9F%B3%E9%A2%91%E5%A4%84%E7%90%86%E5%BA%93%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/ - 引入: - AudioSegment類 ```python from pydub import AudioSegment ``` - 讀檔 - 作法一: from_format(path) ```python AudioSegment.from_wav('path.wav') ``` - 作法二: from_file(path, format) ```python AudioSegment.from_file('path.mp4','mp4') ``` - 作法三: from_file(file, format) ```python with open('file.mp3','rb') as f: AudioSegment.from_file(f, format = 'mp3') ``` - 支援格式: ```python ['wav', 'mp3', 'ogg', 'flv', 'mp4', 'wma', 'aac'] ``` - 回傳型態: AudioSegment物件(immutable) - 寫檔 - export方法 ```python sndObj.export('file.wav', format = 'wav') ``` - 存取 - slice (精度至毫秒) ```python sndObj[begin:end] ``` - 播放 ```python from pydub.playback import play play(sndObj) ``` ## Wave - 內建,處理wav格式:http://bigsec.net/b52/scipydoc/wave_pyaudio.html - 引入 ```python import wave ``` - 讀取檔案 - 開關檔案: ```python wave.open(path,'rb') ``` ```python wave.close() ``` - 取得參數: getparam() - 回傳: (nchannels, sampwidth, framerate, nframes, comptype, compname) ```python params = f.getparams() ``` - 抽取並解析數據: - readframes回傳字串,以short每兩格解析 - 若有雙聲道,輪流取出(e.g. LRLRLR...) ```python str = f.readframes(nframes) data = np.fromstring(str_data, dtype=np.short) ``` - 寫入檔案 - 開關檔案 ```python wave.open(path,'wb') ``` ```python wave.close() ``` - 寫入 - 設置參數 ```python f.setnchannels(1) f.setsampwidth(2) f.setframerate(framerate) ``` - 將字串後寫入編碼 ```python f.writeframes(data.tostring()) ```