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

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

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

ไฟล์จะเปิดในโหมด 'write' หรือ 'read' เหมือนกับฟังก์ชัน open() ในตัว แต่ใช้ฟังก์ชัน open() ในโมดูล wave

wave.open()

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

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

โหมด 'rb' คืนค่าออบเจกต์ Wave_read ในขณะที่โหมด 'wb' คืนค่าออบเจกต์ Wave_write

ออบเจกต์ Wave_write มีเมธอดดังนี้:

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

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

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('

เมธอดของออบเจกต์ Wave_read

close()ปิดสตรีมหากเปิดโดยโมดูล wave
getnchannels()คืนค่าจำนวนช่องสัญญาณเสียง (1 สำหรับ mono, 2 สำหรับ stereo)
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')