2013年7月12日 星期五

Python超級新手心得:寫音訊處理程式的經驗

很久以前就有買了一本O'reilly的《Python入門》也就是小老鼠本(怎麼封面不是大蛇?)Python的程式都是偶而寫一寫,沒有很正規的使用,我還是用java這種系統語言為主,直到最近,為了跟好友Paul Liu開發完全用自由軟體做的虛擬歌手《徵音梅林》,需要特殊的批次錄音程式,自己主業又已經不是作軟體,轉行去作音樂、設計樂器了,美國時間不多,才嘗試Python的快速開發能力,所以就寫了自己第一個完整的Python程式,而且直上GUI。

這個程式的功能是讀取錄音表,然後一個一個的來錄音,程式會自動地顯示錄要錄的發音,錄完自動存檔,而且配特定的檔名,那要錄多少個wav檔呢。4500多個(所以才要寫專用的,用audacity錄一個存一個,再打檔名,你會發瘋的@@)




得到許多寶貴的經驗,為了不要忘記,就順便紀錄一下心得:

1.Python語言本體部份:就算Python號稱很容易,但是一些小細節的習慣動作仍然要適應,例如
  • 縮排的控制也是語法之一,很多小錯誤都卡在這地方XD
  • 同為物件導向語言,看起來很像java,但是存取資料成員時,Python沒有this super可以用,甚至要存取本類別資料成員,都不能省略 自己.變數 這樣的作法
  • 很多有關WxPython的視窗元件的方法成員呼叫,傳的參數如查api會發現往往含上self本身,然後真正在傳參數的時候,卻不用傳self,例如說API上面寫XXX.SetVisible(self,file)或者你自己寫的方法成員宣告時是這樣,但實際呼叫時,只要XXX.SetVisible(myfile)就好了,有一點點人格分裂之感XD
  • Java的GUI程式設計沒有mainloop(),或者說隱藏起來,但是Python的有
  • 承上,同樣的東西在Java很多可能是一個呼叫背後直接跑一個Thread,但Python的不是,所以自己記得包Thread,不然會掛住整個視窗
  • 基本語法不一樣,例如for、操作資料結構部份、沒有";",很直接簡潔,要習慣習慣才行XD
2.開發工具
  • 雖然很多人推崇SPE ,但是SPE存檔存ASCII的,所以程式碼裡面不能出現中文訊息、中文註解,所以我只用它的wxGlade來拉出視窗介面
  • 我主力用emacs,太方便了,只是剛開始寫python,不知道有沒有python的自動補完函式的模組?
3.音訊處理
  • 一開始我用alsaaudio模組,但是後來發現這是一個錯誤的選擇。我們的目標是必須能錄24bit,而Ubuntu以及其他現代的GNU/Linux Distribution是讓alsa上架pulseaudiio,而pulseaudiio被鎖在16bit,你的錄音介面再好也沒有用,用alsa的模組都會直接轉到pulseaudio,然後24bit錄到的都會變成破音
  • 而我是alsa直上jack 音訊系統,pulseaudio也是轉進jack,一直執著alsaaudio沒有用,終究24bit都會變成破音
  • python不適合realtime,所以很少有python用的jack模組,我只有找到pyjack,但build不起來orz。
  • 最後發現有console的jack錄音程式-jack_capture,當然可以正確的錄出24bit的wav,只要我寫的GUI來呼叫他就可以啦,請教paul,得知要用subprocess,一開始有點難度,反覆查API,最後終於搞定,覺得很有趣,原來python被稱為命令稿語言是因為擅長於呼叫其他程式,組合起來快速完成工作。
這次感覺到原來python的魅力以及好處所在,執行有時間壓力的專案時,要打造臨時性工具,不一定要從頭到尾統統自己苦幹實做,運用python這樣的語言,善用且組合現有的程式來完成工作才是上策,而不是把系統語言的寫作觀念帶來命令稿語言。

花了兩個星期寫起來了,利用餘暇時間一點一點寫,昨天終於搞定。搞完,就轉換到音樂人狀態好好地發洩一下....爽啦  XD

2 則留言:

匿名 提到...

可以考慮kdevelop+kdev-python。

Chou Shoichi 提到...

謝謝你的建議

count