Automatische Microphone Aufnahme und Ausgabe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
NicNac
User
Beiträge: 19
Registriert: Sonntag 17. Juni 2012, 12:14

Hallo ihr lieben,

Nach einiger Zeit suchen mit Google leider erfolglos. Versuche ich nun über euch etwas herauszubekommen. Ich will ein Script schreiben in Python unter Windows das es mir ermöglicht sobald ins Microphone gesprochen wird eine Aufnahme zu starten und diese Datei anschliessend wiedergeben zu können ... das so als Grundsatz erst mal. Ich hab mir verschiedene Sachen angesehen wie Sox,Snack ect aber diese sind ein bisschen zu high lvl glaube ich da blick ich garnich durch.

Daher meine Frage mit was könnte ich da am besten arbeiten?

Liebe Grüße
acidbath
User
Beiträge: 21
Registriert: Mittwoch 26. Januar 2011, 19:10

Moin.

Lustigerweise hatte ich danach gestern gesucht und bin auf PyAudio gestoßen.
Ich hatte mir spaßeshalber einfach das record-Beispiel geschnappt und in der Aufnahmeschleife (die man prinzipiell ja auch zu einer Endlosschleife umbauen könnte) bei jedem Durchlauf das erste Wort (2 Bytes) über struct angeschaut. Sobald es einen Schwellenwert überstieg, habe ich mit der eigentlichen Aufnahme (sprich: frames.append(data) ) begonnen. Sicher alles andere als elegant, aber zumindest funktioniert's. :-)
Umso gespannter bin ich jetzt natürlich, was die Python-Cracks zum besten geben. :D

Gruß,
Daniel
NicNac
User
Beiträge: 19
Registriert: Sonntag 17. Juni 2012, 12:14

Das klingt aber super interessant acid. würdest du dich da mit mir austauschen? ich suche weitergehend eine möglichkeit 2 aufgenomme files miteinander zu vergleichen so das man auch den unterschied erkennt aber ich glaub das ist nur möglich wenn man die dateien auch frequenztechnisch einliest oder? der audiokram is mir etwas neu deswegen. :P

PS: Aber pyAudio hab ich mir angesehen und den record auch mal gestartet das passt eigentlich perfekt
acidbath
User
Beiträge: 21
Registriert: Mittwoch 26. Januar 2011, 19:10

Hallo NicNac.

Mehr kann ich Dir leider nicht liefern und von Frequenzanalysen und ähnlichem habe ich überhaupt keine Ahnung.
Ich hatte nur die fixe Idee, meine Hausautomation eventuell auch mit einer Sprachsteuerung zu versehen, nachdem ich mit dem google-Voice-Server rumgespielt hatte und von der Erkennungsqualität positiv überrascht war.
Also brauchte ich irgendwoher Ton und probierte besagtes PyAudio aus. Da die Audiodaten aus 16 Bit pro sample bestehen, nahm ich einfach das Aufnahmebeispiel von der Webseite und fügte ein

Code: Alles auswählen

if abs(struct.unpack('h', data[0]+data[1])[0]) > 1000:
        start_recording = True
hinzu - und siehe da: die Aufnahme beginnt tatsächlich erst, wenn ein lauteres Geräusch ertönt.
Wirklich nutzbar ist das so natürlich nicht, weil ich nur exemplarisch ein einziges Word aus einem Chunk herauspicke, aber mir ging's nur erst einmal um ein "Machbarkeitsexperiment" und ob die Daten so vorliegen, wie ich's erwartet habe.
Vielleicht stelle ich's mir zu einfach vor, aber eine kleine Routine, die exemplarisch jede Zehntelsekunde eine geringe Anzahl an Bits betrachtet und im Erfolgsfall (soll heißen Überschreiten eines vorher festgelegten Schwellenwertes) die Aufnahme beginnt und aus einem mitlaufenden Puffer noch eine halbe Sekunde vorher anfügt, sollte zumindest bei Sprachaufnahmen ausreichen - außer man Stottert ganz böse mit Lauten kürzer als 0,1 Sekunden. :D
Und von der Prozessorlast müßte das auch noch klappen. Man könnte natürlich jedes einzelne 16-Bit-Wort betrachten, aber dann ärgert man den PC vermutlich schon zu sehr, zumindest wenn man es mit einer Skriptsprache macht.
Achja, eine Endeerkennung täte natürlich auch noch Not, aber auch da würde ich's ganz banal mit einer Zählervariable lösen - wenn die letzten 100.000 frames nichts gekommen ist, hat's dem Sprecher wohl die Sprache verschlagen. :lol:

Gruß,
Daniel
BlackJack

Mit `numpy` sollte es auch möglich sein alle Samples zu verarbeiten ohne den PC zu sehr zu verärgern. :-)
Antworten