Fale dziękowe¶

Lista dostępnych urządzeń¶

In [1]:
import sounddevice as sd
print(sd.query_devices())  # Powinno zwrócić listę urządzeń audio
   0 Mapowanie dźwięku Microsoft - Input, MME (2 in, 0 out)
>  1 Mikrofon (2 — High Definition A, MME (2 in, 0 out)
   2 CABLE Output (VB-Audio Virtual , MME (16 in, 0 out)
   3 Mapowanie dźwięku Microsoft - Output, MME (0 in, 2 out)
<  4 CABLE Input (VB-Audio Virtual C, MME (0 in, 16 out)
   5 U32J59x (2 — HD Audio Driver fo, MME (0 in, 2 out)
   6 CABLE In 16ch (VB-Audio Virtual, MME (0 in, 16 out)
   7 CABLE Output (VB-Audio Point), Windows WDM-KS (16 in, 0 out)
   8 Output (VB-Audio Point), Windows WDM-KS (0 in, 16 out)
   9 Input (VB-Audio Point), Windows WDM-KS (16 in, 0 out)
  10 U32J59x (ACX HD Audio Speaker), Windows WDM-KS (0 in, 2 out)
  11 Mikrofon (HD Audio Microphone 2), Windows WDM-KS (2 in, 0 out)
  12 Zestaw słuchawkowy (@System32\drivers\bthhfenum.sys,#2;%1 Hands-Free%0
;(WI-C100)), Windows WDM-KS (0 in, 1 out)
  13 Zestaw słuchawkowy (@System32\drivers\bthhfenum.sys,#2;%1 Hands-Free%0
;(WI-C100)), Windows WDM-KS (1 in, 0 out)
  14 Słuchawki (), Windows WDM-KS (0 in, 2 out)

Nagrywanie dzwięku¶

In [2]:
import sounddevice as sd
import numpy as np
import wave

# Parametry
samplerate = 44100
channels = 2
duration = 5  # Czas nagrywania (sekundy)
output_file = "system_audio.wav"

# Sprawdź numer urządzenia "Stereo Mix"
# w moim przypadku VB-Audio
stereo_mix_device_id = 2  # Zmień na odpowiedni numer!

print("Nagrywanie dźwięku systemowego...")

# Bufor na dane
recorded_data = []

# Callback do nagrywania
def callback(indata, frames, time, status):
    if status:
        print(status)
    recorded_data.append(indata.copy())

# Start nagrywania
with sd.InputStream(device=stereo_mix_device_id, samplerate=samplerate, channels=channels, callback=callback):
    sd.sleep(duration * 1000)

# Konwersja na numpy array
audio_data = np.concatenate(recorded_data, axis=0)

# Zapis do pliku WAV
with wave.open(output_file, "wb") as wf:
    wf.setnchannels(channels)
    wf.setsampwidth(2)  # 16-bit
    wf.setframerate(samplerate)
    wf.writeframes((audio_data * 32767).astype(np.int16).tobytes())

print("Nagranie zapisane do:", output_file)
Nagrywanie dźwięku systemowego...
Nagranie zapisane do: system_audio.wav
In [ ]:
import sounddevice as sd
import numpy as np

# Parametry audio
samplerate = 44100  # Hz
channels = 1  # Mono
device = 2  # Domyślne urządzenie wejściowe (można zmienić)

# Callback do przechwytywania dźwięku
def audio_callback(indata, frames, time, status):
    if status:
        print(status)
    volume_norm = np.linalg.norm(indata)  # Obliczanie poziomu głośności
    print(f"Głośność: {volume_norm:.4f}")

# Uruchomienie strumienia audio
with sd.InputStream(callback=audio_callback, samplerate=samplerate, channels=channels, device=device):
    print("Analiza głośności... (Naciśnij Ctrl+C, aby zakończyć)")
    while True:
        pass  # Pętla nieskończona

Analiza strumienia - widmo¶

In [2]:
import sounddevice as sd
import numpy as np
import matplotlib.pyplot as plt
import tkinter as tk
from scipy.fftpack import fft
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

# Parametry audio
samplerate = 44100  # Hz
duration = 0.1  # Czas analizy (sekundy)
frames_per_buffer = int(samplerate * duration)
channels = 1  # Mono

# Tworzenie GUI
root = tk.Tk()
root.title("Widmo dźwięku (FFT)")

# Tworzenie wykresu FFT w Matplotlib
fig, ax = plt.subplots()
frequencies = np.fft.rfftfreq(frames_per_buffer, 1 / samplerate)  # Częstotliwości dodatnie
y = np.zeros_like(frequencies)  # Dopasowanie rozmiaru
line, = ax.plot(frequencies, y)
ax.set_xlim(0, 5000)  # Ograniczenie widma do 5 kHz
ax.set_ylim(0, 100)  # Skalowanie amplitudy (można dostosować)
ax.set_xlabel("Częstotliwość (Hz)")
ax.set_ylabel("Amplituda")
ax.set_title("Widmo dźwięku (FFT)")

# Osadzenie wykresu w oknie Tkinter
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack()

# Funkcja do aktualizacji wykresu
def update_plot(audio_fft):
    ydata = np.abs(audio_fft[:len(frequencies)])  # Dopasowanie rozmiaru
    line.set_ydata(ydata)
    #ax.set_ylim(0, max(ydata) * 1.1)  # Automatyczne skalowanie
    canvas.draw()

# Callback audio (uruchamiany w oddzielnym wątku przez sounddevice)
def audio_callback(indata, frames, time, status):
    if status:
        print(status)
    if indata.shape[0] != frames_per_buffer:
        print(f"BŁĄD: Otrzymano {indata.shape[0]} próbek zamiast {frames_per_buffer}!")
        return
    audio_fft = np.abs(fft(indata[:, 0]))[:len(frequencies)]  # Poprawione FFT
    root.after(1, update_plot, audio_fft)  # Przekazanie do głównego wątku

# Uruchomienie nasłuchiwania dźwięku
with sd.InputStream(callback=audio_callback, samplerate=samplerate, channels=channels, blocksize=frames_per_buffer, device=2):
    root.mainloop()  # Uruchomienie GUI
No description has been provided for this image