ux(voice_loop): harmlose arecord-EINTR-Meldung beim Stoppen unterdruecken
Das Stoppen per SIGINT loest in arecord ein erwartetes EINTR aus
("Unterbrechung während des Betriebssystemaufrufs"). Recorder-stderr wird nun
abgefangen und nur noch bei tatsaechlich fehlgeschlagener Aufnahme (leere Datei)
angezeigt. Die Aufnahme selbst war/ist korrekt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
4254475b73
commit
e1167951e1
1 changed files with 18 additions and 3 deletions
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue