diff --git a/README.md b/README.md index be2a2fa..926f34c 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,7 @@ For unauthenticated local endpoints (e.g. Ollama): - `chatTemplateKwargs` _(optional)_ - extra keyword arguments passed to the model's chat template (e.g. `{"enable_thinking": false}` for Qwen models to disable chain-of-thought) - `retries` _(optional)_ - number of retry attempts for transient LLM failures - `tmpDir` _(optional)_ - directory used for the temporary STT recording file (default `/tmp`) +- `trimSilence` _(optional)_ - whether to remove leading silence from recordings (default `true`). Set to `false` if your recordings are missing the first word or syllable ### Logging diff --git a/lib/stt.js b/lib/stt.js index 809703b..ed46062 100644 --- a/lib/stt.js +++ b/lib/stt.js @@ -115,7 +115,7 @@ function forceKillSox(logger) { } catch {} } -function startRecording(kv, toast, logger) { +function startRecording(kv, toast, logger, trimSilence = true) { if (soxProc) { logger?.log("STT", "Start recording skipped: sox already running", "debug"); return; @@ -132,9 +132,10 @@ function startRecording(kv, toast, logger) { const inputArgs = mic ? ["-t", "coreaudio", mic] : ["-d"]; logger?.log("STT", `Starting recording mic=${mic || "system default"}`, "debug"); + const silenceArgs = trimSilence ? ["silence", "1", "0.1", "1%"] : []; soxProc = spawn( "sox", - [...inputArgs, "-r", "16000", "-c", "1", "-b", "16", wavFile, "silence", "1", "0.1", "1%"], + [...inputArgs, "-r", "16000", "-c", "1", "-b", "16", wavFile, ...silenceArgs], { stdio: ["ignore", "ignore", "pipe"], detached: false, @@ -517,7 +518,7 @@ export function registerSTT(api, kv, complete, prompts, opts, logger) { toast("Stopping, transcribing..."); doTranscribePipeline(kv, complete, client, toast, systemPrompt, false, logger); } else { - startRecording(kv, toast, logger); + startRecording(kv, toast, logger, opts.trimSilence); if (recording) toast("Recording... press again to transcribe"); } },