Seite 1 von 1
Schleife wiederhohlen?
Verfasst: Dienstag 17. Februar 2015, 17:09
von soulreafer
Guten Tag,
Ich versuche ein Script zu basteln welches eine Mikrofonaufnahme startet sobald Ton erkannt wurde.
Das erkennen vom Ton löse ich mittels pyaudio, analyse und diversen anderen Modulen.
Da ich ziemlicher Neuling bin komm ich an einer stelle nicht weiter.
Die While True schleife in der das Mikrofon abgefragt wird soll ab einem Bestimmten bereich stoppen und die aufnahme starten und dann erneut starten. Derzeit ist es für mich nur möglich die aufnahme über ein extra script zu starten und nach der aufname das abfrage script einfach erneut zu starten.
Code: Alles auswählen
#analyse.loudness(samps)
#analyse.musical_detect_pitch(samps)
import numpy
import pyaudio
import analyse
import subprocess
import os
import time
i = 0
numbers = []
pyaud = pyaudio.PyAudio()
stream = pyaud.open(
format = pyaudio.paInt16,
channels = 1,
rate = 44100,
input_device_index = 2,
input = True)
def theloop():
global i
i = 0
while True:
rawsamps = stream.read(1024)
samps = numpy.fromstring(rawsamps, dtype=numpy.int16)
blaa = str(analyse.musical_detect_pitch(samps))
if blaa == "None":
print "Warte auf Stimme"
else:
blaa = int(float(blaa))
print blaa
if 60 <= blaa < 80:
# hier soll schleife stoppen und nach ausführen des scripts erneut laufen.
#os.system("./speech.sh s")
else:
i = 0
theloop()
bin für jede hilfe dankbar.
Re: Schleife wiederhohlen?
Verfasst: Dienstag 17. Februar 2015, 18:19
von Sirius3
@soulreafer: ich verstehe Dein Problem nicht. Genau dafür sind doch Funktionen da, dass wenn sie aufgerufen werden, eine äußere Schleife solange nicht weiterläuft, bis die Funktion fertig ist.
PS: Einrückungen sollten immer 4 Leerzeichen pro Ebene sein und nie Tabs und Leerzeichen mischen.
"global" sollte nicht verwendet werden, wobei i immer auf 0 gesetzt wird und nie abgefragt wird, also völlig überflüssig ist. Eine Funktion die offensichtlich None oder eine Zahl als Rückgabewert hat, erst in einen String umzuwandeln um dann auf "None" zu testen, ist reichlich umständlich und Fehleranfällig.
Re: Schleife wiederhohlen?
Verfasst: Dienstag 17. Februar 2015, 18:36
von soulreafer
Sirius3 hat geschrieben:@soulreafer: ich verstehe Dein Problem nicht. Genau dafür sind doch Funktionen da, dass wenn sie aufgerufen werden, eine äußere Schleife solange nicht weiterläuft, bis die Funktion fertig ist.
PS: Einrückungen sollten immer 4 Leerzeichen pro Ebene sein und nie Tabs und Leerzeichen mischen.
"global" sollte nicht verwendet werden, wobei i immer auf 0 gesetzt wird und nie abgefragt wird, also völlig überflüssig ist. Eine Funktion die offensichtlich None oder eine Zahl als Rückgabewert hat, erst in einen String umzuwandeln um dann auf "None" zu testen, ist reichlich umständlich und Fehleranfällig.
Naja ich glaube es handelt sich um ein NoneType Objekt weil es sowohl None als str enthält aber auch floats sobald ein geräusch zu hören ist.
anders habe ich es halt nicht hinbekommen^^. Das Einrücken habe ich mir von PHP angewöhnt. Da war es egal. Muss mich erstmal an die neue Formatierung gewöhnen.
Re: Schleife wiederhohlen?
Verfasst: Dienstag 17. Februar 2015, 20:21
von BlackJack
@soulreafer: Den Satz mit dem `NoneType` habe ich nicht verstanden. Ich vermute aber mal Du hast das mit Datentypen nicht so ganz verstanden. `None` ist ein Wert auf den man testen kann. Ohne ihn in seine Zeichenkettendarstellung umzuwandeln. Dann braucht man die Zeichenkette hinterher auch nicht wieder in eine Zahl umwandeln wenn es nicht `None` war.
Re: Schleife wiederhohlen?
Verfasst: Dienstag 17. Februar 2015, 20:58
von soulreafer
ok ich habs jetzt hin bekommen. sobald ich pfeife und die tonhöhe über das festgelegte limit geht wird das shell script aufgerufen und die ganze suppe geht von vorne los. aber das mit dem umwandeln zum unnützen string/int müsst ihr mir nochmal erklären wenn möglich.
hier nochmal der funktionierende code:
Code: Alles auswählen
#analyse.loudness(samps)
#analyse.musical_detect_pitch(samps)
import numpy
import pyaudio
import analyse
import subprocess
import os
import time
def get_volume():
pyaud = pyaudio.PyAudio()
stream = pyaud.open(
format = pyaudio.paInt16,
channels = 1,
rate = 44100,
input_device_index = 2,
input = True)
while True:
rawsamps = stream.read(1024)
samps = numpy.fromstring(rawsamps, dtype=numpy.int16)
blaa = str(analyse.musical_detect_pitch(samps))
if blaa == "None":
print "Warte auf Stimme"
else:
blaa = int(float(blaa))
print blaa
if 60 <= blaa < 80:
os.system("./speech.sh sie wünschen?....")
stream.close()
pyaud.terminate()
break
else:
pass
get_volume()
get_volume()
Re: Schleife wiederhohlen?
Verfasst: Dienstag 17. Februar 2015, 21:13
von Sirius3
@soulreafer: mehr als zu sagen, dass Du statt des Strings mit dem Objekt None vergleichen sollst, kann ich nicht. Statt rekursiv get_volume aufzurufen willst Du auch eher eine Schleife benutzen.
Re: Schleife wiederhohlen?
Verfasst: Dienstag 17. Februar 2015, 22:28
von /me
soulreafer hat geschrieben:Code: Alles auswählen
[...]
blaa = str(analyse.musical_detect_pitch(samps))
if blaa == "None":
print "Warte auf Stimme"
else:
blaa = int(float(blaa))
[...]
Da änderst du lustig Datentypen hin und her.
Erst konvertierst du die Rückgabe von
analyse.musical_detect_pitch(samps) in einen String. Vermutlich war der Originalwert
None oder vom Typ
float. Im else-Zweig konvertierst du das ganze dann wieder zurück.
Einfacher und sinnvoller wäre es so.
Code: Alles auswählen
[...]
blaa = analyse.musical_detect_pitch(samps)
if blaa is None:
print "Warte auf Stimme"
else:
blaa = int(blaa)
[...]
Ist
blaa eigentlich eine mir unbekannte Abkürzung oder einfach nur ein schlecht gewählter Bezeichnername?
Re: Schleife wiederhohlen?
Verfasst: Dienstag 17. Februar 2015, 22:49
von EyDu
@/me:
Blaa 
Re: Schleife wiederhohlen?
Verfasst: Dienstag 17. Februar 2015, 22:58
von BlackJack
Verdammt, jetzt habe ich Hunger.
