Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

อ่านและเขียนไฟล์ WAV โดยใช้ Python (wave)


โมดูล wave ในไลบรารีมาตรฐานของ Python เป็นอินเทอร์เฟซที่ง่ายสำหรับรูปแบบเสียง WAV ฟังก์ชันในโมดูลนี้สามารถเขียนข้อมูลเสียงในรูปแบบดิบไปยังไฟล์ เช่น อ็อบเจกต์ และอ่านแอตทริบิวต์ของไฟล์ WAV ได้

ไฟล์ถูกเปิดใน 'เขียน' หรือโหมดอ่านเช่นเดียวกับฟังก์ชัน open() ในตัว แต่มีฟังก์ชัน open() ในโมดูลเวฟ

wave.open()

ฟังก์ชันนี้เปิดไฟล์เพื่ออ่าน/เขียนข้อมูลเสียง ฟังก์ชันนี้ต้องการพารามิเตอร์สองตัว - อันดับแรกคือชื่อไฟล์และโหมดที่สอง โหมดสามารถเป็น 'wb' สำหรับเขียนข้อมูลเสียงหรือ 'rb' สำหรับการอ่านได้

obj = wave.open('sound.wav','wb')

โหมด 'rb' จะส่งกลับวัตถุ Wave_read ในขณะที่โหมด 'wb' จะส่งกลับวัตถุ Wave_write

วัตถุ Wave_write มีวิธีการดังต่อไปนี้

close() ปิดไฟล์หากเปิดโดย wave
setnchannels() กำหนดจำนวนช่อง 1 สำหรับโมโน 2 สำหรับช่องสเตอริโอ
setsampwidth() กำหนดความกว้างของตัวอย่างเป็น n ไบต์
setframerate() ตั้งอัตราเฟรมเป็น n.
setnframes() กำหนดจำนวนเฟรมเป็น n
setcomptype() กำหนดประเภทการบีบอัดและคำอธิบาย ในขณะนี้ รองรับเฉพาะประเภทการบีบอัด NONE ซึ่งหมายความว่าไม่มีการบีบอัด
setparams() ยอมรับ tuple พารามิเตอร์ (nchannels, sampwidth, framerate, nframes, comptype, compname)
บอก() ดึงตำแหน่งปัจจุบันในไฟล์
writeframesraw() เขียนเฟรมเสียงโดยไม่ต้องแก้ไข
writeframes() เขียนเฟรมเสียงและตรวจสอบว่าถูกต้อง

โค้ดต่อไปนี้จะสร้างไฟล์ WAV โดยมีไบต์จำนวนเต็มสั้นแบบสุ่มที่ระยะเวลา 99999 วินาที

import wave, struct, math, random
sampleRate = 44100.0 # hertz
duration = 1.0 # seconds
frequency = 440.0 # hertz
obj = wave.open('sound.wav','w')
obj.setnchannels(1) # mono
obj.setsampwidth(2)
obj.setframerate(sampleRate)
for i in range(99999):
   value = random.randint(-32767, 32767)
   data = struct.pack('<h', value)
   obj.writeframesraw( data )
obj.close()

วิธีอ็อบเจ็กต์ Wave_read

close() ปิดสตรีมหากเปิดโดยโมดูล wave
getnchannels() ส่งคืนจำนวนช่องสัญญาณเสียง (1 สำหรับโมโน 2 สำหรับสเตอริโอ)
getsampwidth() คืนค่าความกว้างของตัวอย่างเป็นไบต์
getframerate() ส่งกลับความถี่การสุ่มตัวอย่าง
getnframes() ส่งคืนจำนวนเฟรมเสียง
getcomptype() ส่งคืนประเภทการบีบอัด ('NONE' เป็นประเภทที่รองรับเท่านั้น)
getparams() ส่งกลับ namedtuple() (nchannels, sampwidth, framerate, nframes, comptype, compname) เทียบเท่ากับผลลัพธ์ของเมธอด get*()
readframes(n) อ่านและส่งคืนเสียงสูงสุด n เฟรม เป็นวัตถุไบต์
rewind() กรอกลับตัวชี้ไฟล์ไปที่จุดเริ่มต้นของสตรีมเสียง

โค้ดต่อไปนี้จะอ่านพารามิเตอร์บางอย่างของไฟล์ WAV

import wave
obj = wave.open('sound.wav','r')
print( "Number of channels",obj.getnchannels())
print ( "Sample width",obj.getsampwidth())
print ( "Frame rate.",obj.getframerate())
print ("Number of frames",obj.getnframes())
print ( "parameters:",obj.getparams())
obj.close()

ผลลัพธ์

Number of channels 1
Sample width 2
Frame rate. 44100
Number of frames 99999
parameters: _wave_params(nchannels=1, sampwidth=2, framerate=44100, nframes=99999, comptype='NONE', compname='not compressed')