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