पठन में * .wav फाइलें पढ़ना


90

मुझे .wav फ़ाइल में लिखी गई ध्वनि का विश्लेषण करने की आवश्यकता है। उसके लिए मुझे इस फ़ाइल को संख्याओं के सेट में बदलना होगा (उदाहरण के लिए, सरणियाँ)। मुझे लगता है कि मुझे लहर पैकेज का उपयोग करने की आवश्यकता है। हालांकि, मुझे नहीं पता कि यह कैसे काम करता है। उदाहरण के लिए मैंने निम्नलिखित कार्य किए:

import wave
w = wave.open('/usr/share/sounds/ekiga/voicemail.wav', 'r')
for i in range(w.getnframes()):
    frame = w.readframes(i)
    print frame

इस कोड के परिणामस्वरूप मुझे समय के कार्य के रूप में ध्वनि दबाव देखने की उम्मीद थी। इसके विपरीत मैं बहुत सारे अजीब, रहस्यमय प्रतीकों (जो हेक्साडेसिमल संख्या नहीं हैं) को देखता हूं। किसी को भी, दलीलों, मुझे उस के साथ मदद कर सकते हैं?

जवाबों:


109

प्रति प्रलेखन , scipy.io.wavfile.read(somefile)दो मदों की एक टपल देता है: पहला है नमूना दर प्रति सेकंड के नमूनों में, दूसरा एक है numpyसभी डेटा फ़ाइल से पढ़ने के साथ सरणी:

from scipy.io import wavfile
samplerate, data = wavfile.read('./output/audio.wav')

आप इसे अन्य स्वरूपों को खोलने के लिए कमांड लाइन रूपांतरण उपकरण के साथ जोड़ सकते हैं।
एंडोलिथ

11
यह गंभीरता से हालांकि चैनलों की संख्या का अभाव है। चैनलों की संख्या जाने बिना आपको ऑडियो के साथ कैसे काम करना चाहिए?
बस्तीबाई

मेरे कंप्यूटर पर कुछ अजीब संरचना unpacking त्रुटियों को फेंक देता है। मुझे लगता है कि यह नीचे इस्तेमाल किए जाने वाले struct.unpack ('<h', डेटा) nak के बजाय स्ट्रक्चर.unpack ('<i', डेटा) का उपयोग कर रहा है।
एलेक्स एस

1
क्या यह पुस्तकालय काम करता है? मैं कई समस्याओं में भागता हूं: scipy.io.wavfile.read ('/ usr / lib / python2.7 / dist-package / pygame / example / data / house_lo.wav') - कोई डेटा नहीं। scipy.io.wavfile.read ('/ usr / lib / python2.7 / dist-package / pygame / example / data / secosmic_lo.wav') -> ZeroDivision.rror: पूर्णांक विभाजन या modulo by zero
Finn Årup Nielsen

6
@bastibe data2-डी numpy सरणी इतना है data.shapeरिटर्न (num_samples, NUM_CHANNELS) के एक टपल
hobs

63

structमॉड्यूल का उपयोग करते हुए , आप वेव फ्रेम (जो कि 2 के पूरक बाइनरी में -32768 और 32767 (यानी 0x8000और 0x7FFF) के बीच ले जा सकते हैं । यह एक मोनो, 16-बीआईटी, वेव फाइल को पढ़ता है। मुझे यह वेबपेज इसको बनाने में काफी उपयोगी लगा:)

import wave, struct

wavefile = wave.open('sine.wav', 'r')

length = wavefile.getnframes()
for i in range(0, length):
    wavedata = wavefile.readframes(1)
    data = struct.unpack("<h", wavedata)
    print(int(data[0]))

यह स्निपेट 1 फ्रेम पढ़ता है। एक से अधिक फ़्रेम पढ़ने के लिए (उदाहरण के लिए, 13), का उपयोग करें

wavedata = wavefile.readframes(13)
data = struct.unpack("<13h", wavedata)

2
कैसे 24 बिट स्टीरियो फ़ाइलों को संभालने के लिए?
बसज

14
यह मुझे त्रुटि देता है: "struct.error: unpack के लिए लंबाई 2 के एक स्ट्रिंग तर्क की आवश्यकता होती है"
कोडरहैडम

1
यदि आप इस कोड को एक बहुत बड़ी ऑडियो फ़ाइल के साथ चलाते हैं। इस प्रोग्राम द्वारा मेमोरी की आवश्यकता के कारण आपका कंप्यूटर मर जाएगा। बड़े ऑडियो फ़ाइल के लिए ब्लॉक द्वारा ऑडियो फ़ाइल को संसाधित करने की आवश्यकता है
आर्थुरलैम्बर्ट

@ Coder404 आप शायद एक स्टीरियो तरंग फ़ाइल, या एक अलग बिट गहराई है।
जूनमिलो

3
उन लोगों के लिए, जो मेरी तरह सोच रहे हैं कि 2s पूरक बाइनरी क्या है, यहां देखें stackoverflow.com/questions/1049722/what-is-2s-complement
डेनिस गोलोमेज़ोव

34

अलग-अलग पायथन मॉड्यूल wav को पढ़ने के लिए:

लहर ऑडियो फ़ाइलों को पढ़ने के लिए कम से कम ये निम्नलिखित पुस्तकालय हैं:

सबसे सरल उदाहरण:

साउंडफाइल के साथ यह एक सरल उदाहरण है:

import soundfile as sf
data, samplerate = sf.read('existing_file.wav') 

आउटपुट का प्रारूप:

चेतावनी, डेटा हमेशा एक ही प्रारूप में नहीं होते हैं, जो कि पुस्तकालय पर निर्भर करता है। उदाहरण के लिए:

from scikits import audiolab
from scipy.io import wavfile
from sys import argv
for filepath in argv[1:]:
    x, fs, nb_bits = audiolab.wavread(filepath)
    print('Reading with scikits.audiolab.wavread:', x)
    fs, x = wavfile.read(filepath)
    print('Reading with scipy.io.wavfile.read:', x)

आउटपुट:

Reading with scikits.audiolab.wavread: [ 0.          0.          0.         ..., -0.00097656 -0.00079346 -0.00097656]
Reading with scipy.io.wavfile.read: [  0   0   0 ..., -32 -26 -32]

साउंडफाइल और ऑडिओलैब रिटर्न -1 और 1 के बीच तैरता है (जैसा कि मैटाब करता है, यह ऑडियो सिग्नल के लिए कन्वेंशन है)। स्कैपी और वेव रिटर्न पूर्णांक, जिसे आप फ़्लोटिंग के बिट्स की संख्या के अनुसार फ़्लोट में बदल सकते हैं, उदाहरण के लिए:

from scipy.io.wavfile import read as wavread
samplerate, x = wavread(audiofilename)  # x is a numpy array of integers, representing the samples 
# scale to -1.0 -- 1.0
if x.dtype == 'int16':
    nb_bits = 16  # -> 16-bit wav files
elif x.dtype == 'int32':
    nb_bits = 32  # -> 32-bit wav files
max_nb_bit = float(2 ** (nb_bits - 1))
samples = x / (max_nb_bit + 1)  # samples is a numpy array of floats representing the samples 

14

IMHO, साउंड फ़ाइल से एक NumPy सरणी में ऑडियो डेटा प्राप्त करने का सबसे आसान तरीका SoundFile है :

import soundfile as sf
data, fs = sf.read('/usr/share/sounds/ekiga/voicemail.wav')

यह बॉक्स से 24-बिट फ़ाइलों का भी समर्थन करता है।

कई ध्वनि फ़ाइल लाइब्रेरी उपलब्ध हैं, मैंने एक सिंहावलोकन लिखा है जहां आप कुछ पेशेवरों और विपक्षों को देख सकते हैं। यह एक पृष्ठ भी बताता है कि waveमॉड्यूल के साथ 24-बिट wav फ़ाइल कैसे पढ़ें


नोट: soundfile.read () 2 ^ (n_bits - 1) को सामान्य करता है जैसा कि सैंडोवल के scipy.io.wavfile उदाहरण में
Quetzalcoatl

9

आप scikits.audiolab का उपयोग करके इसे पूरा कर सकते हैं मॉड्यूल । यह कार्य करने के लिए NumPy और SciPy की आवश्यकता है, और libsndfile की भी।

ध्यान दें, मैं केवल Ubunutu पर काम करने में सक्षम था और OSX पर नहीं।

from scikits.audiolab import wavread

filename = "testfile.wav"

data, sample_frequency,encoding = wavread(filename)

अब आपके पास wav data है


scikits.audiolab2010 के बाद से अद्यतन नहीं किया गया है और यह शायद केवल पायथन 2 है।
बोरिस

4

यदि आप किसी ऑडियो ब्लॉक को ब्लॉक करके प्रोक करना चाहते हैं, तो दिए गए कुछ समाधान इस अर्थ में काफी भयानक हैं कि वे पूरे ऑडियो को मेमोरी में लोड कर रहे हैं जो कई कैश मिक्स का उत्पादन कर रहे हैं और आपके प्रोग्राम को धीमा कर रहे हैं। अजगर-wavefile जनरेटर के माध्यम से कुशल और पारदर्शी ब्लॉक प्रबंधन का उपयोग करके न्यूम ब्लॉक-बाय-ब्लॉक प्रसंस्करण करने के लिए कुछ पाइथोनिक निर्माण प्रदान करता है। अन्य pythonic niceties फ़ाइलों के लिए संदर्भ प्रबंधक, गुण के रूप में मेटाडेटा हैं ... और यदि आप संपूर्ण फ़ाइल इंटरफ़ेस चाहते हैं, क्योंकि आप एक त्वरित प्रोटोटाइप विकसित कर रहे हैं और आप प्रभावकारिता के बारे में परवाह नहीं करते हैं, तो पूरी फ़ाइल इंटरफ़ेस अभी भी है।

प्रसंस्करण का एक सरल उदाहरण होगा:

import sys
from wavefile import WaveReader, WaveWriter

with WaveReader(sys.argv[1]) as r :
    with WaveWriter(
            'output.wav',
            channels=r.channels,
            samplerate=r.samplerate,
            ) as w :

        # Just to set the metadata
        w.metadata.title = r.metadata.title + " II"
        w.metadata.artist = r.metadata.artist

        # This is the prodessing loop
        for data in r.read_iter(size=512) :
            data[1] *= .8     # lower volume on the second channel
            w.write(data)

उदाहरण पूरी फाइल को पढ़ने के लिए एक ही ब्लॉक का उपयोग करता है, यहां तक ​​कि अंतिम ब्लॉक के मामले में भी जो आमतौर पर आवश्यक आकार से कम है। इस मामले में आपको ब्लॉक का एक टुकड़ा मिलता है। इसलिए किसी भी आगे की प्रक्रिया के लिए हार्डकोड 512 आकार का उपयोग करने के बजाय लौटे ब्लॉक की लंबाई पर भरोसा करें।


1

यदि आप तरंग डेटा पर स्थानांतरण करने जा रहे हैं, तो शायद आपको विशेष रूप से SciPy का उपयोग करना चाहिए scipy.io.wavfile


2
ठीक है। मैंने अभी SciPy स्थापित किया है लेकिन मुझे scipy.io.wavfile के उपयोग का कोई उदाहरण नहीं मिल रहा है।
रोमन

6
कैसे काम करते हैं यह पता लगाने के लिए इंटरैक्टिव दुभाषिया जैसा कुछ नहीं! महत्वाकांक्षी बनो!
इग्नासियो वाज़केज़-अब्राम्स

1

मुझे 1-चैनल 24-बिट WAV फ़ाइल पढ़ने की आवश्यकता है। नाक द्वारा ऊपर पोस्ट बहुत उपयोगी थी। लेकिन, जैसा कि ऊपर उल्लेख किया द्वारा basj 24 बिट सरल नहीं है। अंत में मुझे निम्नलिखित स्निपेट का उपयोग करके काम करना पड़ा:

from scipy.io import wavfile
TheFile = 'example24bit1channelFile.wav'
[fs, x] = wavfile.read(TheFile)

# convert the loaded data into a 24bit signal

nx = len(x)
ny = nx/3*4    # four 3-byte samples are contained in three int32 words

y = np.zeros((ny,), dtype=np.int32)    # initialise array

# build the data left aligned in order to keep the sign bit operational.
# result will be factor 256 too high

y[0:ny:4] = ((x[0:nx:3] & 0x000000FF) << 8) | \
  ((x[0:nx:3] & 0x0000FF00) << 8) | ((x[0:nx:3] & 0x00FF0000) << 8)
y[1:ny:4] = ((x[0:nx:3] & 0xFF000000) >> 16) | \
  ((x[1:nx:3] & 0x000000FF) << 16) | ((x[1:nx:3] & 0x0000FF00) << 16)
y[2:ny:4] = ((x[1:nx:3] & 0x00FF0000) >> 8) | \
  ((x[1:nx:3] & 0xFF000000) >> 8) | ((x[2:nx:3] & 0x000000FF) << 24)
y[3:ny:4] = (x[2:nx:3] & 0x0000FF00) | \
  (x[2:nx:3] & 0x00FF0000) | (x[2:nx:3] & 0xFF000000)

y = y/256   # correct for building 24 bit data left aligned in 32bit words

यदि आपको -1 और +1 के बीच परिणाम की आवश्यकता है, तो कुछ अतिरिक्त स्केलिंग आवश्यक है। हो सकता है कि आपमें से कुछ को यह उपयोगी लगे


0

अगर इसकी सिर्फ दो फाइलें और नमूना दर काफी अधिक है, तो आप उन्हें इंटरलेव कर सकते हैं।

from scipy.io import wavfile
rate1,dat1 = wavfile.read(File1)
rate2,dat2 = wavfile.read(File2)

if len(dat2) > len(dat1):#swap shortest
    temp = dat2
    dat2 = dat1
    dat1 = temp

output = dat1
for i in range(len(dat2)/2): output[i*2]=dat2[i*2]

wavfile.write(OUTPUT,rate,dat)

0

यू भी साधारण import wavioपुस्तकालय का उपयोग कर सकते हैं यू भी ध्वनि के कुछ बुनियादी ज्ञान की आवश्यकता है।


0

PyDub ( http://pydub.com/ ) का उल्लेख नहीं किया गया है और इसे ठीक किया जाना चाहिए। IMO यह पायथन में अभी ऑडियो फ़ाइलों को पढ़ने के लिए सबसे व्यापक पुस्तकालय है, हालांकि इसके दोष के बिना नहीं। एक wav फ़ाइल पढ़ना:

from pydub import AudioSegment

audio_file = AudioSegment.from_wav('path_to.wav')
# or
audio_file = AudioSegment.from_file('path_to.wav')

# do whatever you want with the audio, change bitrate, export, convert, read info, etc.
# Check out the API docs http://pydub.com/

पुनश्च। उदाहरण एक wav फ़ाइल पढ़ने के बारे में है, लेकिन PyDub बॉक्स से बाहर विभिन्न स्वरूपों को संभाल सकता है। चेतावनी यह है कि यह दोनों देशी पायथन wav समर्थन और ffmpeg पर आधारित है, इसलिए आपको ffmpeg स्थापित करना होगा और बहुत से pydub क्षमताओं को ffmpeg संस्करण पर निर्भर करना होगा। आमतौर पर अगर ffmpeg कर सकता है, तो pydub कर सकते हैं (जो काफी शक्तिशाली है)।

गैर-अस्वीकरण: मैं परियोजना से संबंधित नहीं हूं, लेकिन मैं एक भारी उपयोगकर्ता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.