fixed bug: gain should now correctly affect whisper models as intended

This commit is contained in:
2025-08-18 05:15:12 +02:00
parent 6142cd8825
commit b7c8798375

View File

@@ -737,10 +737,69 @@ class DeviceAPI:
self.recorder.stop_and_save()
return False # now "not recording"
def _find_matching_input_for_output(self) -> Optional[int]:
"""
Versucht, für das aktuell gewählte Output-Device (self.output_index)
ein gleichnamiges Input-Device zu finden (typisch bei Loopback-Treibern).
Gibt den Input-Device-Index zurück oder None.
"""
try:
if self.output_index is None or self.output_index < 0:
return None
devs = sd.query_devices()
out_name = devs[self.output_index]["name"]
# 1) exakter Name
for i, d in enumerate(devs):
if d.get("max_input_channels", 0) > 0 and d["name"] == out_name:
return i
low = out_name.lower()
# 2) case-insensitive exakter Name
for i, d in enumerate(devs):
if d.get("max_input_channels", 0) > 0 and d["name"].lower() == low:
return i
# 3) Prefix-Match (robuster für unterschiedliche Bezeichnungen)
for i, d in enumerate(devs):
if d.get("max_input_channels", 0) > 0 and d["name"].lower().startswith(low):
return i
return None
except Exception:
return None
def _start_stt(self):
"""
Startet den STT-Client-Prozess.
Neu: bevorzugt den POST-GAIN Loopback als STT-Quelle, wenn ein passendes
Input-Device zum aktuell gewählten Output-Device existiert. Fallback: raw input.
"""
# Standard: rohes Eingabegerät
capture_index = self.input_index
# Versuch: passendes Loopback-Input zu aktuellem Output finden
loop_idx = self._find_matching_input_for_output()
if loop_idx is not None:
capture_index = loop_idx
try:
devs = sd.query_devices()
print(f"[ASR] capturing POST-GAIN from loopback input #{loop_idx} ({devs[loop_idx]['name']})",
file=sys.stderr)
except Exception:
print(f"[ASR] capturing POST-GAIN from loopback input #{loop_idx}", file=sys.stderr)
else:
try:
devs = sd.query_devices()
print(f"[ASR] capturing RAW from input #{self.input_index} ({devs[self.input_index]['name']})",
file=sys.stderr)
except Exception:
print(f"[ASR] capturing RAW from input #{self.input_index}", file=sys.stderr)
self.client_proc = Process(
target=_stt_worker,
args=(self.input_index, self.queue, self.translate_enabled, self.src_lang_id),
args=(capture_index, self.queue, self.translate_enabled, self.src_lang_id),
daemon=True
)
self.client_proc.start()