Optimising the default for an average laptop, not more CPU (the speech model is hard-wired to 4 threads in NeMo-Speech.cpp, session.cpp:911 — already a thin-client budget). - RECONNECT: a live recording ended with "speech server connection lost: … broken pipe" when the stream to the speech server broke. Now the engine opens a new stream and keeps going; the words still in flight on the old one are finalised so the box keeps them; up to 5 attempts, then a plain message. Verified against a fake speech server that drops the first stream after 3 s: 6 words finalised, reconnected in 2 ms, 14 more words streamed, clean Stop, 0 data races (go -race). - FALLING BEHIND: when the mic clearly carries speech but no words have come back for 10 s (the server is starved of CPU — the stream used to freeze with no message), say so once; it clears when words resume. Verified with a fake server that returns no words: warned after 10 s. - The robot voice (Piper) runs at nice 10 on Linux, so its ~1 s burst per sentence never makes the words you are speaking fall behind.
19 lines
733 B
Go
19 lines
733 B
Go
//go:build linux
|
|
|
|
package main
|
|
|
|
import "syscall"
|
|
|
|
// childAttr: a child process (the speech server, a recorder) is killed with the engine, so a crash
|
|
// never leaves a speech server holding a gigabyte of memory. Linux only: Pdeathsig does not exist on
|
|
// macOS or Windows (see procattr_other.go).
|
|
func childAttr() *syscall.SysProcAttr {
|
|
return &syscall.SysProcAttr{Pdeathsig: syscall.SIGKILL}
|
|
}
|
|
|
|
// yieldCPU lowers a background helper's CPU priority (nice 10), so on a thin client the live transcription
|
|
// always wins the CPU over it. Used for the robot voice: its ~1 s burst per sentence must never make the
|
|
// words you are speaking fall behind.
|
|
func yieldCPU(pid int) {
|
|
_ = syscall.Setpriority(syscall.PRIO_PROCESS, pid, 10)
|
|
}
|