Wie kann ich das anders Umsetzen (Python 3)?
Hi also ich mach mir einen kleinen Sprachassistenten Bot ist nichts zum veröffentlichen oder so ich mach mir das halt um während dem Zocken mal sagen zu können spiel playlist ... usw. Speech to Text usw klappt alles Wunderbar nur das Music Spielen macht klitze bisschen Probleme. Ich will das "main.py" weiter zuhört nachdem ich subprocess.call() gemacht habe aber in dem script das ich damit augerufen habe ist so etwas wie time.sleep() damit die music weiter spielt.
Teil meiner Main.py:
if "spiel" in txt:
if "playlist" in txt:
if "1" in txt:
say("Playlist 1 wird Wiedergegeben.")
subprocess.call(["C:\\Users\\Zensiert\\AppData\\Local\\Programs\\Python\\Python38\\pythonw.exe", "playlist1.py", "play"])
os.execv(sys.executable, ['python3'] + sys.argv)
if "pause" in txt:
say("Musik wird Pausiert")
subprocess.call(["C:\\Users\\Zensiert\\AppData\\Local\\Programs\\Python\\Python38\\pythonw.exe", "playlist1.py", "pause"])
Und hier meine playlist1.py
import pygame
import sys, getopt
arguments = str(sys.argv)
pygame.init()
pygame.mixer.music.load('C:\\Users\\Zensiert\\IdeaProjects\\LibreOfficeSprachAssistent\\.idea\\songs\\playlist1\\streets.mp3')
if(sys.argv[1]== 'play'):
pygame.mixer.music.play()
elif(sys.argv[1] == 'pause'):
pygame.mixer.music.pause()
print(f"Arg Input : {sys.argv[1]=}")
clock = pygame.time.Clock()
while pygame.mixer.music.get_busy():
clock.tick(309)
pygame.event.poll()
Das Script spielt die Musik und es klappt auch alles aber ich kann halt erst wieder reden wenn ich 309 Sekunden (Wegen dem "clock.tick(309)") gewartet habe. Jemand eine Idee? Ich weiß alles nicht so gut erklärt sorry
1 Antwort
Ich hätte das Zusammenspiel der Dateien geändert.
Du musst deine zweite Python Datei nicht als über die Kommandozeile als separates Programm aufrufen. Du kannst dein Python Code auch in zwei Dateien aufteilen und den Code über verschiedene Dateien aufrufen.
Ich würde wahrscheinlich auch eine eigene Klasse erzeugen.
Die main.py würde dann im etwa so aussehen:
# Klasse der anderen Python Datei importieren
from playlist1 import Playlist1
# Instanz der eigenen Klasse im Hauptprogramm erzeugen
playlist1 = Playlist1()
while True:
txt = [Spracheingabe] # dein Code
// Auf neue Eingabe hören.
# die if Verschachtelungen kann man verbinden
if 'spiel' in txt and 'playlist' in txt and '1' in txt:
say("Playlist 1 wird Wiedergegeben.")
# Funktion der Klasse aufrufen
playlist1.play()
if 'pause' in txt:
say("Musik wird Pausiert")
# Funktion der Klasse aufrufen
playlist1.pause()
und playlist1.py:
# imports
# Klasse mit dem Namen definieren
class Playlist1:
# Existenz der Member Variable pygame angeben
pygame = none
# Konstruktor: wird beim Erzeugen der Klasse aufgerufen
def __init__(self):
self.pygame = pygame.init()
def play(self):
self.pygame.mixer.music.load('[Pfad]')
self.pygame.mixer.music.play()
def pause(self):
self.pygame.mixer.music.pause()
Das sollte es im groben auch schon sein.
Nach einem kurzen Blick in die Doku von pygame scheint das Tool bereits Multi Threaded zu sein. Nach dem Aufruf von play() läuft der Code weiter und die Musik wird weiterhin abgespielt.
Die pygame Instanz sollte nur die ganze Zeit bestehen bleiben, da sonst vermutlich die Musik abbricht.
Durch ein "while True" vor der Spracheingabe wird das Hauptprogramm nicht geschlossen, sodass die Musik weiterhin spielt. Du musst also nicht durch "get_busy()" das Programm am Laufen erhalten.
Das "while True" habe ich mir dazu gedacht. Falls es noch kein Bestandteil ist, müsste die Abfrage für einen neuen Sprach Input in einer Schleife liegen. Hier solltest du auch ohne Probleme ein sleep Funktion aufrufen können.
Ach ne habs schon ich hab einfach txt einen wert gegeben auch im UnknownValueError
Zum Abfangen von Fehler gibt es den try und except Block, welchen du auch schon benutzt.
Anstatt die txt Variable mit einem leeren String "" zu füllen, kannst du auch die Funktion mit "return" vorzeitig beenden. So wird die Variable gar nicht erst bentutzt und die undefined Exception tritt nicht auf.
Vielen Wege führen ans Ziel. So ist es bei deiner Variante auch der Fall.
Danke du bist Wircklich ein Hilfbereiter netter Mensch!
Danke! Ich bin gerade nicht am PC aber ich Versuche es heute Nacht. Das while hab ich vergessen in die playlist1.py zu packen (War nur in der Main.py).
Hey danke! Jetzt wird es aber bisschen verwirrend Leider. Unzwar will ich ja dabei noch weiter aufnehmen was der User sagt aber es kommt eine Exception das nicht geredet wird. Ich hatte das eigentlich so geregelt das ich das ganze Programm neu Aufrufe wenn keine Eingabe gekommen ist. Naja jetzt das Problem das ich das Programm nicht neustarten darf weil ja sonst die Musik ausgeht. Hast du da evt auch eine Idee?
Hier meine getSpeak Funktion: