บันทึกการติดตั้ง
บันทึกติดตั้ง PyICU บนเดเบียน Etch ใช้ Python รุ่น 2.4
จะลองเอามาทำตัวตัดคำไทย เพื่อจัดเก็บคำในฐานข้อมูล
ครั้งแรกที่ทดลอง ได้นำเอาไบนารีมาติดตั้ง แต่รันไม่ได้เพราะเกิดข้อผิดพลาดเกี่ยวกับยูนิโค๊ด จึงต้องเอาซอร์สมาคอมไพล์เอง
ติดตั้งแพกเกจที่จำเป็น
# aptitude install python2.4-dev libicu36 libicu36-dev
ดาวน์โหลดซอร์ส และแตกไฟล์
# cd /usr/src
# wget http://downloads.osafoundation.org/PyICU/src/PyICU-src-0.6.tar.gz
# tar xfz PyICU-src-0.6.tar.gz
# cd PyICU-src-0.6
ต้องแก้ไข Makefile นิดนึง ตามคู่มือ
# vi Makefile
... #PYTHON_VER=2.5 PYTHON_VER=2.4 ... # Linux #PREFIX=/usr/local #PREFIX_PYTHON=$(PREFIX) #PREFIX_ICU=$(PREFIX)/icu-$(ICU_VER) #PYTHON=$(PREFIX_PYTHON)/bin/python PREFIX=/usr PREFIX_PYTHON=$(PREFIX) PREFIX_ICU=$(PREFIX) PYTHON=$(PREFIX_PYTHON)/bin/python ...
คอมไพล์และติดตั้ง
# make && make install
เสร็จแล้ว
ทดสอบด้วย
# python
Python 2.4.4 (#2, Jan 13 2007, 17:50:26) [GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import PyICU >>>
ไม่มีข้อผิดพลาด แสดงว่าใช้ได้แล้ว
update
บันทึกอีกรุ่นนึง 51-02-28
debian-etch, python-2.4.4, libicu36, gcc/g++-4.1
ติดตั้งโดย root
ดาวน์โหลดซอร์สที่ PyICU-0.8.1.tar.gz
# cd /usr/src
# wget http://pypi.python.org/packages/source/P/PyICU/PyICU-0.8.1.tar.gz#md5=789092993f84ccd6ba21d7346d6e093d
# tar xfz PyICU-0.8.1.tar.gz
# cd PyICU-0.8.1
เอาแพกเกจของ dev มาก่อน
# aptitude install build-essential python-dev python-setuptools libicu36-dev
ดูจาก README แล้วคอมไพล์เลย
# python setup.py build
# python setup.py install
ถ้าไม่แสดงข้อผิดพลาด ก็ใช้ได้แล้ว
ดัดแปลงโค๊ดมาจาก programming is hard: isThai and ThaiWarp function
import PyICU def isThai(chr): cVal = ord(chr) if(cVal >= 3584 and cVal <= 3711): return True return False def wrap(txt): txt = PyICU.UnicodeString(txt) bd = PyICU.BreakIterator.createWordInstance(PyICU.Locale("th")) bd.setText(txt) lastPos = bd.first() retTxt = PyICU.UnicodeString("") txt_list = [] try: while(1): currentPos = bd.next() retTxt += txt[lastPos:currentPos] # txt_list.append(txt[lastPos:currentPos]) #Only thai language evaluated if(isThai(txt[currentPos-1])): if(currentPos < len(txt)): if(isThai(txt[currentPos])): #This is dummy word seperator #retTxt += PyICU.UnicodeString("|||") # pass lastPos = currentPos except StopIteration: pass #retTxt = retTxt[:-1] #return retTxt return [unicode(i) for i in txt_list] def fullwrap(txt): txt_list = txt.split(' ') new_list = [] for i in txt_list: #new_list.extend(wrap(i).split('|||')) new_list.extend(wrap(i)) return new_list
ลองตัดคำดู
$ python
Python 2.4.4 (#2, Jan 13 2007, 17:50:26) [GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> word = 'ทดลองเรียน Python ภาษาโปรแกรมคอมพิวเตอร์' >>> print wrap(word) ทดลอง|||เรียน Python ภาษา|||โปรแกรม|||คอมพิวเตอร์ >>> print fullwrap(word) [u'\u0e17\u0e14\u0e25\u0e2d\u0e07', u'\u0e40\u0e23\u0e35\u0e22\u0e19', u'Python', u'\u0e20\u0e32\u0e29\u0e32', u'\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21', u'\u0e04\u0e2d\u0e21\u0e1e\u0e34\u0e27\u0e40\u0e15\u0e2d\u0e23\u0e4c'] >>> for i in fullwrap(word): print i ... ทดลอง เรียน Python ภาษา โปรแกรม คอมพิวเตอร์ >>>
โฮมเพจอยู่ที่ pymedia - Python module for wav, mp3, ogg, avi, divx, dvd, cdda etc files manipulations.
ดาวน์โหลดแพกเกจได้ที่ pymedia.sourceforge.net
ต้องติดตั้งแพกเกจดังนี้
$ sudo aptitude install libogg-dev libvorbis-dev liblame-dev libfaad2-dev faad
แล้วก็ติดตั้งได้
$ sudo dpkg -i pymedia_1.3.5_i686-py2.4.deb
ทดสอบด้วยการเรียกใช้ python
$ python
Python 2.4.4c1 (#2, Oct 11 2006, 21:51:02) [GCC 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import pymedia >>>
ถ้าไม่ฟ้องอะไรออกมา ก็แสดงว่าผ่านแล้ว
เอกสาร Tutorial ในเพจของ pymedia เอง ค่อนข้างหยาบและมีที่ผิดเยอะ
จะลองรวบรวมเฉพาะโค๊ดมาใช้ดู
ลองเล่นไฟล์ wav
import time, wave, pymedia.audio.sound as sound sFile= "YOUR FILE NAME" f= wave.open( sFile, 'rb' ) sampleRate= f.getframerate() channels= f.getnchannels() format= sound.AFMT_S16_LE snd= sound.Output( sampleRate, channels, format ) s= f.readframes( 300000 ) snd.play( s )
แปลง codec
ตัวอย่างนี้ รันไม่ผ่าน เกิด seg-fault
import pymedia.audio.acodec as acodec import pymedia.muxer as muxer sName='01A.mp3' f= open( sName, 'rb' ) s= f.read( 8192 ) file_ext = str.split( sName, '.' )[ -1 ].lower() dm = muxer.Demuxer( file_ext ) frames= dm.parse( s ) print dm.hasHeader(), dm.getInfo() dec= acodec.Decoder( dm.streams[ 0 ] ) frame= frames[ 0 ] r= dec.decode( frame[ 1 ] ) print r.sample_rate, r.channels, r.bitrate, r.sample_length params= { 'id': acodec.getCodecID('wma'), 'bitrate': 16, 'sample_rate': 16000, 'ext': 'wma', 'channels': 1 } enc= acodec.Encoder( params )