


















@@ -28,6 +28,7 @@ export type GoogleMeetConfig = {
2828chrome: {
2929audioBackend: "blackhole-2ch";
3030audioFormat: GoogleMeetChromeAudioFormat;
31+audioBufferBytes: number;
3132launch: boolean;
3233browserProfile?: string;
3334guestName: string;
@@ -86,7 +87,15 @@ export type GoogleMeetConfig = {
8687};
8788};
888989-export const DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND = [
90+const SOX_DEFAULT_BUFFER_BYTES = 8192;
91+const SOX_MIN_BUFFER_BYTES = 17;
92+export const DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES = SOX_DEFAULT_BUFFER_BYTES / 2;
93+94+function withSoxBuffer(command: readonly string[], bufferBytes: number): string[] {
95+return [command[0] ?? "sox", "-q", "--buffer", String(bufferBytes), ...command.slice(2)];
96+}
97+98+const DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND_BASE = [
9099"sox",
91100"-q",
92101"-t",
@@ -106,7 +115,7 @@ export const DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND = [
106115"-",
107116] as const;
108117109-export const DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND = [
118+const DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND_BASE = [
110119"sox",
111120"-q",
112121"-t",
@@ -126,7 +135,7 @@ export const DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND = [
126135"BlackHole 2ch",
127136] as const;
128137129-const LEGACY_GOOGLE_MEET_AUDIO_INPUT_COMMAND = [
138+const LEGACY_GOOGLE_MEET_AUDIO_INPUT_COMMAND_BASE = [
130139"rec",
131140"-q",
132141"-t",
@@ -142,7 +151,7 @@ const LEGACY_GOOGLE_MEET_AUDIO_INPUT_COMMAND = [
142151"-",
143152] as const;
144153145-const LEGACY_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND = [
154+const LEGACY_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND_BASE = [
146155"play",
147156"-q",
148157"-t",
@@ -158,6 +167,16 @@ const LEGACY_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND = [
158167"-",
159168] as const;
160169170+export const DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND = withSoxBuffer(
171+DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND_BASE,
172+DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES,
173+);
174+175+export const DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND = withSoxBuffer(
176+DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND_BASE,
177+DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES,
178+);
179+161180const DEFAULT_GOOGLE_MEET_CHROME_AUDIO_FORMAT: GoogleMeetChromeAudioFormat = "pcm16-24khz";
162181const DEFAULT_GOOGLE_MEET_BARGE_IN_RMS_THRESHOLD = 650;
163182const DEFAULT_GOOGLE_MEET_BARGE_IN_PEAK_THRESHOLD = 2500;
@@ -177,6 +196,7 @@ const DEFAULT_GOOGLE_MEET_CONFIG: GoogleMeetConfig = {
177196chrome: {
178197audioBackend: "blackhole-2ch",
179198audioFormat: DEFAULT_GOOGLE_MEET_CHROME_AUDIO_FORMAT,
199+audioBufferBytes: DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES,
180200launch: true,
181201guestName: "OpenClaw Agent",
182202reuseExistingTab: true,
@@ -361,16 +381,36 @@ function resolveChromeAudioFormat(value: unknown): GoogleMeetChromeAudioFormat |
361381}
362382}
363383364-function defaultAudioInputCommand(format: GoogleMeetChromeAudioFormat): readonly string[] {
365-return format === "g711-ulaw-8khz"
366- ? LEGACY_GOOGLE_MEET_AUDIO_INPUT_COMMAND
367- : DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND;
384+function resolveAudioBufferBytes(value: unknown, fallback: number): number {
385+const number = resolveNumber(value, fallback);
386+if (!Number.isFinite(number) || number <= 0) {
387+return fallback;
388+}
389+return Math.max(SOX_MIN_BUFFER_BYTES, Math.trunc(number));
390+}
391+392+function defaultAudioInputCommand(
393+format: GoogleMeetChromeAudioFormat,
394+bufferBytes: number,
395+): string[] {
396+return withSoxBuffer(
397+format === "g711-ulaw-8khz"
398+ ? LEGACY_GOOGLE_MEET_AUDIO_INPUT_COMMAND_BASE
399+ : DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND_BASE,
400+bufferBytes,
401+);
368402}
369403370-function defaultAudioOutputCommand(format: GoogleMeetChromeAudioFormat): readonly string[] {
371-return format === "g711-ulaw-8khz"
372- ? LEGACY_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND
373- : DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND;
404+function defaultAudioOutputCommand(
405+format: GoogleMeetChromeAudioFormat,
406+bufferBytes: number,
407+): string[] {
408+return withSoxBuffer(
409+format === "g711-ulaw-8khz"
410+ ? LEGACY_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND_BASE
411+ : DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND_BASE,
412+bufferBytes,
413+);
374414}
375415376416export function resolveGoogleMeetConfig(input: unknown): GoogleMeetConfig {
@@ -392,6 +432,10 @@ export function resolveGoogleMeetConfigWithEnv(
392432const audioFormat =
393433resolveChromeAudioFormat(chrome.audioFormat) ??
394434(hasCustomAudioCommand ? "g711-ulaw-8khz" : DEFAULT_GOOGLE_MEET_CONFIG.chrome.audioFormat);
435+const audioBufferBytes = resolveAudioBufferBytes(
436+chrome.audioBufferBytes,
437+DEFAULT_GOOGLE_MEET_CONFIG.chrome.audioBufferBytes,
438+);
395439const chromeNode = asRecord(raw.chromeNode);
396440const twilio = asRecord(raw.twilio);
397441const voiceCall = asRecord(raw.voiceCall);
@@ -421,6 +465,7 @@ export function resolveGoogleMeetConfigWithEnv(
421465chrome: {
422466audioBackend: "blackhole-2ch",
423467 audioFormat,
468+ audioBufferBytes,
424469launch: resolveBoolean(chrome.launch, DEFAULT_GOOGLE_MEET_CONFIG.chrome.launch),
425470browserProfile: normalizeOptionalString(chrome.browserProfile),
426471guestName:
@@ -438,10 +483,10 @@ export function resolveGoogleMeetConfigWithEnv(
438483chrome.waitForInCallMs,
439484DEFAULT_GOOGLE_MEET_CONFIG.chrome.waitForInCallMs,
440485),
441-audioInputCommand: configuredAudioInputCommand ?? [...defaultAudioInputCommand(audioFormat)],
442-audioOutputCommand: configuredAudioOutputCommand ?? [
443- ...defaultAudioOutputCommand(audioFormat),
444-],
486+audioInputCommand:
487+ configuredAudioInputCommand ?? defaultAudioInputCommand(audioFormat, audioBufferBytes),
488+audioOutputCommand:
489+ configuredAudioOutputCommand ?? defaultAudioOutputCommand(audioFormat, audioBufferBytes),
445490bargeInInputCommand: resolveStringArray(chrome.bargeInInputCommand),
446491bargeInRmsThreshold: resolveNumber(
447492chrome.bargeInRmsThreshold,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。