PythonAudio - mwicat/personal GitHub Wiki

https://bastibe.de/2012-11-02-real-time-signal-processing-in-python.html

Analyze WAVE file

sudo pip install soundfile matplotlib numpy
import sys

import numpy as np
import matplotlib.pyplot as plt
import soundfile as sf


plt.style.use('ggplot')

fn = sys.argv[1]

data, samplerate = sf.read(fn)

left = data[:, 0]
right = data[:, 1]

mono = np.sum(data, axis=1)


def analyze_signal(s, title, ax):
    clippings = s[np.where(abs(s) >= 1.0)]
    print('clippings', clippings)

    duration_samples = len(s)
    duration_s = len(s) / samplerate

    t = np.linspace(0, duration_s, num=duration_samples)

    ax.plot(t, s, 'xkcd:sky blue')
    ax.set(xlabel='time (s)', ylabel='amplitude', title=title)
    ax.grid()


fig = plt.figure(1)

#analyze_signal(left, 'left', plt.subplot(211))
#analyze_signal(right, 'right', plt.subplot(212))

analyze_signal(mono, 'mono', plt.subplot())

fig.savefig("test.png")
plt.show()

Capture audio

brew install portaudio
sudo pip install pyaudio
import numpy
import pyaudio
import sys


pyaud = pyaudio.PyAudio()


info = pyaud.get_host_api_info_by_index(0)
numdevices = info.get('deviceCount')


if len(sys.argv) != 2:
    for i in range(0, numdevices):
        dev = pyaud.get_device_info_by_host_api_device_index(0, i)
        print('%d: %s INPUTS %s OUTPUTS %s' % (
            i,
            dev.get('name'),
            dev.get('maxInputChannels'),
            dev.get('maxOutputChannels')))
    sys.exit(1)


dev_idx = int(sys.argv[1])


stream = pyaud.open(
    format=pyaudio.paInt16,
    frames_per_buffer=1024,
    channels=1,
    rate=44100,
    input_device_index=dev_idx,
    input=True)


while True:
    rawsamps = stream.read(1024)
    samps = numpy.fromstring(rawsamps, dtype=numpy.int16)
    print('Read', len(samps))

Analyse pitch

sudo pip install SoundAnalyse
import numpy as np
import analyse

rawsamps = stream.read(1024)
samps = numpy.fromstring(rawsamps, dtype=numpy.int16)
loudness = analyse.loudness(samps)
pitch = analyse.musical_detect_pitch(samps)

Play WAV file

import pyaudio  
import wave  

#define stream chunk   
chunk = 1024  

#open a wav format music  
f = wave.open(r"/usr/share/sounds/alsa/Rear_Center.wav","rb")  
#instantiate PyAudio  
p = pyaudio.PyAudio()  
#open stream  
stream = p.open(format = p.get_format_from_width(f.getsampwidth()),  
                channels = f.getnchannels(),  
                rate = f.getframerate(),  
                output = True)  
#read data  
data = f.readframes(chunk)  

#play stream  
while data:  
    stream.write(data)  
    data = f.readframes(chunk)  

#stop stream  
stream.stop_stream()  
stream.close()  

#close PyAudio  
p.terminate() 

List audio devices

def list_devices():
    info = pyaud.get_host_api_info_by_index(0)
    numdevices = info.get('deviceCount')

    for i in range(0, numdevices):
        dev = pyaud.get_device_info_by_host_api_device_index(0, i)
        print('%d: %s INPUTS %s OUTPUTS %s' % (
            i,
            dev.get('name'),
            dev.get('maxInputChannels'),
            dev.get('maxOutputChannels')))

Convert float to dbFS

dbfs = 20 * np.log10(linear)