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:
|
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 = tempfile.NamedTemporaryFile(suffix=".wav", delete=False)
|
||||||
tmp.close()
|
tmp.close()
|
||||||
cmd = _record_cmd(recorder, device, rate, tmp.name)
|
cmd = _record_cmd(recorder, device, rate, tmp.name)
|
||||||
|
|
||||||
input("\n[Enter] = Aufnahme START …")
|
input("\n[Enter] = Aufnahme START …")
|
||||||
proc = subprocess.Popen(cmd)
|
err = tempfile.TemporaryFile()
|
||||||
|
proc = subprocess.Popen(cmd, stderr=err)
|
||||||
input("[Enter] = Aufnahme STOP …")
|
input("[Enter] = Aufnahme STOP …")
|
||||||
proc.send_signal(signal.SIGINT)
|
proc.send_signal(signal.SIGINT)
|
||||||
try:
|
try:
|
||||||
proc.wait(timeout=5)
|
proc.wait(timeout=5)
|
||||||
except subprocess.TimeoutExpired:
|
except subprocess.TimeoutExpired:
|
||||||
proc.kill()
|
proc.kill()
|
||||||
|
|
||||||
with open(tmp.name, "rb") as fh:
|
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:
|
def play_pcm(pcm: bytes) -> None:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue