Der PyAudio-Eingang ist übergelaufen
Ich versuche, mich in Echtzeit Plotten sound in python. Ich brauche, um die Stücke von meinem Mikrofon.
Mit PyAudio, versuchen,
import pyaudio
import wave
import sys
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
frames_per_buffer = chunk)
print "* recording"
all = []
for i in range(0, RATE / chunk * RECORD_SECONDS):
data = stream.read(chunk)
all.append(data)
print "* done recording"
stream.close()
p.terminate()
Nachdem ich immer die folgende Fehlermeldung:
* recording
Traceback (most recent call last):
File "gg.py", line 23, in <module>
data = stream.read(chunk)
File "/usr/lib64/python2.7/site-packages/pyaudio.py", line 564, in read
return pa.read_stream(self._stream, num_frames)
IOError: [Errno Input overflowed] -9981
Ich kann nicht verstehen, diesen Puffer. Ich will, zu verwenden blocking IO-Modus, also wenn die chunks nicht verfügbar ist, will ich warten, für diese Stücke. Aber wenn ich das erstellen versuchen außer segment-oder sleep(0.1) habe ich knackser zu hören, also das ist nicht das, was ich will.
Schlagen Sie bitte die beste Lösung für mein ploblem?
InformationsquelleAutor der Frage libbkmz | 2012-05-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
pyaudio.Stream.read()
hat eine keyword-parameterexception_on_overflow
setzen Sie diese auf False.Ihres Beispiel-code würde wie folgt Aussehen:
Sehen die PyAudio Dokumentation für mehr details.
InformationsquelleAutor der Antwort Jesquik
Ich habe den gleichen Fehler bei mir lief dein code. Ich schaute auf die Standard-sample-rate meiner Standard-audio-Gerät, mein macbook internen Mikrofon, es war 48000Hz nicht 44100Hz.
Wenn ich änderte RATE auf diesen Wert, es hat funktioniert.
InformationsquelleAutor der Antwort velotron
Es scheint wie eine Menge Menschen sind der Begegnung mit diesem Thema. Ich grub ein bisschen in ihn und ich denke, es bedeutet, dass zwischen dem vorherigen Aufruf
stream.read()
und das aktuelle Gespräch, werden die Daten aus dem stream verloren (d.h. der Puffer füllte sich schneller, als Sie es geklärt).Vom doc für
Pa_ReadStream()
(die PortAudio-Funktion, diestream.read()
schließlich endet Aufruf):(
PaInputOverflowed
dann zu einemIOError
im pyaudio-wrapper).Wenn es OK ist für Sie nicht erfassen jedes einzelne Bild, dann können Sie diese Fehlermeldung ignorieren. Wenn es absolut wichtig, dass Sie jeden frame, dann müssen Sie einen Weg finden, um die Priorität zu erhöhen Ihrer Anwendung. Ich bin nicht vertraut genug mit Python zu kennen pythonic Weg, dies zu tun, aber es ist einen Versuch Wert, einen einfachen
nice
Befehl, oder die änderung der scheduling-Strategie zu SCHED_DEADLINE.Edit:
Einzige Problem jetzt ist, dass wenn IOError geworfen wird, verlieren Sie alle Bilder gesammelt in, call. Stattdessen ignorieren Sie die überlauf-und nur zurückkehren, was wir haben, können Sie den patch anwenden unten, das wird verursachen stream.read() zu ignorieren, Ausgabe Unterfahrschutz und input-overflow-Fehler von PortAudio (aber immer noch werfen etwas, wenn ein anderer Fehler aufgetreten ist). Ein besserer Weg wäre, um dieses Verhalten (werfen/nicht werfen) anpassbar je nach Ihren Bedürfnissen.
InformationsquelleAutor der Antwort Meta
Stellen Sie sicher, dass das richtige format ist, mein internes Mikrofon wurde auf 24-Bit festgelegt ist (siehe " Audio-Midi-Setup-Anwendung).
InformationsquelleAutor der Antwort w-m
Arbeitete ich das auf OS X 10.10, Habe den gleichen Fehler, während Sie versuchen, um audio vom Mikrofon in ein SYBA USB-Karte (C-Media-Chipsatz), und verarbeiten Sie in Echtzeit mit fft ' s und mehr:
Dem überlauf wurde vollständig gelöst, wenn mit Hilfe einer Callback-Modus, anstelle des Blockierenden Modus, wie geschrieben von libbkmz.(https://www.python.org/dev/peps/pep-0263/)
Basiert auf, der etwas von den funktionierenden code sah so aus:
Diesem code erstellen Sie eine callback-Funktion, erstellen Sie dann ein stream-Objekt, starten Sie es und dann in einer Schleife in jeder Funktion. Einen separaten thread zum Streaming von audio und stream ist geschlossen, wenn die main-Schleife wird gestoppt. selbst.audio ist in jeder Funktion. Ich hatte auch Probleme mit dem Faden, der immer, wenn nicht gekündigt wird.
Seit Pyaudio läuft dieser stream in einem separaten thread, und das machte den audio-stream stabil, die Blocking-Modus hätte die Sättigung in Abhängigkeit von der Geschwindigkeit oder das timing der rest der Prozesse, die in das Skript.
Beachten Sie, dass die chunk-Größe ist 2^12, aber kleinere Stücke, die genauso gut funktionieren. Es gibt andere Parameter, die ich angesehen und rumgespielt, um sicherzustellen, dass Sie alles machte Sinn:
Hoffe, das funktioniert für jemanden!
InformationsquelleAutor der Antwort Roberto Becerra
Meine andere Antwort das problem gelöst, in den meisten Fällen. Aber manchmal wird der Fehler immer noch Auftritt.
Das war der Grund, warum ich verschrottet pyaudio und wechselte zu pyalsaaudio. Mein Krächzender jetzt glatt werden Aufzeichnungen keinen Ton.
InformationsquelleAutor der Antwort Harald Thomson
Ich hatte das gleiche Problem auf dem wirklich langsamen raspberry pi, aber ich war in der Lage, es zu lösen (für die meisten Fälle) durch die Verwendung der schneller
array
Modul für die Speicherung der Daten.Den Inhalt
data
ist eher binäre danach.Aber Sie können
numpy.array(data, dtype='i')
um ein numpy-array von intergers.InformationsquelleAutor der Antwort Harald Thomson
mir dies geholfen:
https://stackoverflow.com/a/46787874/5047984
Ich verwendete multiprocessing-Datei zu schreiben, die parallel zu der Aufnahme von audio. Das ist mein code:
recordAudioSamples.py
config.py
InformationsquelleAutor der Antwort gannebamm