diff --git a/scripts/voice_loop.py b/scripts/voice_loop.py index e3e6094..9e53f0f 100644 --- a/scripts/voice_loop.py +++ b/scripts/voice_loop.py @@ -87,21 +87,36 @@ def _record_cmd(recorder: str, device: str | None, rate: int, outfile: str) -> l def record_utterance(recorder: str, device: str | None, rate: int) -> bytes: - """Push-to-Talk: Enter startet, Enter stoppt die Aufnahme; gibt WAV-Bytes zurueck.""" + """Push-to-Talk: Enter startet, Enter stoppt die Aufnahme; gibt WAV-Bytes zurueck. + + Das Recorder-stderr wird abgefangen: Beim absichtlichen Stoppen per SIGINT meldet + arecord ein harmloses 'Unterbrechung während des Betriebssystemaufrufs' (EINTR). + Diese Meldung wird nur angezeigt, wenn die Aufnahme tatsaechlich fehlschlaegt. + """ tmp = tempfile.NamedTemporaryFile(suffix=".wav", delete=False) tmp.close() cmd = _record_cmd(recorder, device, rate, tmp.name) input("\n[Enter] = Aufnahme START …") - proc = subprocess.Popen(cmd) + err = tempfile.TemporaryFile() + proc = subprocess.Popen(cmd, stderr=err) input("[Enter] = Aufnahme STOP …") proc.send_signal(signal.SIGINT) try: proc.wait(timeout=5) except subprocess.TimeoutExpired: proc.kill() + with open(tmp.name, "rb") as fh: - return fh.read() + data = fh.read() + # Recorder-Fehlertext nur zeigen, wenn nichts/zu wenig aufgenommen wurde. + if len(data) < 1000: + err.seek(0) + message = err.read().decode("utf-8", "replace").strip() + if message: + print(f" ({recorder}: {message})") + err.close() + return data def play_pcm(pcm: bytes) -> None: