Fehler, den ich im Internet nicht finde

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
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

Hallo,
ich bekomme bei einem Python-Skript, in welchem eine Audiodatei abgespielt wird, folgenden Fehler:

Code: Alles auswählen

File "/usr/local/lib/python3.7/dist-packages/pyaudio.py", line 750, in open
    stream = Stream(self, *args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/pyaudio.py", line 441, in __init__
    self._stream = pa.open(**arguments)
OSError: [Errno -9985] Device unavailable
Weiß jemand, was dieser bedeutet?
Vielen Dank für die Hilfe!
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JakobPrie: Das Gerät ist nicht verfügbar. Mehr kann man ohne mehr Informationen eher nicht sagen. Man sieht in dem Traceback ja nicht mal den Aufruf. Aber selbst aus dem muss man ja nicht sehen können welche Werte konkret übergeben werden, und man weiss auch nicht welche Geräte eigentlich verfügbar sein sollten, und wie Audio auf dem konkreten System eingerichtet ist und angesprochen wird.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

Also es handelt sich um einen Raspi, welchen ich mit einem USB-Stick für Audio-Ausgang ausgestattet habe. Das ganze wäre dann Klinken-Anschluss. Zum Abspielen nutze ich ALSA (bzw. PyAlsaAudio), bzw. pyAudio. Das Projekt ist ein Sprachassistent, bei dem es sich um ein Server-Client-Prinzip handelt. Wenn eine Audiodatei, in welcher die Antwort des Sprachassistenten enthalten ist, abspiele, schickt der Server einen String an den Client, was er sagen soll. Der Client konvertiert diesen mithilfe von google tts zu einer Wave-datei.
Nun möchte ich aber, dass der Server eine Wav-Datei dem Client schicken kann und dieser diese dann einfach stumpf abspielt.
Zum versenden nutze ich Sockets. Die Datei kommt eigentlich auch soweit an. Ich verschicke sie in Chunks der Größe 16384. Ich speicher die Chunks dann in einem array. In einem weiteren Thread wird geschaut, ob etwas in diesem Array ist und wenn dies der Fall ist, wird der Inhalt abgespielt. wenn was "wichtigeres" dazwischen kommt, wird das Feld mit der jeweiligen Chunk-größe noch fertig abgespielt, dann kommt die wichtige nachricht und dann geht es mit den Chunks weiter. Die Wave-Dateien stelle ich vor dem Abspielen wie folgt ein:

Code: Alles auswählen

chunk = 16384
           frame_rate = audiofile.getframerate()*2
            format = {'format': 8,
                  'channels':1,
                  'rate':frame_rate,
                  'chunk':chunk}
            wav_data = audiofile.readframes(chunk)
            audio_buffer = []
            while wav_data:
                audio_buffer.append(wav_data)
                wav_data = audiofile.readframes(chunk)
Die Funktion, die den Ton ausgibt sieht wie folgt aus (Die Einrückung ist wegen copy-paste falsch):

Code: Alles auswählen

def __init__(self, serverconnection, local_storage, Audio_Input):
        self.Serverconnection = serverconnection
        self.playback_audio_buffer = []
        self.playback_audio_format = {}
        self.notification_audio_format = {}
        self.audio = pyaudio.PyAudio()

stream = self.audio.open(format=self.playback_audio_format['format'],
                                         channels=self.playback_audio_format['channels'],
                                         rate=self.playback_audio_format['rate'],
                                         output=True,
                                         frames_per_buffer=self.playback_audio_format['chunk'])
                for data in self.playback_audio_buffer:
                    if not data == 'Endederdurchsage':
                        stream.write(data)
Das sind erst einmal die wichtigsten informationen glaube ich.
Hoffe Ihr könnt damit was anafngen
Benutzeravatar
hyle
User
Beiträge: 96
Registriert: Sonntag 22. Dezember 2019, 23:19
Wohnort: Leipzig

@JakobPrie: Bekommst Du denn mit den Examples einen Ton raus, wenn Du eine lokale Wav-Datei abspielst? http://larsimmisch.github.io/pyalsaaudi ... l#examples
Und wird etwas ausgegeben, wenn Du mit aplay eine lokale Wav-Datei abspielst?

Btw. Was sind die Ausgaben von:

Code: Alles auswählen

aplay -l
#
cat /etc/asound.conf
#
cat ~/.asoundrc
?
Alles was wir sind ist Sand im Wind Hoschi.
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

hyle hat geschrieben: Freitag 11. September 2020, 16:00 @JakobPrie: Bekommst Du denn mit den Examples einen Ton raus, wenn Du eine lokale Wav-Datei abspielst? http://larsimmisch.github.io/pyalsaaudi ... l#examples
Und wird etwas ausgegeben, wenn Du mit aplay eine lokale Wav-Datei abspielst?

Btw. Was sind die Ausgaben von:

Code: Alles auswählen

aplay -l
#
cat /etc/asound.conf
#
cat ~/.asoundrc
?
Jam das funktioniert :/
JakobPrie
User
Beiträge: 91
Registriert: Sonntag 21. Juni 2020, 11:12

hyle hat geschrieben: Freitag 11. September 2020, 16:00 @JakobPrie: Bekommst Du denn mit den Examples einen Ton raus, wenn Du eine lokale Wav-Datei abspielst? http://larsimmisch.github.io/pyalsaaudi ... l#examples
Und wird etwas ausgegeben, wenn Du mit aplay eine lokale Wav-Datei abspielst?

Btw. Was sind die Ausgaben von:

Code: Alles auswählen

aplay -l
#
cat /etc/asound.conf
#
cat ~/.asoundrc
?
Ich bekomme auch so einen Ton raus, nur nach so 30 Sekunden funktioniert es nicht mehr
Antworten