Schleife wiederhohlen?

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
soulreafer
User
Beiträge: 3
Registriert: Dienstag 17. Februar 2015, 17:00

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.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
soulreafer
User
Beiträge: 3
Registriert: Dienstag 17. Februar 2015, 17:00

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.
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.
soulreafer
User
Beiträge: 3
Registriert: Dienstag 17. Februar 2015, 17:00

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()
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@/me: Blaa :mrgreen:
Das Leben ist wie ein Tennisball.
BlackJack

Verdammt, jetzt habe ich Hunger. :-)
Antworten