Seite 1 von 1

Pyaudio

Verfasst: Freitag 22. April 2022, 19:15
von toper
Hallo zusammen,

ich habe ein Programm, welches den Ausgegebenen Ton auslesen soll.
Das folgende Programm funktioniert einwandfrei auf meinem Laptop, auf meinem PC bekomme ich aber nur "0" zurück.

Code: Alles auswählen

import pyaudio
import numpy as np

maxValue = 2**16
bars = 35
p=pyaudio.PyAudio()


stream=p.open(format=pyaudio.paInt16,channels=1,rate=44100,
              input=True, frames_per_buffer=1024)


while True:
    data = np.fromstring(stream.read(1024),dtype=np.int16)
    dataL = data[0::2]
    dataR = data[1::2]
    peakL = np.abs(np.max(dataL)-np.min(dataL))/maxValue
    peakR = np.abs(np.max(dataR)-np.min(dataR))/maxValue
    lString = "#"*int(peakL*bars)+"-"*int(bars-peakL*bars)
    rString = "#"*int(peakR*bars)+"-"*int(bars-peakR*bars)
    print("L=[%s]\tR=[%s]"%(lString, rString))

Weiß jemand woran das liegen könnte?

Re: Pyaudio

Verfasst: Samstag 23. April 2022, 11:56
von __blackjack__
@toper: Was heisst „nur 0“? Wo genau?

Wie sieht die Hardware aus? Was könnte PyAudio da alles benutzen als mehr oder weniger zufällig ausgewählte Audioquelle? Ist der Kanal für Aufnahme aktiviert? Nicht stummgeschaltet? Eventuell die Aufnahmelautstärke/-verstärkung auf 0 runter geregelt?

Anmerkungen zum Quelltext Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Namen sollte nicht kryptisch abgekürzt werden oder kryptische Abkürzungen enthalten. Insbesondere nichts einbuchstabiges.

Man sollte dafür sorgen, dass bei Programmende die Ressourcen sauber aufgeräumt werden, also hier insbesondere das der Stream geschlossen wird. Entweder mit ``try``/``finally`` oder mit ``with`` und `contextlib.closing()`.

Der Code für den linken und den rechten Kanal steht da zweimal nahezu identisch. Das kann man in eine Funktion heraus ziehen.

Statt ``%`` würde man in aktuellem Python-Code f-Zeichenkettenliterale verwenden.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
from contextlib import closing

import numpy as np
import pyaudio

MAX_VALUE = 2 ** 16
BAR_LENGTH = 35
FRAME_COUNT = 1024


def create_bar(samples):
    peak_value = abs(np.max(samples) - np.min(samples)) / MAX_VALUE
    return ("#" * int(peak_value * BAR_LENGTH)).ljust(BAR_LENGTH, "-")


def main():
    with closing(
        pyaudio.PyAudio().open(
            rate=44_100, channels=1, format=pyaudio.paInt16, input=True
        )
    ) as stream:
        while True:
            samples = np.fromstring(stream.read(FRAME_COUNT), dtype=np.int16)
            print(
                f"L=[{create_bar(samples[0::2])}]"
                f"\tR=[{create_bar(samples[1::2])}]"
            )


if __name__ == "__main__":
    main()

Re: Pyaudio

Verfasst: Samstag 23. April 2022, 14:05
von toper
Nur 0 heißt, dass er es immer so anzeigt, als würde kein Ton abgespielt werden.
Das Mikrofon kann ich abfragen indem ich den device_index auf 1 stelle.
Bei Index 3(Wo sich der Lautsprecher befindet funktioniert es allerdings nicht.Es ist auch nichts stumm geschaltet oder ähnliches.

Und bei Index 4 bekomme ich eine Art Hintergrundrauschen, also scheinbar zufällige Daten.