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)