python/demos/demo_pyaudio.py: added simple demo for pyaudio, see #6, closes #78,...
authorPaul Brossier <piem@piem.org>
Wed, 21 Dec 2016 21:00:32 +0000 (22:00 +0100)
committerPaul Brossier <piem@piem.org>
Wed, 21 Dec 2016 21:00:32 +0000 (22:00 +0100)
python/demos/demo_pyaudio.py [new file with mode: 0755]

diff --git a/python/demos/demo_pyaudio.py b/python/demos/demo_pyaudio.py
new file mode 100755 (executable)
index 0000000..205a58d
--- /dev/null
@@ -0,0 +1,66 @@
+#! /usr/bin/env python
+
+import pyaudio
+import sys
+import numpy as np
+from aubio import pitch, sink
+
+# initialise pyaudio
+p = pyaudio.PyAudio()
+
+# open stream
+buffer_size = 1024
+pyaudio_format = pyaudio.paFloat32
+n_channels = 1
+samplerate = 44100
+stream = p.open(format=pyaudio_format,
+                channels=n_channels,
+                rate=samplerate,
+                input=True,
+                frames_per_buffer=buffer_size)
+
+if len(sys.argv) > 1:
+    # record 5 seconds
+    output_filename = sys.argv[1]
+    record_duration = 5 # exit 1
+    outputsink = sink(sys.argv[1], samplerate)
+    total_frames = 0
+else:
+    # run forever
+    outputsink = None
+    record_duration = None
+
+# setup pitch
+tolerance = 0.8
+win_s = 4096 # fft size
+hop_s = buffer_size # hop size
+pitch_o = pitch("default", win_s, hop_s, samplerate)
+pitch_o.set_unit("midi")
+pitch_o.set_tolerance(tolerance)
+
+print("*** starting recording")
+while True:
+    try:
+        audiobuffer = stream.read(buffer_size)
+        signal = np.fromstring(audiobuffer, dtype=np.float32)
+
+        pitch = pitch_o(signal)[0]
+        confidence = pitch_o.get_confidence()
+
+        print("{} / {}".format(pitch,confidence))
+
+        if outputsink:
+            outputsink(signal, len(signal))
+
+        if record_duration:
+            total_frames += len(signal)
+            if record_duration * samplerate < total_frames:
+                break
+    except KeyboardInterrupt:
+        print("*** Ctrl+C pressed, exiting")
+        break
+
+print("*** done recording")
+stream.stop_stream()
+stream.close()
+p.terminate()