forked from TheDeathDragon/LiveTranslate
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_audio.py
More file actions
61 lines (50 loc) · 1.58 KB
/
Copy pathtest_audio.py
File metadata and controls
61 lines (50 loc) · 1.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""Quick test: capture loopback audio and check if data is non-zero."""
import pyaudiowpatch as pyaudio
import numpy as np
pa = pyaudio.PyAudio()
# Find loopback device
wasapi = None
for i in range(pa.get_host_api_count()):
info = pa.get_host_api_info_by_index(i)
if "WASAPI" in info["name"]:
wasapi = info
break
print(f"WASAPI: {wasapi['name']}")
loopback = None
for i in range(pa.get_device_count()):
dev = pa.get_device_info_by_index(i)
if dev.get("isLoopbackDevice", False):
loopback = dev
print(
f" Loopback: [{i}] {dev['name']} ch={dev['maxInputChannels']} rate={dev['defaultSampleRate']}"
)
if loopback is None:
print("No loopback device found!")
pa.terminate()
exit(1)
channels = loopback["maxInputChannels"]
rate = int(loopback["defaultSampleRate"])
chunk = int(rate * 0.5)
print(f"\nCapturing from: {loopback['name']}")
print(f"Config: {rate}Hz, {channels}ch, chunk={chunk}")
stream = pa.open(
format=pyaudio.paFloat32,
channels=channels,
rate=rate,
input=True,
input_device_index=loopback["index"],
frames_per_buffer=chunk,
)
print("\nReading 6 chunks (3 seconds)...")
for i in range(6):
data = stream.read(chunk, exception_on_overflow=False)
audio = np.frombuffer(data, dtype=np.float32)
mono = audio.reshape(-1, channels).mean(axis=1) if channels > 1 else audio
rms = np.sqrt(np.mean(mono**2))
print(
f" Chunk {i}: samples={len(mono)}, rms={rms:.6f}, max={np.abs(mono).max():.6f}"
)
stream.stop_stream()
stream.close()
pa.terminate()
print("\nDone.")